浏览代码

Merge branch 'yb/3.0' of hongze/hongze_yb into master

hsun 3 年之前
父节点
当前提交
79a4464b7d
共有 78 个文件被更改,包括 5553 次插入4901 次删除
  1. 34 0
      cache/company/company.go
  2. 28 0
      cache/report_chapter_type/report_chapter_type.go
  3. 19 0
      config/config.go
  4. 21 0
      controller/company/company_permission.go
  5. 114 0
      controller/purchase/purchase.go
  6. 134 0
      controller/report/classify.go
  7. 198 0
      controller/report/report.go
  8. 2 1
      controller/user/user.go
  9. 4 0
      core/run_server.go
  10. 2 0
      global/global.go
  11. 3 2
      go.mod
  12. 33 0
      init_serve/EsClient.go
  13. 6 1
      init_serve/router.go
  14. 14 0
      init_serve/task.go
  15. 16 17
      logic/user/user.go
  16. 1 1
      middleware/token.go
  17. 79 0
      models/response/classify.go
  18. 62 0
      models/response/paging.go
  19. 81 0
      models/response/permission.go
  20. 53 0
      models/response/purchase/purchase.go
  21. 216 0
      models/response/report.go
  22. 1 0
      models/tables/chart_permission/chart_permission.go
  23. 20 0
      models/tables/chart_permission/query.go
  24. 13 0
      models/tables/chart_permission_chapter_mapping/chart_permission_chapter_mapping.go
  25. 50 0
      models/tables/chart_permission_chapter_mapping/query.go
  26. 14 0
      models/tables/chart_permission_search_key_word_mapping/chart_permission_search_key_word_mapping.go
  27. 46 0
      models/tables/chart_permission_search_key_word_mapping/query.go
  28. 21 0
      models/tables/daily_base_column/daily_base_column.go
  29. 97 0
      models/tables/daily_base_column/query.go
  30. 0 29
      models/tables/edb_data/create.go
  31. 0 755
      models/tables/edb_data/query.go
  32. 0 42
      models/tables/edb_data/update.go
  33. 33 0
      models/tables/rddp/classify/classify.go
  34. 116 0
      models/tables/rddp/classify/query.go
  35. 314 0
      models/tables/rddp/report/query.go
  36. 39 0
      models/tables/rddp/report/report.go
  37. 116 0
      models/tables/rddp/report_chapter/query.go
  38. 35 0
      models/tables/rddp/report_chapter/report_chapter.go
  39. 15 0
      models/tables/rddp/report_chapter_ticker/query.go
  40. 16 0
      models/tables/rddp/report_chapter_ticker/report_chapter_ticker.go
  41. 9 0
      models/tables/rddp/report_view_log/create.go
  42. 19 0
      models/tables/rddp/report_view_log/query.go
  43. 16 0
      models/tables/rddp/report_view_log/report_view_log.go
  44. 8 0
      models/tables/rddp/report_view_record/create.go
  45. 19 0
      models/tables/rddp/report_view_record/report_view_record.go
  46. 59 0
      models/tables/report_chapter_type/query.go
  47. 30 0
      models/tables/report_chapter_type/report_chapter_type.go
  48. 22 0
      models/tables/report_chapter_type_permission/query.go
  49. 13 0
      models/tables/report_chapter_type_permission/report_chapter_type_permission.go
  50. 9 0
      models/tables/user_access_record/create.go
  51. 18 0
      models/tables/user_access_record/user_access_record.go
  52. 8 0
      models/tables/wx_user/update.go
  53. 1 1
      models/tables/wx_user/wx_user.go
  54. 33 0
      models/tables/yb_activity/query.go
  55. 9 0
      models/tables/yb_activity_view_log/create.go
  56. 19 0
      models/tables/yb_activity_view_log/query.go
  57. 16 0
      models/tables/yb_activity_view_log/yb_activity_view_log.go
  58. 1 1
      models/tables/yb_apply_record/yb_apply_record.go
  59. 14 0
      routers/company.go
  60. 14 0
      routers/purchase.go
  61. 26 0
      routers/report.go
  62. 115 0
      services/activity/activity.go
  63. 95 0
      services/activity/activity_view_log.go
  64. 0 376
      services/chart/chart_info.go
  65. 0 3665
      services/chart/edb_data.go
  66. 306 8
      services/company/permission.go
  67. 292 0
      services/elastic/report.go
  68. 75 0
      services/purchase/purchase.go
  69. 392 0
      services/report/classify.go
  70. 1102 0
      services/report/report.go
  71. 427 0
      services/report/report_chapter.go
  72. 136 0
      services/report/report_view_log.go
  73. 52 0
      services/report/report_view_record.go
  74. 46 0
      services/report/user_access_record.go
  75. 1 0
      services/user/user.go
  76. 70 0
      task/task.go
  77. 1 1
      utils/common.go
  78. 14 1
      utils/constants.go

+ 34 - 0
cache/company/company.go

@@ -0,0 +1,34 @@
+package company
+
+import (
+	"context"
+	jsoniter "github.com/json-iterator/go"
+	"hongze/hongze_yb/global"
+	model "hongze/hongze_yb/models/tables/company"
+	"hongze/hongze_yb/utils"
+	"strconv"
+	"time"
+)
+
+// GetByCompanyId 根据客户id获取信息
+func GetByCompanyId(companyId int64) (item *model.Company, err error) {
+	cacheKey := utils.HONGZEYB_ + "company:GetByCompanyId:" + strconv.Itoa(int(companyId))
+	companyInfo, _ := global.Redis.Get(context.TODO(), cacheKey).Result()
+	if companyInfo != "" {
+		err = jsoniter.UnmarshalFromString(companyInfo, &item)
+		if err != nil {
+			return
+		}
+		item.CompanyID = uint64(companyId)
+		return
+	}
+	item, err = model.GetByCompanyId(companyId)
+	if err == nil && item.CompanyID > 0 {
+		companyInfo, err = jsoniter.MarshalToString(item)
+		if err != nil {
+			return
+		}
+		_ = global.Redis.SetEX(context.TODO(), cacheKey, companyInfo, 2*time.Hour)
+	}
+	return
+}

+ 28 - 0
cache/report_chapter_type/report_chapter_type.go

@@ -0,0 +1,28 @@
+package report_chapter_type
+
+import (
+	"context"
+	jsoniter "github.com/json-iterator/go"
+	"hongze/hongze_yb/global"
+	model "hongze/hongze_yb/models/tables/report_chapter_type"
+	"hongze/hongze_yb/utils"
+	"time"
+)
+// GetEffectTypeID 获取缓存中的可用章节
+func GetEffectTypeID() (chapterIds []int, err error ) {
+	cacheKey := utils.HONGZEYB_ + "report_chapter_type:GetEffectTypeID"
+	chapterIdsStr, _ := global.Redis.Get(context.TODO(), cacheKey).Result()
+	if chapterIdsStr != "" {
+		err = jsoniter.UnmarshalFromString(chapterIdsStr, &chapterIds)
+		return
+	}
+	chapterIds, err = model.GetEffectTypeID()
+	if err == nil && len(chapterIds) > 0 {
+		chapterIdsStr, err = jsoniter.MarshalToString(chapterIds)
+		if err != nil {
+			return
+		}
+		_ = global.Redis.SetEX(context.TODO(), cacheKey, chapterIdsStr, 2*time.Hour)
+	}
+	return
+}

+ 19 - 0
config/config.go

@@ -1,11 +1,14 @@
 package config
 
+import "time"
+
 type Config struct {
 	Log    Log    `mapstructure:"log" json:"log" yaml:"log"`
 	Serve  Serve  `mapstructure:"serve" json:"serve" yaml:"serve"`
 	Mysql  Mysql  `mapstructure:"mysql" json:"mysql" yaml:"mysql"`
 	Redis  Redis  `mapstructure:"redis" json:"redis" yaml:"redis"`
 	AliOss AliOss `mapstructure:"ali-oss" json:"ali-oss" yaml:"ali-oss"`
+	EsClient     EsClient `mapstructure:"es_client" json:"es_client" yaml:"es_client"`
 }
 
 // Serve gin服务配置
@@ -64,3 +67,19 @@ type AliOss struct {
 	AccessKeyId     string `mapstructure:"access-key-id" json:"access-key-id" yaml:"access-key-id" description:"access-key-id"`
 	AccessKeySecret string `mapstructure:"access-key-secret" json:"access-key-secret" yaml:"access-key-secret" description:"access-key-secret"`
 }
+
+// EsClient es客户端配置
+type EsClient struct {
+	// 终端地址
+	Endpoints string `json:"endpoints" yaml:"endpoints"`
+	// 用户
+	Username string `json:"username" yaml:"username"`
+	// 密码
+	Password string `json:"password" yaml:"password"`
+	// 超时时间,单位ms
+	Timeout time.Duration `json:"timeout" yaml:"timeout"`
+	// es日志目录
+	Log string `json:"log" yaml:"log"`
+	// 索引前缀
+	Prefix  string `json:"prefix" yaml:"prefix"`
+}

+ 21 - 0
controller/company/company_permission.go

@@ -0,0 +1,21 @@
+package company
+
+import (
+	"github.com/gin-gonic/gin"
+	"hongze/hongze_yb/controller/response"
+	"hongze/hongze_yb/services/company"
+	userService "hongze/hongze_yb/services/user"
+)
+
+// GetHomeFiccPermissions 首页品种权限列表
+func GetHomeFiccPermissions(c *gin.Context) {
+	userinfo := userService.GetInfoByClaims(c)
+
+	list, err := company.GetHomeFiccPermissions(userinfo)
+	if err !=nil {
+		response.Fail(err.Error(), c)
+		return
+	}
+
+	response.OkData("获取成功", list, c)
+}

+ 114 - 0
controller/purchase/purchase.go

@@ -0,0 +1,114 @@
+package purchase
+
+import (
+	"fmt"
+	"github.com/gin-gonic/gin"
+	"hongze/hongze_yb/controller/response"
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/models/tables/company_product"
+	"hongze/hongze_yb/services/purchase"
+	userService "hongze/hongze_yb/services/user"
+	"hongze/hongze_yb/utils"
+	"strconv"
+	"strings"
+)
+
+// List 已购列表
+func List(c *gin.Context) {
+	userinfo := userService.GetInfoByClaims(c)
+	// 判断用户是否有已购权限
+	if userinfo.CompanyID == 0 {
+		response.Fail("无权操作", c)
+		return
+	}
+
+	// 判断用户状态是否是正常和永续
+	companyProduct, err := company_product.GetByCompany2ProductId(userinfo.CompanyID, 1)
+	if err != nil {
+		response.Fail("无权查看", c)
+		return
+	}
+	// 已购仅付费用户可见
+	if ! strings.Contains("永续,正式", companyProduct.Status) {
+		response.Fail("无权查看", c)
+		return
+	}
+	list, err := purchase.GetLatestReportAndActivity(userinfo)
+	if err !=nil {
+		response.Fail(err.Error(), c)
+		return
+	}
+
+	response.OkData("获取成功", list, c)
+}
+
+// Detail 已购详情
+func Detail(c *gin.Context)  {
+    reqClassifyIdFirst := c.DefaultQuery("classify_id_first", "")
+	reqActivityId := c.DefaultQuery("activity_id", "")
+
+	reqPageIndex := c.DefaultQuery("current_index", "1")
+	reqPageSize := c.DefaultQuery("page_size", strconv.Itoa(utils.PageSize20))
+
+	pageIndex, err := strconv.Atoi(reqPageIndex)
+	if err != nil {
+		response.Fail("请输入正确的条数限制", c)
+		return
+	}
+
+	pageSize, err := strconv.Atoi(reqPageSize)
+	if err != nil {
+		response.Fail("请输入正确的页码", c)
+		return
+	}
+
+	if reqClassifyIdFirst == "" && reqActivityId == "" {
+		response.Fail("请输入分类序号或者活动序号", c)
+		return
+	}
+
+	var activityId int
+	if reqActivityId != "" {
+		activityId, err = strconv.Atoi(reqActivityId)
+		if err != nil {
+			response.Fail("请输入正确的活动序号", c)
+			return
+		}
+	}
+
+	var classifyIdFirst int
+	if reqClassifyIdFirst != ""{
+		classifyIdFirst, err = strconv.Atoi(reqClassifyIdFirst)
+		if err != nil {
+			response.Fail("分类ID格式错误", c)
+			return
+		}
+	}
+
+
+	// 判断用户是否有已购权限
+	userinfo := userService.GetInfoByClaims(c)
+	if userinfo.CompanyID == 0 {
+		response.Fail("无权操作", c)
+		return
+	}
+	// 判断用户状态是否是正常和永续
+	companyProduct, err := company_product.GetByCompany2ProductId(userinfo.CompanyID, 1)
+	if err != nil {
+		response.Fail("无权查看", c)
+		return
+	}
+	// 已购仅付费用户可见
+	if ! strings.Contains("永续,正式", companyProduct.Status) {
+		response.Fail("无权查看", c)
+		return
+	}
+	list, err := purchase.GetDetail(userinfo, classifyIdFirst, activityId, pageIndex, pageSize)
+	if err != nil {
+		response.Fail(err.Error(), c)
+		global.LOG.Critical(fmt.Sprintf("userId=%d, errMsg:%s", userinfo.UserID, err.Error()))
+		return
+	}
+
+	response.OkData("获取成功", list, c)
+}

+ 134 - 0
controller/report/classify.go

@@ -0,0 +1,134 @@
+package report
+
+import (
+	"github.com/gin-gonic/gin"
+	"hongze/hongze_yb/controller/response"
+	reportService "hongze/hongze_yb/services/report"
+	userService "hongze/hongze_yb/services/user"
+	"hongze/hongze_yb/utils"
+	"strconv"
+)
+
+// ClassifyList 专栏列表
+func ClassifyList(c *gin.Context)  {
+	reqClassifyIdFirst := c.DefaultQuery("classify_id_first", "")
+	if reqClassifyIdFirst == "" {
+		response.Fail("请输入二级分类标识", c)
+		return
+	}
+
+	classifyIdFirst, err := strconv.Atoi(reqClassifyIdFirst)
+	if err != nil {
+		response.Fail("请输入正确的二级分类标识", c)
+		return
+	}
+	userinfo := userService.GetInfoByClaims(c)
+
+	classList, err := reportService.GetClassListByClassifyId(userinfo, classifyIdFirst)
+	if err != nil {
+		response.Fail(err.Error(), c)
+		return
+	}
+	response.OkData("查询成功", classList, c )
+	return
+}
+
+// ClassifyDetail 专栏详情
+func ClassifyDetail(c *gin.Context)  {
+	reqClassifyIdSecond := c.DefaultQuery("classify_id_second", "")
+	if reqClassifyIdSecond == "" {
+		response.Fail("请输入二级分类标识", c)
+		return
+	}
+
+	classifyIdSecond, err := strconv.Atoi(reqClassifyIdSecond)
+	if err != nil {
+		response.Fail("请输入正确的二级分类标识", c)
+		return
+	}
+	userinfo := userService.GetInfoByClaims(c)
+
+	detail, err := reportService.GetClassifyDetail(userinfo, classifyIdSecond)
+	if err != nil {
+		response.Fail(err.Error(), c)
+		return
+	}
+	response.OkData("查询成功", detail, c )
+	return
+}
+
+// ClassifyDetailReports 专栏目录列表
+func ClassifyDetailReports(c *gin.Context)  {
+	reqClassifyIdSecond := c.DefaultQuery("classify_id_second", "")
+	reqPageIndex := c.DefaultQuery("current_index", "1")
+	reqPageSize := c.DefaultQuery("page_size", strconv.Itoa(utils.PageSize20))
+
+	pageIndex, err := strconv.Atoi(reqPageIndex)
+	if err != nil {
+		response.Fail("请输入正确的条数限制", c)
+		return
+	}
+
+	pageSize, err := strconv.Atoi(reqPageSize)
+	if err != nil {
+		response.Fail("请输入正确的页码", c)
+		return
+	}
+
+	if reqClassifyIdSecond == "" {
+		response.Fail("请输入二级分类标识", c)
+		return
+	}
+
+	classifyIdSecond, err := strconv.Atoi(reqClassifyIdSecond)
+	if err != nil {
+		response.Fail("请输入正确的二级分类标识", c)
+		return
+	}
+
+	userinfo := userService.GetInfoByClaims(c)
+
+	detail, err := reportService.GetClassifyReportList(userinfo, classifyIdSecond, pageIndex, pageSize)
+	if err != nil {
+		response.Fail(err.Error(), c)
+		return
+	}
+	response.OkData("查询成功", detail, c )
+	return
+}
+
+// ClassifySimpleList 简单查询二级分类名称列表
+func ClassifySimpleList(c *gin.Context)  {
+	reqClassifyIdFirst := c.DefaultQuery("classify_id_first", "")
+	if reqClassifyIdFirst == ""{
+		response.Fail("请输入分类ID", c)
+		return
+	}
+	classifyIdFirst, err := strconv.Atoi(reqClassifyIdFirst)
+	if err != nil {
+		response.Fail("分类ID格式错误", c)
+		return
+	}
+	userinfo := userService.GetInfoByClaims(c)
+
+	classList, err := reportService.GetClassifySecondSimpleList(userinfo, classifyIdFirst)
+	if err != nil {
+		response.Fail(err.Error(), c)
+		return
+	}
+	response.OkData("查询成功", classList, c )
+	return
+}
+
+// ClassifyFirstList Ficc 菜单
+func ClassifyFirstList(c *gin.Context)  {
+	userinfo := userService.GetInfoByClaims(c)
+
+	classList, err := reportService.GetClassifyFirstList(userinfo)
+	if err != nil {
+		response.Fail(err.Error(), c)
+		return
+	}
+	response.OkData("查询成功", classList, c )
+	return
+}

+ 198 - 0
controller/report/report.go

@@ -0,0 +1,198 @@
+package report
+
+import (
+	"github.com/gin-gonic/gin"
+	"hongze/hongze_yb/controller/response"
+	"hongze/hongze_yb/services/report"
+	userService "hongze/hongze_yb/services/user"
+	"hongze/hongze_yb/utils"
+	"strconv"
+)
+
+// Detail 报告详情
+func Detail(c *gin.Context)  {
+	reqReportId := c.DefaultQuery("report_id", "")
+	if reqReportId == ""{
+		response.Fail("请输入报告ID", c)
+		return
+	}
+	reportId, err := strconv.Atoi(reqReportId)
+	if err != nil {
+		response.Fail("报告ID格式有误", c)
+		return
+	}
+	userinfo := userService.GetInfoByClaims(c)
+
+	reportDetail, err := report.GetReportDetail(userinfo, reportId)
+	if err != nil {
+		response.Fail(err.Error(), c)
+		return
+	}
+	response.OkData("查询成功", reportDetail, c )
+	return
+}
+
+// ChapterDetail 章节详情
+func ChapterDetail(c *gin.Context)  {
+	reqReportChapterId := c.DefaultQuery("report_chapter_id", "")
+	if reqReportChapterId == ""{
+		response.Fail("请输入章节ID", c)
+		return
+	}
+	reportChapterId, err := strconv.Atoi(reqReportChapterId)
+	if err != nil {
+		response.Fail("章节ID格式有误", c)
+		return
+	}
+	userinfo := userService.GetInfoByClaims(c)
+
+	chapterDetail, err := report.GetChapterDetail(userinfo, reportChapterId)
+	if err != nil {
+		response.Fail(err.Error(), c)
+		return
+	}
+	response.OkData("查询成功", chapterDetail, c )
+	return
+}
+
+// List 研报列表
+func List(c *gin.Context)  {
+	reqClassifyIdFirst := c.DefaultQuery("classify_id_first", "")
+	reqClassifyIdSec := c.DefaultQuery("classify_id_second", "")
+	keyWord:= c.DefaultQuery("key_word", "")
+	reqPageIndex := c.DefaultQuery("current_index", "1")
+	reqPageSize := c.DefaultQuery("page_size", strconv.Itoa(utils.PageSize20))
+
+	pageIndex, err := strconv.Atoi(reqPageIndex)
+	if err != nil {
+		response.Fail("请输入正确的条数限制", c)
+		return
+	}
+
+	pageSize, err := strconv.Atoi(reqPageSize)
+	if err != nil {
+		response.Fail("请输入正确的页码", c)
+		return
+	}
+
+	if reqClassifyIdFirst == ""{
+		response.Fail("请输入分类ID", c)
+		return
+	}
+	classifyIdFirst, err := strconv.Atoi(reqClassifyIdFirst)
+	if err != nil {
+		response.Fail("分类ID格式错误", c)
+		return
+	}
+	var classifyIdSecond int
+	if reqClassifyIdSec != ""{
+		classifyIdSecond, err = strconv.Atoi(reqClassifyIdSec)
+		if err != nil {
+			response.Fail("分类ID格式错误", c)
+			return
+		}
+	}
+
+	userinfo := userService.GetInfoByClaims(c)
+
+	list, err := report.GetReportList(userinfo, keyWord, classifyIdFirst, classifyIdSecond, pageIndex, pageSize)
+	if err != nil {
+		response.Fail(err.Error(), c)
+		return
+	}
+	response.OkData("查询成功", list, c )
+	return
+}
+
+// CollectReportList 首页研报汇总
+func CollectReportList(c *gin.Context) {
+	reqChartPermissionId := c.DefaultQuery("chart_permission_id", "")
+	reqPageIndex := c.DefaultQuery("current_index", "1")
+	reqPageSize := c.DefaultQuery("page_size", strconv.Itoa(utils.PageSize20))
+
+	pageIndex, err := strconv.Atoi(reqPageIndex)
+	if err != nil {
+		response.Fail("请输入正确的条数限制", c)
+		return
+	}
+
+	pageSize, err := strconv.Atoi(reqPageSize)
+	if err != nil {
+		response.Fail("请输入正确的页码", c)
+		return
+	}
+
+	if reqChartPermissionId == ""{
+		response.Fail("请输入权限ID", c)
+		return
+	}
+	chartPermissionId, err := strconv.Atoi(reqChartPermissionId)
+	if err != nil {
+		response.Fail("权限ID格式错误", c)
+		return
+	}
+	userinfo := userService.GetInfoByClaims(c)
+
+	list, err := report.GetCollectReportList(userinfo, chartPermissionId, pageIndex, pageSize)
+	if err != nil {
+		response.Fail(err.Error(), c)
+		return
+	}
+	response.OkData("查询成功", list, c )
+	return
+}
+
+// Search 首页研报搜索
+func Search(c *gin.Context) {
+	keyWord := c.DefaultQuery("key_word", "")
+	reqPageIndex := c.DefaultQuery("current_index", "1")
+	reqPageSize := c.DefaultQuery("page_size", strconv.Itoa(utils.PageSize20))
+
+	pageIndex, err := strconv.Atoi(reqPageIndex)
+	if err != nil {
+		response.Fail("请输入正确的条数限制", c)
+		return
+	}
+
+	pageSize, err := strconv.Atoi(reqPageSize)
+	if err != nil {
+		response.Fail("请输入正确的页码", c)
+		return
+	}
+
+	if keyWord == ""{
+		response.Fail("请输入搜索词", c)
+		return
+	}
+	userinfo := userService.GetInfoByClaims(c)
+	data, err := report.SearchReport(userinfo, keyWord, pageIndex, pageSize)
+	if err != nil {
+		response.Fail(err.Error(), c)
+		return
+	}
+	response.OkData("查询成功", data, c)
+	return
+}
+
+// TickerData 报告详情获取指标数据
+func TickerData(c *gin.Context)  {
+	reqReportChapterId := c.DefaultQuery("report_chapter_id", "")
+	if reqReportChapterId == ""{
+		response.Fail("请输入章节ID", c)
+		return
+	}
+	reportChapterId, err := strconv.Atoi(reqReportChapterId)
+	if err != nil {
+		response.Fail("章节ID格式有误", c)
+		return
+	}
+	userinfo := userService.GetInfoByClaims(c)
+
+	chapterDetail, err := report.GetTickerData(userinfo, reportChapterId)
+	if err != nil {
+		response.Fail(err.Error(), c)
+		return
+	}
+	response.OkData("查询成功", chapterDetail, c )
+	return
+}

+ 2 - 1
controller/user/user.go

@@ -254,7 +254,8 @@ func Apply(c *gin.Context) {
 // @Router /user/get_tab_bar [get]
 func GetTabBar(c *gin.Context) {
 	userInfo := userService.GetInfoByClaims(c)
-	tabBarList, err := userLogic.GetUserTabBar(userInfo)
+	version := c.Request.Header.Get("version")
+	tabBarList, err := userLogic.GetUserTabBar(userInfo, version)
 
 	if err != nil {
 		response.Fail("获取失败", c)

+ 4 - 0
core/run_server.go

@@ -16,7 +16,11 @@ func RunServe() {
 		//初始化redis
 		init_serve.Redis()
 	}
+	//初始化elasticSearch 搜索客户端
+	init_serve.NewEsClient()
 
+	//启动任务
+	init_serve.InitTask()
 	// 3.监听端口,默认在8080
 	// Run("里面不指定端口号默认为8080")
 	err := r.Run(fmt.Sprint("0.0.0.0:", global.CONFIG.Serve.Port)) // 监听并在 0.0.0.0:8080 上启动服务

+ 2 - 0
global/global.go

@@ -2,6 +2,7 @@ package global
 
 import (
 	"github.com/go-redis/redis/v8"
+	"github.com/olivere/elastic/v7"
 	oplogging "github.com/op/go-logging"
 	"gorm.io/gorm"
 	"hongze/hongze_yb/config"
@@ -15,4 +16,5 @@ var (
 	MYSQL_LOG     io.Writer
 	DEFAULT_MYSQL *gorm.DB      //默认数据库连接配置
 	Redis         *redis.Client //redis链接
+	EsClient      *elastic.Client
 )

+ 3 - 2
go.mod

@@ -12,12 +12,13 @@ require (
 	github.com/go-redis/redis/v8 v8.11.4
 	github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
 	github.com/jonboulle/clockwork v0.2.2 // indirect
-	github.com/json-iterator/go v1.1.12 // indirect
+	github.com/json-iterator/go v1.1.12
 	github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
 	github.com/lestrrat-go/strftime v1.0.5 // indirect
 	github.com/mattn/go-isatty v0.0.14 // indirect
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/nosixtools/solarlunar v0.0.0-20211112060703-1b6dea7b4a19
+	github.com/olivere/elastic/v7 v7.0.31
 	github.com/op/go-logging v0.0.0-20160315200505-970db520ece7
 	github.com/satori/go.uuid v1.2.0 // indirect
 	github.com/shopspring/decimal v1.2.0
@@ -28,7 +29,7 @@ require (
 	github.com/yidane/formula v0.0.0-20210902154546-0782e1736717
 	golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect
 	golang.org/x/image v0.0.0-20190802002840-cff245a6509b
-	golang.org/x/sys v0.0.0-20211107104306-e0b2ad06fe42 // indirect
+	golang.org/x/sys v0.0.0-20211107104306-e0b2ad06fe42
 	golang.org/x/text v0.3.7 // indirect
 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
 	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df

+ 33 - 0
init_serve/EsClient.go

@@ -0,0 +1,33 @@
+package init_serve
+
+import (
+	"github.com/olivere/elastic/v7"
+	"hongze/hongze_yb/global"
+	"log"
+	"os"
+)
+
+func NewEsClient()  {
+	esConfig := global.CONFIG.EsClient
+	client, err := elastic.NewClient(
+		elastic.SetURL(esConfig.Endpoints),                         // 支持多个地址,用逗号分隔即可
+		elastic.SetBasicAuth(esConfig.Username, esConfig.Password), // 基于http base auth 验证机制的账号密码
+		elastic.SetSniff(false),                                    // 是否应该定期检查集群
+		elastic.SetHealthcheck(false),                              // 是否开启健康检查
+	//	elastic.SetInfoLog(newEsLog(esConfig.Log+"/es_info.log", "Info")),
+	//	elastic.SetErrorLog(newEsLog(esConfig.Log+"/es_error.log", "Error")),
+	//	elastic.SetTraceLog(newEsLog(esConfig.Log+"/es_trace.log", "trace")),
+	)
+	if err != nil {
+		global.LOG.Error("newEsClient init error,err=", err)
+		panic("newEsClient 初始化失败:" + err.Error())
+	}
+
+	//全局赋值redis链接
+	global.EsClient = client
+}
+
+func newEsLog(file string, level string) *log.Logger {
+	logFile, _ := os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0766)
+	return log.New(logFile, "ES-"+level+": ", 0)
+}

+ 6 - 1
init_serve/router.go

@@ -43,6 +43,11 @@ func InitRouter() (r *gin.Engine) {
 	routers.InitResearchReport(r)
 	// 图库相关路由
 	routers.InitChart(r)
-
+	// 客户相关路由
+	routers.InitCompany(r)
+	// 已购页面相关路由
+	routers.InitPurchase(r)
+	// 研报相关路由
+	routers.InitReport(r)
 	return
 }

+ 14 - 0
init_serve/task.go

@@ -0,0 +1,14 @@
+package init_serve
+
+import (
+	"hongze/hongze_yb/task"
+)
+
+func InitTask()  {
+	chlist := task.GetTaskList()
+	go func() {
+		for l := range chlist {
+			l.Exec()
+		}
+	}()
+}

+ 16 - 17
logic/user/user.go

@@ -342,23 +342,22 @@ func Apply(userId int, companyId int64, mobile, email string, applyInfo userReq.
 }
 
 // GetUserTabBar 获取用户小程序TabBar
-func GetUserTabBar(userInfo user.UserInfo) (list []string, err error) {
-	//buy,report,chart,activity,user
+func GetUserTabBar(userInfo user.UserInfo, version string) (list []string, err error) {
+	// user-我的; activity-活动; chart-图表; report-研报; buy-已购
 	list = []string{"activity", "user", "chart"}
-
-	//companyProduct, err := company_product.GetByCompany2ProductId(userInfo.CompanyID, 1)
-	//if err != nil {
-	//	if err == utils.ErrNoRow {
-	//		err = nil
-	//	}
-	//	return
-	//}
-	//if strings.Contains("永续,正式,试用", companyProduct.Status) {
-	//	list = append(list, "report", "chart")
-	//}
-	//if strings.Contains("永续,正式", companyProduct.Status) {
-	//	list = append(list, "buy")
-	//}
-
+	if version == "yb3.0" {
+		list = []string{"activity", "user", "chart", "report"}
+		companyProduct, tmpErr := company_product.GetByCompany2ProductId(userInfo.CompanyID, 1)
+		if tmpErr != nil {
+			if tmpErr == utils.ErrNoRow {
+				err = nil
+			}
+			return
+		}
+		// 已购仅付费用户可见
+		if strings.Contains("永续,正式", companyProduct.Status) {
+			list = append(list, "buy")
+		}
+	}
 	return
 }

+ 1 - 1
middleware/token.go

@@ -70,7 +70,7 @@ func Token() gin.HandlerFunc {
 			c.Abort()
 			return
 		}
-
+		userInfo.LoginToken = token
 		c.Set("userInfo", userInfo)
 		c.Next()
 	}

+ 79 - 0
models/response/classify.go

@@ -0,0 +1,79 @@
+package response
+
+import (
+	"time"
+)
+
+type ClassifyListItem struct {
+	ClassifyIdSecond   int    `json:"classify_id_second"`
+	ClassifyNameSecond string `json:"classify_name_second"`
+	ParentId           int    `json:"parent_id"`
+	ReportAuthor       string `json:"report_author"`
+	AuthorDescript     string `json:"author_descript"`
+	HomeImgUrl         string `json:"home_img_url"`
+	Stage              int    `description:"期数" json:"stage"`
+	ProductName        string `json:"product_name"`
+}
+
+type ClassifyDetail struct {
+	ClassifyListItem
+	AvatarImgUrl    string               `json:"avatar_img_url"`
+	Abstract        string               `json:"abstract"`
+	Descript        string               `json:"descript"`
+	PermissionCheck *PermissionCheckInfo `json:"permission_check"`
+	AuthOk          bool                 `json:"auth_ok"`
+	VipTitle        string               `json:"vip_title"'`
+}
+
+type ClassReportListItem struct {
+	ReportId           int       `description:"报告Id" json:"report_id"`
+	ClassifyIdFirst    int       `description:"一级分类id" json:"classify_id_first"`
+	ClassifyNameFirst  string    `description:"一级分类名称" json:"classify_name_first"`
+	ClassifyIdSecond   int       `description:"二级分类id" json:"classify_id_second"`
+	ClassifyNameSecond string    `description:"二级分类名称" json:"classify_name_second"`
+	Title              string    `description:"标题" json:"title"`
+	Abstract           string    `description:"摘要" json:"abstract"`
+	Author             string    `description:"作者" json:"author"`
+	ReportImgUrl       string    `description:"作者头像" json:"report_img_url"`
+	PublishTime        time.Time `description:"发布时间" json:"publish_time"`
+	Stage              int       `description:"期数" json:"stage"`
+	VideoUrl           string    `description:"音频文件URL" json:"video_url"`
+	VideoName          string    `json:"video_name"`         //音频文件名称
+	VideoPlaySeconds   string    `json:"video_play_seconds"` //音频播放时长
+}
+type ClassReportList struct {
+	List            []*ClassReportListItem `json:"list"`
+	PermissionCheck *PermissionCheckInfo   `json:"permission_check"`
+	AuthOk          bool                   `json:"auth_ok"`
+	Paging          *PagingItem            `json:"paging"`
+}
+
+type ClassifySimpleListItem struct {
+	ClassifyIdSecond         int    `json:"classify_id_second"`
+	ClassifyNameSecond       string `json:"classify_name_second"`
+	ClassifySecondNameSimple string `json:"classify_second_simple"`
+}
+
+type ClassifyFirstListItem struct {
+	ClassifyIdFirst    int    `description:"一级分类id" json:"classify_id_first"`
+	ClassifyIdSecond   int    `json:"classify_id_second"`
+	ClassifyNameFirst  string `description:"一级分类名称" json:"classify_name_first"`
+	ClassifyNameSecond string `json:"classify_name_second"`
+	IconImgUrl         string `json:"icon_img_url"`
+	Sort               int    `json:"sort"`
+	RedirectType       int    `description:"跳转页面类型:1,专栏列表,2报告列表,3专栏详情" json:"redirect_type"`
+}
+
+type ClassifyFirstList []*ClassifyFirstListItem
+
+func (c ClassifyFirstList) Len() int {
+	return len(c)
+}
+
+func (c ClassifyFirstList) Less(i, j int) bool {
+	return c[i].Sort < c[j].Sort
+}
+
+func (c ClassifyFirstList) Swap(i, j int) {
+	c[i], c[j] = c[j], c[i]
+}

+ 62 - 0
models/response/paging.go

@@ -0,0 +1,62 @@
+package response
+
+import "hongze/hongze_yb/utils"
+
+type PagingItem struct {
+	IsStart       bool `description:"是否首页" json:"is_start"`
+	IsEnd         bool `description:"是否最后一页" json:"is_end"`
+	PreviousIndex int  `description:"上一页页码"  json:"previous_index"`
+	NextIndex     int  `description:"下一页页码"  json:"next_index"`
+	CurrentIndex  int  `description:"当前页页码" json:"current_index"`
+	Pages         int  `description:"总页数"    json:"pages"`
+	Totals        int  `description:"总数据量"  json:"totals"`
+	PageSize      int  `description:"每页数据条数" json:"page_size"`
+}
+
+func GetPaging(currentIndex,pageSize,total int)(item *PagingItem)  {
+	if pageSize<=0 {
+		pageSize=utils.PageSize20
+	}
+	if currentIndex<=0 {
+		currentIndex=1
+	}
+	item=new(PagingItem)
+	item.PageSize=pageSize
+	item.Totals=total
+	item.CurrentIndex=currentIndex
+
+	if total<=0 {
+		item.IsStart=true
+		item.IsEnd=true
+		return
+	}
+	pages:=utils.PageCount(total,pageSize)
+	item.Pages=pages
+	if pages<=1 {
+		item.IsStart=true
+		item.IsEnd=true
+		item.PreviousIndex=1
+		item.NextIndex=1
+		return
+	}
+	if pages == currentIndex {
+		item.IsStart=false
+		item.IsEnd=true
+		item.PreviousIndex=currentIndex-1
+		item.NextIndex=currentIndex
+		return
+	}
+	if currentIndex==1 {
+		item.IsStart=true
+		item.IsEnd=false
+		item.PreviousIndex=1
+		item.NextIndex=currentIndex+1
+		return
+	}
+	item.IsStart=false
+	item.IsEnd=false
+	item.PreviousIndex=currentIndex-1
+	item.NextIndex=currentIndex+1
+	return
+}
+

+ 81 - 0
models/response/permission.go

@@ -0,0 +1,81 @@
+package response
+
+type PermissionFirstItem struct {
+	AuthOk     bool
+	Sort       int
+	IsCheck    bool
+	List       PermissionFiccSecondList
+}
+
+type PermissionFiccItem struct {
+	ClassifyName    string   `json:"classify_name"`
+	List            PermissionFiccSecondList   `json:"list"`
+	Sort           int       `json:"sort"`
+	IconUrl       string     `json:"icon_url"`
+	SelectIconUrl     string     `json:"select_icon_url"`
+}
+
+type PermissionFiccSecondItem struct {
+	ChartPermissionName string    `json:"chart_permission_name"`
+	ChartPermissionID   int    `json:"chart_permission_id"`
+	Sort           int 	`json:"sort"`
+	AuthOk     bool   `json:"auth_ok"`
+}
+
+type PermissionFiccResp struct {
+	PermissionList 	PermissionFiccList `json:"permission_list"`
+	ContactInfo     PermissionCheckContactInfo    `json:"contact_info"`
+	CheckFlag    bool        `json:"check_flag"`
+}
+type PermissionFiccList []*PermissionFiccItem
+
+func (p PermissionFiccList) Len() int {
+	return len(p)
+}
+
+func (p PermissionFiccList) Less(i, j int) bool {
+	return p[i].Sort < p[j].Sort
+}
+
+func (p PermissionFiccList) Swap(i, j int) {
+	p[i], p[j] = p[j], p[i]
+}
+
+type PermissionFiccSecondList []*PermissionFiccSecondItem
+
+func (ps PermissionFiccSecondList) Len() int {
+	return len(ps)
+}
+
+func (ps PermissionFiccSecondList) Less(i, j int) bool {
+	return ps[i].Sort < ps[j].Sort
+}
+
+func (ps PermissionFiccSecondList) Swap(i, j int) {
+	ps[i], ps[j] = ps[j], ps[i]
+}
+
+// PermissionCheckInfo 权限校验完成后的结果
+type PermissionCheckInfo struct {
+	Name         string       `json:"name" description:"销售名称"`
+	Mobile       string       `json:"mobile" description:"手机号"`
+	Type         string       `json:"type" description:"校验失败,没有权限,需要让前端处理的类型,枚举值:apply,contact"`
+	HzPhone      string       `json:"hz_phone" description:"弘则公司电话"`
+	CustomerInfo CustomerInfo `json:"customer_info" description:"客户信息"`
+}
+
+// PermissionCheckInfoContact 权限校验完成后的结果
+type PermissionCheckContactInfo struct {
+	Name         string       `json:"name" description:"销售名称"`
+	Mobile       string       `json:"mobile" description:"手机号"`
+}
+
+// CustomerInfo 客户信息
+type CustomerInfo struct {
+	CompanyName string `json:"company_name" description:"客户(公司)名称"`
+	Name        string `json:"name" description:"联系人名称"`
+	Mobile      string `json:"mobile" description:"手机号"`
+	Status      string `json:"status" description:"状态"`
+	IsSuspend   int8   `json:"is_suspend" description:"启用与否字段:1:暂停,0:启用"`
+	HasApply    bool   `json:"has_apply" description:"是否有申请过"`
+}

+ 53 - 0
models/response/purchase/purchase.go

@@ -0,0 +1,53 @@
+package purchase
+
+import (
+	"hongze/hongze_yb/models/response"
+	"time"
+)
+
+type PurchaseListItem struct {
+	item
+	Unread             int    `description:"未读数" json:"unread"`
+}
+
+type DetailResp struct {
+	List []*Detail  `json:"list"`
+	Paging  *response.PagingItem `json:"paging"`
+}
+
+type Detail struct {
+	item
+	TopName         string   `description:"主标题" json:"top_name"`
+}
+
+type item struct {
+	ReportId           int    `description:"报告Id" json:"report_id"`
+	ActivityId		   int 	  `description:"活动ID" json:"activity_id"`
+	ClassifyIdFirst    int    `description:"一级分类id" json:"classify_id_first"`
+	ClassifyNameFirst  string `description:"一级分类名称" json:"classify_name_first"`
+	ClassifyIdSecond   int    `description:"二级分类id" json:"classify_id_second"`
+	ClassifyNameSecond string `description:"二级分类名称" json:"classify_name_second"`
+	Title              string `description:"标题" json:"title"`
+	Content            string `description:"简介" json:"content"`
+	Stage              int	  `description:"期数" json:"stage"`
+	Time               time.Time `description:"更新时间" json:"time"`
+	ImgUrl             string   `description:"背景图地址" json:"img_url"`
+}
+
+type PurchaseList []*PurchaseListItem
+
+func (p PurchaseList) Len() int {
+	return len(p)
+}
+
+func (p PurchaseList) Less(i, j int) bool {
+	if p[i].Time.Before(p[j].Time) {
+		return false
+	}
+	return true
+}
+
+func (p PurchaseList) Swap(i, j int) {
+	p[i], p[j] = p[j], p[i]
+}
+

+ 216 - 0
models/response/report.go

@@ -0,0 +1,216 @@
+package response
+
+import (
+	"time"
+)
+
+type ReportDetail struct {
+	ReportInfo          *ReportItem  `json:"report_info"`
+	ReportChapterList        []*ReportChapterListItem `json:"report_chapter_list"`
+	PermissionCheck     *PermissionCheckInfo    `json:"permission_check"`
+	AuthOk              bool `json:"auth_ok"`
+}
+
+type ReportChapterListItem struct {
+	ReportChapterId    int    `json:"report_chapter_id"`
+	ReportId        int    `json:"report_id"`
+	Title           string    `json:"title"`
+	TypeId                  int         `json:"type_id"`
+	TypeName                string         	`json:"type_name"`
+	Trend                   string      `json:"trend"`
+	ReportChapterTypeKey    string      `json:"report_chapter_type_key"`
+	ReportChapterTypeThumb  string	    `json:"report_chapter_type_thumb"`
+	ReportChapterTypeName   string       `json:"report_chapter_type_name"`
+	Sort                    int          `json:"sort"`
+	PublishTime         time.Time    `json:"publish_time"`
+}
+
+type ReportItem struct {
+	ReportId           int    `json:"report_id"`
+	ClassifyNameFirst  string `description:"一级分类名称" json:"classify_name_first"`
+	ClassifyNameSecond string `description:"二级分类名称" json:"classify_name_second"`
+	Title              string `description:"标题" json:"title"`
+	Abstract           string `description:"摘要" json:"abstract"`
+	Author             string `description:"作者" json:"author"`
+	Frequency          string `description:"频度" json:"frequency"`
+	PublishTime        time.Time `description:"发布时间" json:"publish_time"`
+	Stage              int    `description:"期数" json:"stage"`
+	Content            string `description:"内容" json:"content"`
+	VideoUrl           string `description:"音频文件URL" json:"video_url"`
+	VideoName          string `description:"音频文件名称" json:"video_name"`
+	VideoPlaySeconds   string `description:"音频播放时长" json:"video_play_seconds"`
+	ContentSub         string `description:"内容前两个章节" json:"content_sub"`
+	BannerUrl          string `description:"详情页banner" json:"banner_url"`
+}
+
+type ReportChapterItem struct {
+	ReportChapterId    int    `json:"report_chapter_id"`
+	ReportId        int    `json:"report_id"`
+	Title           string    `json:"title"`
+	TypeId                  int         `json:"type_id"`
+	TypeName                string         	`json:"type_name"`
+	Trend                   string      `json:"trend"`
+	ReportChapterTypeName   string       `json:"report_chapter_type_name"`
+	PublishTime         time.Time    `json:"publish_time"`
+	Content            string `description:"内容" json:"content"`
+	ContentSub         string `description:"内容前两个章节" json:"content_sub"`
+	VideoUrl            string    `json:"video_url"`                    //音频文件URL
+	VideoName           string    `json:"video_name"`                  //音频文件名称
+	VideoPlaySeconds    string    `json:"video_play_seconds"`      //音频播放时长
+	VideoSize           string    `json:"video_size"`
+	Author              string    `description:"作者" json:"author"`
+	Stage              int        `description:"期数" json:"stage"`
+	ClassifyIdFirst    int        `description:"一级分类id" json:"classify_id_first"`
+	ClassifyNameFirst  string     `description:"一级分类名称" json:"classify_name_first"`
+}
+
+type ReportChapterDetail struct {
+	ReportChapterItem  * ReportChapterItem  `json:"report_chapter_item"`
+	PermissionCheck     *PermissionCheckInfo    `json:"permission_check"`
+	ReportChapterMenuList        []*ReportChapterMenu `json:"report_chapter_menu_list""`
+	AuthOk              bool `json:"auth_ok"`
+}
+
+type ReportChapterMenu struct {
+	ReportChapterId    int    `json:"report_chapter_id"`
+	ReportId        int    `json:"report_id"`
+	ReportChapterTypeName   string       `json:"report_chapter_type_name"`
+	ReportChapterTypeThumb  string	    `json:"report_chapter_type_thumb"`
+	Sort             int  `json:"sort"`
+}
+
+type ReportListItem struct {
+	ReportId                 int    `description:"报告Id" json:"report_id"`
+	ClassifyIdFirst    int    `description:"一级分类id" json:"classify_id_first"`
+	ClassifyNameFirst  string `description:"一级分类名称" json:"classify_name_first"`
+	ClassifyIdSecond   int    `description:"二级分类id" json:"classify_id_second"`
+	ClassifyNameSecond string `description:"二级分类名称" json:"classify_name_second"`
+	Title              string `description:"标题" json:"title"`
+	Abstract           string `description:"摘要" json:"abstract"`
+	Author             string `description:"作者" json:"author"`
+	ReportImgUrl       string `description:"作者头像" json:"report_img_url"`
+	PublishTime        time.Time `description:"发布时间" json:"publish_time"`
+	Stage              int    `description:"期数" json:"stage"`
+	VideoList          []*VideoListItem `json:"video_list"`
+	AuthOk             bool   `json:"auth_ok"`
+	TitleInfo          string `json:"title_info"`
+}
+
+type VideoListItem struct {
+	VideoUrl            string `description:"音频文件URL" json:"video_url"`
+	Sort                int `description:"音频内容排序" json:"sort"`
+	VideoName           string    `json:"video_name"`               //音频文件名称
+	VideoPlaySeconds    string    `json:"video_play_seconds"`      //音频播放时长
+}
+
+type ReportList struct {
+	Paging     *PagingItem  		`json:"paging"`
+	List        []*ReportListItem `json:"list"`
+}
+
+type ReportCollectListItem struct {
+	ReportId                 int    `description:"报告Id" json:"report_id"`
+	ReportChapterId    int    `json:"report_chapter_id"`
+	ClassifyIdFirst    int    `description:"一级分类id" json:"classify_id_first"`
+	ClassifyNameFirst  string `description:"一级分类名称" json:"classify_name_first"`
+	ClassifyIdSecond   int    `description:"二级分类id" json:"classify_id_second"`
+	ClassifyNameSecond string `description:"二级分类名称" json:"classify_name_second"`
+	ReportChapterTypeId                  int         `json:"report_chapter_type_id"`
+	PublishTime        time.Time `description:"发布时间" json:"publish_time"`
+	Title              string `description:"标题" json:"title"`
+	ContentSub         string `description:"内容前两个章节" json:"content_sub"`
+}
+
+type ReportCollectList struct {
+	Date     string   	`json:"date"`
+	SubList  []*ReportCollectListItem `json:"sub_list"`
+}
+
+type ReportCollectResp struct {
+	Paging     *PagingItem  		`json:"paging"`
+	List []*ReportCollectList `json:"list"`
+}
+
+type ReportSearchResp struct {
+	Paging     *PagingItem  		`json:"paging"`
+	List []*ReportCollectListItem `json:"list"`
+}
+
+type EsReportItem struct {
+	Author             string `description:"作者"`
+	BodyContent        string `description:"内容"`
+	Categories         string `description:"品种名称"`
+	ClassifyIdFirst    int    `description:"一级分类id"`
+	ClassifyNameFirst  string `description:"一级分类名称"`
+	ClassifyIdSecond   int    `description:"二级分类id"`
+	ClassifyNameSecond string `description:"二级分类名称"`
+	PublishState       int    `description:"1:未发布,2:已发布"`
+	PublishTime        string `description:"发布时间"`
+	ReportChapterId    int    `description:"报告章节Id"`
+	ReportId           int    `description:"报告Id"`
+	Title              string `description:"标题"`
+	Abstract           string `description:"摘要"`
+	StageStr           string `description:"期数"`
+}
+
+type TickerDataItem struct {
+	Date             string        `json:"date"`
+	Ticker			 string        `json:"ticker"`
+	BaseColumnName   string        `json:"base_column_name"`
+	TickerValue      float64       `json:"ticker_value"`
+	LastValue        float64       `json:"last_value"`
+	DdValue          float64       `json:"dd_value"`
+	WwValue          float64       `json:"ww_value"`
+	MmValue          float64       `json:"mm_value"`
+}
+type TickerTitleData struct {
+	TickerTitle      string      `json:"ticker_title"`
+	ReportChapterTypeId  int     `json:"report_chapter_type_id"`
+	ReportChapterTypeName string `json:"report_chapter_type_name"`
+	DataTableImage string   `json:"data_table_image"`
+}
+type TickerData struct {
+	List []*TickerDataItem `json:"list"`
+	TickerTitle *TickerTitleData `json:"ticker_title"`
+}
+
+type ReportCollectListResp []*ReportCollectList
+
+func (p ReportCollectListResp) Len() int {
+	return len(p)
+}
+
+func (p ReportCollectListResp) Less(i, j int) bool {
+	return p[i].Date > p[j].Date
+}
+
+func (p ReportCollectListResp) Swap(i, j int) {
+	p[i], p[j] = p[j], p[i]
+}
+
+type ReportChapterList []*ReportChapterListItem
+func (r ReportChapterList) Len() int {
+	return len(r)
+}
+
+func (r ReportChapterList) Less(i, j int) bool {
+	return r[i].Sort < r[j].Sort
+}
+
+func (r ReportChapterList) Swap(i, j int) {
+	r[i], r[j] = r[j], r[i]
+}
+
+type ReportChapterMenuList []*ReportChapterMenu
+
+func (rc ReportChapterMenuList) Len() int {
+	return len(rc)
+}
+
+func (rc ReportChapterMenuList) Less(i, j int) bool {
+	return rc[i].Sort < rc[j].Sort
+}
+
+func (rc ReportChapterMenuList) Swap(i, j int) {
+	rc[i], rc[j] = rc[j], rc[i]
+}

+ 1 - 0
models/tables/chart_permission/chart_permission.go

@@ -21,6 +21,7 @@ type ChartPermission struct {
 	IsOther             int8      `gorm:"column:is_other;type:tinyint(2);not null;default:0" json:"isOther"`                   // 是否是其他,用于查研观向小程序后台展示
 	IsReport            int8      `gorm:"index:is_report;column:is_report;type:tinyint(4);not null;default:0" json:"isReport"` // 是否是报告,用于查研观向小程序前台报告展示
 	CygxAuth            int8      `gorm:"column:cygx_auth;type:tinyint(4);not null;default:0" json:"cygxAuth"`                 // 是否是权限,用于查研观向小程序前台权限校验
+	YbImgUrl            string      `gorm:"column:yb_img_url;type:varchar(255)" json:"yb_img_url"`                            // 研报小程序报告列表icon
 }
 
 // TableName get sql table name.获取数据库表名

+ 20 - 0
models/tables/chart_permission/query.go

@@ -12,6 +12,11 @@ func GetListByProductId(productId int64) (list []*ChartPermission, err error) {
 	return
 }
 
+// GetFiccListExceptTacticByProductId 获取ficc 除了市场策略的所有权限
+func GetFiccListExceptTacticByProductId() (list []*ChartPermission, err error)  {
+	err = global.DEFAULT_MYSQL.Where(" enabled = 1 AND permission_type = 0 AND product_id = 1 and classify_name != '市场策略'").Find(&list).Error
+	return
+}
 // GetClassNameListByProductId 根据权限id获取权限分类
 func GetClassNameListByProductId(productId int64) (list []*ChartPermission, err error) {
 	err = global.DEFAULT_MYSQL.Where(" product_id = ?", productId).Group("classify_name").Find(&list).Error
@@ -34,3 +39,18 @@ func GetListByIds(permissionIds []int) (list []*ChartPermission, err error) {
 	err = global.DEFAULT_MYSQL.Model(ChartPermission{}).Where("chart_permission_id IN (?)", permissionIds).Scan(&list).Error
 	return
 }
+
+// GetListByProductIdAndClassifyName 根据product及classify_name获取集合
+func GetListByProductIdAndClassifyName(productId int, classifyName string) (items []*ChartPermission, err error) {
+	err = global.DEFAULT_MYSQL.Model(ChartPermission{}).Where("enabled = 1 AND permission_type = 0 AND product_id = ? AND classify_name = ?", productId, classifyName).Order("sort ASC").Scan(&items).Error
+	return
+}
+
+// GetByChartPermissionId 根据chartPermissionId 查找权限基本信息
+func GetByChartPermissionId(chartPermissionId int) (item *ChartPermission, err error)  {
+	err = global.DEFAULT_MYSQL.Model(ChartPermission{}).Where("chart_permission_id = ?", chartPermissionId).First(&item).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	return
+}

+ 13 - 0
models/tables/chart_permission_chapter_mapping/chart_permission_chapter_mapping.go

@@ -0,0 +1,13 @@
+package chart_permission_chapter_mapping
+
+type ChartPermissionChapterMapping struct {
+	ID                   int  `gorm:"primaryKey;column:id;type:int(11) unsigned;not null" json:"-"`
+	ChartPermissionId    int  `gorm:"column:chart_permission_id;type:int(11)" json:"chart_permission_id"`
+	ReportChapterTypeId  int  `gorm:"column:report_chapter_type_id;type:int(11)" json:"report_chapter_type_id"`
+	ResearchType         string `gorm:"column:research_type;type:varchar(100)" json:"research_type"`
+}
+
+
+func (r *ChartPermissionChapterMapping) TableName() string {
+	return "chart_permission_chapter_mapping"
+}

+ 50 - 0
models/tables/chart_permission_chapter_mapping/query.go

@@ -0,0 +1,50 @@
+package chart_permission_chapter_mapping
+
+import (
+	"hongze/hongze_yb/global"
+)
+
+// GetReportIdsByPermisssionIds 根据权限ID筛选报告ID, rddp 类型表示新后台新增的报告,区分老后台
+func GetReportIdsByPermisssionIds(permissionIds []int, researchType string) (reportIds []int, err error)  {
+	var charPermissionMapping []*ChartPermissionChapterMapping
+	err = global.DEFAULT_MYSQL.Model(ChartPermissionChapterMapping{}).Select("DISTINCT report_chapter_type_id ").Where("chart_permission_id in (?) AND research_type = ? ", permissionIds, researchType).Scan(&charPermissionMapping).Error
+	if err != nil {
+		return
+	}
+	for _, v := range charPermissionMapping {
+		reportIds = append(reportIds, v.ReportChapterTypeId)
+	}
+	return
+}
+
+// GetPermissionIdsByReportId 根据报告ID筛选出对应的权限
+func GetPermissionIdsByReportId(reportId int, researchType string) (permissionIds []int, err error)  {
+	var charPermissionMapping []*ChartPermissionChapterMapping
+	err = global.DEFAULT_MYSQL.Model(ChartPermissionChapterMapping{}).
+		Select("DISTINCT chart_permission_id").
+		Where("report_chapter_type_id = ? and research_type = ? ", reportId, researchType).
+		Scan(&charPermissionMapping).Error
+	if err != nil {
+		return
+	}
+	for _, v := range charPermissionMapping {
+		permissionIds = append(permissionIds, v.ChartPermissionId)
+	}
+	return
+}
+
+// GetPermissionIdsByWeek 根据报告ID筛选出对应的权限
+func GetPermissionIdsByWeek() (permissionIds []int, err error)  {
+	var charPermissionMapping []*ChartPermissionChapterMapping
+	err = global.DEFAULT_MYSQL.Model(ChartPermissionChapterMapping{}).
+		Select("DISTINCT chart_permission_id").
+		Where("research_type = 'week'").
+		Scan(&charPermissionMapping).Error
+	if err != nil {
+		return
+	}
+	for _, v := range charPermissionMapping {
+		permissionIds = append(permissionIds, v.ChartPermissionId)
+	}
+	return
+}

+ 14 - 0
models/tables/chart_permission_search_key_word_mapping/chart_permission_search_key_word_mapping.go

@@ -0,0 +1,14 @@
+package chart_permission_search_key_word_mapping
+
+type ChartPermissionSearchKeyWordMapping struct {
+	Id        		  int  `orm:"primaryKey;column:id;type:int(11) unsigned;not null" json:"-"`
+	ChartPermissionId int  	`gorm:"column:chart_permission_id;type:int(11)" json:"chart_permission_id"`
+	KeyWord          string  `gorm:"column:key_word;type:varchar(100)" json:"key_word"`
+	From             string   `gorm:"column:from;type:varchar(100)" json:"from"`
+	TacticType       string	 `gorm:"column:tactic_type;type:varchar(100)" json:"tactic_type"`
+	TeleconferenceSort int		`gorm:"column:teleconference_sort;type:int(11)" json:"teleconference_sort"`
+}
+
+func (c *ChartPermissionSearchKeyWordMapping) TableName() string {
+	return "chart_permission_search_key_word_mapping"
+}

+ 46 - 0
models/tables/chart_permission_search_key_word_mapping/query.go

@@ -0,0 +1,46 @@
+package chart_permission_search_key_word_mapping
+
+import (
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/utils"
+)
+
+// GetChartPermissionIdsByKeyWord 查询二级分类中的权限
+func GetChartPermissionIdsByKeyWord(keyWord string) (ids []int, err error)  {
+	var list []*ChartPermissionSearchKeyWordMapping
+	err = global.DEFAULT_MYSQL.Model(ChartPermissionSearchKeyWordMapping{}).Where("key_word = ? and `from` = 'rddp' ", keyWord).Scan(&list).Error
+	if err != nil && err != utils.ErrNoRow {
+		return
+	}
+	if len(list) > 0 {
+		for _, item := range list {
+			ids = append(ids, item.ChartPermissionId)
+		}
+	}
+	return
+}
+
+
+// GetChartPermissionByFrom 查询二级分类中的权限
+func GetChartPermissionByFrom(from string) (list []*ChartPermissionSearchKeyWordMapping, err error)  {
+	err = global.DEFAULT_MYSQL.Model(ChartPermissionSearchKeyWordMapping{}).Where("`from` = ? and chart_permission_id != 33", from).Scan(&list).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	return
+}
+
+// GetKeyWordsByChartPermissionId 根据权限ID, 查询二级分类名称
+func GetKeyWordsByChartPermissionId(charPermissionId int, from string) (keyWords []string, err error)  {
+	var list []*ChartPermissionSearchKeyWordMapping
+	err = global.DEFAULT_MYSQL.Model(ChartPermissionSearchKeyWordMapping{}).Where("chart_permission_id = ? and `from` = ? ", charPermissionId, from).Scan(&list).Error
+	if err != nil && err != utils.ErrNoRow {
+		return
+	}
+	if len(list) > 0 {
+		for _, item := range list {
+			keyWords = append(keyWords, item.KeyWord)
+		}
+	}
+	return
+}

+ 21 - 0
models/tables/daily_base_column/daily_base_column.go

@@ -0,0 +1,21 @@
+package daily_base_column
+
+import "time"
+
+type DailyBaseColumn struct {
+	BaseColumnId int `gorm:"column:base_column_id" db:"base_column_id" json:"base_column_id" form:"base_column_id"`
+	TableName1 string `gorm:"column:table_name" db:"table_name" json:"table_name" form:"table_name"`
+	BaseColumnName string `gorm:"column:base_column_name" db:"base_column_name" json:"base_column_name" form:"base_column_name"` //基础列名称
+	BaseColumnChapterType string `gorm:"column:base_column_chapter_type" db:"base_column_chapter_type" json:"base_column_chapter_type" form:"base_column_chapter_type"` //基础列类型
+	BaseColumnTicker string `gorm:"column:base_column_ticker" db:"base_column_ticker" json:"base_column_ticker" form:"base_column_ticker"`
+	Enabled int8 `gorm:"column:enabled" db:"enabled" json:"enabled" form:"enabled"`
+	CreatedTime time.Time `gorm:"column:created_time" db:"created_time" json:"created_time" form:"created_time"` //创建时间
+	LastUpdatedTime int64 `gorm:"column:last_updated_time" db:"last_updated_time" json:"last_updated_time" form:"last_updated_time"`
+	Freq string `gorm:"column:freq" db:"freq" json:"freq" form:"freq"`
+	Catalog string `gorm:"column:catalog" db:"catalog" json:"catalog" form:"catalog"`
+	ReportChapterTypeId int64 `gorm:"column:report_chapter_type_id" db:"report_chapter_type_id" json:"report_chapter_type_id" form:"report_chapter_type_id"` //分类id
+}
+
+func (d *DailyBaseColumn) TableName() string  {
+	return "daily_base_column"
+}

+ 97 - 0
models/tables/daily_base_column/query.go

@@ -0,0 +1,97 @@
+package daily_base_column
+
+import (
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/models/response"
+)
+
+// GetDataByBaseColumnTickers17 获取数据指标
+func GetDataByBaseColumnTickers17(tickers []string) (list []*response.TickerDataItem, err error) {
+	sql :=`SELECT
+ ifnull(max(doo.date), max(dd.date)) AS date,
+ dbc.base_column_ticker AS ticker,
+ dbc.base_column_name,
+ ifnull(
+  (
+   SELECT
+
+   VALUE
+
+   FROM
+    daily_data
+   WHERE
+    ticker = dbc.base_column_ticker
+   AND date = ifnull(max(doo.date), max(dd.date))
+  ),
+  (
+   SELECT
+
+   VALUE
+
+   FROM
+    daily_original
+   WHERE
+    ticker = dbc.base_column_ticker
+   AND date = ifnull(max(doo.date), max(dd.date))
+  )
+ ) AS ticker_value,
+ ifnull(
+  (
+   SELECT
+
+   VALUE
+
+   FROM
+    daily_data
+   WHERE
+    ticker = dbc.base_column_ticker
+   AND date < ifnull(max(doo.date), max(dd.date))
+   ORDER BY
+    date DESC
+   LIMIT 1
+  ),
+  (
+   SELECT
+
+   VALUE
+
+   FROM
+    daily_original
+   WHERE
+    ticker = dbc.base_column_ticker
+   AND date < ifnull(max(doo.date), max(dd.date))
+   ORDER BY
+    date DESC
+   LIMIT 1
+  )
+ ) AS last_value
+FROM
+ daily_base_column AS dbc
+LEFT JOIN daily_data AS dd ON dbc.base_column_ticker = dd.ticker
+LEFT JOIN daily_original AS doo ON dbc.base_column_ticker = doo.ticker
+WHERE
+ dbc.base_column_ticker IN ?
+GROUP BY
+ dbc.base_column_ticker`
+	err = global.DEFAULT_MYSQL.Raw(sql, tickers).Scan(&list).Error
+	return
+}
+
+// GetDataByBaseColumnTickers 获取数据指标
+func GetDataByBaseColumnTickers(tickers []string) (list []*response.TickerDataItem, err error) {
+	sql :=`select ifnull(max(doo.date),max(dd.date)) as date,dbc.base_column_ticker as ticker,dbc.base_column_name ,
+            ifnull((select value from daily_data where ticker = dbc.base_column_ticker and date <= ifnull(max(doo.date),max(dd.date)) and value is not null order by date desc limit 1),(select value from daily_original where ticker = dbc.base_column_ticker and date <= ifnull(max(doo.date),max(dd.date)) and value is not null order by date desc limit 1)) as ticker_value,
+            ifnull((select value from daily_data where ticker = concat(dbc.base_column_ticker,'_dd') and date <= ifnull(max(doo.date),max(dd.date)) and value is not null order by date desc limit 1),(select value from daily_original where ticker = concat(dbc.base_column_ticker,'_dd') and date <= ifnull(max(doo.date),max(dd.date))and value is not null order by date desc limit 1)) as dd_value,
+            ifnull((select value from daily_data where ticker = concat(dbc.base_column_ticker,'_ww') and date <= ifnull(max(doo.date),max(dd.date)) and value is not null order by date desc limit 1),(select value from daily_original where ticker = concat(dbc.base_column_ticker,'_ww') and date <= ifnull(max(doo.date),max(dd.date)) and value is not null order by date desc limit 1)) as ww_value,
+            ifnull((select value from daily_data where ticker = concat(dbc.base_column_ticker,'_mm') and date <= ifnull(max(doo.date),max(dd.date)) and value is not null order by date desc limit 1),(select value from daily_original where ticker = concat(dbc.base_column_ticker,'_mm') and date <= ifnull(max(doo.date),max(dd.date)) and value is not null order by date desc limit 1)) as mm_value
+       from
+			 daily_base_column AS dbc
+LEFT JOIN daily_data AS dd ON dbc.base_column_ticker = dd.ticker
+LEFT JOIN daily_original AS doo ON dbc.base_column_ticker = doo.ticker
+WHERE
+ dbc.base_column_ticker IN ?
+GROUP BY
+ dbc.base_column_ticker`
+	err = global.DEFAULT_MYSQL.Raw(sql, tickers).Scan(&list).Error
+	return
+}

+ 0 - 29
models/tables/edb_data/create.go

@@ -1,30 +1 @@
 package edb_data
-
-import (
-	"hongze/hongze_yb/global"
-)
-
-func AddEdbDataThsBySql(sqlStr string) (err error) {
-	err = global.MYSQL["data"].Exec(sqlStr).Error
-	return
-}
-
-func AddEdbDataWindBySql(sqlStr string) (err error) {
-	err = global.MYSQL["data"].Exec(sqlStr).Error
-	return
-}
-
-func AddEdbDataPb(items []*EdbDataPb) (err error) {
-	err = global.MYSQL["data"].Model(EdbDataPb{}).Create(items).Error
-	return
-}
-
-func AddBaseFromSmmIndex(item *BaseFromSmmIndex) (lastId int64, err error) {
-	err = global.MYSQL["data"].Model(BaseFromSmmIndex{}).Create(item).Error
-	return
-}
-
-func AddBaseFromSmmData(item *BaseFromSmmData) (lastId int64, err error) {
-	err = global.MYSQL["data"].Model(BaseFromSmmData{}).Create(item).Error
-	return
-}

+ 0 - 755
models/tables/edb_data/query.go

@@ -6,7 +6,6 @@ import (
 	"hongze/hongze_yb/global"
 	"hongze/hongze_yb/utils"
 	"strconv"
-	"time"
 )
 
 // 指标数据->存储表
@@ -130,436 +129,6 @@ func GetEdbDataList(source, endInfoId int, startDate, endDate string) (list []*E
 	return
 }
 
-
-func GetEdbDataThsByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_ths WHERE edb_code = ? AND data_time = ? `
-	err = global.MYSQL["data"].Raw(sql, edbCode, startDate).Scan(&count).Error
-
-	return
-}
-
-func GetEdbDataWindByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_wind WHERE edb_code=? AND data_time=? `
-	err = global.MYSQL["data"].Raw(sql, edbCode, startDate).Scan(&count).Error
-
-	return
-}
-
-func GetEdbDataPbByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_pb WHERE edb_code=? AND data_time>=? `
-	err = global.MYSQL["data"].Raw(sql, edbCode, startDate).Scan(&count).Error
-
-	return
-}
-
-type ManualEdbdata struct {
-	TradeCode  string    `gorm:"column:TRADE_CODE" description:"指标编码"`
-	Dt         string    `gorm:"column:DT" description:"日期"`
-	Close      string    `gorm:"column:CLOSE" description:"值"`
-	ModifyTime time.Time `gorm:"column:modify_time:" description:"修改时间"`
-}
-
-func GetEdbdataManualByTradeCode(condition string, pars []interface{}) (item []*ManualEdbdata, err error) {
-	sql := ` SELECT  * FROM edbdata WHERE 1=1 `
-	if condition != "" {
-		sql += condition
-	}
-	sql += ` ORDER BY DT DESC `
-	err = global.MYSQL["edb"].Raw(sql, pars).Scan(&item).Error
-
-	return
-}
-
-type EdbDataBase struct {
-	EdbDataId     int `gorm:"column:edb_data_id;primaryKey"`
-	EdbInfoId     int
-	EdbCode       string
-	DataTime      string
-	Value         string
-	Status        int
-	CreateTime    time.Time
-	ModifyTime    time.Time
-	DataTimestamp int64
-}
-
-type lzSurveyData struct {
-	DataTime   string `gorm:"column:data_time" description:"日期"`
-	InputValue string `gorm:"column:input_value" description:"值"`
-}
-
-func GetLzSurveyDataByTradeCode(condition string, pars []interface{}) (item []*lzSurveyData, err error) {
-	sql := ` SELECT  a.* FROM longzhong_survey_data AS a
-				INNER JOIN longzhong_survey_product AS b ON a.survey_product_id=b.survey_product_id
-				WHERE 1=1 `
-	if condition != "" {
-		sql += condition
-	}
-	sql += ` ORDER BY a.data_time DESC `
-	err = global.MYSQL["edb"].Raw(sql, pars).Scan(&item).Error
-
-	return
-}
-
-func GetEdbDataLzByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_lz WHERE edb_code=? AND data_time=? `
-	err = global.MYSQL["data"].Raw(sql, edbCode, startDate).Scan(&count).Error
-
-	return
-}
-
-type EdbDataPb struct {
-	EdbDataId     int `gorm:"column:edb_data_id;primaryKey"`
-	EdbInfoId     int
-	EdbCode       string
-	DataTime      string
-	Value         float64
-	Status        int
-	CreateTime    time.Time
-	ModifyTime    time.Time
-	Ticker        string
-	Field         string
-	DataTimestamp int64
-}
-
-type BaseFromSmm struct {
-	BaseFromSmmId int `gorm:"column:base_from_smm_id;primaryKey"`
-	Aid           int
-	Name          string
-	Interface     string
-	ApiUpdate     int
-	ApiUpdateType string
-	ApiType       int
-	ApiTypeAll    string
-	Type1         string `gorm:"column:type_1"`
-	Type2         string `gorm:"column:type_2"`
-	Type3         string `gorm:"column:type_3"`
-	ApiStartTime  string
-	ApiUpdateTime string
-	StartTime     string
-	FinishTime    string
-	AuthModule    string
-	AuthLang      string
-	ApiLabel      string
-	Enable        string
-	EditPerson    string
-	EditTime      string
-	AuthDur       int
-	AuthDurType   string
-}
-
-type BaseFromSmmIndex struct {
-	BaseFromSmmIndexId int `gorm:"column:base_from_smm_index_id;primaryKey"`
-	Interface          string
-	Name               string
-	IndexCode          string
-	IndexName          string
-	Type1              string `gorm:"column:type_1"`
-	Type2              string `gorm:"column:type_2"`
-	Type3              string `gorm:"column:type_3"`
-	Frequency          string
-	Unit               string
-	ApiStartTime       string
-	ApiUpdateTime      string
-	StartTime          string
-	FinishTime         string
-	CreateTime         time.Time
-	ModifyTime         time.Time
-}
-
-type BaseFromSmmData struct {
-	SmmDataId          int `gorm:"column:smm_data_id;primaryKey"`
-	BaseFromSmmIndexId int
-	IndexCode          string
-	DataTime           string
-	Value              string
-	CreateTime         time.Time
-	ModifyTime         time.Time
-	DataTimestamp      int64
-}
-
-func GetBaseFromSmmBySmmCode(smmCode string) (item *BaseFromSmm, err error) {
-	sql := `SELECT * FROM base_from_smm WHERE interface = ?`
-	err = global.MYSQL["data"].Raw(sql, smmCode).Scan(&item).Error
-
-	return
-}
-
-func GetBaseFromSmmIndexBySmmCode(smmCode string) (list []*BaseFromSmmIndex, err error) {
-	sql := ` SELECT * FROM base_from_smm_index WHERE interface = ? `
-	err = global.MYSQL["data"].Raw(sql, smmCode).Scan(&list).Error
-
-	return
-}
-
-func GetBaseFromSmmDataAllByIndexCode(indexCode string) (list []*BaseFromSmmData, err error) {
-	sql := `SELECT * FROM base_from_smm_data WHERE index_code=? `
-	err = global.MYSQL["data"].Raw(sql, indexCode).Scan(&list).Error
-
-	return
-}
-
-func GetBaseFromSmmMaxOrMinDate(indexCode string) (min_date, max_date string, err error) {
-	sql := ` SELECT MIN(data_time) AS min_date FROM base_from_smm_data WHERE index_code=? `
-	err = global.MYSQL["data"].Raw(sql, indexCode).Scan(&min_date).Error
-	sql = ` SELECT MAX(data_time) AS max_date FROM base_from_smm_data WHERE index_code=? `
-	err = global.MYSQL["data"].Raw(sql, indexCode).Scan(&max_date).Error
-
-	return
-}
-
-type YsResult struct {
-	Code int64 `json:"Code"`
-	Data struct {
-		CompanyList []interface{} `json:"CompanyList"`
-		Content     [][]string    `json:"Content"`
-		Field       []struct {
-			ColIndex   int64  `json:"ColIndex"`
-			ColumnType string `json:"ColumnType"`
-			Info       string `json:"Info"`
-			IsDate     string `json:"IsDate"`
-			Name       string `json:"Name"`
-			Unit       string `json:"Unit"`
-			DBColName  string `json:"db_col_name"`
-		} `json:"Field"`
-		CountPage   int64  `json:"count_page"`
-		CurrentPage int64  `json:"current_page"`
-		Frequency   string `json:"frequency"`
-		Mindate     string `json:"mindate"`
-		PageNum     int64  `json:"page_num"`
-		Status      int64  `json:"status"`
-		TotalNum    int64  `json:"total_num"`
-	} `json:"Data"`
-	Msg string `json:"Msg"`
-}
-
-type BaseFromSmmDataSimple struct {
-	SmmDataId          int `gorm:"column:smm_data_id;primaryKey"`
-	BaseFromSmmIndexId int
-	IndexCode          string
-	DataTime           string
-	Value              string
-}
-
-type BaseFromDlDataSimple struct {
-	Id        int `gorm:"column:base_from_trade_dalian_index_id;primaryKey"`
-	DealCode  string
-	BuyCode   string
-	SoldCode  string
-	DataTime  string
-	DealValue string
-	BuyValue  string
-	SoldValue string
-}
-
-func GetDlDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromDlDataSimple, err error) {
-	sql := ` SELECT * FROM base_from_trade_dalian_index WHERE 1=1 `
-	if condition != "" {
-		sql += condition
-	}
-	sql += ` ORDER BY data_time DESC `
-	err = global.MYSQL["data"].Raw(sql, pars).Scan(&item).Error
-
-	return
-}
-
-func GetEdbDataDlByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_dl WHERE edb_code=? AND data_time=? `
-	err = global.MYSQL["data"].Raw(sql, edbCode, startDate).Scan(&count).Error
-
-	return
-}
-
-type GlData struct {
-	InputValue string `gorm:"column:DATA_VALUE" description:"日期"`
-	DataTime   string `gorm:"column:DATA_DATE" description:"值"`
-}
-
-func GetGlDataByTradeCode(condition string, pars []interface{}) (item []*GlData, err error) {
-	condition += " AND IS_DELETE=0 "
-	sql := ` SELECT * FROM mb_index_main_data WHERE 1=1 `
-	if condition != "" {
-		sql += condition
-	}
-	sql += ` ORDER BY PUBLISH_TIME DESC `
-	err = global.MYSQL["data"].Raw(sql, pars).Scan(&item).Error
-
-	return
-}
-
-func GetEdbDataGlByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_gl WHERE edb_code=? AND data_time=? `
-	err = global.MYSQL["data"].Raw(sql, edbCode, startDate).Scan(&count).Error
-
-	return
-}
-
-type EdbDataFromLt struct {
-	Close map[int64]interface{} `json:"CLOSE"`
-}
-
-type BaseFromZzDataSimple struct {
-	Id        int `gorm:"column:base_from_trade_zhengzhou_index_id;primaryKey"`
-	DealCode  string
-	BuyCode   string
-	SoldCode  string
-	DataTime  string
-	DealValue string
-	BuyValue  string
-	SoldValue string
-}
-
-func GetZzDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromZzDataSimple, err error) {
-	sql := ` SELECT * FROM base_from_trade_zhengzhou_index WHERE 1=1 `
-	if condition != "" {
-		sql += condition
-	}
-	sql += ` ORDER BY data_time DESC `
-	err = global.MYSQL["data"].Raw(sql, pars).Scan(&item).Error
-
-	return
-}
-
-func GetEdbDataZzByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_zz WHERE edb_code=? AND data_time=? `
-	err = global.MYSQL["data"].Raw(sql, edbCode, startDate).Scan(&count).Error
-	return
-}
-
-type BaseFromShDataSimple struct {
-	Id        int `gorm:"column:base_from_trade_shanghai_index_id;primaryKey"`
-	DealCode  string
-	BuyCode   string
-	SoldCode  string
-	DataTime  string
-	DealValue string
-	BuyValue  string
-	SoldValue string
-}
-
-func GetShDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromShDataSimple, err error) {
-	sql := ` SELECT * FROM base_from_trade_shanghai_index WHERE 1=1 `
-	if condition != "" {
-		sql += condition
-	}
-	sql += ` ORDER BY data_time DESC `
-	err = global.MYSQL["data"].Raw(sql, pars).Scan(&item).Error
-
-	return
-}
-
-func GetEdbDataShByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_sh WHERE edb_code=? AND data_time=? `
-	err = global.MYSQL["data"].Raw(sql, edbCode, startDate).Scan(&count).Error
-
-	return
-}
-
-type BaseFromCffexDataSimple struct {
-	Id        int `gorm:"column:base_from_trade_cffex_index_id;primaryKey"`
-	DealCode  string
-	BuyCode   string
-	SoldCode  string
-	DataTime  string
-	DealValue string
-	BuyValue  string
-	SoldValue string
-}
-
-func GetCffexDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromCffexDataSimple, err error) {
-	sql := ` SELECT * FROM base_from_trade_cffex_index WHERE 1=1 `
-	if condition != "" {
-		sql += condition
-	}
-	sql += ` ORDER BY data_time DESC `
-	err = global.MYSQL["data"].Raw(sql, pars).Scan(&item).Error
-
-	return
-}
-
-func GetEdbDataCffexByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_cffex WHERE edb_code=? AND data_time=? `
-	err = global.MYSQL["data"].Raw(sql, edbCode, startDate).Scan(&count).Error
-
-	return
-}
-
-type BaseFromShfeDataSimple struct {
-	Id        int `gorm:"column:base_from_trade_ine_index_id;primaryKey"`
-	DealCode  string
-	BuyCode   string
-	SoldCode  string
-	DataTime  string
-	DealValue string
-	BuyValue  string
-	SoldValue string
-}
-
-func GetShfeDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromShfeDataSimple, err error) {
-	sql := ` SELECT * FROM base_from_trade_ine_index WHERE 1=1 `
-	if condition != "" {
-		sql += condition
-	}
-	sql += ` ORDER BY data_time DESC `
-	err = global.MYSQL["data"].Raw(sql, pars).Scan(&item).Error
-
-	return
-}
-
-func GetEdbDataShfeByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_ine WHERE edb_code=? AND data_time=? `
-	err = global.MYSQL["data"].Raw(sql, edbCode, startDate).Scan(&count).Error
-
-	return
-}
-
-type BaseFromTradeEicIndex struct {
-	BaseFromEicIndexId     int `gorm:"column:base_from_eic_index_id;primaryKey"`
-	Country                string
-	Type                   string
-	EicCode                string
-	ShortName              string
-	Name                   string
-	Status                 string
-	GasDayStartedOn        string
-	GasInStorage           string
-	GasInStorageCode       string
-	Full                   string
-	FullCode               string
-	Trend                  string
-	TrendCode              string
-	Injection              string
-	InjectionCode          string
-	Withdrawal             string
-	WithdrawalCode         string
-	WorkingGasVolume       string
-	WorkingGasVolumeCode   string
-	InjectionCapacity      string
-	InjectionCapacityCode  string
-	WithdrawalCapacity     string
-	WithdrawalCapacityCode string
-	Info                   string
-	CreateTime             time.Time
-	ModifyTime             time.Time
-}
-
-func GetGieDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromTradeEicIndex, err error) {
-	sql := ` SELECT * FROM base_from_trade_eic_index WHERE 1=1 `
-	if condition != "" {
-		sql += condition
-	}
-	sql += ` ORDER BY gas_day_started_on DESC `
-	err = global.MYSQL["data"].Raw(sql, pars).Scan(&item).Error
-
-	return
-}
-
-func GetEdbDataGieByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_gie WHERE edb_code=? AND data_time=? `
-	err = global.MYSQL["data"].Raw(sql, edbCode, startDate).Scan(&count).Error
-
-	return
-}
-
 type EdbInfoMaxAndMinInfo struct {
 	MinDate     string  `description:"最小日期"`
 	MaxDate     string  `description:"最大日期"`
@@ -580,329 +149,5 @@ func GetEdbInfoMaxAndMinInfo(source int, edbCode string) (item *EdbInfoMaxAndMin
 	sql = fmt.Sprintf(sql, tableName)
 	err = global.MYSQL["data"].Raw(sql, edbCode).Scan(&latest_value).Error
 	item.LatestValue = latest_value
-	return
-}
-
-type EdbInfoCalculateDetail struct {
-	EdbInfoCalculateId int       `gorm:"primaryKey;column:edb_info_calculate_id"`
-	EdbInfoId          int       `description:"指标id"`
-	EdbCode            string    `description:"指标编码"`
-	FromEdbInfoId      int       `description:"计算指标id"`
-	FromEdbCode        string    `description:"计算指标编码"`
-	FromEdbName        string    `description:"计算指标名称"`
-	FromSource         int       `description:"计算指标来源"`
-	FromSourceName     string    `description:"计算指标来源名称"`
-	FromTag            string    `description:"来源指标标签"`
-	Sort               int       `description:"计算指标名称排序"`
-	CreateTime         time.Time `description:"创建时间"`
-	ModifyTime         time.Time `description:"修改时间"`
-	StartDate          string    `description:"开始日期"`
-	EndDate            string    `description:"结束日期"`
-	EdbType            int       `description:"指标类型:1:基础指标,2:计算指标"`
-}
-
-func GetEdbInfoCalculateDetail(edbInfoId, source int) (list []*EdbInfoCalculateDetail, err error) {
-	sql := ` SELECT a.*,b.start_date,b.end_date,b.edb_type FROM edb_info_calculate_mapping AS a
-			INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
-			WHERE a.edb_info_id=? ORDER BY sort ASC `
-	err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&list).Error
-
-	return
-}
-
-type EdbInfoSearchData struct {
-	DataTime string	 `description:"数据日期"`
-	Value    float64 `description:"数据"`
-}
-
-//order:1升序,其余值为降序
-func GetEdbDataListAll(condition string, pars []interface{}, source, order int) (item []*EdbInfoSearchData, err error) {
-	sql := ``
-	tableName := GetEdbDataTableName(source)
-	sql = ` SELECT * FROM %s WHERE 1=1 `
-	sql = fmt.Sprintf(sql, tableName)
-
-	if condition != "" {
-		sql += condition
-	}
-	if order == 1 {
-		sql += ` ORDER BY data_time ASC `
-	} else {
-		sql += ` ORDER BY data_time DESC `
-	}
-	err = global.MYSQL["data"].Raw(sql, pars...).Scan(&item).Error
-	// 格式化日期
-	if len(item) > 0 {
-		for _, row := range item {
-			if row.DataTime != "" {
-				row.DataTime = row.DataTime[:10]
-				//tempTime, _ := time.Parse("2006-01-02T00:00:00", row.DataTime)
-				//row.DataTime = tempTime.Format(utils.FormatDate)
-			}
-		}
-	}
-
-	return
-}
-
-
-type CalculateItems struct {
-	EdbInfoId int
-	DataMap   map[string]float64
-}
-
-type EdbInfoCalculateLjzzyDetail struct {
-	EdbInfoCalculateLjzzyId int       `gorm:"column:edb_info_calculate_ljzzy_id;primaryKey"`
-	EdbInfoId               int       `description:"指标id"`
-	EdbCode                 string    `description:"指标编码"`
-	FromEdbInfoId           int       `description:"计算指标id"`
-	FromEdbCode             string    `description:"计算指标编码"`
-	FromEdbName             string    `description:"计算指标名称"`
-	FromSource              int       `description:"计算指标来源"`
-	FromSourceName          string    `description:"计算指标来源名称"`
-	FromTag                 string    `description:"来源指标标签"`
-	Sort                    int       `description:"计算指标名称排序"`
-	CreateTime              time.Time `description:"创建时间"`
-	ModifyTime              time.Time `description:"修改时间"`
-	StartDate               string    `description:"开始日期"`
-	EndDate                 string    `description:"结束日期"`
-}
-
-func GetEdbInfoCalculateLjzzyDetail(edbInfoId int) (item *EdbInfoCalculateLjzzyDetail, err error) {
-	sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_mapping AS a
-			INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
-			WHERE a.edb_info_id=? `
-	err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&item).Error
-
-	return
-}
-
-
-type EdbInfoCalculateTbzDetail struct {
-	EdbInfoCalculateTbzId int       `gorm:"column:edb_info_calculate_tbz_id;primaryKey"`
-	EdbInfoId             int       `description:"指标id"`
-	EdbCode               string    `description:"指标编码"`
-	FromEdbInfoId         int       `description:"计算指标id"`
-	FromEdbCode           string    `description:"计算指标编码"`
-	FromEdbName           string    `description:"计算指标名称"`
-	FromSource            int       `description:"计算指标来源"`
-	FromSourceName        string    `description:"计算指标来源名称"`
-	FromTag               string    `description:"来源指标标签"`
-	Sort                  int       `description:"计算指标名称排序"`
-	CreateTime            time.Time `description:"创建时间"`
-	ModifyTime            time.Time `description:"修改时间"`
-	StartDate             string    `description:"开始日期"`
-	EndDate               string    `description:"结束日期"`
-}
-
-func GetEdbInfoCalculateTbzDetail(edbInfoId int) (item *EdbInfoCalculateTbzDetail, err error) {
-	sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_mapping AS a
-			INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
-			WHERE a.edb_info_id=? `
-	err = global.MYSQL["data"].Raw(sql, edbInfoId).First(&item).Error
-
-	return
-}
-
-type EdbInfoCalculateTczDetail struct {
-	EdbInfoCalculateTczId int       `gorm:"column:edb_info_calculate_tcz_id;primaryKey"`
-	EdbInfoId             int       `description:"指标id"`
-	EdbCode               string    `description:"指标编码"`
-	FromEdbInfoId         int       `description:"计算指标id"`
-	FromEdbCode           string    `description:"计算指标编码"`
-	FromEdbName           string    `description:"计算指标名称"`
-	FromSource            int       `description:"计算指标来源"`
-	FromSourceName        string    `description:"计算指标来源名称"`
-	FromTag               string    `description:"来源指标标签"`
-	Sort                  int       `description:"计算指标名称排序"`
-	CreateTime            time.Time `description:"创建时间"`
-	ModifyTime            time.Time `description:"修改时间"`
-	StartDate             string    `description:"开始日期"`
-	EndDate               string    `description:"结束日期"`
-}
-
-func GetEdbInfoCalculateTczDetail(edbInfoId int) (item *EdbInfoCalculateTczDetail, err error) {
-	sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_mapping AS a
-			INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
-			WHERE a.edb_info_id=? `
-	err = global.MYSQL["data"].Raw(sql, edbInfoId).First(&item).Error
-
-	return
-}
-
-type EdbInfoCalculateNszydpjjsDetail struct {
-	EdbInfoCalculateNszydpjjsId int       `gorm:"column:edb_info_calculate_nszydpjjs_id;primaryKey"`
-	EdbInfoId                   int       `description:"指标id"`
-	EdbCode                     string    `description:"指标编码"`
-	FromEdbInfoId               int       `description:"计算指标id"`
-	FromEdbCode                 string    `description:"计算指标编码"`
-	FromEdbName                 string    `description:"计算指标名称"`
-	FromSource                  int       `description:"计算指标来源"`
-	FromSourceName              string    `description:"计算指标来源名称"`
-	FromTag                     string    `description:"来源指标标签"`
-	Sort                        int       `description:"计算指标名称排序"`
-	CreateTime                  time.Time `description:"创建时间"`
-	ModifyTime                  time.Time `description:"修改时间"`
-	StartDate                   string    `description:"开始日期"`
-	EndDate                     string    `description:"结束日期"`
-}
-
-func GetEdbInfoCalculateNszydpjjsDetail(edbInfoId int) (item *EdbInfoCalculateNszydpjjsDetail, err error) {
-	sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_mapping AS a
-			INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
-			WHERE a.edb_info_id=? `
-	err = global.MYSQL["data"].Raw(sql, edbInfoId).First(&item).Error
-
-	return
-}
-
-type EdbInfoCalculateHbzDetail struct {
-	EdbInfoCalculateTbzId int       `gorm:"column:edb_info_calculate_tbz_id;primaryKey"`
-	EdbInfoId             int       `description:"指标id"`
-	EdbCode               string    `description:"指标编码"`
-	FromEdbInfoId         int       `description:"计算指标id"`
-	FromEdbCode           string    `description:"计算指标编码"`
-	FromEdbName           string    `description:"计算指标名称"`
-	FromSource            int       `description:"计算指标来源"`
-	FromSourceName        string    `description:"计算指标来源名称"`
-	FromTag               string    `description:"来源指标标签"`
-	Sort                  int       `description:"计算指标名称排序"`
-	CreateTime            time.Time `description:"创建时间"`
-	ModifyTime            time.Time `description:"修改时间"`
-	StartDate             string    `description:"开始日期"`
-	EndDate               string    `description:"结束日期"`
-}
-
-func GetEdbInfoCalculateHbzDetail(edbInfoId int) (item *EdbInfoCalculateTbzDetail, err error) {
-	sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_mapping AS a
-			INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
-			WHERE a.edb_info_id=? `
-	err = global.MYSQL["data"].Raw(sql, edbInfoId).First(&item).Error
-
-	return
-}
-
-
-type EdbInfoCalculateHczDetail struct {
-	EdbInfoCalculateHczId int       `gorm:"column:edb_info_calculate_hcz_id;primaryKey"`
-	EdbInfoId             int       `description:"指标id"`
-	EdbCode               string    `description:"指标编码"`
-	FromEdbInfoId         int       `description:"计算指标id"`
-	FromEdbCode           string    `description:"计算指标编码"`
-	FromEdbName           string    `description:"计算指标名称"`
-	FromSource            int       `description:"计算指标来源"`
-	FromSourceName        string    `description:"计算指标来源名称"`
-	FromTag               string    `description:"来源指标标签"`
-	Sort                  int       `description:"计算指标名称排序"`
-	CreateTime            time.Time `description:"创建时间"`
-	ModifyTime            time.Time `description:"修改时间"`
-	StartDate             string    `description:"开始日期"`
-	EndDate               string    `description:"结束日期"`
-}
-
-func GetEdbInfoCalculateHczDetail(edbInfoId int) (item *EdbInfoCalculateHczDetail, err error) {
-	sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_mapping AS a
-			INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
-			WHERE a.edb_info_id=? `
-	err = global.MYSQL["data"].Raw(sql, edbInfoId).First(&item).Error
-
-	return
-}
-
-
-type EdbInfoCalculateBpDetail struct {
-	EdbInfoCalculateBpId int       `gorm:"column:edb_info_calculate_bp_id;primaryKey"`
-	EdbInfoId            int       `description:"指标id"`
-	EdbCode              string    `description:"指标编码"`
-	FromEdbInfoId        int       `description:"计算指标id"`
-	FromEdbCode          string    `description:"计算指标编码"`
-	FromEdbName          string    `description:"计算指标名称"`
-	FromSource           int       `description:"计算指标来源"`
-	FromSourceName       string    `description:"计算指标来源名称"`
-	FromTag              string    `description:"来源指标标签"`
-	Sort                 int       `description:"计算指标名称排序"`
-	CreateTime           time.Time `description:"创建时间"`
-	ModifyTime           time.Time `description:"修改时间"`
-	StartDate            string    `description:"开始日期"`
-	EndDate              string    `description:"结束日期"`
-}
-
-func GetEdbInfoCalculateBpDetail(edbInfoId int) (item *EdbInfoCalculateTbzDetail, err error) {
-	sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_mapping AS a
-			INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
-			WHERE a.edb_info_id=? `
-	err = global.MYSQL["data"].Raw(sql, edbInfoId).First(&item).Error
-
-	return
-}
-
-// EdbDataCalculateZjpj 直接拼接数据结构体
-type EdbDataCalculateZjpj struct {
-	EdbDataId     int `gorm:"column:edb_data_id;primaryKey"`
-	EdbInfoId     int
-	EdbCode       string
-	DataTime      string
-	Value         float64
-	Status        int
-	CreateTime    time.Time
-	ModifyTime    time.Time
-	DataTimestamp int64
-}
-
-// GetAllEdbDataCalculateZjpjByEdbInfoId 根据指标id获取全部的数据
-func GetAllEdbDataCalculateZjpjByEdbInfoId(edbInfoId int) (items []*EdbDataCalculateZjpj, err error) {
-	sql := ` SELECT * FROM edb_data_calculate_zjpj WHERE edb_info_id=? ORDER BY data_time DESC `
-	err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&items).Error
-
-	return
-}
-
-// EdbInfoCalculateMapping 计算指标于基础指标,关系表
-type EdbInfoCalculateMapping struct {
-	EdbInfoCalculateMappingId int       `gorm:"column:edb_info_calculate_mapping_id;primaryKey"`
-	EdbInfoId                 int       `description:"计算指标id"`
-	Source                    int       `description:"计算指标来源"`
-	SourceName                string    `description:"计算指标来源名称"`
-	EdbCode                   string    `description:"计算指标编码"`
-	FromEdbInfoId             int       `description:"基础指标id"`
-	FromEdbCode               string    `description:"基础指标编码"`
-	FromEdbName               string    `description:"基础指标名称"`
-	FromSource                int       `description:"基础指标来源"`
-	FromSourceName            string    `description:"基础指标来源名称"`
-	FromTag                   string    `description:"来源指标标签"`
-	Sort                      int       `description:"计算指标名称排序"`
-	CreateTime                time.Time `description:"创建时间"`
-	ModifyTime                time.Time `description:"修改时间"`
-}
-
-// GetEdbInfoCalculateListByCondition 获取指标关系列表
-func GetEdbInfoCalculateListByCondition(condition string, pars []interface{}) (items []*EdbInfoCalculateMapping, err error) {
-	sql := ` SELECT * FROM edb_info_calculate_mapping WHERE 1=1 `
-	if condition != "" {
-		sql += condition
-	}
-	err = global.MYSQL["data"].Raw(sql, pars).Scan(&items).Error
-
-	return
-}
-
-// EdbDataCalculateLjztbpj 累计值同比拼接数据结构体
-type EdbDataCalculateLjztbpj struct {
-	EdbDataId     int `gorm:"column:edb_data_id;primaryKey"`
-	EdbInfoId     int
-	EdbCode       string
-	DataTime      string
-	Value         float64
-	Status        int
-	CreateTime    time.Time
-	ModifyTime    time.Time
-	DataTimestamp int64
-}
-
-// GetAllEdbDataCalculateLjztbpjByEdbInfoId 根据指标id获取全部的数据
-func GetAllEdbDataCalculateLjztbpjByEdbInfoId(edbInfoId int) (items []*EdbDataCalculateLjztbpj, err error) {
-	sql := ` SELECT * FROM edb_data_calculate_ljztbpj WHERE edb_info_id=? ORDER BY data_time DESC `
-	err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&items).Error
-
 	return
 }

+ 0 - 42
models/tables/edb_data/update.go

@@ -2,48 +2,6 @@ package edb_data
 
 import "hongze/hongze_yb/global"
 
-func ModifyEdbDataThs(edbInfoId int64, dataTime string, value float64) (err error) {
-	sql := ` UPDATE edb_data_ths SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-	err = global.MYSQL["data"].Exec(sql, value, edbInfoId, dataTime).Error
-
-	return
-}
-
-func ModifyEdbDataWind(edbInfoId int64, dataTime string, value float64) (err error) {
-	sql := ` UPDATE edb_data_wind SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-	err = global.MYSQL["data"].Exec(sql, value, edbInfoId, dataTime).Error
-
-	return
-}
-
-func ModifyEdbDataPb(edbInfoId int, dataTime string, value float64) (err error) {
-	sql := ` UPDATE edb_data_pb SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-	err = global.MYSQL["data"].Exec(sql, value, edbInfoId, dataTime).Error
-
-	return
-}
-
-func ModifyBaseFromSmmData(smmDataId int, value string) (err error) {
-	sql := `UPDATE base_from_smm_data SET value=?,modify_time=NOW() WHERE smm_data_id=? `
-	err = global.MYSQL["data"].Exec(sql, value, smmDataId).Error
-
-	return
-}
-
-func ModifyBaseFromSmmMinDateAndMaxDate(baseFromSmmIndexId int, minDate, maxDate string) (err error) {
-	sql := ` UPDATE base_from_smm_index SET start_date=?,end_date=?,modify_time=NOW() WHERE base_from_smm_index_id=? `
-	err = global.MYSQL["data"].Exec(sql, minDate, maxDate, baseFromSmmIndexId).Error
-
-	return
-}
-
-func ModifyEdbDataGl(edbInfoId int64, dataTime, value string) (err error) {
-	sql := ` UPDATE edb_data_gl SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-	err = global.MYSQL["data"].Exec(sql, value, edbInfoId, dataTime).Error
-
-	return
-}
-
 func ModifyEdbInfoMaxAndMinInfo(edbInfoId int, item *EdbInfoMaxAndMinInfo) (err error) {
 	sql := ` UPDATE edb_info SET start_date=?,end_date=?,min_value=?,max_value=?,is_update=2,latest_date=?,latest_value=?,modify_time=NOW() WHERE edb_info_id=? `
 	err = global.MYSQL["data"].Exec(sql, item.MinDate, item.MaxDate, item.MinValue, item.MaxValue, item.MaxDate, item.LatestValue, edbInfoId).Error

+ 33 - 0
models/tables/rddp/classify/classify.go

@@ -0,0 +1,33 @@
+package classify
+
+import "time"
+
+type Classify struct {
+	Id int `gorm:"column:id" db:"id" json:"id" form:"id"`
+	ClassifyName string `gorm:"column:classify_name" db:"classify_name" json:"classify_name" form:"classify_name"` //分类名称
+	Sort int8 `gorm:"column:sort" db:"sort" json:"sort" form:"sort"` //排序
+	ParentId int `gorm:"column:parent_id" db:"parent_id" json:"parent_id" form:"parent_id"` //父级分类id
+	CreateTime time.Time `gorm:"column:create_time" db:"create_time" json:"create_time" form:"create_time"`
+	ModifyTime time.Time `gorm:"column:modify_time" db:"modify_time" json:"modify_time" form:"modify_time"`
+	Abstract string `gorm:"column:abstract" db:"abstract" json:"abstract" form:"abstract"` //栏目简介
+	Descript string `gorm:"column:descript" db:"descript" json:"descript" form:"descript"` //分享描述
+	ReportAuthor string `gorm:"column:report_author" db:"report_author" json:"report_author" form:"report_author"` //栏目作者
+	AuthorDescript string `gorm:"column:author_descript" db:"author_descript" json:"author_descript" form:"author_descript"` //作者简介
+	ReportImgUrl string `gorm:"column:report_img_url" db:"report_img_url" json:"report_img_url" form:"report_img_url"` //报告配图
+	HeadImgUrl string `gorm:"column:head_img_url" db:"head_img_url" json:"head_img_url" form:"head_img_url"` //头部banner
+	AvatarImgUrl string `gorm:"column:avatar_img_url" db:"avatar_img_url" json:"avatar_img_url" form:"avatar_img_url"` //头像
+	ColumnImgUrl string `gorm:"column:column_img_url" db:"column_img_url" json:"column_img_url" form:"column_img_url"` //栏目配图
+	IsHomeColumn int8 `gorm:"column:is_home_column" db:"is_home_column" json:"is_home_column" form:"is_home_column"` //1:首页专栏
+	HomeImgUrl string `gorm:"column:home_img_url" db:"home_img_url" json:"home_img_url" form:"home_img_url"` //首页配图
+	ClassifyLabel string `gorm:"column:classify_label" db:"classify_label" json:"classify_label" form:"classify_label"`
+	ShowType uint8 `gorm:"column:show_type" db:"show_type" json:"show_type" form:"show_type"` //展示类型:1-列表 2-专栏
+	HasTeleconference uint8 `gorm:"column:has_teleconference" db:"has_teleconference" json:"has_teleconference" form:"has_teleconference"` //是否有电话会 0-否 1-是
+	VipTitle string `gorm:"column:vip_title" db:"vip_title" json:"vip_title" form:"vip_title"` //研究员头衔
+	YbIconUrl string `gorm:"column:yb_icon_url" db:"yb_icon_url" json:"yb_icon_url" form:"yb_icon_url"` //研报3.0已购页面icon图片地址
+	YbBgUrl string `gorm:"column:yb_bg_url" db:"yb_bg_url" json:"yb_bg_url" form:"yb_bg_url"` //研报3.0已购详情背景图地址
+	IsShow int8 `gorm:"column:is_show" db:"is_show" json:"is_show" form:"is_show"` //是否展示报告:1,展示该分类下的报告,0隐藏分类下的报告
+}
+
+func (c *Classify) TableName() string  {
+	return "classify"
+}

+ 116 - 0
models/tables/rddp/classify/query.go

@@ -0,0 +1,116 @@
+package classify
+
+import (
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/utils"
+)
+
+func GetSimpleAll()(list []*Classify, err error)  {// 过滤权益研报的分类
+	err = global.MYSQL["rddp"].Select("id, classify_name, yb_icon_url, yb_bg_url, parent_id").Model(Classify{}).Where("is_show = 1  AND parent_id != 56 AND id != 56").Scan(&list).Error
+	return
+}
+// GetByClassifyName 根据分类名称查找专栏详情
+func GetByClassifyName(classifyName string) (item *Classify, err error) {
+	err = global.MYSQL["rddp"].Model(Classify{}).Where("classify_name = ?", classifyName).First(&item).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	return
+}
+
+// GetSecondIdsByClassifyNames 根据权限相关的二级分类名称获取名称ID
+func GetSecondIdsByClassifyNames(names []string) (ids []int, err error) {
+	var list []*Classify
+	err = global.MYSQL["rddp"].Model(Classify{}).Select("id").Where("classify_name in (?) and parent_id >0 AND is_show = 1 AND parent_id != 56", names).Scan(&list).Error
+	if err != nil {
+		if err == utils.ErrNoRow {
+			err = nil
+		}
+		return
+	}
+	for _, v := range list {
+		ids = append(ids, v.Id)
+	}
+	return
+}
+
+// GetParentList 查询所有一级分类
+func GetParentList() (list []*Classify, err error) {
+	err = global.MYSQL["rddp"].Model(Classify{}).
+		Select("id, classify_name, show_type").
+		Where("parent_id = 0 and classify_name != '权益研报' AND is_show = 1").
+		Order("sort asc, id asc").Scan(&list).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	return
+}
+
+// GetByClassifyId 根据分类ID查询分类详情
+func GetByClassifyId(id int) (item *Classify, err error) {
+	err = global.MYSQL["rddp"].Model(Classify{}).Where("id = ? AND is_show = 1", id).First(&item).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	return
+}
+
+// GetListByPid 根据分类名称查找专栏列表
+func GetListByPid(pid int) (list []*Classify, err error) {
+	err = global.MYSQL["rddp"].Model(Classify{}).
+		Select("id, classify_name, parent_id, report_author, author_descript, home_img_url").
+		Where("parent_id = ? AND is_show = 1 ", pid).Order("sort asc, id asc").Scan(&list).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	return
+}
+
+
+// GetIdsByClassifyNameAndParentId 查询
+func GetIdsByClassifyNameAndParentId(names []string, parentId int) (ids []int, err error) {
+	var list []*Classify
+	err = global.MYSQL["rddp"].Model(Classify{}).Select("id").Where("classify_name in (?) and parent_id = ? AND is_show = 1", names, parentId).Scan(&list).Error
+	if err != nil {
+		return
+	}
+	for _, v := range list {
+		ids = append(ids, v.Id)
+	}
+	return
+}
+
+// GetOtherIdsByClassifyNames 查询
+func GetOtherIdsByClassifyNames(names []string) (ids []int, err error) {
+	var list []*Classify
+	err = global.MYSQL["rddp"].Model(Classify{}).Select("id").Where("classify_name in (?) and parent_id > 0 AND is_show = 1", names).Scan(&list).Error
+	if err != nil {
+		return
+	}
+	for _, v := range list {
+		ids = append(ids, v.Id)
+	}
+	return
+}
+
+// GetOtherIdsByClassifyNames 查询
+func GetOtherSecondIds(names []string) (ids []int, err error) {
+	var list []*Classify
+	err = global.MYSQL["rddp"].Model(Classify{}).Select("id").Where("parent_id IN (SELECT id FROM classify WHERE classify_name IN (?) AND parent_id = 0 AND is_show = 1)", names).Scan(&list).Error
+	if err != nil {
+		return
+	}
+	for _, v := range list {
+		ids = append(ids, v.Id)
+	}
+	return
+}
+
+// GetChildByPid 根据一级分类查找二级分类
+func GetChildByPid(pid int) (list []*Classify, err error) {
+	err = global.MYSQL["rddp"].Model(Classify{}).Where("parent_id = ? AND is_show = 1 ", pid).Scan(&list).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	return
+}

+ 314 - 0
models/tables/rddp/report/query.go

@@ -0,0 +1,314 @@
+package report
+
+import (
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/models/response"
+	"hongze/hongze_yb/utils"
+)
+
+// GetLatestClassReportsByClassifyIdSeconds 根据用户已购买的分类权限查询个分类最新的报告
+func GetLatestClassReportsByClassifyIdSeconds(classifyIdSeconds []int) (reportList []*Report, err error) {
+	sql := `SELECT t1.id,
+t1.classify_id_first,
+t1.classify_id_second,
+t1.stage,
+t1.title,
+t1.classify_name_first,
+t1.classify_name_second,
+t1.publish_time
+FROM report t1
+INNER JOIN
+(
+    SELECT classify_id_first, max( publish_time ) AS max_publish_time
+    FROM report
+    WHERE
+	state = 2 
+	AND classify_name_first !="权益研报"
+    AND classify_id_second IN ?
+GROUP BY
+	classify_id_first
+) t2
+    ON t1.classify_id_first = t2.classify_id_first AND
+       t1.publish_time   = t2.max_publish_time
+	 WHERE t1.state = 2 
+	 AND t1.classify_name_first !="权益研报"
+	 AND t1.classify_id_second IN ?`
+	err = global.MYSQL["rddp"].Raw(sql, classifyIdSeconds, classifyIdSeconds).Scan(&reportList).Error
+	return
+}
+
+// GetReportsByClassifyIdSecondsAndDate 根据时间和报告分类筛选出合适的记录
+func GetReportsByClassifyIdSecondsAndDate( classifyIdSeconds []int, publishTime string) (reportList []*Report, err error) {
+	err = global.MYSQL["rddp"].Model(Report{}).
+		Select("id, classify_name_first").
+		Where("classify_id_second in (?) and state = 2 and publish_time > ? ", classifyIdSeconds, publishTime).Scan(&reportList).Error
+	return
+}
+
+// GetListByIDsAndClassifyIdFirst 分页查询
+func GetListByIDsAndClassifyIdFirst( ids []int, classifyIdFirst int,  offset , limit int) (reportList []*Report, err error) {
+	err = global.MYSQL["rddp"].Model(Report{}).
+		Select("id, classify_id_first, classify_name_first, classify_id_second, classify_name_second, title, stage, publish_time").
+		Where("id in (?) and classify_id_first=? and state = 2 ", ids, classifyIdFirst).
+		Order("publish_time desc, id desc").
+		Offset(offset).
+		Limit(limit).
+		Scan(&reportList).Error
+	return
+}
+
+// GetListCountByIDsAndClassifyIdFirst 分页查询
+func GetListCountByIDsAndClassifyIdFirst( ids []int, classifyIdFirst int) (total int64, err error) {
+	err = global.MYSQL["rddp"].Model(Report{}).
+		Select("id, classify_id_first, classify_name_first, classify_id_second, classify_name_second, title, stage, publish_time").
+		Where("id in (?) and classify_id_first=? and state = 2 ", ids, classifyIdFirst).
+		Count(&total).Error
+	return
+}
+
+// GetListByClassifyIdSeconds 分页查询
+func GetListByClassifyIdSeconds( classifyIdSeconds []int, offset , limit int) (reportList []*Report, err error) {
+	err = global.MYSQL["rddp"].Model(Report{}).
+		Select("id, classify_id_first, classify_name_first, classify_id_second, classify_name_second, title, stage, publish_time").
+		Where("classify_id_second in (?) and state = 2 ", classifyIdSeconds).
+		Order("publish_time desc, id desc").
+		Offset(offset).
+		Limit(limit).
+		Scan(&reportList).Error
+	return
+}
+
+// GetListCountByClassifyIdSeconds
+func GetListCountByClassifyIdSeconds( classifyIdSeconds []int) (total int64, err error) {
+	err = global.MYSQL["rddp"].Model(Report{}).
+		Select("id, classify_id_first, classify_name_first, classify_id_second, classify_name_second, title, stage, publish_time").
+		Where("classify_id_second in (?) and state = 2 ", classifyIdSeconds).
+		Count(&total).Error
+	return
+}
+
+// GetListByClassifyIdFirst 按照类型分页查询
+func GetListByClassifyIdFirst(classifyIdFirst int,  offset , limit int) (reportList []*Report, err error) {
+	err = global.MYSQL["rddp"].Model(Report{}).
+		Select("id, classify_id_first, classify_name_first, classify_id_second, classify_name_second, title, stage, publish_time").
+		Where("classify_id_first=? and state = 2 ", classifyIdFirst).
+		Order("publish_time desc, id desc").
+		Offset(offset).
+		Limit(limit).
+		Scan(&reportList).Error
+	return
+}
+
+// GetListCountByClassifyIdFirst 按照类型查询报告总数
+func GetListCountByClassifyIdFirst(classifyIdFirst int) (total int64, err error) {
+	err = global.MYSQL["rddp"].Model(Report{}).
+		Select("id, classify_id_first, classify_name_first, classify_id_second, classify_name_second, title, stage, publish_time").
+		Where("classify_id_first=? and state = 2 ", classifyIdFirst).
+		Count(&total).Error
+	return
+}
+
+// GetLatestByReportIds 根据ids获取报告
+func GetLatestByReportIds(ids []int) (item *Report, err error) {
+	err = global.MYSQL["rddp"].Where("id in ? and state = 2", ids).Order("publish_time desc, id desc").First(&item).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	return
+}
+
+// GetPublishByReportId 根据id获取报告
+func GetPublishByReportId(id int) (item *Report, err error) {
+	err = global.MYSQL["rddp"].Where("id = ? and state = 2", id).First(&item).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	return
+}
+
+// GetByReportId 根据id获取报告
+func GetByReportId(id int) (item *Report, err error) {
+	err = global.MYSQL["rddp"].Where("id = ? ", id).First(&item).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	return
+}
+
+// GetByReportIds 根据id获取报告
+func GetByReportIds(ids []int) (list []*Report, err error) {
+	err = global.MYSQL["rddp"].Model(Report{}).Where("id in (?) and state = 2", ids).Select("id, create_time").Scan(&list).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	return
+}
+
+// GetLatestDay 获取最新的晨报
+func GetLatestDay() (item *Report, err error) {
+	err = global.MYSQL["rddp"].Where("state = 2 and classify_name_first= '晨报'").Order("publish_time desc, id desc").First(&item).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	return
+}
+
+// GetLatestReportsByClassifyIdFirst 查询当前一级分类下,二级分类中,最新的报告
+func GetLatestReportsByClassifyIdFirst(classifyIdFirst int, classifyIdSeconds []int) (reportList []*Report, err error) {
+	sql := `
+SELECT t1.id,
+t1.classify_id_first,
+t1.classify_id_second,
+t1.stage,
+t1.classify_name_first,
+t1.classify_name_second,
+t1.publish_time
+FROM report t1
+INNER JOIN
+(
+    SELECT classify_id_first, classify_id_second, max( publish_time ) AS max_publish_time
+    FROM report
+    WHERE
+	state = 2 
+	AND classify_id_first = ?
+    AND classify_id_second IN ?
+GROUP BY
+	classify_id_second
+) t2
+    ON t1.classify_id_second = t2.classify_id_second AND
+		 t1.classify_id_first = t2.classify_id_first AND
+       t1.publish_time   = t2.max_publish_time
+	 WHERE t1.state = 2 
+	 AND t1.classify_id_first = ?
+	 AND t1.classify_id_second IN ?`
+	err = global.MYSQL["rddp"].Raw(sql, classifyIdFirst, classifyIdSeconds, classifyIdFirst, classifyIdSeconds).Scan(&reportList).Error
+	return
+}
+
+// GetReportListByCondition 获取报告列表
+func GetReportListByCondition(condition string, pars []interface{}) (list []*Report, err error) {
+	err = global.MYSQL["rddp"].Select("id").Model(Report{}).Where(condition, pars...).
+		Scan(&list).Error
+	return
+}
+
+// GetListByClassifyIdSecond 按照二级类型分页查询
+func GetListByClassifyIdSecond(classifyIdSecond int,  offset , limit int) (reportList []*Report, err error) {
+	err = global.MYSQL["rddp"].Model(Report{}).
+		Select("id, classify_id_first, classify_name_first, classify_id_second, classify_name_second, title, stage, publish_time, author, video_name, video_url, video_play_seconds, abstract").
+		Where("classify_id_second = ? and state = 2 ", classifyIdSecond).
+		Order("publish_time desc, id desc").
+		Offset(offset).
+		Limit(limit).
+		Scan(&reportList).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	return
+}
+
+
+// GetListCountByClassifyIdSecond 按照二级分类总条数
+func GetListCountByClassifyIdSecond(classifyIdSecond int) (total int64, err error) {
+	err = global.MYSQL["rddp"].Model(Report{}).
+		Where("classify_id_second=? and state = 2 ", classifyIdSecond).Count(&total).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	return
+}
+
+
+// GetReportList 获取报告列表
+func GetReportList(condition string, pars []interface{}, offset , limit int) (list []*Report, err error) {
+	err = global.MYSQL["rddp"].Model(Report{}).
+		Select("id, classify_id_first, classify_name_first, classify_id_second, classify_name_second, title, stage, publish_time, author, create_time, video_url, video_name, video_play_seconds, abstract").
+		Where(condition, pars...).
+		Order("publish_time desc, id desc").
+		Offset(offset).
+		Limit(limit).
+		Scan(&list).Error
+	return
+}
+
+// GetReportListCount 获取报告总数
+func GetReportListCount(condition string, pars []interface{}) (total int64, err error) {
+	err = global.MYSQL["rddp"].Model(Report{}).Where(condition, pars...).
+		Count(&total).Error
+	return
+}
+
+// GetReportCollectListByPermission 根据权限相关的分类查询报告和章节
+func GetReportCollectListByPermission(classifyIdSeconds []int, typeIds []int, offset , limit int) (list []*response.ReportCollectListItem, err error)  {
+	sql := `( SELECT
+id AS report_id,
+0 AS report_chapter_id,
+classify_id_first,
+classify_id_second,
+classify_name_first,
+classify_name_second,
+0 as report_chapter_type_id,
+title,
+content_sub,
+publish_time 
+FROM
+	report
+WHERE
+	classify_name_first != "晨报" 
+	AND classify_name_first != "周报" 
+	AND classify_id_second in ?
+	AND state = 2
+	)
+UNION
+	
+( SELECT
+report_id,
+report_chapter_id,
+classify_id_first,
+0 as classify_id_second,
+classify_name_first,
+null as classify_name_second,
+type_id as report_chapter_type_id,
+title,
+content_sub,
+publish_time 
+FROM
+	report_chapter
+WHERE
+	publish_state = 2
+	AND type_id in ?
+	)
+	ORDER BY publish_time DESC, report_id desc LIMIT ? OFFSET ?
+	`
+	err = global.MYSQL["rddp"].Raw(sql, classifyIdSeconds, typeIds, limit, offset).Scan(&list).Error
+	return
+}
+// GetReportCollectCountByPermission 查询汇总报告总页数
+func GetReportCollectCountByPermission(classifyIdSeconds []int, typeIds []int) (total int64, err error)  {
+	sql := `select count(*) from ( ( SELECT
+id AS report_id,
+0 AS report_chapter_id
+FROM
+        report
+WHERE
+        classify_name_first != "晨报" 
+        AND classify_name_first != "周报" 
+        AND classify_id_second in ?
+        AND state = 2
+        )
+UNION
+        
+( SELECT
+report_id,
+report_chapter_id
+FROM
+        report_chapter
+WHERE
+        publish_state = 2
+        AND type_id in ?
+        )
+) as ru
+	`
+	err = global.MYSQL["rddp"].Raw(sql, classifyIdSeconds, typeIds).Count(&total).Error
+	return
+}

+ 39 - 0
models/tables/rddp/report/report.go

@@ -0,0 +1,39 @@
+package report
+
+import "time"
+
+type Report struct {
+	Id                 int    `orm:"column(id)" description:"报告Id" json:"_"`
+	AddType            int    `description:"新增方式:1:新增报告,2:继承报告" json:"add_type"`
+	ClassifyIdFirst    int    `description:"一级分类id" json:"classify_id_first"`
+	ClassifyNameFirst  string `description:"一级分类名称" json:"classify_name_first"`
+	ClassifyIdSecond   int    `description:"二级分类id" json:"classify_id_second"`
+	ClassifyNameSecond string `description:"二级分类名称" json:"classify_name_second"`
+	Title              string `description:"标题" json:"title"`
+	Abstract           string `description:"摘要" json:"abstract"`
+	Author             string `description:"作者" json:"author"`
+	Frequency          string `description:"频度" json:"frequency"`
+	CreateTime         time.Time `description:"创建时间" json:"create_time"`
+	ModifyTime         time.Time `description:"修改时间" json:"modify_time"`
+	State              int    `description:"1:未发布,2:已发布" json:"state"`
+	PublishTime        time.Time `description:"发布时间" json:"publish_time"`
+	Stage              int    `description:"期数" json:"stage"`
+	MsgIsSend          int    `description:"消息是否已发送,0:否,1:是" json:"msg_is_send"`
+	Content            string `description:"内容" json:"content"`
+	VideoUrl           string `description:"音频文件URL" json:"video_url"`
+	VideoName          string `description:"音频文件名称" json:"video_name"`
+	VideoPlaySeconds   string `description:"音频播放时长" json:"video_play_seconds"`
+	ContentSub         string `description:"内容前两个章节" json:"content_sub"`
+	ThsMsgIsSend       int    `description:"客户群消息是否已发送,0:否,1:是" json:"ths_msg_is_send"`
+	StageStr           string `description:"期数" json:"stage_str"`
+}
+
+type UnReadItem struct {
+	ReportID           int
+	ClassifyNameFirst  string
+}
+
+
+func (r *Report) TableName() string {
+	return "report"
+}

+ 116 - 0
models/tables/rddp/report_chapter/query.go

@@ -0,0 +1,116 @@
+package report_chapter
+
+import (
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/utils"
+)
+
+func GetLatestChaptersByTypeIdsAndClass(typeIds []int, classifyNameFirst string) (list []*ReportChapter, err error) {
+	sql := `SELECT
+	DISTINCT report_id
+FROM
+	report_chapter
+WHERE
+	type_id IN (?) 
+	AND publish_state = 2 
+	AND is_edit = 1
+	AND report_type = ?
+ORDER BY
+	publish_time desc, report_chapter_id desc limit 30
+`
+	err = global.MYSQL["rddp"].Model(ReportChapter{}).Raw(sql, typeIds, classifyNameFirst).Scan(&list).Error
+	return
+}
+
+// GetListByReportId 根据报告ID获取章节列表
+func GetListByReportId(reportId int, classifyNameFirst string) (list []*ReportChapter, err error)  {
+	var where string
+	if  classifyNameFirst == "周报"{
+		where = "report_id = ? AND is_edit = 1 AND publish_state = 2"
+	}else{
+		where = "report_id = ? AND publish_state = 2"
+	}
+
+	err = global.MYSQL["rddp"].Model(ReportChapter{}).
+		Select("report_chapter_id, report_id, type_id, type_name, abstract, title, author, publish_time, trend").
+		Where(where, reportId).
+		Order("sort asc, report_chapter_id asc").
+		Scan(&list).Error
+	return
+}
+
+// GetListByReportIdTypeIds 根据报告ID、章节类型ID获取章节列表
+func GetListByReportIdTypeIds(reportId int, typeIds []int, classifyNameFirst string) (list []*ReportChapter, err error)  {
+	var where string
+	if  classifyNameFirst == "周报"{
+		where = "report_id = ? AND type_id in (?) AND is_edit = 1 AND publish_state = 2 "
+	}else{
+		where = "report_id = ? AND type_id in (?) AND publish_state = 2 "
+	}
+
+	err = global.MYSQL["rddp"].Model(ReportChapter{}).
+		Select("report_chapter_id, report_id, type_id, type_name, abstract, title, author, publish_time").
+		Where(where, reportId, typeIds).
+		Order("sort asc, report_chapter_id asc").
+		Scan(&list).Error
+	return
+}
+
+// GetContentById 根据ID获取章节详情
+func GetContentById(id int, typeIds []int) (info *ReportChapter, err error)  {
+	err = global.MYSQL["rddp"].Model(ReportChapter{}).Select("report_chapter_id, report_id,  is_edit, classify_name_first, classify_id_first, content, trend, type_id, type_name, abstract, title, author, stage, publish_time, content, content_sub, video_url, video_name, video_play_seconds, video_size").
+		Where("report_chapter_id = ? and type_id in (?) AND publish_state = 2 ", id, typeIds).
+		First(&info).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	return
+}
+
+// GetReportIdsByTypeIdsAndClass 根据章节ID获取报告ID
+func GetReportIdsByTypeIdsAndClass(typeIds []int, classifyNameFirst string) (reportIds []int, err error) {
+	var list []*ReportChapter
+	err = global.MYSQL["rddp"].Model(ReportChapter{}).Select("DISTINCT report_id").Where("type_id in (?) and publish_state = 2 AND is_edit = 1 AND classify_name_first= ? ", typeIds, classifyNameFirst).Scan(&list).Error
+	if err != nil {
+		return
+	}
+	for _, v := range list {
+		reportIds = append(reportIds, v.ReportId)
+	}
+	return
+}
+
+// GetTypeIdById 根据ID获取章节类型
+func GetTypeIdById(id int) (info *ReportChapter, err error)  {
+	err = global.MYSQL["rddp"].Model(ReportChapter{}).Select("report_chapter_id, type_id").
+		Where("report_chapter_id = ? AND publish_state = 2 ", id).
+		First(&info).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	return
+}
+
+
+// GetByTypeIdsAndReportIds 根据章节ID和ReportIds查询报告
+func GetByTypeIdsAndReportIds(typeIds []int,  reportIds []int, classifyNameFirst string) (list []*ReportChapter, err error) {
+	var where string
+	if  classifyNameFirst == "周报"{
+		where = "report_id in (?) AND type_id in (?) AND is_edit = 1 AND publish_state = 2 "
+	}else{
+		where = "report_id in (?) AND type_id in (?) AND publish_state = 2 "
+	}
+
+	err = global.MYSQL["rddp"].Model(ReportChapter{}).
+		Select("report_id, type_id, report_chapter_id, classify_name_first, classify_id_first, video_url, video_name, video_play_seconds, video_size, sort").
+		Where(where, reportIds, typeIds).
+		Order("sort asc, report_chapter_id asc").
+		Scan(&list).Error
+	if err != nil {
+		return
+	}
+	for _, v := range list {
+		reportIds = append(reportIds, v.ReportId)
+	}
+	return
+}

+ 35 - 0
models/tables/rddp/report_chapter/report_chapter.go

@@ -0,0 +1,35 @@
+package report_chapter
+
+import "time"
+
+type ReportChapter struct {
+	ReportChapterId   int       `gorm:"primaryKey;column:report_chapter_id;type:int(10) unsigned;not null" json:"-"`
+	ReportId          int       `gorm:"column:report_id;type:int(10);not null;default:0"  json:"report_id"`                         //报告ID
+	ReportType        string    `gorm:"column:report_type;type:varchar(255);not null;default:''"  json:"report_type"`               //晨报-day;周报-week;
+	ClassifyIdFirst   int       `gorm:"column:classify_id_first;type:int(10);default:0"  json:"classify_id_first"`                  //一级分类id
+	ClassifyNameFirst string    `gorm:"column:classify_name_first;type:varchar(255);default:''"  json:"classify_name_first"`        //一级分类名称
+	TypeId            int       `gorm:"column:type_id;type:int(10);not null;default:0"  json:"type_id"`                             //品种ID
+	TypeName          string    `gorm:"column:type_name;type:varchar(255);not null;default:''"  json:"type_name"`                   //品种名称
+	Title             string    `gorm:"column:title;type:varchar(255);not null;default:''"  json:"title"`                           //章节标题
+	Abstract          string    `gorm:"column:abstract;type:varchar(255);not null;default:''"  json:"abstract"`                     //摘要
+	AddType           int       `gorm:"column:add_type;type:int(10);not null;default:0"  json:"add_type"`                           //是否为继承报告1-空白报告2-继承报告
+	Author            string    `gorm:"column:author;type:varchar(255);not null;default:''"  json:"author"`                         //作者
+	Content           string    `gorm:"column:content;type:longtext;"  json:"content"`                                              //内容
+	ContentSub        string    `gorm:"column:content_sub;type:longtext;"  json:"content_sub"`                                      //内容前两章
+	Stage             int       `gorm:"column:stage;type:int(10);not null;default:0"  json:"stage"`                                 //期数
+	Trend             string    `gorm:"column:trend;type:varchar(255);not null;default:''"  json:"trend"`                           //趋势观点
+	Sort              int       `gorm:"column:sort;type:int(10);not null;default:0"  json:"sort"`                                   //排序:数值越小越靠前
+	IsEdit            int       `gorm:"column:is_edit;type:int(10);not null;default:0"  json:"is_edit"`                             //是否编辑
+	PublishState      int       `gorm:"column:publish_state;type:int(4);not null;default:0"  json:"publish_state"`                  //发布状态1-待发布2-已发布
+	PublishTime       time.Time `gorm:"column:publish_time;type:datetime"  json:"publish_time"`                                     //发布时间
+	VideoUrl          string    `gorm:"column:video_url;type:varchar(255);not null;default:''"  json:"video_url"`                   //音频文件URL
+	VideoName         string    `gorm:"column:video_name;type:varchar(255);not null;default:''"  json:"video_name"`                 //音频文件名称
+	VideoPlaySeconds  string    `gorm:"column:video_play_seconds;type:varchar(255);not null;default:''"  json:"video_play_seconds"` //音频播放时长
+	VideoSize         string    `gorm:"column:video_size;type:varchar(255);not null;default:''"  json:"video_size"`                 //音频文件大小,单位M
+	CreateTime        time.Time `gorm:"column:create_time;type:datetime"  json:"create_time"`                                       //创建时间
+	ModifyTime        time.Time `gorm:"column:modify_time;type:datetime"  json:"modify_time"`                                       //修改时间
+}
+
+func (r *ReportChapter) TableName() string {
+	return "report_chapter"
+}

+ 15 - 0
models/tables/rddp/report_chapter_ticker/query.go

@@ -0,0 +1,15 @@
+package report_chapter_ticker
+
+import (
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/utils"
+)
+
+// GetTickerByChapterId 根据章节ID获取指标列表
+func GetTickerByChapterId(reportChapterId int) (list []*reportChapterTicker, err error)  {
+	err = global.MYSQL["rddp"].Model(reportChapterTicker{}).Where("report_chapter_id = ?", reportChapterId).Order("sort asc, id asc").Scan(&list).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	return
+}

+ 16 - 0
models/tables/rddp/report_chapter_ticker/report_chapter_ticker.go

@@ -0,0 +1,16 @@
+package report_chapter_ticker
+
+import "time"
+
+type reportChapterTicker struct {
+	Id                  int		  `gorm:"primaryKey;column:report_chapter_id;type:int(10) unsigned;not null" json:"-"`
+	ReportChapterId     int       `gorm:"column:report_chapter_id;type:int(10) unsigned;not null" json:"report_chapter_id"`
+	Sort				int       `gorm:"column:sort;type:int(10);not null;default:0"  json:"sort"`
+	Ticker              string    `gorm:"column:ticker;type:varchar(50);not null;default:''" json:"ticker"`
+	CreateTime          time.Time `gorm:"column:create_time;type:datetime"  json:"create_time"`                                         //创建时间
+	UpdateTime          time.Time `gorm:"column:update_time;type:datetime"  json:"update_time"`                                         //修改时间
+}
+
+func (r *reportChapterTicker) TableName() string {
+	return "report_chapter_ticker"
+}

+ 9 - 0
models/tables/rddp/report_view_log/create.go

@@ -0,0 +1,9 @@
+package report_view_log
+
+import "hongze/hongze_yb/global"
+
+// CreateInBatches 批量新增
+func CreateInBatches(reportLogs []*ReportViewLog) (err error) {
+	err = global.MYSQL["rddp"].Model(ReportViewLog{}).CreateInBatches(reportLogs, len(reportLogs)).Error
+	return
+}

+ 19 - 0
models/tables/rddp/report_view_log/query.go

@@ -0,0 +1,19 @@
+package report_view_log
+
+import "hongze/hongze_yb/global"
+
+// GetByReportIdsAndUserIdAndTime 根据用户id和 报告id,创建时间筛选出用户已经浏览过的记录
+func GetByReportIdsAndUserIdAndTime(reportIds []int, userId uint64, createTime string) (repIds []int, err error)   {
+	var viewLog []*ReportViewLog
+	err = global.MYSQL["rddp"].Model(ReportViewLog{}).Where("report_id in (?) and user_id = ? and create_time > ?", reportIds, userId, createTime).Scan(&viewLog).Error
+	if err != nil {
+		return
+	}
+
+	if len(viewLog) > 0 {
+		for _, v := range viewLog {
+			repIds = append(repIds, v.ReportId)
+		}
+	}
+	return
+}

+ 16 - 0
models/tables/rddp/report_view_log/report_view_log.go

@@ -0,0 +1,16 @@
+package report_view_log
+
+import (
+	"time"
+)
+
+type ReportViewLog struct {
+	Id                  int          `gorm:"primaryKey;column:id;type:int(11) unsigned;not null" json:"-"`
+	UserId              uint64          `gorm:"column:user_id;type:int(11)"  json:"user_id"`
+	ReportId            int 		 `gorm:"column:report_id;type:int(11)"  json:"report_id"`
+	CreateTime          time.Time    `gorm:"column:create_time;type:datetime"  json:"create_time"`
+}
+
+func (reportLog *ReportViewLog) TableName() string  {
+	return "report_view_log"
+}

+ 8 - 0
models/tables/rddp/report_view_record/create.go

@@ -0,0 +1,8 @@
+package report_view_record
+
+import "hongze/hongze_yb/global"
+
+func Create(record *ReportViewRecord) (err error)  {
+	err =  global.MYSQL["rddp"].Create(record).Error
+	return
+}

+ 19 - 0
models/tables/rddp/report_view_record/report_view_record.go

@@ -0,0 +1,19 @@
+package report_view_record
+
+import "time"
+
+type ReportViewRecord struct {
+	Id          int       `orm:"column(id);pk"`
+	UserId      int       `description:"用户id"`
+	ReportId    int       `description:"报告id"`
+	Mobile      string    `description:"手机号"`
+	Email       string    `description:"邮箱"`
+	RealName    string    `description:"用户实际姓名"`
+	CompanyName string    `description:"公司名称"`
+	CreateTime  time.Time `description:"创建时间"`
+	ReportChapterId     int `description:"报告章节ID,0表示目录页"`
+}
+
+func (r *ReportViewRecord) TableName() string  {
+	return "report_view_record"
+}

+ 59 - 0
models/tables/report_chapter_type/query.go

@@ -0,0 +1,59 @@
+package report_chapter_type
+
+import (
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/utils"
+)
+
+func GetEffectTypeID() (chapterIds []int, err error ) {
+	var chapterList []*ReportChapterType
+	err = global.DEFAULT_MYSQL.Model(ReportChapterType{}).Select("report_chapter_type_id ").Where("is_show=1").Scan(&chapterList).Error
+	if err != nil {
+		if err == utils.ErrNoRow {
+			err = nil
+		}
+		return
+	}
+	if len(chapterList) > 0 {
+		for _, v := range chapterList {
+			chapterIds = append(chapterIds, int(v.ReportChapterTypeId))
+		}
+	}
+	return
+}
+
+
+func GetEffectTypes() (list []*ReportChapterType, err error ) {
+	err = global.DEFAULT_MYSQL.Model(ReportChapterType{}).Where("is_show=1").Scan(&list).Error
+	return
+}
+
+// GetTypeIDByReportChapterTypeName 根据章节类型查找章节ID
+func GetTypeIDByReportChapterTypeName(name string) (chapterIds []int, err error ) {
+	var chapterList []*ReportChapterType
+	err = global.DEFAULT_MYSQL.Model(ReportChapterType{}).Select("report_chapter_type_id ").Where("is_show=1 and report_chapter_type_name =?", name).Scan(&chapterList).Error
+	if err != nil {
+		if err == utils.ErrNoRow {
+			err = nil
+		}
+		return
+	}
+	if len(chapterList) > 0 {
+		for _, v := range chapterList {
+			chapterIds = append(chapterIds, int(v.ReportChapterTypeId))
+		}
+	}
+	return
+}
+
+// GetTickerTitleByTypeId 根据类型获取指标标题
+func GetTickerTitleByTypeId(id int) (chapterType *ReportChapterType , err error)  {
+	err = global.DEFAULT_MYSQL.Model(ReportChapterType{}).Select("ticker_title, report_chapter_type_id, report_chapter_type_name, report_chapter_type_key").Where("report_chapter_type_id=?", id).First(&chapterType).Error
+	if err != nil {
+		if err == utils.ErrNoRow {
+			err = nil
+		}
+		return
+	}
+	return
+}

+ 30 - 0
models/tables/report_chapter_type/report_chapter_type.go

@@ -0,0 +1,30 @@
+package report_chapter_type
+
+import "time"
+
+type ReportChapterType struct {
+	ReportChapterTypeId    uint64    	  `gorm:"primaryKey;column:report_chapter_type_id;type:bigint(20) unsigned;not null" json:"-"`        //研究报告章节id
+	ReportChapterTypeKey   string         `gorm:"column:report_chapter_type_key;type:varchar(32)" json:"report_chapter_type_key"`            //章节key
+	ReportChapterTypeThumb string         `gorm:"column:report_chapter_type_thumb;type:varchar(512)" json:"report_chapter_type_thumb"`        //H5展示的图片
+	BannerUrl              string         `gorm:"column:banner_url;type:varchar(512)" json:"banner_url"`                                      //banner显示图片
+	ReportChapterTypeName  string         `gorm:"column:report_chapter_type_name;type:varchar(32)" json:"report_chapter_type_name"`          //报告章节类型名称
+	Sort                   int            `gorm:"column:sort;type:int(10);not null;default:0" json:"sort"`                                  //排序字段
+	Enabled                int            `gorm:"column:enabled;type:tinyint(1)" json:"enabled"`                                            //报告类型状态
+	CreatedTime            time.Time      `gorm:"column:created_time;type:datetime" json:"created_time"`                                  //创建时间
+	LastUpdatedTime        time.Time      `gorm:"column:last_updated_time;type:datetime" json:"last_updated_time"`                        //更新时间
+	ResearchType           string         `gorm:"column:research_type;type:varchar(30)" json:"research_type"`                                //研报类型
+	SelectedImage          string         `gorm:"column:selected_image;type:varchar(512)" json:"selected_image"`                              //选中时的图片
+	UnselectedImage        string         `gorm:"column:unselected_image;type:varchar(512)" json:"unselected_image"`                          //没选中时的图片
+	EditImgUrl             string         `gorm:"column:edit_img_url;type:varchar(512)" json:"edit_img_url"`                                  //管理后台编辑时选用的图
+	TickerTitle            string         `gorm:"column:ticker_title;type:varchar(128)" json:"ticker_title"`                                  //指标列的标题
+	IsShow                 int            `gorm:"column:is_show;type:tinyint(1);default:1" json:"is_show"`                                    //是否显示
+	PauseStartTime         time.Time      `gorm:"column:pause_start_time;type:datetime" json:"pause_start_time"`                          //暂停开始日期
+	PauseEndTime           time.Time      `gorm:"column:pause_end_time;type:datetime" json:"pause_end_time"`                              //暂停结束日期
+	IsSet                  int            `gorm:"column:is_set;type:tinyint(4);default:0" json:"is_set"`
+	YbIconUrl              string    `gorm:"column:yb_icon_url;type:varchar(255) json:"yb_icon_url"`                                     //研报小程序3.0图标
+	YbBottomIcon              string    `gorm:"column:yb_bottom_icon;type:varchar(255) json:"yb_bottom_icon"`                                     //研报小程序3.0底部菜单图标
+}
+
+func (r *ReportChapterType) TableName() string {
+	return "report_chapter_type"
+}

+ 22 - 0
models/tables/report_chapter_type_permission/query.go

@@ -0,0 +1,22 @@
+package report_chapter_type_permission
+
+import (
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/utils"
+)
+
+// GetTypeIdsByChartPermissionId 根据权限查询对应的章节
+func GetTypeIdsByChartPermissionId(chartPermissionId int) (typeIds []int, err error)  {
+	var list []*ReportChapterTypePermission
+	err = global.DEFAULT_MYSQL.Model(ReportChapterTypePermission{}).Where("chart_permission_id = ?", chartPermissionId).Scan(&list).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	if err != nil {
+		return
+	}
+	for _, v := range list {
+		typeIds = append(typeIds, int(v.ReportChapterTypeId))
+	}
+	return
+}

+ 13 - 0
models/tables/report_chapter_type_permission/report_chapter_type_permission.go

@@ -0,0 +1,13 @@
+package report_chapter_type_permission
+
+type ReportChapterTypePermission struct {
+	Id                     int
+	ChartPermissionID      uint64
+	ResearchType           string
+	ReportChapterTypeId    uint64
+}
+
+func (r *ReportChapterTypePermission) TableName() string {
+	return "report_chapter_type_permission"
+}
+

+ 9 - 0
models/tables/user_access_record/create.go

@@ -0,0 +1,9 @@
+package user_access_record
+
+import "hongze/hongze_yb/global"
+
+//  Create 新增报告浏览记录
+func (ua *UserAccessRecord) Create() (err error) {
+	err = global.DEFAULT_MYSQL.Create(ua).Error
+	return
+}

+ 18 - 0
models/tables/user_access_record/user_access_record.go

@@ -0,0 +1,18 @@
+package user_access_record
+
+import "time"
+
+type UserAccessRecord struct {
+	Id              int `gorm:"column:id" db:"id" json:"id" form:"id"`
+	Uid             int `gorm:"column:uid" db:"uid" json:"uid" form:"uid"`
+	Token           string `gorm:"column:token" db:"token" json:"token" form:"token"`
+	ReportId        int `gorm:"column:report_id" db:"report_id" json:"report_id" form:"report_id"`
+	CreateTime      time.Time `gorm:"column:create_time" db:"create_time" json:"create_time" form:"create_time"`
+	Remark          string `gorm:"column:remark" db:"remark" json:"remark" form:"remark"`
+	ReportChapterId int `gorm:"column:report_chapter_id" db:"report_chapter_id" json:"report_chapter_id" form:"report_chapter_id"` //章节ID
+}
+
+// TableName get sql table name.获取数据库表名
+func (ua *UserAccessRecord) TableName() string {
+	return "user_access_record"
+}

+ 8 - 0
models/tables/wx_user/update.go

@@ -30,3 +30,11 @@ func ModifyFirstLogin(userId uint64) (err error) {
 	}).Error
 	return
 }
+
+// SetWxUserReportLastViewTime 修改最新阅读时间
+func (wxUser *WxUser) SetWxUserReportLastViewTime() (err error) {
+	wxUser.ReportLastViewTime = time.Now()
+	var updateCols = []string{"ReportLastViewTime"}
+	err = wxUser.Update(updateCols)
+	return
+}

+ 1 - 1
models/tables/wx_user/wx_user.go

@@ -59,7 +59,7 @@ type WxUser struct {
 }
 
 // TableName get sql table name.获取数据库表名
-func (m *WxUser) TableName() string {
+func (wxUser *WxUser) TableName() string {
 	return "wx_user"
 }
 

+ 33 - 0
models/tables/yb_activity/query.go

@@ -71,4 +71,37 @@ func GetDetailById(activityId int) (activity *ActivityDetail, err error) {
 func GetOneById(activityId int) (activity *YbActivity, err error) {
 	err = global.DEFAULT_MYSQL.Where("activity_id = ?", activityId).First(&activity).Error
 	return
+}
+
+// GetActivityByIDsAndDate 根据时间和活动ID筛选出合适的记录
+func GetActivityByIDsAndDate( ids []int, publishTime string) (list []*YbActivity, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbActivity{}).
+		Select("DISTINCT activity_id").
+		Where("activity_id in (?) and publish_status = 1 and create_time > ? and is_delete = 0", ids, publishTime).Scan(&list).Error
+	return
+}
+
+// GetLatestByIds 获取最新的活动
+func GetLatestByIds(activityids []int) (activity *YbActivity, err error)  {
+	err = global.DEFAULT_MYSQL.Model(YbActivity{}).Where("activity_id in (?) and is_delete = 0 and publish_status = 1", activityids).Order("create_time desc").First(&activity).Error
+	return
+}
+
+// GetListByIds 分页查询活动列表
+func GetListByIds(activityids []int, offset , limit int) (activitys []*YbActivity, err error)  {
+	err = global.DEFAULT_MYSQL.Model(YbActivity{}).
+		Where("activity_id in (?) and is_delete = 0 and publish_status = 1", activityids).
+		Order("create_time desc").
+		Offset(offset).
+		Limit(limit).
+		Scan(&activitys).Error
+	return
+}
+
+// GetListCountByIds 查询活动列表总数
+func GetListCountByIds(activityIds []int) (total int64, err error)  {
+	err = global.DEFAULT_MYSQL.Model(YbActivity{}).
+		Where("activity_id in (?) and is_delete = 0 and publish_status = 1", activityIds).
+		Count(&total).Error
+	return
 }

+ 9 - 0
models/tables/yb_activity_view_log/create.go

@@ -0,0 +1,9 @@
+package yb_activity_view_log
+
+import "hongze/hongze_yb/global"
+
+// CreateInBatches 批量新增活动提醒记录
+func CreateInBatches(activityLogs []*YbActivityViewLog) (err error) {
+	err = global.DEFAULT_MYSQL.Model(YbActivityViewLog{}).CreateInBatches(activityLogs, len(activityLogs)).Error
+	return
+}

+ 19 - 0
models/tables/yb_activity_view_log/query.go

@@ -0,0 +1,19 @@
+package yb_activity_view_log
+
+import "hongze/hongze_yb/global"
+
+// GetByActivityIdsAndUserIdAndTime 根据用户id和 活动id,创建时间筛选出用户已经浏览过的记录
+func GetByActivityIdsAndUserIdAndTime( activityIds []int, userId uint64, createTime string) (actIds []int, err error)   {
+	var viewLog []*YbActivityViewLog
+	err = global.DEFAULT_MYSQL.Model(YbActivityViewLog{}).Where("activity_id in (?) and user_id = ? and create_time > ?", activityIds, userId, createTime).Scan(&viewLog).Error
+	if err != nil {
+		return
+	}
+
+	if len(viewLog) > 0 {
+		for _, v := range viewLog {
+			actIds = append(actIds, v.ActivityId)
+		}
+	}
+	return
+}

+ 16 - 0
models/tables/yb_activity_view_log/yb_activity_view_log.go

@@ -0,0 +1,16 @@
+package yb_activity_view_log
+
+import (
+	"time"
+)
+
+type YbActivityViewLog struct {
+	Id                  int          `gorm:"primaryKey;column:id;type:int(11) unsigned;not null" json:"-"`
+	UserId              uint64        `gorm:"column:user_id;type:int(11)"  json:"user_id"`
+	ActivityId          int 		 `gorm:"column:activity_id;type:int(11)"  json:"activity_id"`
+	CreateTime          time.Time    `gorm:"column:create_time;type:datetime"  json:"create_time"`
+}
+
+func (activityLog *YbActivityViewLog) TableName() string  {
+	return "yb_activity_view_log"
+}

+ 1 - 1
models/tables/yb_apply_record/yb_apply_record.go

@@ -22,7 +22,7 @@ type YbApplyRecord struct {
 	SysUserID       int       `gorm:"column:sys_user_id;type:int(11);default:0" json:"sysUserId"`                   // 处理人id
 	CreateTime      time.Time `gorm:"column:create_time;type:datetime" json:"createTime"`                           // 创建时间
 	IsMove			int		  `gorm:"column:is_move;type:tinyint(4);default:0" json:"is_move"`						// 是否已移动 0-否 1-是
-	Source			int		  `gorm:"column:source;type:tinyint(4);default:1" json:"source"`						// 申请来源 1-我的 2-活动 3-图库
+	Source			int		  `gorm:"column:source;type:tinyint(4);default:1" json:"source"`						// 申请来源 1-我的 2-活动 3-图库 4-研报
 	SourceAgent     int       `gorm:"column:source_agent;type:tinyint(4);default:1" json:"source_agent"`             // 申请入口来源,1:小程序,2:pc
 	FromPage        string    `gorm:"column:from_page;type:varchar(255);default:''" json:"from_page"`                // 申请来源具体页面
 }

+ 14 - 0
routers/company.go

@@ -0,0 +1,14 @@
+package routers
+
+import (
+	"github.com/gin-gonic/gin"
+	"hongze/hongze_yb/controller/company"
+	"hongze/hongze_yb/middleware"
+)
+
+func InitCompany(r *gin.Engine) {
+	rGroup := r.Group("api/company").Use(middleware.Token())
+	{
+		rGroup.GET("/getPermissionList", company.GetHomeFiccPermissions)
+	}
+}

+ 14 - 0
routers/purchase.go

@@ -0,0 +1,14 @@
+package routers
+
+import (
+	"github.com/gin-gonic/gin"
+	"hongze/hongze_yb/controller/purchase"
+	"hongze/hongze_yb/middleware"
+)
+
+func InitPurchase(r *gin.Engine)  {
+	rGroup := r.Group("api/purchase").Use(middleware.Token())
+
+	rGroup.GET("/list", purchase.List)
+	rGroup.GET("/detail", purchase.Detail)
+}

+ 26 - 0
routers/report.go

@@ -0,0 +1,26 @@
+package routers
+
+import (
+	"github.com/gin-gonic/gin"
+	"hongze/hongze_yb/controller/report"
+	"hongze/hongze_yb/middleware"
+)
+
+func InitReport(r *gin.Engine)  {
+	rGroup := r.Group("api/report").Use(middleware.Token())
+	rGroup.GET("/detail", report.Detail)
+	rGroup.GET("/chapter/detail", report.ChapterDetail)
+	rGroup.GET("/chapter/ticker", report.TickerData)
+	rGroup.GET("/list", report.List)
+	rGroup.GET("/collect", report.CollectReportList)
+	rGroup.GET("/search", report.Search)
+
+	rGroup2 := r.Group("api/classify").Use(middleware.Token())
+	rGroup2.GET("/ficc", report.ClassifyFirstList)
+	rGroup2.GET("/list", report.ClassifyList)
+	rGroup2.GET("/simple/list", report.ClassifySimpleList)
+	rGroup2.GET("/detail", report.ClassifyDetail)
+	rGroup2.GET("/detail/reports", report.ClassifyDetailReports)
+
+
+}

+ 115 - 0
services/activity/activity.go

@@ -1,7 +1,12 @@
 package activity
 
 import (
+	"errors"
+	"fmt"
 	"gorm.io/gorm"
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/models/response"
+	"hongze/hongze_yb/models/response/purchase"
 	"hongze/hongze_yb/models/tables/company_product"
 	"hongze/hongze_yb/models/tables/yb_activity"
 	"hongze/hongze_yb/models/tables/yb_activity_permission"
@@ -194,5 +199,115 @@ func GetUserAuthActivityIds(userInfo user.UserInfo) (acrivityIds []int, err erro
 		acrivityIds = append(acrivityIds, int(v.ActivityID))
 	}
 
+	return
+}
+
+// GetLatestActivity 从用户有权限参与的活动中,筛选出最新的活动
+func GetLatestActivity(permissionIds []int, userId uint64) (purchaseItem *purchase.PurchaseListItem, err error)  {
+	var errMsg string
+	defer func() {
+		if sysErr := recover(); sysErr != nil {
+			err = errors.New("系统错误")
+			global.LOG.Critical(fmt.Sprintf("GetLatestClassReport: userId=%d, err:%s,sysErr:%s", userId, err.Error(), sysErr))
+		}
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("GetLatestClassReport: userId=%d, err:%s, errMsg:%s", userId, err.Error(), errMsg))
+		}
+	}()
+	// 获取用户权限可参与的活动ID
+	var activityIds []int
+	permissions, err := yb_activity_permission.GetPermissionsByPermissionIds(permissionIds)
+	if err != nil {
+		return
+	}
+	for _, v := range permissions {
+		activityIds = append(activityIds, int(v.ActivityID))
+	}
+
+	activityItem, err := yb_activity.GetLatestByIds(activityIds)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("查询活动错误")
+		return
+	}
+	//统计未读数
+	unRead, err := GetUnRead(activityIds, userId)
+	if err != nil{
+		errMsg = err.Error()
+		err = errors.New("查询活动未读数错误")
+		return
+	}
+	purchaseItem = new(purchase.PurchaseListItem)
+	if activityItem.ActivityID > 0 {
+		purchaseItem.ActivityId = activityItem.ActivityID
+		purchaseItem.Title = activityItem.ActivityName
+		purchaseItem.Content = fmt.Sprintf("主讲:%s", activityItem.Speaker)
+		purchaseItem.Time = activityItem.ModifyTime
+		purchaseItem.Unread = unRead
+		// 添加活动icon
+		purchaseItem.ImgUrl = utils.ALIYUN_YBIMG_HOST + "purchase_icon_xj_two_week.png"
+	}
+	return
+}
+
+
+// GetList 从用户有权限参与的活动中,筛选出最新的活动
+func GetPurchaseDetail(permissionIds []int, userId uint64,  pageIndex, pageSize int) (ret *purchase.DetailResp, err error)  {
+	// 获取用户权限可参与的活动ID
+	var activityIds []int
+	permissions, err := yb_activity_permission.GetPermissionsByPermissionIds(permissionIds)
+	if err != nil {
+		return
+	}
+	for _, v := range permissions {
+		activityIds = append(activityIds, int(v.ActivityID))
+	}
+	offset := (pageIndex - 1) * pageSize
+	activityList, err := yb_activity.GetListByIds(activityIds, offset, pageSize)
+	if err != nil {
+		return
+	}
+
+	total, err := yb_activity.GetListCountByIds(activityIds)
+	if err != nil {
+		return
+	}
+	var WeekDayMap = map[string]string{
+		"Monday":    "周一",
+		"Tuesday":   "周二",
+		"Wednesday": "周三",
+		"Thursday":  "周四",
+		"Friday":    "周五",
+		"Saturday":  "周六",
+		"Sunday":    "周日",
+	}
+
+	ret = new(purchase.DetailResp)
+	var list []*purchase.Detail
+	for _, item := range activityList {
+		temp := new(purchase.Detail)
+		temp.ActivityId = item.ActivityID
+		temp.Title = fmt.Sprintf("主讲:%s", item.Speaker)
+		// 时间处理
+		activityDate := item.StartTime.Format("2006-01-02")
+		activityStart := item.StartTime.Format("15:04")
+		activityEnd := item.EndTime.Format("15:04")
+		activityWeek := item.StartTime.Weekday().String()
+		weekStr := WeekDayMap[activityWeek]
+		timeStr := activityDate + " " + activityStart + "-" + activityEnd + " " + weekStr
+		temp.Content = fmt.Sprintf("活动时间:%s", timeStr)
+		temp.Time = item.ModifyTime
+		temp.TopName = item.ActivityName
+		temp.ImgUrl = utils.ALIYUN_YBIMG_HOST + "purchase_bg_activity.png"
+		list = append(list, temp)
+	}
+	ret.List = list
+	ret.Paging = response.GetPaging(pageIndex, pageSize, int(total))
+	num, tErr := BatchInsertActivityView(activityIds, userId)
+	log.Printf("新增活动浏览记录:%d", num)
+	if tErr != nil {
+		err = tErr
+		return
+	}
 	return
 }

+ 95 - 0
services/activity/activity_view_log.go

@@ -0,0 +1,95 @@
+package activity
+
+import (
+	"hongze/hongze_yb/models/tables/yb_activity"
+	"hongze/hongze_yb/models/tables/yb_activity_view_log"
+	"time"
+)
+
+// GetUnRead 获取未读数
+func GetUnRead( activityIds []int, userId uint64) (unRead int, err error) {
+	firstDay := "2022-01-01"
+	newActivityList, err := yb_activity.GetActivityByIDsAndDate(activityIds, firstDay)
+	if err != nil {
+		return
+	}
+	var newIds []int
+	activityMap := make(map[int]bool)
+	if len(newActivityList) > 0 {
+		for _, v := range newActivityList {
+			newIds = append(newIds, v.ActivityID)
+			activityMap[v.ActivityID] = true
+		}
+
+		//获取用户的浏览记录
+		viewActivityIds, tErr := yb_activity_view_log.GetByActivityIdsAndUserIdAndTime(newIds, userId, firstDay)
+		if tErr != nil {
+			err = tErr
+			return
+		}
+
+		//过滤已经浏览过的活动ID
+		if len(viewActivityIds) > 0 {
+			for _, item := range viewActivityIds {
+				if _, ok := activityMap[item]; ok {
+					delete(activityMap, item)
+				}
+			}
+		}
+
+		unRead = len(activityMap)
+	}
+	return
+}
+
+// BatchInsertActivityView 批量新增报告已读记录
+func BatchInsertActivityView(activityIds []int, userId uint64) (num int, err error)  {
+	firstDay := "2022-01-01"
+	newActivityList, err := yb_activity.GetActivityByIDsAndDate(activityIds, firstDay)
+	if err != nil {
+		return
+	}
+	var newIds []int
+	activityMap := make(map[int]bool)
+	if len(newActivityList) > 0 {
+		for _, v := range newActivityList {
+			newIds = append(newIds, v.ActivityID)
+			activityMap[v.ActivityID] = true
+		}
+
+		//获取用户的浏览记录
+		viewActivityIds, tErr := yb_activity_view_log.GetByActivityIdsAndUserIdAndTime(newIds, userId, firstDay)
+		if tErr != nil {
+			err = tErr
+			return
+		}
+
+		//过滤已经浏览过的活动ID
+		if len(viewActivityIds) > 0 {
+			for _, item := range viewActivityIds {
+				if _, ok := activityMap[item]; ok {
+					delete(activityMap, item)
+				}
+			}
+		}
+
+		var logs []*yb_activity_view_log.YbActivityViewLog
+		for k, _ := range activityMap{
+			temp := new(yb_activity_view_log.YbActivityViewLog)
+			temp.ActivityId = k
+			temp.UserId = userId
+			temp.CreateTime = time.Now()
+			logs = append(logs, temp)
+		}
+		tErr = yb_activity_view_log.CreateInBatches(logs)
+		if tErr != nil {
+			err = tErr
+			return
+		}
+		num = len(logs)
+	}
+	return
+}
+
+
+

+ 0 - 376
services/chart/chart_info.go

@@ -151,382 +151,6 @@ func ModifyChartInfoAndMapping(edbInfoIdStr string, req *chartInfoModel.SaveChar
 	return
 }
 
-// RefreshChartInfo 刷新图表
-func RefreshChartInfo(chartInfoId int) (err error) {
-	var errMsg string
-	defer func() {
-		if err != nil {
-			//go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "ChartInfoRefresh:"+errMsg, utils.EmailSendToUsers)
-			fmt.Println("ChartInfoRefresh Err:" + errMsg)
-		}
-	}()
-
-	// 获取需要刷新的指标
-	baseEdbInfoArr, calculateInfoArr, err := GetChartInfoRefreshData(chartInfoId)
-	if err != nil {
-		errMsg = "获取需要刷新的指标失败:Err:" + err.Error()
-		return
-	}
-
-	newBaseEdbInfoArr := make([]*edbInfoModel.EdbInfo, 0)
-	baseMap := make(map[int]*edbInfoModel.EdbInfo)
-	for _, bv := range baseEdbInfoArr {
-		if _, ok := baseMap[bv.EdbInfoId]; !ok {
-			newBaseEdbInfoArr = append(newBaseEdbInfoArr, bv)
-		}
-		baseMap[bv.EdbInfoId] = bv
-	}
-
-	fmt.Println("calculateInfoArr:", len(calculateInfoArr))
-
-	newCalculateInfoArr := make([]*edbInfoModel.EdbInfo, 0)
-	calculateMap := make(map[int]*edbInfoModel.EdbInfo)
-	var calculateArr []int
-	for _, bv := range calculateInfoArr {
-		if _, ok := calculateMap[bv.EdbInfoId]; !ok {
-			newCalculateInfoArr = append(newCalculateInfoArr, bv)
-			calculateArr = append(calculateArr, bv.EdbInfoId)
-		}
-		calculateMap[bv.EdbInfoId] = bv
-	}
-	sort.Ints(calculateArr)
-
-	var startDate string
-	for _, bv := range newBaseEdbInfoArr {
-		source := bv.Source
-		edbInfoId := bv.EdbInfoId
-		edbCode := bv.EdbCode
-		startDate = bv.StartDate.Format(utils.FormatDate)
-		sTime, err := time.Parse(utils.FormatDate, bv.EndDate.Format(utils.FormatDate))
-		if err != nil {
-			return err
-		}
-		startDate = sTime.Format(utils.FormatDate)
-
-		fmt.Println("source:", source)
-
-		if source == utils.DATA_SOURCE_THS {
-			endDate := time.Now().AddDate(utils.DATA_END_DATE_LIMIT, 0, 0).Format(utils.FormatDate)
-			fmt.Println("DO:RefreshEdbDataByThs")
-			err = RefreshEdbDataByThs(edbInfoId, edbCode, startDate, endDate)
-			if err != nil {
-				errMsg = "RefreshEdbDataByThs Err:" + err.Error()
-			}
-		} else if source == utils.DATA_SOURCE_WIND {
-			endDate := time.Now().Format(utils.FormatDate)
-			fmt.Println("DO:RefreshEdbDataByWind")
-			err = RefreshEdbDataByWind(edbInfoId, edbCode, startDate, endDate)
-			if err != nil {
-				errMsg = "RefreshEdbDataByWind Err:" + err.Error()
-			}
-		} else if source == utils.DATA_SOURCE_PB {
-			startDate := sTime.Format(utils.FormatDateUnSpace)
-			endDate := time.Now().AddDate(utils.DATA_END_DATE_LIMIT, 0, 0).Format(utils.FormatDateUnSpace)
-			fmt.Println("DO:RefreshEdbDataByPb")
-			err = RefreshEdbDataByPb(edbInfoId, edbCode, startDate, endDate)
-			if err != nil {
-				errMsg = "RefreshEdbDataByPb Err:" + err.Error()
-			}
-		} else if source == utils.DATA_SOURCE_MANUAL {
-			fmt.Println("DO:RefreshAllEdbDataByManual:" + edbCode)
-			err = RefreshAllEdbDataByManual(edbInfoId, bv.Source, edbCode)
-			if err != nil {
-				errMsg = "RefreshEdbDataByManual Err:" + err.Error()
-			}
-		} else if source == utils.DATA_SOURCE_LZ {
-			endDate := time.Now().AddDate(utils.DATA_END_DATE_LIMIT, 0, 0).Format(utils.FormatDate)
-			fmt.Println("DO:RefreshEdbDataByLz")
-			err = RefreshEdbDataByLz(edbInfoId, edbCode, startDate, endDate)
-			if err != nil {
-				errMsg = "RefreshEdbDataByLz Err:" + err.Error()
-			}
-		} else if source == utils.DATA_SOURCE_YS {
-			endDate := time.Now().AddDate(utils.DATA_END_DATE_LIMIT, 0, 0).Format(utils.FormatDate)
-			fmt.Println("DO:RefreshAllEdbDataByYs")
-			err = RefreshAllEdbDataByYs(edbInfoId, source, edbCode, startDate, endDate)
-			if err != nil {
-				errMsg = "RefreshEdbDataByYs Err:" + err.Error()
-			}
-		} else if source == utils.DATA_SOURCE_GL {
-			endDate := time.Now().AddDate(utils.DATA_END_DATE_LIMIT, 0, 0).Format(utils.FormatDate)
-			fmt.Println("DO:RefreshEdbDataByGl")
-			err = RefreshEdbDataByGl(edbInfoId, edbCode, startDate, endDate)
-			if err != nil {
-				errMsg = "RefreshEdbDataByGl Err:" + err.Error()
-			}
-		} else if source == utils.DATA_SOURCE_LT {
-			endDate := time.Now().Format(utils.FormatDate)
-			fmt.Println("DO:RefreshAllEdbDataByLt")
-			err = RefreshAllEdbDataByLt(edbInfoId, source, edbCode, startDate, endDate)
-			if err != nil {
-				errMsg = "RefreshAllEdbDataByLT Err:" + err.Error()
-			}
-		} else if source == utils.DATA_SOURCE_ZZ {
-			endDate := time.Now().AddDate(utils.DATA_END_DATE_LIMIT, 0, 0).Format(utils.FormatDate)
-			fmt.Println("DO:RefreshEdbDataByZz")
-			err = RefreshEdbDataByZz(edbInfoId, edbCode, startDate, endDate)
-			if err != nil {
-				errMsg = "RefreshAllEdbDataByZz Err:" + err.Error()
-			}
-		} else if source == utils.DATA_SOURCE_DL {
-			endDate := time.Now().AddDate(utils.DATA_END_DATE_LIMIT, 0, 0).Format(utils.FormatDate)
-			fmt.Println("DO:RefreshEdbDataByDl")
-			err = RefreshEdbDataByDl(edbInfoId, edbCode, startDate, endDate)
-			if err != nil {
-				errMsg = "RefreshAllEdbDataByDl Err:" + err.Error()
-			}
-		} else if source == utils.DATA_SOURCE_SH {
-			endDate := time.Now().AddDate(utils.DATA_END_DATE_LIMIT, 0, 0).Format(utils.FormatDate)
-			fmt.Println("DO:RefreshEdbDataBySh")
-			err = RefreshEdbDataBySh(edbInfoId, edbCode, startDate, endDate)
-			if err != nil {
-				errMsg = "RefreshAllEdbDataBySh Err:" + err.Error()
-			}
-		} else if source == utils.DATA_SOURCE_CFFEX {
-			endDate := time.Now().AddDate(utils.DATA_END_DATE_LIMIT, 0, 0).Format(utils.FormatDate)
-			fmt.Println("DO:RefreshEdbDataByCffex")
-			err = RefreshEdbDataByCffex(edbInfoId, edbCode, startDate, endDate)
-			if err != nil {
-				errMsg = "RefreshAllEdbDataByCffex Err:" + err.Error()
-			}
-		} else if source == utils.DATA_SOURCE_SHFE {
-			endDate := time.Now().AddDate(utils.DATA_END_DATE_LIMIT, 0, 0).Format(utils.FormatDate)
-			fmt.Println("DO:RefreshEdbDataByShfe")
-			err = RefreshEdbDataByShfe(edbInfoId, edbCode, startDate, endDate)
-			if err != nil {
-				errMsg = "RefreshAllEdbDataByShfe Err:" + err.Error()
-			}
-		} else if source == utils.DATA_SOURCE_GIE {
-			endDate := time.Now().AddDate(utils.DATA_END_DATE_LIMIT, 0, 0).Format(utils.FormatDate)
-			fmt.Println("DO:RefreshEdbDataByGie")
-			err = RefreshEdbDataByGie(edbInfoId, edbCode, startDate, endDate)
-			if err != nil {
-				errMsg = "RefreshEdbDataByGie Err:" + err.Error()
-			}
-		}
-
-		maxAndMinItem, err := edbDataModel.GetEdbInfoMaxAndMinInfo(source, edbCode)
-		if err != nil {
-			return err
-		}
-		if maxAndMinItem != nil {
-			err = edbDataModel.ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
-			if err != nil {
-				return err
-			}
-		}
-	}
-
-	endDate := "" //计算指标不限制日期
-	//刷新相关计算指标
-
-	for _, v := range calculateArr {
-		edbInfo := calculateMap[v]
-		if edbInfo == nil {
-			return err
-		}
-		edbInfoId := edbInfo.EdbInfoId
-		source := edbInfo.Source
-		edbCode := edbInfo.EdbCode
-
-		if source == utils.DATA_SOURCE_CALCULATE {
-			startDate = edbInfo.StartDate.Format(utils.FormatDate)
-			sTime, err := time.Parse(utils.FormatDate, edbInfo.EndDate.Format(utils.FormatDate))
-			if err != nil {
-				return err
-			}
-			startDate = sTime.Format(utils.FormatDate)
-
-			var edbInfoIdBytes []string
-			calculateMap, err := edbDataModel.GetEdbInfoCalculateDetail(edbInfoId, edbInfo.Source)
-			if err != nil {
-				errMsg = "GetEdbInfoCalculateDetail Err:" + err.Error()
-				return err
-			}
-			var formulaStr string
-			edbInfoList := make([]*edbInfoModel.EdbInfo, 0)
-
-			for _, v := range calculateMap {
-				formulaStr += v.FromTag + ","
-				edbInfoIdBytes = append(edbInfoIdBytes, v.FromTag)
-				edbInfo, _ := edbInfoModel.GetEdbInfoById(v.FromEdbInfoId)
-				edbInfoList = append(edbInfoList, edbInfo)
-			}
-			fmt.Println("DO:RefreshAllCalculate")
-			err = RefreshAllCalculate(edbInfoList, int(edbInfoId), source, edbInfo.EdbCode, edbInfo.CalculateFormula, startDate, endDate, edbInfoIdBytes)
-			if err != nil {
-				errMsg = "RefreshCalculate Err:" + err.Error()
-				return err
-			}
-		} else if source == utils.DATA_SOURCE_CALCULATE_LJZZY { //刷新累计值转月值
-			fmt.Println("DO:GetEdbInfoCalculateLjzzyDetail")
-			calculateLjzzy, err := edbDataModel.GetEdbInfoCalculateLjzzyDetail(edbInfoId)
-			if err != nil {
-				errMsg = "GetEdbInfoCalculateLjzzyDetail Err:" + err.Error()
-				return err
-			}
-			fromEdbInfo, err := edbInfoModel.GetEdbInfoById(calculateLjzzy.FromEdbInfoId)
-			if err != nil {
-				errMsg = "GetEdbInfoById Err:" + err.Error()
-				return err
-			}
-			startDate = edbInfo.StartDate.Format(utils.FormatDate)
-			endDate = time.Now().Format(utils.FormatDate)
-			fmt.Println("DO:RefreshAllCalculateLjzzy")
-			err = RefreshAllCalculateLjzzy(edbInfoId, source, fromEdbInfo, calculateLjzzy.EdbCode, startDate, endDate)
-			if err != nil {
-				errMsg = "RefreshAllCalculateLjzzy Err:" + err.Error()
-				return err
-			}
-		} else if source == utils.DATA_SOURCE_CALCULATE_TBZ { //刷新同比值
-			calculateTbz, err := edbDataModel.GetEdbInfoCalculateTbzDetail(edbInfoId)
-			if err != nil {
-				errMsg = "GetEdbInfoCalculateTbzDetail Err:" + err.Error()
-				return err
-			}
-			fromEdbInfo, err := edbInfoModel.GetEdbInfoById(calculateTbz.FromEdbInfoId)
-			if err != nil {
-				errMsg = "GetEdbInfoById Err:" + err.Error()
-				return err
-			}
-			startDate = edbInfo.StartDate.Format(utils.FormatDate)
-			endDate = time.Now().Format(utils.FormatDate)
-			fmt.Println("DO:RefreshAllCalculateTbz")
-			err = RefreshAllCalculateTbz(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate)
-			if err != nil {
-				errMsg = "RefreshAllCalculateTbz Err:" + err.Error()
-				return err
-			}
-		} else if source == utils.DATA_SOURCE_CALCULATE_TCZ { //同差值
-			calculateTcz, err := edbDataModel.GetEdbInfoCalculateTczDetail(edbInfoId)
-			if err != nil {
-				errMsg = "GetEdbInfoCalculateTczDetail Err:" + err.Error()
-				return err
-			}
-			fromEdbInfo, err := edbInfoModel.GetEdbInfoById(calculateTcz.FromEdbInfoId)
-			if err != nil {
-				errMsg = "GetEdbInfoById Err:" + err.Error()
-				return err
-			}
-			startDate = edbInfo.StartDate.Format(utils.FormatDate)
-			endDate = time.Now().Format(utils.FormatDate)
-			fmt.Println("DO:RefreshAllCalculateTcz")
-			err = RefreshAllCalculateTcz(edbInfoId, source, fromEdbInfo, calculateTcz.EdbCode, startDate, endDate)
-			if err != nil {
-				errMsg = "RefreshCalculateTcz Err:" + err.Error()
-				return err
-			}
-		} else if source == utils.DATA_SOURCE_CALCULATE_NSZYDPJJS { //N数值移动平均计算
-			calculateNszydpjjs, err := edbDataModel.GetEdbInfoCalculateNszydpjjsDetail(edbInfoId)
-			if err != nil {
-				errMsg = "GetEdbInfoCalculateNszydpjjsDetail Err:" + err.Error()
-				return err
-			}
-			fromEdbInfo, err := edbInfoModel.GetEdbInfoById(calculateNszydpjjs.FromEdbInfoId)
-			if err != nil {
-				errMsg = "GetEdbInfoById Err:" + err.Error()
-				return err
-			}
-			formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
-			startDate = edbInfo.StartDate.Format(utils.FormatDate)
-			fmt.Println("DO:RefreshAllCalculateNszydpjjs")
-			err = RefreshAllCalculateNszydpjjs(edbInfoId, edbInfo.Source, formulaInt, fromEdbInfo, calculateNszydpjjs.EdbCode, startDate)
-			if err != nil {
-				errMsg = "RefreshCalculateNszydpjjs Err:" + err.Error()
-				return err
-			}
-		} else if source == utils.DATA_SOURCE_CALCULATE_HBZ { //刷新环比值
-			calculateTbz, err := edbDataModel.GetEdbInfoCalculateHbzDetail(edbInfoId)
-			if err != nil {
-				errMsg = "GetEdbInfoCalculateHbzDetail Err:" + err.Error()
-				return err
-			}
-			fromEdbInfo, err := edbInfoModel.GetEdbInfoById(calculateTbz.FromEdbInfoId)
-			if err != nil {
-				errMsg = "GetEdbInfoById Err:" + err.Error()
-				return err
-			}
-			startDate = edbInfo.StartDate.Format(utils.FormatDate)
-			endDate = time.Now().Format(utils.FormatDate)
-			formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
-			fmt.Println("DO:RefreshAllCalculateHbz")
-			err = RefreshAllCalculateHbz(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate, formulaInt)
-			if err != nil {
-				errMsg = "RefreshAllCalculateHbz Err:" + err.Error()
-				return err
-			}
-		} else if source == utils.DATA_SOURCE_CALCULATE_HCZ { //刷新环差值
-			calculateTbz, err := edbDataModel.GetEdbInfoCalculateHczDetail(edbInfoId)
-			if err != nil {
-				errMsg = "GetEdbInfoCalculateHczDetail Err:" + err.Error()
-				return err
-			}
-			fromEdbInfo, err := edbInfoModel.GetEdbInfoById(calculateTbz.FromEdbInfoId)
-			if err != nil {
-				errMsg = "GetEdbInfoById Err:" + err.Error()
-				return err
-			}
-			startDate = edbInfo.StartDate.Format(utils.FormatDate)
-			endDate = time.Now().Format(utils.FormatDate)
-			formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
-			fmt.Println("DO:RefreshAllCalculateHcz")
-			err = RefreshAllCalculateHcz(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate, formulaInt)
-			if err != nil {
-				errMsg = "RefreshAllCalculateHcz Err:" + err.Error()
-				return err
-			}
-		} else if source == utils.DATA_SOURCE_CALCULATE_BP { //刷新变频
-			calculateTbz, err := edbDataModel.GetEdbInfoCalculateBpDetail(edbInfoId)
-			if err != nil {
-				errMsg = "GetEdbInfoCalculateTbzDetail Err:" + err.Error()
-				return err
-			}
-			fromEdbInfo, err := edbInfoModel.GetEdbInfoById(calculateTbz.FromEdbInfoId)
-			if err != nil {
-				errMsg = "GetEdbInfoById Err:" + err.Error()
-				return err
-			}
-			startDate = edbInfo.StartDate.Format(utils.FormatDate)
-			endDate = time.Now().Format(utils.FormatDate)
-			fmt.Println("DO:RefreshAllCalculateBp")
-			err = RefreshAllCalculateBp(edbInfoId, source, fromEdbInfo, calculateTbz.EdbCode, startDate, endDate)
-			if err != nil {
-				errMsg = "RefreshAllCalculateBp Err:" + err.Error()
-				return err
-			}
-		} else if source == utils.DATA_SOURCE_CALCULATE_ZJPJ { //刷新直接拼接数据
-			fmt.Println("DO:RefreshAllCalculateZjpj")
-			err = RefreshAllCalculateZjpj(edbInfo)
-			if err != nil {
-				errMsg = "RefreshAllCalculateZjpj Err:" + err.Error()
-				return err
-			}
-		} else if source == utils.DATA_SOURCE_CALCULATE_LJZTBPJ { //刷新累计值同比拼接数据
-			fmt.Println("DO:RefreshAllCalculateLjztbpj")
-			err = RefreshAllCalculateLjztbpj(edbInfo)
-			if err != nil {
-				errMsg = "RefreshAllCalculateLjztbpj Err:" + err.Error()
-				return err
-			}
-		}
-
-		maxAndMinItem, err := edbDataModel.GetEdbInfoMaxAndMinInfo(source, edbCode)
-		if err != nil {
-			return err
-		}
-
-		if maxAndMinItem != nil {
-			err = edbDataModel.ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
-			if err != nil {
-				return err
-			}
-		}
-		fmt.Println("end calculateArr:", v, time.Now())
-	}
-
-	return
-}
-
 // GetChartInfoRefreshData 获取需要刷新的指标
 func GetChartInfoRefreshData(chartInfoId int) (baseEdbInfoArr, calculateInfoArr []*edbInfoModel.EdbInfo, err error) {
 	sql := ` SELECT b.* FROM chart_edb_mapping AS a

+ 0 - 3665
services/chart/edb_data.go

@@ -1,3680 +1,15 @@
 package chart
 
 import (
-	"crypto/md5"
-	"encoding/hex"
 	"encoding/json"
-	"errors"
 	"fmt"
-	"github.com/shopspring/decimal"
-	"github.com/yidane/formula"
 	"hongze/hongze_yb/global"
-	edbDataModel "hongze/hongze_yb/models/tables/edb_data"
-	edbInfoModel "hongze/hongze_yb/models/tables/edb_info"
 	"hongze/hongze_yb/utils"
 	"io/ioutil"
 	"net/http"
-	"net/url"
-	"reflect"
-	"sort"
-	"strconv"
 	"strings"
-	"time"
 )
 
-type EdbDataFromThs struct {
-	DataVol   int64       	`json:"dataVol"`
-	Errmsg    string      	`json:"errmsg"`
-	Errorcode int64       	`json:"errorcode"`
-	Perf      interface{} 	`json:"perf"`
-	Tables    []struct {
-		ID    []string  	`json:"id"`
-		Time  []string  	`json:"time"`
-		Value []float64 	`json:"value"`
-	}						`json:"tables"`
-}
-
-func RefreshEdbDataByThs(edbInfoId int, edbCode, startDate, endDate string) (err error) {
-	HzServerDataUrl := ""
-	if global.CONFIG.Serve.RunMode == "release" {
-		HzServerDataUrl = "http://172.19.173.231:7000/"
-	} else {
-		HzServerDataUrl = "http://139.196.136.213:7000/"
-	}
-
-	thsUrl := HzServerDataUrl + `edbInfo/ths?EdbCode=%s&StartDate=%s&EndDate=%s`
-	thsUrl = fmt.Sprintf(thsUrl, edbCode, startDate, endDate)
-	//utils.FileLog.Info("thsUrl:%s", thsUrl)
-
-	reqRes, err := http.Get(thsUrl)
-	if err != nil {
-		return
-	}
-	defer reqRes.Body.Close()
-	body, err := ioutil.ReadAll(reqRes.Body)
-	if err != nil {
-		return
-	}
-
-	fmt.Println("GetEdbDataByThs body:")
-	fmt.Println(string(body))
-
-	item := new(EdbDataFromThs)
-	err = json.Unmarshal(body, &item)
-	if err != nil {
-		return
-	}
-	if item.Errorcode != 0 {
-		err = errors.New(string(body))
-		return
-	}
-	if len(item.Tables) > 0 {
-		table := item.Tables[0]
-		dataLen := len(table.Time)
-		addSql := ` INSERT INTO edb_data_ths(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
-		nowStr := time.Now().Format(utils.FormatDateTime)
-		var isAdd bool
-		for i := 0; i < dataLen; i++ {
-			eDate := table.Time[i]
-			sValue := table.Value[i]
-
-			count, err := edbDataModel.GetEdbDataThsByCodeAndDate(edbCode, eDate)
-			if err != nil && err != utils.ErrNoRow {
-				return err
-			}
-			if count <= 0 {
-				dataTime, err := time.Parse(utils.FormatDate, eDate)
-				if err != nil {
-
-				}
-				timestamp := dataTime.UnixNano() / 1e6
-				timeStr := fmt.Sprintf("%d", timestamp)
-
-				addSql += "("
-				addSql += strconv.Itoa(edbInfoId) + "," + "'" + edbCode + "'" + "," + "'" + eDate + "'" + "," + utils.SubFloatToString(sValue, 30) + "," + "'" + nowStr + "'" +
-					"," + "'" + nowStr + "'"
-				addSql += "," + "'" + timeStr + "'"
-				addSql += "),"
-				isAdd = true
-			} else {
-				err = edbDataModel.ModifyEdbDataThs(int64(edbInfoId), eDate, sValue)
-				if err != nil {
-					return err
-				}
-			}
-		}
-
-		if isAdd {
-			addSql = strings.TrimRight(addSql, ",")
-			err = edbDataModel.AddEdbDataThsBySql(addSql)
-			if err != nil {
-				fmt.Println("AddEdbDataThs Err", err.Error())
-				return
-			}
-		}
-	}
-
-	return
-}
-
-type EdbDataFromWind struct {
-	Close  map[string]float64 `json:"CLOSE"`
-	Dt     map[string]int64   `json:"DT"`
-	ErrMsg string
-}
-
-func RefreshEdbDataByWind(edbInfoId int, edbCode, startDate, endDate string) (err error) {
-	defer func() {
-		if err != nil {
-			fmt.Println("GetEdbDataByWind Err:" + err.Error())
-		}
-	}()
-
-	fmt.Println("startDate,endDate:",startDate,endDate)
-
-	thsUrl := utils.Hz_Data_Url + `edbInfo/wind?EdbCode=%s&StartDate=%s&EndDate=%s`
-	thsUrl = fmt.Sprintf(thsUrl, edbCode, startDate, endDate)
-	//utils.FileLog.Info("thsUrl:%s", thsUrl)
-
-	reqRes, err := http.Get(thsUrl)
-	if err != nil {
-		return
-	}
-	defer reqRes.Body.Close()
-	body, err := ioutil.ReadAll(reqRes.Body)
-	if err != nil {
-		return
-	}
-	
-	fmt.Println("GetEdbDataByThs body:")
-	fmt.Println(string(body))
-	//utils.FileLog.Info("wind result:"+string(body))
-
-	item := new(EdbDataFromWind)
-	err = json.Unmarshal(body, &item)
-	if err != nil {
-		return
-	}
-	addSql := ` INSERT INTO edb_data_wind(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
-	nowStr := time.Now().Format(utils.FormatDateTime)
-	var isAdd bool
-	for k, v := range item.Dt {
-		timeStr := fmt.Sprintf("%d", v)
-
-		v = v / 1000
-		t := time.Unix(v, 0)
-		dateTime := t.Format(utils.FormatDate)
-		val := item.Close[k]
-
-		count, err := edbDataModel.GetEdbDataWindByCodeAndDate(edbCode, dateTime)
-		if err != nil && err != utils.ErrNoRow {
-			return err
-		}
-		if count <= 0 {
-			isAdd = true
-			fmt.Println(dateTime)
-			addSql += "("
-			addSql += strconv.Itoa(edbInfoId) + "," + "'" + edbCode + "'" + "," + "'" + dateTime + "'" + "," + utils.SubFloatToString(val, 30) + "," + "'" + nowStr + "'" +
-				"," + "'" + nowStr + "'"
-			addSql += "," + "'" + timeStr + "'"
-			addSql += "),"
-		} else {
-			err = edbDataModel.ModifyEdbDataWind(int64(edbInfoId), dateTime, val)
-			if err != nil {
-				return err
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		err = edbDataModel.AddEdbDataWindBySql(addSql)
-		if err != nil {
-			fmt.Println("AddEdbDataWind Err", err.Error())
-			return
-		}
-	}
-	return
-}
-
-type EdbDataFromPb struct {
-	Date   map[string]int64   `json:"date"`
-	Ticker map[string]string  `json:"ticker"`
-	Field  map[string]string  `json:"field"`
-	Value  map[string]float64 `json:"value"`
-}
-
-func RefreshEdbDataByPb(edbInfoId int, edbCode, startDate, endDate string) (err error) {
-	refreshEdbCode := edbCode
-	edbCode = url.QueryEscape(edbCode)
-	bpUrl := utils.Hz_Data_PB_Url + `edbInfo/pb?EdbCode=%s&StartDate=%s&EndDate=%s`
-	bpUrl = fmt.Sprintf(bpUrl, edbCode, startDate, endDate)
-	//utils.FileLog.Info("bpUrl+" + bpUrl)
-
-	reqRes, err := http.Get(bpUrl)
-	if err != nil {
-		return
-	}
-	defer reqRes.Body.Close()
-	body, err := ioutil.ReadAll(reqRes.Body)
-	if err != nil {
-		return
-	}
-	fmt.Println("RefreshEdbDataByPb body:")
-	fmt.Println(string(body))
-	//utils.FileLog.Info("RefreshEdbDataByPb:" + string(body))
-
-	item := new(EdbDataFromPb)
-	err = json.Unmarshal(body, &item)
-	if err != nil {
-		return
-	}
-	if len(item.Date) > 0 {
-		dateMap := item.Date
-		pbList := make([]*edbDataModel.EdbDataPb, 0)
-		for k, v := range dateMap {
-			timestamp := v
-			v = v / 1000
-			t := time.Unix(v, 0)
-			dateTime := t.Format(utils.FormatDate)
-
-			val := item.Value[k]
-			field := item.Field[k]
-			ticker := item.Ticker[k]
-			if field == "PX_LAST" {
-				//判断数据是否已经存在
-				count, err := edbDataModel.GetEdbDataPbByCodeAndDate(refreshEdbCode, dateTime)
-				if err != nil && err != utils.ErrNoRow {
-					return err
-				}
-				fmt.Println("field:", field)
-				if count <= 0 {
-					item := new(edbDataModel.EdbDataPb)
-					item.EdbCode, _ = url.QueryUnescape(edbCode)
-					item.EdbInfoId = edbInfoId
-					item.CreateTime = time.Now()
-					item.ModifyTime = time.Now()
-					item.DataTime = dateTime
-					item.Value = val
-					item.Status = 1
-					item.Field = field
-					item.Ticker = ticker
-					item.DataTimestamp = timestamp
-					pbList = append(pbList, item)
-				} else {
-					err = edbDataModel.ModifyEdbDataPb(edbInfoId, dateTime, val)
-					if err != nil {
-						return err
-					}
-				}
-			}
-		}
-
-		if len(pbList) > 0 {
-			err = edbDataModel.AddEdbDataPb(pbList)
-			if err != nil {
-				fmt.Println("AddEdbDataPb Err", err.Error())
-				return
-			}
-		}
-	}
-
-	return
-}
-
-//刷新手工指标数据
-func RefreshAllEdbDataByManual(edbInfoId, source int, edbCode string) (err error) {
-	tx := global.MYSQL["data"].Begin()
-	defer func() {
-		if err != nil {
-			tx.Rollback()
-		} else {
-			tx.Commit()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		condition += " AND TRADE_CODE=? "
-		pars = append(pars, edbCode)
-	}
-
-	manualDataList, err := edbDataModel.GetEdbdataManualByTradeCode(condition, pars)
-	//获取指标所有数据
-	existDataList := make([]*edbDataModel.EdbDataBase, 0)
-	dataTableName := edbDataModel.GetEdbDataTableName(source)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&existDataList).Error
-	//_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
-	if err != nil {
-		return err
-	}
-
-	existDataMap := make(map[string]*edbDataModel.EdbDataBase)
-	for _, v := range existDataList {
-		existDataMap[v.DataTime] = v
-	}
-
-	addSql := ` INSERT INTO edb_data_manual(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
-	var isAdd bool
-	manualMap := make(map[string]*edbDataModel.ManualEdbdata)
-	for _, v := range manualDataList {
-		item := v
-		if findItem, ok := existDataMap[v.Dt]; !ok {
-			eDate := item.Dt
-			sValue := item.Close
-
-			dataTime, err := time.Parse(utils.FormatDate, eDate)
-			if err != nil {
-				return err
-			}
-			timestamp := dataTime.UnixNano() / 1e6
-			timeStr := fmt.Sprintf("%d", timestamp)
-
-			addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
-			isAdd = true
-		} else {
-			if findItem.Value != item.Close {
-				sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-				sql = fmt.Sprintf(sql, dataTableName)
-				err = tx.Exec(sql, item.Close, edbInfoId, item.Dt).Error
-				//err = global.MYSQL["data"].Exec(sql, item.Close, edbInfoId, item.Dt).Error
-				//_, err = o.Raw(sql, item.Close, edbInfoId, item.Dt).Exec()
-				if err != nil {
-					return err
-				}
-			}
-		}
-		manualMap[v.Dt] = v
-	}
-	for _, v := range existDataList {
-		if _, ok := manualMap[v.DataTime]; !ok {
-			go func() {
-				sql := ` DELETE FROM %s WHERE edb_data_id=? `
-				tableName := edbDataModel.GetEdbDataTableName(utils.DATA_SOURCE_MANUAL)
-				sql = fmt.Sprintf(sql, tableName)
-				err = tx.Exec(sql, v.EdbInfoId).Error
-				//err = global.MYSQL["data"].Exec(sql, edbDataId).Error
-			}()
-			//go DeleteEdbDataByIdAndSource(v.EdbDataId, utils.DATA_SOURCE_MANUAL)
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		err = tx.Exec(addSql).Error
-		//_, err = o.Raw(addSql).Exec()
-		if err != nil {
-			fmt.Println("RefreshAllEdbDataByManual add Err", err.Error())
-			return
-		}
-	}
-	return
-}
-
-func DeleteEdbDataByIdAndSource(edbDataId, source int) (err error) {
-	sql := ` DELETE FROM %s WHERE edb_data_id=? `
-	tableName := edbDataModel.GetEdbDataTableName(source)
-	sql = fmt.Sprintf(sql, tableName)
-	err = global.MYSQL["data"].Exec(sql, edbDataId).Error
-
-	return
-}
-
-func GetAddSql(edbInfoId, edbCode, dataTime, timestampStr string, value string) (addSql string) {
-	nowStr := time.Now().Format(utils.FormatDateTime)
-	addSql += "("
-	addSql += edbInfoId + "," + "'" + edbCode + "'" + "," + "'" + dataTime + "'" + "," + value + "," + "'" + nowStr + "'" +
-		"," + "'" + nowStr + "'"
-	addSql += "," + "'" + timestampStr + "'"
-	addSql += "),"
-	return
-}
-
-//刷新隆众指标数据
-func RefreshEdbDataByLz(edbInfoId int, edbCode, startDate, endDate string) (err error) {
-
-	tx := global.MYSQL["data"].Begin()
-	defer func() {
-		if err != nil {
-			tx.Rollback()
-		} else {
-			tx.Commit()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		condition += " AND b.lz_code=? "
-		pars = append(pars, edbCode)
-	}
-
-	if startDate != "" {
-		condition += " AND a.data_time>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND a.data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	lzDataList, err := edbDataModel.GetLzSurveyDataByTradeCode(condition, pars)
-
-	addSql := ` INSERT INTO edb_data_lz(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
-	var isAdd bool
-	for _, v := range lzDataList {
-		item := v
-		count, err := edbDataModel.GetEdbDataLzByCodeAndDate(edbCode, v.DataTime)
-		if err != nil && err != utils.ErrNoRow {
-			return err
-		}
-		if count <= 0 {
-			nowStr := time.Now().Format(utils.FormatDateTime)
-			eDate := item.DataTime
-			sValue := item.InputValue
-			dataTime, err := time.Parse(utils.FormatDate, eDate)
-			if err != nil {
-				return err
-			}
-			timestamp := dataTime.UnixNano() / 1e6
-			timeStr := fmt.Sprintf("%d", timestamp)
-			addSql += "("
-			addSql += edbInfoIdStr + "," + "'" + edbCode + "'" + "," + "'" + eDate + "'" + "," + sValue + "," + "'" + nowStr + "'" +
-				"," + "'" + nowStr + "'" + "," + "'" + timeStr + "'"
-			addSql += "),"
-			isAdd = true
-		} else {
-			//edbInfoId int64, dataTime, value string
-			//o := orm.NewOrm()
-			//o.Using("data")
-			sql := ` UPDATE edb_data_lz SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-			err = tx.Exec(sql, v.InputValue, int64(edbInfoId), v.DataTime).Error
-			//_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
-
-			//err = ModifyEdbDataLz(int64(edbInfoId), v.DataTime, v.InputValue)
-			if err != nil {
-				return err
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		err = tx.Exec(addSql).Error
-		//_, err = o.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-
-	return
-}
-
-//全部刷新有色数据
-func RefreshAllEdbDataByYs(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
-
-	tx := global.MYSQL["data"].Begin()
-	defer func() {
-		if err != nil {
-			tx.Rollback()
-		} else {
-			tx.Commit()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//获取数据
-	err = SyncSmmIndexDataBase(edbCode, startDate, endDate)
-	if err != nil {
-		err = errors.New("SyncSmmIndexDataBase Err:" + err.Error())
-		return err
-	}
-	//获取已存在指标所有数据
-	existDataList := make([]*edbDataModel.EdbDataBase, 0)
-	dataTableName := edbDataModel.GetEdbDataTableName(source)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-
-	err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&existDataList).Error
-	//_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
-	if err != nil {
-		return err
-	}
-	existDataMap := make(map[string]string)
-	for _, v := range existDataList {
-		existDataMap[v.DataTime] = v.Value
-	}
-
-	smmDateList := make([]*edbDataModel.BaseFromSmmDataSimple, 0)
-	smmSql := ` SELECT * FROM base_from_smm_data WHERE index_code=? AND data_time>=? `
-	err = global.MYSQL["data"].Raw(smmSql, edbCode, startDate).Scan(&existDataList).Error
-	//_, err = o.Raw(smmSql, edbCode, startDate).QueryRows(&smmDateList)
-	if err != nil {
-		return err
-	}
-
-	addSql := ` INSERT INTO edb_data_ys(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
-	var isAdd bool
-	for _, sv := range smmDateList {
-		if existVal, ok := existDataMap[sv.DataTime]; !ok {
-			dataTime, err := time.Parse(utils.FormatDate, sv.DataTime)
-			if err != nil {
-				return err
-			}
-			timestamp := dataTime.UnixNano() / 1e6
-			timeStr := fmt.Sprintf("%d", timestamp)
-			addSql += GetAddSql(edbInfoIdStr, edbCode, sv.DataTime, timeStr, sv.Value)
-			isAdd = true
-		} else {
-			if existVal != sv.Value {
-				sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-				sql = fmt.Sprintf(sql, dataTableName)
-
-				err = tx.Exec(sql, sv.Value, edbInfoId, sv.DataTime).Error
-				//_, err = o.Raw(sql, sv.Value, edbInfoId, sv.DataTime).Exec()
-				if err != nil {
-					return err
-				}
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		err = tx.Exec(addSql).Error
-		//_, err = o.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-const (
-	dataUrl = "https://dataapi.smm.cn/GetData/" //data url (中文)
-	//dataUrl = "https://dataapi.smm.cn/GetDataEn/" //data url (english edition)
-	authUrl = "https://platform.smm.cn/usercenter/auth" // auth url (for all)
-)
-
-type TokenResp struct {
-	Code int       `json:"Code"`
-	Msg  string    `json:"Msg"`
-	Data TokenData `json:"Data"`
-}
-
-type TokenData struct {
-	Token string `json:"Token"`
-}
-
-//获取token
-func getToken(userName string, password string) (string, error) {
-	encryptAuth := md5.New()
-	encryptAuth.Write([]byte(password)) //encrypt password with md5
-	newPassword := hex.EncodeToString(encryptAuth.Sum(nil))
-
-	resp, err := http.PostForm(authUrl, url.Values{"user_name": {userName}, "password": {newPassword}})
-	if err != nil {
-		return "", err
-	}
-
-	defer resp.Body.Close()
-
-	body, err := ioutil.ReadAll(resp.Body)
-	if err != nil {
-		fmt.Println("reponse error", err)
-		return "", err
-	}
-
-	var bodyJsonContent TokenResp
-
-	if err = json.Unmarshal([]byte(body), &bodyJsonContent); err != nil {
-		fmt.Println(err, "unmarsal failure")
-		return "", err
-	}
-
-	var token string
-	if bodyJsonContent.Code == 0 {
-		token = bodyJsonContent.Data.Token
-	}
-
-	//print(token)
-	return token, nil
-}
-
-func SyncSmmIndexDataBase(edbCode, startDate, endDate string) (err error) {
-	//utils.FileLog.Info("start:" + time.Now().Format(utils.FormatDateTime))
-
-	var smmCode string
-	if strings.Contains(edbCode, "#") {
-		smmCode = strings.Split(edbCode, "#")[0]
-	} else {
-		smmCode = edbCode
-	}
-	token, err := getToken("pqian@hzinsights.com", "hz123456")
-	if err != nil {
-		fmt.Println(err)
-		return
-	}
-	baseSmmItem, err := edbDataModel.GetBaseFromSmmBySmmCode(smmCode)
-	if err != nil {
-		fmt.Println(err)
-		return
-	}
-
-	if baseSmmItem == nil {
-		err = errors.New("GetBaseFromSmmBySmmCode Err:" + err.Error())
-		return
-	}
-
-	smmIndexAll, err := edbDataModel.GetBaseFromSmmIndexBySmmCode(smmCode)
-	if err != nil {
-		fmt.Println("GetBaseFromSmmIndex Err:" + err.Error())
-		return
-	}
-	existIndexMap := make(map[string]*edbDataModel.BaseFromSmmIndex)
-	for _, item := range smmIndexAll {
-		existIndexMap[item.IndexCode] = item
-	}
-
-	ysItem, err := getApiData(token, edbCode, startDate, endDate)
-	if err != nil {
-		fmt.Println(err)
-		return
-	}
-	if ysItem != nil && ysItem.Code == 200 {
-
-		frequency := ysItem.Data.Frequency
-
-		indexMap := make(map[string]int)
-		smmIndexIdMap := make(map[int]int)
-		indexCodeMap := make(map[int]string)
-
-		indexKey := 0
-		var isDateIndex int
-		for fk, fv := range ysItem.Data.Field {
-			if fv.IsDate == "1" {
-				isDateIndex = fk
-			} else {
-				if !strings.Contains(fv.Name, "产品名称") &&
-					!strings.Contains(fv.Name, "单位") &&
-					!strings.Contains(fv.Name, "时间") &&
-					!strings.Contains(fv.Name, "备注") {
-
-					indexMap[fv.DBColName] = fk
-
-					indexKey += 1
-					indexCode := smmCode + "#" + strconv.Itoa(indexKey)
-
-					if findItem, ok := existIndexMap[indexCode]; !ok {
-						ssmIndex := new(edbDataModel.BaseFromSmmIndex)
-						ssmIndex.Interface = smmCode
-						ssmIndex.Name = baseSmmItem.Name
-						ssmIndex.IndexCode = indexCode
-						ssmIndex.IndexName = baseSmmItem.Name + "_" + fv.Name
-						ssmIndex.Type1 = baseSmmItem.Type1
-						ssmIndex.Type2 = baseSmmItem.Type2
-						ssmIndex.Type3 = baseSmmItem.Type3
-						ssmIndex.Frequency = frequency
-						ssmIndex.Unit = fv.Unit
-						ssmIndex.ApiStartTime = baseSmmItem.ApiStartTime
-						ssmIndex.ApiUpdateTime = baseSmmItem.ApiUpdateTime
-						ssmIndex.StartTime = baseSmmItem.StartTime
-						ssmIndex.FinishTime = baseSmmItem.FinishTime
-						ssmIndex.CreateTime = time.Now()
-						ssmIndex.ModifyTime = time.Now()
-						lastIndexId, err := edbDataModel.AddBaseFromSmmIndex(ssmIndex)
-						if err != nil {
-							err = errors.New("AddBaseFromSmmIndex Err:" + err.Error())
-							return err
-						}
-						smmIndexIdMap[fk] = int(lastIndexId)
-						indexCodeMap[fk] = indexCode
-					} else {
-						smmIndexIdMap[fk] = findItem.BaseFromSmmIndexId
-						indexCodeMap[fk] = findItem.IndexCode
-					}
-				}
-			}
-		}
-
-		existDataMap := make(map[string]*edbDataModel.BaseFromSmmData)
-		for _, mv := range indexCodeMap {
-			indexCode := mv
-			dataAllList, err := edbDataModel.GetBaseFromSmmDataAllByIndexCode(indexCode)
-			if err != nil {
-				err = errors.New("GetBaseFromSmmData Err:" + err.Error())
-				return err
-			}
-			for _, item := range dataAllList {
-				key := item.IndexCode + item.DataTime
-				existDataMap[key] = item
-			}
-		}
-
-		addExistDataMap := make(map[string]string)
-
-		for _, dv := range ysItem.Data.Content {
-			var dataTime string
-			dataTime = dv[isDateIndex]
-			if strings.Contains(dataTime, "Q1") {
-				dataTime = strings.Replace(dataTime, "Q1", "-01", -1)
-				dataTime += "-31"
-			}
-			if strings.Contains(dataTime, "Q2") {
-				dataTime = strings.Replace(dataTime, "Q2", "-06", -1)
-				dataTime += "-30"
-			}
-			if strings.Contains(dataTime, "Q3") {
-				dataTime = strings.Replace(dataTime, "Q3", "-09", -1)
-				dataTime += "-30"
-			}
-			if strings.Contains(dataTime, "Q4") {
-				dataTime = strings.Replace(dataTime, "Q4", "-12", -1)
-				dataTime += "-31"
-			}
-
-			if strings.Contains(dataTime, "H1") {
-				dataTime = strings.Replace(dataTime, "H1", "-06", -1)
-				dataTime += "-30"
-			}
-
-			if strings.Contains(dataTime, "H2") {
-				dataTime = strings.Replace(dataTime, "H2", "-12", -1)
-				dataTime += "-31"
-			}
-
-			if frequency == "月" {
-				monthDate, err := time.Parse("2006-01", dataTime)
-				if err != nil {
-					fmt.Println("time.Parse:" + err.Error())
-				}
-				lastTime := monthDate.AddDate(0, 1, -1)
-				lastYear, lastMonth, lastDay := lastTime.Date()
-				var lastDate string
-				if int(lastMonth) < 10 {
-					lastDate = strconv.Itoa(lastYear) + "-" + "0" + strconv.Itoa(int(lastMonth)) + "-" + strconv.Itoa(lastDay)
-				} else {
-					lastDate = strconv.Itoa(lastYear) + "-" + strconv.Itoa(int(lastMonth)) + "-" + strconv.Itoa(lastDay)
-				}
-				dataTime = lastDate
-			} else if frequency == "年" {
-				dataTime = dataTime + "-12-31"
-			}
-			saveDataTime, err := time.Parse(utils.FormatDate, dataTime)
-			if err != nil {
-				err = errors.New("time.Parse Err:" + err.Error())
-				return err
-			}
-			timestamp := saveDataTime.UnixNano() / 1e6
-			//循环指标
-			for _, v := range indexMap {
-
-				indexCode := indexCodeMap[v]
-				smmIndexId := smmIndexIdMap[v]
-				dataVal := dv[v]
-
-				if indexCode != "" {
-
-					key := indexCode + dataTime
-					val := strings.Replace(dataVal, ",", "", -1)
-					if findData, dataOk := existDataMap[key]; !dataOk {
-						if _, addOK := addExistDataMap[key]; !addOK {
-							if val != "" && val != "-" {
-								dataItem := new(edbDataModel.BaseFromSmmData)
-								dataItem.BaseFromSmmIndexId = smmIndexId
-								dataItem.IndexCode = indexCode
-								dataItem.DataTime = dataTime
-								dataItem.Value = val
-								dataItem.CreateTime = time.Now()
-								dataItem.ModifyTime = time.Now()
-								dataItem.DataTimestamp = timestamp
-								_, err = edbDataModel.AddBaseFromSmmData(dataItem)
-								if err != nil && !strings.Contains(err.Error(), "idx_index_code_date") {
-									fmt.Println("AddBaseFromSmmData Err:" + err.Error())
-									err = errors.New("AddBaseFromSmmData Err:" + err.Error())
-									return err
-								}
-							}
-						}
-					} else {
-						if findData != nil && findData.Value != val { //修改
-							if _, addOK := addExistDataMap[key]; !addOK {
-								if val != "" && val != "-" {
-									err = edbDataModel.ModifyBaseFromSmmData(findData.SmmDataId, val)
-									if err != nil {
-										err = errors.New("ModifyBaseFromSmmData Err:" + err.Error())
-										return err
-									}
-								}
-							}
-						}
-					}
-					addExistDataMap[key] = key
-				}
-			}
-		}
-
-		//修改数据开始,结束日期
-		{
-			indexList, err := edbDataModel.GetBaseFromSmmIndexBySmmCode(smmCode)
-			if err != nil {
-				fmt.Println("GetBaseFromSmmIndexBySmmCode Err:" + err.Error())
-			}
-			for _, sv := range indexList {
-				minDate, maxDate, err := edbDataModel.GetBaseFromSmmMaxOrMinDate(sv.IndexCode)
-				if err != nil {
-					fmt.Println("GetEdbDataSmmMaxOrMinDate Err:" + err.Error())
-				} else {
-					err = edbDataModel.ModifyBaseFromSmmMinDateAndMaxDate(sv.BaseFromSmmIndexId, minDate, maxDate)
-					if err != nil {
-						fmt.Println("ModifyBaseFromSmmMinDateAndMaxDate Err:" + err.Error())
-					}
-				}
-			}
-		}
-	}
-
-	return
-}
-
-/*
- * request data
- * sdatetime,edatetime ==>format:yyyy-mm-dd,
- * apiName ==> data.metal.com(for english)/data.smm.cn (for chinese)
- */
-func getApiData(token string, apiName string, sdatetime string, edatetime string) (item *edbDataModel.YsResult, err error) {
-	reqUrl := dataUrl + apiName
-	resp, err := http.PostForm(reqUrl, url.Values{"token": {token}, "sdatetime": {sdatetime}, "edatetime": {edatetime}})
-	if err != nil {
-		return nil, err
-	}
-
-	defer resp.Body.Close()
-	body, err := ioutil.ReadAll(resp.Body)
-	if err != nil {
-		fmt.Println("response error")
-		return nil, err
-	}
-	//utils.FileLog.Info("ys result:" + string(body))
-	dataJsonContent := new(edbDataModel.YsResult)
-	if err = json.Unmarshal([]byte(body), &dataJsonContent); err != nil {
-		fmt.Println(err, "data unmarshal failure")
-		return nil, err
-	}
-
-	if dataJsonContent.Code == 200 && len(dataJsonContent.Data.Content) > 0 {
-		return dataJsonContent, nil
-	} else {
-		err = errors.New("code:" + strconv.Itoa(int(dataJsonContent.Code)) + "msg:" + dataJsonContent.Msg)
-	}
-	return nil, nil
-}
-
-func RefreshEdbDataByGl(edbInfoId int, edbCode, startDate, endDate string) (err error) {
-	tx := global.MYSQL["data"].Begin()
-	defer func() {
-		if err != nil {
-			tx.Rollback()
-		} else {
-			tx.Commit()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		condition += " AND INDEX_CODE=? "
-		pars = append(pars, edbCode)
-	}
-
-	if startDate != "" {
-		condition += " AND DATA_DATE>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND DATA_DATE<=? "
-		pars = append(pars, endDate)
-	}
-
-	glDataList, err := edbDataModel.GetGlDataByTradeCode(condition, pars)
-
-	addSql := ` INSERT INTO edb_data_gl(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, v := range glDataList {
-		item := v
-		if _, ok := existMap[v.DataTime]; !ok {
-			count, err := edbDataModel.GetEdbDataGlByCodeAndDate(edbCode, v.DataTime)
-			if err != nil && err != utils.ErrNoRow {
-				return err
-			}
-			if count <= 0 {
-				eDate := item.DataTime
-				sValue := item.InputValue
-				if sValue != "" {
-					dataTime, err := time.Parse(utils.FormatDate, eDate)
-					if err != nil {
-						return err
-					}
-					timestamp := dataTime.UnixNano() / 1e6
-					timeStr := fmt.Sprintf("%d", timestamp)
-					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
-					isAdd = true
-				}
-			} else {
-				updateSql := ` UPDATE edb_data_gl SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-				//err = global.MYSQL["data"].Exec(sql, value, edbInfoId, dataTime).Error
-				err = tx.Exec(updateSql, v.InputValue, edbInfoId, v.DataTime).Error
-				//err = edbDataModel.ModifyEdbDataGl(int64(edbInfoId), v.DataTime, v.InputValue)
-				if err != nil {
-					return err
-				}
-			}
-		}
-		existMap[v.DataTime] = v.InputValue
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		err = tx.Exec(addSql).Error
-		//_, err = o.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-// RefreshEdbDataByZz 刷新路透社数据
-func RefreshAllEdbDataByLt(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
-	// 获取路透社数据
-	ltDataList, err := QueryEdbDataByLt(edbCode, startDate, endDate)
-	if err != nil {
-		return
-	}
-
-	tx := global.MYSQL["data"].Begin()
-	defer func() {
-		if err != nil {
-			tx.Rollback()
-		} else {
-			tx.Commit()
-		}
-	}()
-
-	//获取指标所有数据
-	dataList := make([]*edbDataModel.EdbDataBase, 0)
-	dataTableName := edbDataModel.GetEdbDataTableName(source)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	err = global.MYSQL["data"].Raw(sql, dataTableName).Scan(&dataList).Error
-	//_, err = o.Raw(sql, edbInfoId).QueryRows(&dataList)
-	if err != nil {
-		return err
-	}
-	dataMap := make(map[string]string)
-	for _, v := range dataList {
-		dataMap[v.DataTime] = v.Value
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-
-	addSql := ` INSERT INTO edb_data_lt(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
-	var isAdd bool
-
-	for timestampInt, edbValue := range ltDataList {
-		dataTime := time.Unix(timestampInt/1000, 0)
-
-		//校验数据类型对不对
-		valType := reflect.TypeOf(edbValue)
-		if valType == nil {
-			continue
-		}
-		if valType.String() != "float64" {
-			continue
-		}
-		sValue := edbValue.(float64)
-
-		eDate := dataTime.Format(utils.FormatDate)
-		if err != nil {
-			return err
-		}
-
-		saveValue := utils.SubFloatToString(sValue, 30)
-		if existVal, ok := dataMap[eDate]; !ok {
-			timestamp := dataTime.UnixNano() / 1e6
-			timeStr := fmt.Sprintf("%d", timestamp)
-
-			addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, saveValue)
-			isAdd = true
-		} else {
-			if existVal != saveValue {
-				sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-				sql = fmt.Sprintf(sql, dataTableName)
-				err = tx.Exec(sql, sValue, edbInfoId, eDate).Error
-				//_, err = o.Raw(sql, sValue, edbInfoId, eDate).Exec()
-				if err != nil {
-					return err
-				}
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		err = tx.Exec(addSql).Error
-		//_, err = o.Raw(addSql).Exec()
-		if err != nil {
-			fmt.Println("RefreshAllEdbDataByLt add Err", err.Error())
-			return
-		}
-	}
-	return
-}
-
-// QueryEdbDataByLt 获取路透社数据
-func QueryEdbDataByLt(edbCode, startDate, endDate string) (dataList map[int64]interface{}, err error) {
-	dataList = make(map[int64]interface{})
-
-	ltUrl := utils.Hz_Data_LT_Url + `edbInfo/ek?EdbCode=%s&StartDate=%s&EndDate=%s`
-	ltUrl = fmt.Sprintf(ltUrl, edbCode, startDate, endDate)
-	//utils.FileLogData.Info("ltUrl:%s", ltUrl)
-	//body, err := http.Get(ltUrl)
-
-	reqRes, err := http.Get(ltUrl)
-	if err != nil {
-		return
-	}
-	defer reqRes.Body.Close()
-	body, err := ioutil.ReadAll(reqRes.Body)
-	if err != nil {
-		return
-	}
-
-	//utils.FileLogData.Info("lt result:%s", string(body))
-
-	//if err != nil {
-	//	return
-	//}
-	//fmt.Println(string(body))
-	item := new(edbDataModel.EdbDataFromLt)
-	err = json.Unmarshal(body, &item)
-
-	if err != nil {
-		return
-	}
-	dataList = item.Close
-	return
-}
-
-// RefreshEdbDataByZz 刷新郑商所指标数据
-func RefreshEdbDataByZz(edbInfoId int, edbCode, startDate, endDate string) (err error) {
-
-	tx := global.MYSQL["data"].Begin()
-	defer func() {
-		if err != nil {
-			tx.Rollback()
-		} else {
-			tx.Commit()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	var suffix string
-	if strings.Contains(edbCode, "deal") {
-		suffix = "deal"
-	} else if strings.Contains(edbCode, "buy") {
-		suffix = "buy"
-	} else if strings.Contains(edbCode, "sold") {
-		suffix = "sold"
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		if suffix == "deal" {
-			condition += " AND deal_code=? "
-		} else if suffix == "buy" {
-			condition += " AND buy_code=? "
-		} else {
-			condition += " AND sold_code=? "
-		}
-		pars = append(pars, edbCode)
-	}
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	glDataList, err := edbDataModel.GetZzDataByTradeCode(condition, pars)
-
-	addSql := ` INSERT INTO edb_data_zz(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, v := range glDataList {
-		var value string
-		if suffix == "deal" {
-			value = v.DealValue
-		} else if suffix == "buy" {
-			value = v.BuyValue
-		} else {
-			value = v.SoldValue
-		}
-		item := v
-		itemValue := value
-		if _, ok := existMap[v.DataTime]; !ok {
-			count, err := edbDataModel.GetEdbDataZzByCodeAndDate(edbCode, v.DataTime)
-			if err != nil && err != utils.ErrNoRow {
-				return err
-			}
-			if count <= 0 {
-				eDate := item.DataTime
-				sValue := itemValue
-				if sValue != "" {
-					dataTime, err := time.Parse(utils.FormatDate, eDate)
-					if err != nil {
-						return err
-					}
-					timestamp := dataTime.UnixNano() / 1e6
-					timeStr := fmt.Sprintf("%d", timestamp)
-					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
-					isAdd = true
-				}
-			} else {
-				updateSql := ` UPDATE edb_data_zz SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-				err = tx.Exec(updateSql, value, edbInfoId, v.DataTime).Error
-				if err != nil {
-					return err
-				}
-			}
-		}
-		existMap[v.DataTime] = value
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		err = tx.Exec(addSql).Error
-		//_, err = o.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-func RefreshEdbDataByDl(edbInfoId int, edbCode, startDate, endDate string) (err error) {
-
-	tx := global.MYSQL["data"].Begin()
-	defer func() {
-		if err != nil {
-			tx.Rollback()
-		} else {
-			tx.Commit()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	var suffix string
-	if strings.Contains(edbCode, "deal") {
-		suffix = "deal"
-	} else if strings.Contains(edbCode, "buy") {
-		suffix = "buy"
-	} else if strings.Contains(edbCode, "sold") {
-		suffix = "sold"
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		if suffix == "deal" {
-			condition += " AND deal_code=? "
-		} else if suffix == "buy" {
-			condition += " AND buy_code=? "
-		} else {
-			condition += " AND sold_code=? "
-		}
-		pars = append(pars, edbCode)
-	}
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	glDataList, err := edbDataModel.GetDlDataByTradeCode(condition, pars)
-
-	addSql := ` INSERT INTO edb_data_dl(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, v := range glDataList {
-		var value string
-		if suffix == "deal" {
-			value = v.DealValue
-		} else if suffix == "buy" {
-			value = v.BuyValue
-		} else {
-			value = v.SoldValue
-		}
-		item := v
-		itemValue := value
-		if _, ok := existMap[v.DataTime]; !ok {
-			count, err := edbDataModel.GetEdbDataDlByCodeAndDate(edbCode, v.DataTime)
-			if err != nil && err != utils.ErrNoRow {
-				return err
-			}
-			if count <= 0 {
-				eDate := item.DataTime
-				sValue := itemValue
-				if sValue != "" {
-					dataTime, err := time.Parse(utils.FormatDate, eDate)
-					if err != nil {
-						return err
-					}
-					timestamp := dataTime.UnixNano() / 1e6
-					timeStr := fmt.Sprintf("%d", timestamp)
-					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
-					isAdd = true
-				}
-			} else {
-				updataSql := ` UPDATE edb_data_dl SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-				err = tx.Exec(updataSql, value, edbInfoId, v.DataTime).Error
-				if err != nil {
-					return err
-				}
-			}
-		}
-		existMap[v.DataTime] = value
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		err = tx.Exec(addSql).Error
-		if err != nil {
-			return err
-		}
-	}
-
-	return
-}
-
-// RefreshEdbDataBySh 刷新上期所指标数据
-func RefreshEdbDataBySh(edbInfoId int, edbCode, startDate, endDate string) (err error) {
-
-	tx := global.MYSQL["data"].Begin()
-	defer func() {
-		if err != nil {
-			tx.Rollback()
-		} else {
-			tx.Commit()
-		}
-	}()
-	if err != nil {
-		return
-	}
-	var suffix string
-	if strings.Contains(edbCode, "deal") {
-		suffix = "deal"
-	} else if strings.Contains(edbCode, "buy") {
-		suffix = "buy"
-	} else if strings.Contains(edbCode, "sold") {
-		suffix = "sold"
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		if suffix == "deal" {
-			condition += " AND deal_code=? "
-		} else if suffix == "buy" {
-			condition += " AND buy_code=? "
-		} else {
-			condition += " AND sold_code=? "
-		}
-		pars = append(pars, edbCode)
-	}
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	glDataList, err := edbDataModel.GetShDataByTradeCode(condition, pars)
-
-	addSql := ` INSERT INTO edb_data_sh(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, v := range glDataList {
-		var value string
-		if suffix == "deal" {
-			value = v.DealValue
-		} else if suffix == "buy" {
-			value = v.BuyValue
-		} else {
-			value = v.SoldValue
-		}
-		item := v
-		itemValue := value
-		if _, ok := existMap[v.DataTime]; !ok {
-			count, err := edbDataModel.GetEdbDataShByCodeAndDate(edbCode, v.DataTime)
-			if err != nil && err != utils.ErrNoRow {
-				return err
-			}
-			if count <= 0 {
-				eDate := item.DataTime
-				sValue := itemValue
-				if sValue != "" {
-					dataTime, err := time.Parse(utils.FormatDate, eDate)
-					if err != nil {
-						return err
-					}
-					timestamp := dataTime.UnixNano() / 1e6
-					timeStr := fmt.Sprintf("%d", timestamp)
-					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
-					isAdd = true
-				}
-			} else {
-				updataSql := ` UPDATE edb_data_sh SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-				err = tx.Exec(updataSql, value, edbInfoId, v.DataTime).Error
-				if err != nil {
-					return err
-				}
-			}
-		}
-		existMap[v.DataTime] = value
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		err = tx.Exec(addSql).Error
-		//_, err = o.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-
-	return
-}
-
-// RefreshEdbDataByCffex 刷新中金所指标数据
-func RefreshEdbDataByCffex(edbInfoId int, edbCode, startDate, endDate string) (err error) {
-	tx := global.MYSQL["data"].Begin()
-	defer func() {
-		if err != nil {
-			tx.Rollback()
-		} else {
-			tx.Commit()
-		}
-	}()
-	if err != nil {
-		return
-	}
-	var suffix string
-	if strings.Contains(edbCode, "deal") {
-		suffix = "deal"
-	} else if strings.Contains(edbCode, "buy") {
-		suffix = "buy"
-	} else if strings.Contains(edbCode, "sold") {
-		suffix = "sold"
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		if suffix == "deal" {
-			condition += " AND deal_code=? "
-		} else if suffix == "buy" {
-			condition += " AND buy_code=? "
-		} else {
-			condition += " AND sold_code=? "
-		}
-		pars = append(pars, edbCode)
-	}
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	glDataList, err := edbDataModel.GetCffexDataByTradeCode(condition, pars)
-
-	addSql := ` INSERT INTO edb_data_cffex(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, v := range glDataList {
-		var value string
-		if suffix == "deal" {
-			value = v.DealValue
-		} else if suffix == "buy" {
-			value = v.BuyValue
-		} else {
-			value = v.SoldValue
-		}
-		item := v
-		itemValue := value
-		if _, ok := existMap[v.DataTime]; !ok {
-			count, err := edbDataModel.GetEdbDataCffexByCodeAndDate(edbCode, v.DataTime)
-			if err != nil && err != utils.ErrNoRow {
-				return err
-			}
-			if count <= 0 {
-				eDate := item.DataTime
-				sValue := itemValue
-				if sValue != "" {
-					dataTime, err := time.Parse(utils.FormatDate, eDate)
-					if err != nil {
-						return err
-					}
-					timestamp := dataTime.UnixNano() / 1e6
-					timeStr := fmt.Sprintf("%d", timestamp)
-					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
-					isAdd = true
-				}
-			} else {
-				updateSql := ` UPDATE edb_data_cffex SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-				err = tx.Exec(updateSql, value, edbInfoId, v.DataTime).Error
-
-				if err != nil {
-					return err
-				}
-			}
-		}
-		existMap[v.DataTime] = value
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		err = tx.Exec(addSql).Error
-		//_, err = o.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-// RefreshEdbDataByShfe 刷新上期能源指标数据
-func RefreshEdbDataByShfe(edbInfoId int, edbCode, startDate, endDate string) (err error) {
-
-	tx := global.MYSQL["data"].Begin()
-	defer func() {
-		if err != nil {
-			tx.Rollback()
-		} else {
-			tx.Commit()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	var suffix string
-	if strings.Contains(edbCode, "deal") {
-		suffix = "deal"
-	} else if strings.Contains(edbCode, "buy") {
-		suffix = "buy"
-	} else if strings.Contains(edbCode, "sold") {
-		suffix = "sold"
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		if suffix == "deal" {
-			condition += " AND deal_code=? "
-		} else if suffix == "buy" {
-			condition += " AND buy_code=? "
-		} else {
-			condition += " AND sold_code=? "
-		}
-		pars = append(pars, edbCode)
-	}
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	glDataList, err := edbDataModel.GetShfeDataByTradeCode(condition, pars)
-
-	addSql := ` INSERT INTO edb_data_ine(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, v := range glDataList {
-		var value string
-		if suffix == "deal" {
-			value = v.DealValue
-		} else if suffix == "buy" {
-			value = v.BuyValue
-		} else {
-			value = v.SoldValue
-		}
-		item := v
-		itemValue := value
-		if _, ok := existMap[v.DataTime]; !ok {
-			count, err := edbDataModel.GetEdbDataShfeByCodeAndDate(edbCode, v.DataTime)
-			if err != nil && err != utils.ErrNoRow {
-				return err
-			}
-			if count <= 0 {
-				eDate := item.DataTime
-				sValue := itemValue
-				if sValue != "" {
-					dataTime, err := time.Parse(utils.FormatDate, eDate)
-					if err != nil {
-						return err
-					}
-					timestamp := dataTime.UnixNano() / 1e6
-					timeStr := fmt.Sprintf("%d", timestamp)
-					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
-					isAdd = true
-				}
-			} else {
-				updateSql := ` UPDATE edb_data_ine SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-				err = tx.Exec(updateSql, value, edbInfoId, v.DataTime).Error
-				if err != nil {
-					return err
-				}
-			}
-		}
-		existMap[v.DataTime] = value
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		err = tx.Exec(addSql).Error
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-// RefreshEdbDataByGie 刷新欧洲天然气指标数据
-func RefreshEdbDataByGie(edbInfoId int, edbCode, startDate, endDate string) (err error) {
-
-	tx := global.MYSQL["data"].Begin()
-	defer func() {
-		if err != nil {
-			tx.Rollback()
-		} else {
-			tx.Commit()
-		}
-	}()
-
-	if err != nil {
-		fmt.Println("refresh err:", err)
-		return
-	}
-	var suffix string
-	l := len(edbCode)
-	if strings.Contains(edbCode[l-2:], "GS") {
-		suffix = "GS"
-	} else if strings.Contains(edbCode[l-1:], "F") {
-		suffix = "F"
-	} else if strings.Contains(edbCode[l-1:], "T") {
-		suffix = "T"
-	} else if strings.Contains(edbCode[l-2:], "In") {
-		suffix = "In"
-	} else if strings.Contains(edbCode[l-3:], "Out") {
-		suffix = "Out"
-	} else if strings.Contains(edbCode[l-3:], "WGV") {
-		suffix = "WGV"
-	} else if strings.Contains(edbCode[l-2:], "IC") {
-		suffix = "IC"
-	} else if strings.Contains(edbCode[l-2:], "WC") {
-		suffix = "WC"
-	} else {
-		suffix = ""
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		condition += " AND eic_code=? "
-		pars = append(pars, edbCode[:l-len(suffix)])
-	}
-
-	if startDate != "" {
-		condition += " AND gas_day_started_on>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND gas_day_started_on<=? "
-		pars = append(pars, endDate)
-	}
-
-	eicDataList, err := edbDataModel.GetGieDataByTradeCode(condition, pars)
-	fmt.Println("eicDataList", len(eicDataList))
-	addSql := ` INSERT INTO edb_data_gie(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, v := range eicDataList {
-		var value string
-		if suffix == "GS" {
-			value = v.GasInStorage
-		} else if suffix == "F" {
-			value = v.Full
-		} else if suffix == "T" {
-			value = v.Trend
-		} else if suffix == "In" {
-			value = v.Injection
-		} else if suffix == "Out" {
-			value = v.Withdrawal
-		} else if suffix == "WGV" {
-			value = v.WorkingGasVolume
-		} else if suffix == "IC" {
-			value = v.InjectionCapacity
-		} else if suffix == "WC" {
-			value = v.WithdrawalCapacity
-		}
-		item := v
-		itemValue := value
-		if _, ok := existMap[v.GasDayStartedOn]; !ok {
-			count, err := edbDataModel.GetEdbDataGieByCodeAndDate(edbCode, v.GasDayStartedOn)
-			if err != nil && err != utils.ErrNoRow {
-				return err
-			}
-			if count <= 0 {
-				eDate := item.GasDayStartedOn
-				sValue := itemValue
-				if sValue != "" {
-					dataTime, err := time.Parse(utils.FormatDate, eDate)
-					if err != nil {
-						return err
-					}
-					timestamp := dataTime.UnixNano() / 1e6
-					timeStr := fmt.Sprintf("%d", timestamp)
-					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
-					isAdd = true
-				}
-			} else {
-				updateSql := ` UPDATE edb_data_gie SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-				err = tx.Exec(updateSql, value, edbInfoId, v.GasDayStartedOn).Error
-				if err != nil {
-					return err
-				}
-			}
-		}
-		existMap[v.GasDayStartedOn] = value
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		err = tx.Exec(addSql).Error
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-
-//刷新全部数据
-func RefreshAllCalculate(edbInfoIdArr []*edbInfoModel.EdbInfo, edbInfoId, source int, edbCode, formulaStr, startDate, endDate string, edbInfoIdBytes []string) (err error) {
-
-	tx := global.MYSQL["data"].Begin()
-	defer func() {
-		if err != nil {
-			tx.Rollback()
-		} else {
-			tx.Commit()
-		}
-	}()
-
-	fmt.Println(startDate, endDate)
-	saveDataMap := make(map[string]map[int]float64)
-	for _, v := range edbInfoIdArr {
-		var condition string
-		var pars []interface{}
-		condition += " AND edb_info_id=? "
-		pars = append(pars, v.EdbInfoId)
-		if startDate != "" {
-			condition += " AND data_time>=? "
-			pars = append(pars, startDate)
-		}
-		if endDate != "" {
-			condition += " AND data_time<=? "
-			pars = append(pars, endDate)
-		}
-		fmt.Println("v.Source:", v.Source)
-		dataList, err := edbDataModel.GetEdbDataListAll(condition, pars, v.Source, 1)
-		if err != nil {
-			return err
-		}
-		dataMap := make(map[string]float64)
-		for _, dv := range dataList {
-			if val, ok := saveDataMap[dv.DataTime]; ok {
-				if _, ok := val[v.EdbInfoId]; !ok {
-					val[v.EdbInfoId] = dv.Value
-				}
-			} else {
-				temp := make(map[int]float64)
-				temp[v.EdbInfoId] = dv.Value
-				saveDataMap[dv.DataTime] = temp
-			}
-		}
-		item := new(edbDataModel.CalculateItems)
-		item.EdbInfoId = v.EdbInfoId
-		item.DataMap = dataMap
-	}
-
-	formulaMap := CheckFormula(formulaStr)
-	addSql := ` INSERT INTO edb_data_calculate(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
-	var isAdd bool
-
-	//获取指标所有数据
-	dataList := make([]*edbDataModel.EdbDataBase, 0)
-	dataTableName := edbDataModel.GetEdbDataTableName(source)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&dataList).Error
-	//_, err = o.Raw(sql, edbInfoId).QueryRows(&dataList)
-	if err != nil {
-		return err
-	}
-	dataMap := make(map[string]string)
-	for _, v := range dataList {
-		dataMap[v.DataTime] = v.Value
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	existDataMap := make(map[string]string)
-	for sk, sv := range saveDataMap {
-		fmt.Println(sk, sv)
-		formulaStr = strings.ToUpper(formulaStr)
-		formulaFormStr := ReplaceFormula(edbInfoIdArr, sv, formulaMap, formulaStr, edbInfoIdBytes)
-		if formulaFormStr != "" {
-			//utils.FileLog.Info("formulaFormStr:%s", formulaFormStr)
-			expression := formula.NewExpression(formulaFormStr)
-			calResult, err := expression.Evaluate()
-			if err != nil {
-				err = errors.New("计算失败:Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
-				fmt.Println(err)
-				return err
-			}
-			calVal, err := calResult.Float64()
-			if err != nil {
-				err = errors.New("计算失败:获取计算值失败 Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
-				fmt.Println(err)
-				return err
-			}
-
-			saveValue := utils.SubFloatToString(calVal, 4)
-			if existVal, ok := dataMap[sk]; !ok {
-				dataTime, _ := time.Parse(utils.FormatDate, sk)
-				timestamp := dataTime.UnixNano() / 1e6
-				timeStr := fmt.Sprintf("%d", timestamp)
-
-				if _, existOk := existDataMap[sk]; !existOk {
-					addSql += GetAddSql(edbInfoIdStr, edbCode, sk, timeStr, saveValue)
-					isAdd = true
-				}
-				existDataMap[sk] = sk
-			} else {
-				if existVal != saveValue {
-					sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-					sql = fmt.Sprintf(sql, dataTableName)
-					err = tx.Exec(sql, saveValue, edbInfoId, sk).Error
-					//_, err = o.Raw(sql, saveValue, edbInfoId, sk).Exec()
-					if err != nil {
-						return err
-					}
-				}
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		err = tx.Exec(addSql).Error
-		//_, err = o.Raw(addSql).Exec()
-		if err != nil {
-			fmt.Println("RefreshAllCalculate add Err", err.Error())
-			return
-		}
-	}
-	return
-}
-
-func CheckFormula(formula string) map[string]string {
-	mathFormula := []string{"MAX", "MIN", "ABS", "ACOS", "ASIN", "CEIL", "MOD", "POW", "ROUND", "SIGN", "SIN", "TAN", "LOG10", "LOG2", "LOG"}
-
-	str := strings.ToUpper(formula)
-	for _, v := range mathFormula {
-		str = strings.Replace(str, v, "", -1)
-	}
-	str = strings.Replace(str, "(", "", -1)
-	str = strings.Replace(str, ")", "", -1)
-
-	byteMap := make(map[string]string)
-	for i := 0; i < len(str); i++ {
-		byteInt := str[i]
-		if byteInt >= 65 && byteInt <= 90 {
-			byteStr := string(byteInt)
-			if _, ok := byteMap[byteStr]; !ok {
-				byteMap[byteStr] = byteStr
-			}
-		}
-	}
-	return byteMap
-}
-
-func GetFormulaMap() map[string]string {
-	funMap := make(map[string]string)
-	funMap["MAX"] = "[@@]"
-	funMap["MIN"] = "[@!]"
-	funMap["ABS"] = "[@#]"
-	funMap["CEIL"] = "[@$]"
-	funMap["COS"] = "[@%]"
-	funMap["FLOOR"] = "[@^]"
-	funMap["MOD"] = "[@&]"
-	funMap["POW"] = "[@*]"
-	funMap["ROUND"] = "[@(]"
-	return funMap
-}
-
-func ReplaceFormula(edbInfoIdArr []*edbInfoModel.EdbInfo, valArr map[int]float64, formulaMap map[string]string, formulaStr string, edbInfoIdBytes []string) string {
-	funMap := GetFormulaMap()
-	for k, v := range funMap {
-		formulaStr = strings.Replace(formulaStr, k, v, -1)
-	}
-
-	replaceCount := 0
-	for dk, dv := range edbInfoIdArr {
-		if dk == 0 {
-			dKey := edbInfoIdBytes[dk]
-			if _, ok := formulaMap[dKey]; ok { //公式中存在
-				if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
-					dvStr := fmt.Sprintf("%v", val)
-					formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
-					replaceCount++
-				}
-			}
-		}
-		if dk == 1 {
-			dKey := edbInfoIdBytes[dk]
-			if _, ok := formulaMap[dKey]; ok { //公式中存在
-				if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
-					dvStr := fmt.Sprintf("%v", val)
-					formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
-					replaceCount++
-				}
-			}
-		}
-		if dk == 2 {
-			dKey := edbInfoIdBytes[dk]
-			if _, ok := formulaMap[dKey]; ok { //公式中存在
-				if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
-					dvStr := fmt.Sprintf("%v", val)
-					formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
-					replaceCount++
-				}
-			}
-		}
-		if dk == 3 {
-			dKey := edbInfoIdBytes[dk]
-			if _, ok := formulaMap[dKey]; ok { //公式中存在
-				if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
-					dvStr := fmt.Sprintf("%v", val)
-					formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
-					replaceCount++
-				}
-			}
-		}
-		if dk == 4 {
-			dKey := edbInfoIdBytes[dk]
-			if _, ok := formulaMap[dKey]; ok { //公式中存在
-				if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
-					dvStr := fmt.Sprintf("%v", val)
-					formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
-					replaceCount++
-				}
-			}
-		}
-		if dk == 5 {
-			dKey := edbInfoIdBytes[dk]
-			if _, ok := formulaMap[dKey]; ok { //公式中存在
-				if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
-					dvStr := fmt.Sprintf("%v", val)
-					formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
-					replaceCount++
-				}
-			}
-		}
-		if dk == 6 {
-			dKey := edbInfoIdBytes[dk]
-			if _, ok := formulaMap[dKey]; ok { //公式中存在
-				if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
-					dvStr := fmt.Sprintf("%v", val)
-					formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
-					replaceCount++
-				}
-			}
-		}
-		if dk == 7 {
-			dKey := edbInfoIdBytes[dk]
-			if _, ok := formulaMap[dKey]; ok { //公式中存在
-				if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
-					dvStr := fmt.Sprintf("%v", val)
-					formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
-					replaceCount++
-				}
-			}
-		}
-		if dk == 8 {
-			dKey := edbInfoIdBytes[dk]
-			if _, ok := formulaMap[dKey]; ok { //公式中存在
-				if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
-					dvStr := fmt.Sprintf("%v", val)
-					formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
-					replaceCount++
-				}
-			}
-		}
-	}
-	for k, v := range funMap {
-		formulaStr = strings.Replace(formulaStr, v, k, -1)
-	}
-	if replaceCount == len(formulaMap) {
-		return formulaStr
-	} else {
-		return ""
-	}
-}
-
-func RefreshAllCalculateLjzzy(edbInfoId, source int, fromEdbInfo *edbInfoModel.EdbInfo, edbCode, startDate, endDate string) (err error) {
-	tx := global.MYSQL["data"].Begin()
-	defer func() {
-		if err != nil {
-			tx.Rollback()
-		} else {
-			tx.Commit()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	fmt.Println(edbInfoIdStr)
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, fromEdbInfo.EdbInfoId)
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	dataList, err := edbDataModel.GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 1)
-	if err != nil {
-		return err
-	}
-
-	yearMap := make(map[int]map[int]*edbDataModel.EdbInfoSearchData)
-	dataLen := len(dataList)
-	for i := 0; i < dataLen; i++ {
-		item := dataList[i]
-		//日其中获取年
-		itemDate, err := time.Parse(utils.FormatDate, item.DataTime)
-		if err != nil {
-			return err
-		}
-		year := itemDate.Year()
-		month := int(itemDate.Month())
-		if monthMap, yok := yearMap[year]; yok {
-			monthMap[month] = item
-			yearMap[year] = monthMap
-		} else {
-			monthMap = make(map[int]*edbDataModel.EdbInfoSearchData)
-			monthMap[month] = item
-			yearMap[year] = monthMap
-		}
-	}
-
-	addSql := ` INSERT INTO edb_data_calculate_ljzzy(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
-	var isAdd bool
-	//获取指标所有数据
-	existDataList := make([]*edbDataModel.EdbDataBase, 0)
-	dataTableName := edbDataModel.GetEdbDataTableName(source)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&existDataList).Error
-	//_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
-	if err != nil {
-		return err
-	}
-	dataMap := make(map[string]string)
-	for _, v := range existDataList {
-		dataMap[v.DataTime] = v.Value
-	}
-	existDataMap := make(map[string]string)
-
-	for yk, yv := range yearMap {
-		_, oneMonthOk := yv[1]
-		_, twoMonthOk := yv[2]
-		if !oneMonthOk && !twoMonthOk {
-			continue
-		}
-		for i := 1; i <= 12; i++ {
-			//fmt.Println(yk, i, yv[i])
-			dataCurrentItem := yv[i]
-			var date string
-			var val float64
-			if i == 1 || i == 2 {
-				if _, mok := yv[1]; mok { //1月有值
-					if i == 1 {
-						date = dataCurrentItem.DataTime
-						val, _ = decimal.NewFromFloat(dataCurrentItem.Value).Float64() //a.Div(b).Float64()
-					}
-					if i == 2 {
-						dataOneItem := yv[1]
-						if dataCurrentItem != nil && dataOneItem != nil {
-							date = dataCurrentItem.DataTime
-							twoMonth := decimal.NewFromFloat(dataCurrentItem.Value)
-							oneMonth := decimal.NewFromFloat(dataOneItem.Value)
-							val, _ = twoMonth.Sub(oneMonth).Float64()
-						}
-					}
-				} else { //1月无值
-					dataTwoItem := yv[2]
-					if i == 1 {
-						date = strconv.Itoa(yk) + "-01-31"
-						a := decimal.NewFromFloat(dataTwoItem.Value)
-						b := decimal.NewFromFloat(2.0)
-						val, _ = a.Div(b).Float64()
-					}
-					if i == 2 {
-						date = dataCurrentItem.DataTime
-						a := decimal.NewFromFloat(dataTwoItem.Value)
-						b := decimal.NewFromFloat(2.0)
-						val, _ = a.Div(b).Float64()
-					}
-				}
-			} else {
-				dataPreItem := yv[i-1]
-				if dataCurrentItem != nil && dataPreItem != nil {
-					date = dataCurrentItem.DataTime
-					//val =  dataCurrentItem.Value - dataPreItem.Value
-					a := decimal.NewFromFloat(dataCurrentItem.Value)
-					b := decimal.NewFromFloat(dataPreItem.Value)
-					val, _ = a.Sub(b).Float64()
-				}
-			}
-			if date != "" {
-				saveValue := utils.SubFloatToString(val, 4)
-				//判断数据是否存在
-				if existVal, ok := dataMap[date]; !ok {
-					dataTime, _ := time.Parse(utils.FormatDate, date)
-					timestamp := dataTime.UnixNano() / 1e6
-					timeStr := fmt.Sprintf("%d", timestamp)
-					if _, existOk := existDataMap[date]; !existOk {
-						addSql += GetAddSql(edbInfoIdStr, edbCode, date, timeStr, saveValue)
-						isAdd = true
-					}
-					existDataMap[date] = date
-				} else {
-					if existVal != saveValue {
-						sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-						sql = fmt.Sprintf(sql, dataTableName)
-						err = tx.Exec(sql, saveValue, edbInfoId, date).Error
-						//_, err = o.Raw(sql, saveValue, edbInfoId, date).Exec()
-						if err != nil {
-							return err
-						}
-					}
-				}
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		err = tx.Exec(addSql).Error
-		//_, err = o.Raw(addSql).Exec()
-		if err != nil {
-			fmt.Println("RefreshAllCalculateLjzzy add Err", err.Error())
-			return
-		}
-	}
-	return
-}
-
-func RefreshAllCalculateTbz(edbInfoId, source int, fromEdbInfo *edbInfoModel.EdbInfo, edbCode, startDate, endDate string) (err error) {
-	tx := global.MYSQL["data"].Begin()
-	defer func() {
-		if err != nil {
-			tx.Rollback()
-		} else {
-			tx.Commit()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, fromEdbInfo.EdbInfoId)
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-	fmt.Println("GetEdbDataListAll--start")
-	dataList, err := edbDataModel.GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
-	if err != nil {
-		return err
-	}
-	fmt.Println("GetEdbDataListAll--end")
-	var dateArr []string
-	dataMap := make(map[string]*edbDataModel.EdbInfoSearchData)
-	for _, v := range dataList {
-		dateArr = append(dateArr, v.DataTime)
-		dataMap[v.DataTime] = v
-	}
-	fmt.Println("source:", source)
-	//获取指标所有数据
-	existDataList := make([]*edbDataModel.EdbDataBase, 0)
-	dataTableName := edbDataModel.GetEdbDataTableName(source)
-	fmt.Println("dataTableName:", dataTableName)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&existDataList).Error
-	//_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
-	if err != nil {
-		return err
-	}
-	existDataMap := make(map[string]string)
-	for _, v := range existDataList {
-		existDataMap[v.DataTime] = v.Value
-	}
-	//fmt.Println("existDataMap:", existDataMap)
-	addSql := ` INSERT INTO edb_data_calculate_tbz(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
-	var isAdd bool
-	existAddDataMap := make(map[string]string)
-	for _, av := range dateArr {
-		currentItem := dataMap[av]
-		if currentItem != nil {
-			//当前日期
-			currentDate, err := time.Parse(utils.FormatDate, av)
-			if err != nil {
-				return err
-			}
-			//上一年的日期
-			preDate := currentDate.AddDate(-1, 0, 0)
-			preDateStr := preDate.Format(utils.FormatDate)
-			if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
-				//dataTime, _ := time.Parse(utils.FormatDate, date)
-				timestamp := currentDate.UnixNano() / 1e6
-				timestampStr := fmt.Sprintf("%d", timestamp)
-				val := TbzDiv(currentItem.Value, findItem.Value)
-				if existVal, ok := existDataMap[av]; !ok {
-					if _, existOk := existAddDataMap[av]; !existOk {
-						addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-						isAdd = true
-					}
-					existAddDataMap[av] = av
-				} else {
-					if existVal != val {
-						sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-						sql = fmt.Sprintf(sql, dataTableName)
-						err = tx.Exec(sql, val, edbInfoId, av).Error
-						//_, err = o.Raw(sql, val, edbInfoId, av).Exec()
-						if err != nil {
-							return err
-						}
-					}
-				}
-				continue
-			} else {
-				if fromEdbInfo.Frequency == "月度" { //向上和向下,各找一个月
-					for i := 0; i <= 35; i++ {
-						nextDateDay := preDate.AddDate(0, 0, i)
-						nextDateDayStr := nextDateDay.Format(utils.FormatDate)
-						if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
-							timestamp := currentDate.UnixNano() / 1e6
-							timestampStr := fmt.Sprintf("%d", timestamp)
-							val := TbzDiv(currentItem.Value, findItem.Value)
-
-							if existVal, ok := existDataMap[av]; !ok {
-								if _, existOk := existAddDataMap[av]; !existOk {
-									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-									isAdd = true
-								}
-								existAddDataMap[av] = av
-							} else {
-								if existVal != val {
-									sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-									sql = fmt.Sprintf(sql, dataTableName)
-									err = tx.Exec(sql, val, edbInfoId, av).Error
-									//_, err = o.Raw(sql, val, edbInfoId, av).Exec()
-									if err != nil {
-										return err
-									}
-								}
-							}
-							break
-						} else {
-							preDateDay := preDate.AddDate(0, 0, -i)
-							preDateDayStr := preDateDay.Format(utils.FormatDate)
-							if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
-								timestamp := currentDate.UnixNano() / 1e6
-								timestampStr := fmt.Sprintf("%d", timestamp)
-								val := TbzDiv(currentItem.Value, findItem.Value)
-
-								if existVal, ok := existDataMap[av]; !ok {
-									if _, existOk := existAddDataMap[av]; !existOk {
-										addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-										isAdd = true
-									}
-									existAddDataMap[av] = av
-								} else {
-									if existVal != val {
-										sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-										sql = fmt.Sprintf(sql, dataTableName)
-										err = tx.Exec(sql, val, edbInfoId, av).Error
-										//_, err = o.Raw(sql, val, edbInfoId, av).Exec()
-										if err != nil {
-											return err
-										}
-									}
-								}
-								break
-							}
-						}
-					}
-				} else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
-					if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
-						timestamp := currentDate.UnixNano() / 1e6
-						timestampStr := fmt.Sprintf("%d", timestamp)
-						val := TbzDiv(currentItem.Value, findItem.Value)
-
-						if existVal, ok := existDataMap[av]; !ok {
-							if _, existOk := existAddDataMap[av]; !existOk {
-								addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-								isAdd = true
-							}
-							existAddDataMap[av] = av
-						} else {
-							if existVal != val {
-								sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-								sql = fmt.Sprintf(sql, dataTableName)
-								err = tx.Exec(sql, val, edbInfoId, av).Error
-								//_, err = o.Raw(sql, val, edbInfoId, av).Exec()
-								if err != nil {
-									return err
-								}
-							}
-						}
-						break
-					}
-				} else {
-					nextDateDay := preDate.AddDate(0, 0, 1)
-					nextDateDayStr := nextDateDay.Format(utils.FormatDate)
-
-					preDateDay := preDate.AddDate(0, 0, -1)
-					preDateDayStr := preDateDay.Format(utils.FormatDate)
-
-					for i := 0; i < 35; i++ {
-						if i >= 1 {
-							nextDateDay = nextDateDay.AddDate(0, 0, i)
-							nextDateDayStr = nextDateDay.Format(utils.FormatDate)
-						}
-						if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
-							timestamp := currentDate.UnixNano() / 1e6
-							timestampStr := fmt.Sprintf("%d", timestamp)
-							val := TbzDiv(currentItem.Value, findItem.Value)
-
-							if existVal, ok := existDataMap[av]; !ok {
-								if _, existOk := existAddDataMap[av]; !existOk {
-									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-									isAdd = true
-								}
-								existAddDataMap[av] = av
-							} else {
-								if existVal != val {
-									sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-									sql = fmt.Sprintf(sql, dataTableName)
-									err = tx.Exec(sql, val, edbInfoId, av).Error
-									//_, err = o.Raw(sql, val, edbInfoId, av).Exec()
-									if err != nil {
-										return err
-									}
-								}
-							}
-							break
-						} else {
-							if i >= 1 {
-								preDateDay = preDate.AddDate(0, 0, -i)
-								preDateDayStr = nextDateDay.Format(utils.FormatDate)
-							}
-							if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
-								timestamp := currentDate.UnixNano() / 1e6
-								timestampStr := fmt.Sprintf("%d", timestamp)
-								val := TbzDiv(currentItem.Value, findItem.Value)
-
-								if existVal, ok := existDataMap[av]; !ok {
-									if _, existOk := existAddDataMap[av]; !existOk {
-										addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-										isAdd = true
-									}
-									existAddDataMap[av] = av
-								} else {
-									if existVal != val {
-										sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-										sql = fmt.Sprintf(sql, dataTableName)
-										err = tx.Exec(sql, val, edbInfoId, av).Error
-										//_, err = o.Raw(sql, val, edbInfoId, av).Exec()
-										if err != nil {
-											return err
-										}
-									}
-								}
-								break
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		err = tx.Exec(addSql).Error
-		//_, err = o.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-func TbzDiv(a, b float64) string {
-	var valStr string
-	if b != 0 {
-		af := decimal.NewFromFloat(float64(a))
-		bf := decimal.NewFromFloat(float64(b))
-		val, _ := af.Div(bf).Float64()
-		val = val - 1
-		valStr = utils.SubFloatToString(val, 4)
-	} else {
-		valStr = "0"
-	}
-	return valStr
-}
-
-//刷新全部同差值数据
-func RefreshAllCalculateTcz(edbInfoId, source int, fromEdbInfo *edbInfoModel.EdbInfo, edbCode, startDate, endDate string) (err error) {
-	tx := global.MYSQL["data"].Begin()
-	defer func() {
-		if err != nil {
-			tx.Rollback()
-		} else {
-			tx.Commit()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, fromEdbInfo.EdbInfoId)
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	dataList, err := edbDataModel.GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
-	if err != nil {
-		return err
-	}
-	var dateArr []string
-	dataMap := make(map[string]*edbDataModel.EdbInfoSearchData)
-	for _, v := range dataList {
-		dateArr = append(dateArr, v.DataTime)
-		dataMap[v.DataTime] = v
-	}
-	//获取指标所有数据
-	existDataList := make([]*edbDataModel.EdbDataBase, 0)
-	dataTableName := edbDataModel.GetEdbDataTableName(source)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&existDataList).Error
-	//_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
-	if err != nil {
-		return err
-	}
-	existDataMap := make(map[string]string)
-	for _, v := range existDataList {
-		existDataMap[v.DataTime] = v.Value
-	}
-
-	addSql := ` INSERT INTO edb_data_calculate_tcz(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
-	var isAdd bool
-	existAddDataMap := make(map[string]string)
-	for _, av := range dateArr {
-		currentItem := dataMap[av]
-		if currentItem != nil {
-			//当前日期
-			currentDate, err := time.Parse(utils.FormatDate, av)
-			if err != nil {
-				return err
-			}
-			//上一年的日期
-			preDate := currentDate.AddDate(-1, 0, 0)
-			preDateStr := preDate.Format(utils.FormatDate)
-			if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
-				//dataTime, _ := time.Parse(utils.FormatDate, date)
-				timestamp := currentDate.UnixNano() / 1e6
-				timestampStr := fmt.Sprintf("%d", timestamp)
-				val := TczSub(currentItem.Value, findItem.Value)
-
-				if existVal, ok := existDataMap[av]; !ok {
-					if _, existOk := existAddDataMap[av]; !existOk {
-						addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-						isAdd = true
-					}
-					existAddDataMap[av] = av
-				} else {
-					if existVal != val {
-						sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-						sql = fmt.Sprintf(sql, dataTableName)
-						err = tx.Exec(sql, val, edbInfoId, av).Error
-						//_, err = o.Raw(sql, val, edbInfoId, av).Exec()
-						if err != nil {
-							return err
-						}
-					}
-				}
-				//utils.FileLog.Info("同期找到:" + av + ";" + preDateStr)
-				continue
-			} else {
-				if fromEdbInfo.Frequency == "月度" { //向上和向下,各找一个月
-					for i := 0; i <= 35; i++ {
-						nextDateDay := preDate.AddDate(0, 0, 1)
-						nextDateDayStr := nextDateDay.Format(utils.FormatDate)
-						if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
-							timestamp := currentDate.UnixNano() / 1e6
-							timestampStr := fmt.Sprintf("%d", timestamp)
-							val := TczSub(currentItem.Value, findItem.Value)
-
-							if existVal, ok := existDataMap[av]; !ok {
-								if _, existOk := existAddDataMap[av]; !existOk {
-									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-									isAdd = true
-								}
-								existAddDataMap[av] = av
-							} else {
-								if existVal != val {
-									sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-									sql = fmt.Sprintf(sql, dataTableName)
-									err = tx.Exec(sql, val, edbInfoId, av).Error
-									//_, err = o.Raw(sql, val, edbInfoId, av).Exec()
-									if err != nil {
-										return err
-									}
-								}
-							}
-							break
-						} else {
-							preDateDay := preDate.AddDate(0, 0, -1)
-							preDateDayStr := preDateDay.Format(utils.FormatDate)
-							if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
-								timestamp := currentDate.UnixNano() / 1e6
-								timestampStr := fmt.Sprintf("%d", timestamp)
-								val := TczSub(currentItem.Value, findItem.Value)
-
-								if existVal, ok := existDataMap[av]; !ok {
-									if _, existOk := existAddDataMap[av]; !existOk {
-										addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-										isAdd = true
-									}
-									existAddDataMap[av] = av
-								} else {
-									if existVal != val {
-										sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-										sql = fmt.Sprintf(sql, dataTableName)
-										err = tx.Exec(sql, val, edbInfoId, av).Error
-										//_, err = o.Raw(sql, val, edbInfoId, av).Exec()
-										if err != nil {
-											return err
-										}
-									}
-								}
-								break
-							}
-						}
-					}
-				} else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
-					if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
-						timestamp := currentDate.UnixNano() / 1e6
-						timestampStr := fmt.Sprintf("%d", timestamp)
-						val := TczSub(currentItem.Value, findItem.Value)
-
-						if existVal, ok := existDataMap[av]; !ok {
-							if _, existOk := existAddDataMap[av]; !existOk {
-								addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-								isAdd = true
-							}
-							existAddDataMap[av] = av
-						} else {
-							if existVal != val {
-								sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-								sql = fmt.Sprintf(sql, dataTableName)
-								err = tx.Exec(sql, val, edbInfoId, av).Error
-								//_, err = o.Raw(sql, val, edbInfoId, av).Exec()
-								if err != nil {
-									return err
-								}
-							}
-						}
-						break
-					}
-				} else {
-					for i := 0; i < 35; i++ {
-						nextDateDay := preDate.AddDate(0, 0, 1)
-						nextDateDayStr := nextDateDay.Format(utils.FormatDate)
-						if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
-							timestamp := currentDate.UnixNano() / 1e6
-							timestampStr := fmt.Sprintf("%d", timestamp)
-							val := TczSub(currentItem.Value, findItem.Value)
-
-							if existVal, ok := existDataMap[av]; !ok {
-								if _, existOk := existAddDataMap[av]; !existOk {
-									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-									isAdd = true
-								}
-								existAddDataMap[av] = av
-							} else {
-								if existVal != val {
-									sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-									sql = fmt.Sprintf(sql, dataTableName)
-									err = tx.Exec(sql, val, edbInfoId, av).Error
-									//_, err = o.Raw(sql, val, edbInfoId, av).Exec()
-									if err != nil {
-										return err
-									}
-								}
-							}
-							break
-						} else {
-							preDateDay := preDate.AddDate(0, 0, -1)
-							preDateDayStr := preDateDay.Format(utils.FormatDate)
-							if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
-								timestamp := currentDate.UnixNano() / 1e6
-								timestampStr := fmt.Sprintf("%d", timestamp)
-								val := TczSub(currentItem.Value, findItem.Value)
-
-								if existVal, ok := existDataMap[av]; !ok {
-									if _, existOk := existAddDataMap[av]; !existOk {
-										addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-										isAdd = true
-									}
-									existAddDataMap[av] = av
-								} else {
-									if existVal != val {
-										sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-										sql = fmt.Sprintf(sql, dataTableName)
-										err = tx.Exec(sql, val, edbInfoId, av).Error
-										//_, err = o.Raw(sql, val, edbInfoId, av).Exec()
-										if err != nil {
-											return err
-										}
-									}
-								}
-								break
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		err = tx.Exec(addSql).Error
-		//_, err = o.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-func TczSub(a, b float64) string {
-	af := decimal.NewFromFloat(float64(a))
-	fmt.Println(af)
-	bf := decimal.NewFromFloat(float64(b))
-	val, _ := af.Sub(bf).Float64()
-	valStr := utils.SubFloatToString(val, 4)
-	return valStr
-}
-
-//刷新全部N数值移动平均计算
-func RefreshAllCalculateNszydpjjs(edbInfoId, source, formulaInt int, fromEdbInfo *edbInfoModel.EdbInfo, edbCode, startDate string) (err error) {
-	tx := global.MYSQL["data"].Begin()
-	defer func() {
-		if err != nil {
-			fmt.Println("RefreshCalculateNszydpjjs Err:" + err.Error())
-			//utils.FileLog.Info("RefreshCalculateNszydpjjs Err:" + err.Error())
-			tx.Rollback()
-		} else {
-			tx.Commit()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	fmt.Println(edbInfoIdStr)
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, edbInfoId)
-
-	existDataList, err := edbDataModel.GetEdbDataListAll(condition, pars, source, 0)
-	if err != nil {
-		fmt.Println("existDataList GetEdbDataListAll Err:" + err.Error())
-		return err
-	}
-
-	existDataMap := make(map[string]*edbDataModel.EdbInfoSearchData)
-	for _, v := range existDataList {
-		existDataMap[v.DataTime] = v
-	}
-
-	//计算来源数据
-	var fromCondition string
-	var fromPars []interface{}
-	fromCondition += " AND edb_info_id=? "
-	fromPars = append(fromPars, fromEdbInfo.EdbInfoId)
-	fromCondition += " AND data_time>=? "
-	fromPars = append(fromPars, startDate)
-
-	fmt.Println("fromPars:", fromPars)
-	fromDataList, err := edbDataModel.GetEdbDataListAll(fromCondition, fromPars, fromEdbInfo.Source, 0)
-	if err != nil {
-		fmt.Println("from GetEdbDataListAll Err:" + err.Error())
-		return err
-	}
-
-	var fromDateArr []string
-	fromDataMap := make(map[string]*edbDataModel.EdbInfoSearchData)
-	for _, v := range fromDataList {
-		fromDateArr = append(fromDateArr, v.DataTime)
-		fromDataMap[v.DataTime] = v
-	}
-
-	addSql := ` INSERT INTO edb_data_calculate_nszydpjjs(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
-	var isAdd bool
-	dataTableName := edbDataModel.GetEdbDataTableName(source)
-	arrLen := len(fromDateArr)
-	existAddDataMap := make(map[string]string)
-	for ak, av := range fromDateArr {
-		//处理第一个值
-		var valArr []float64
-		if findItem, ok := fromDataMap[av]; ok {
-			valArr = append(valArr, findItem.Value)
-		} else {
-			continue
-		}
-		if ak+1 != arrLen {
-			//处理除第一个值之外的N-1个值
-			for i := 1; i < formulaInt; i++ {
-				arrIndex := ak + i
-				if arrIndex >= arrLen {
-					break
-				}
-				arrVal := fromDateArr[arrIndex]
-				if findItem, ok := fromDataMap[arrVal]; ok {
-					valArr = append(valArr, findItem.Value)
-				} else {
-					continue
-				}
-			}
-		}
-		valArrLen := len(valArr)
-		//var totalVal float64
-		totalVal := decimal.NewFromFloat(0.00)
-		for _, v := range valArr {
-			newDecimal := decimal.NewFromFloat(v)
-			totalVal = totalVal.Add(newDecimal)
-		}
-		af := totalVal //decimal.NewFromFloat(totalVal)
-		bf := decimal.NewFromFloat(float64(valArrLen))
-		val, _ := af.Div(bf).Float64()
-		valStr := utils.SubFloatToString(val, 4)
-
-		if existVal, existOk := existDataMap[av]; !existOk {
-			currentDate, err := time.Parse(utils.FormatDate, av)
-			if err != nil {
-				return err
-			}
-			timestamp := currentDate.UnixNano() / 1e6
-			timestampStr := fmt.Sprintf("%d", timestamp)
-			if _, existOk := existAddDataMap[av]; !existOk {
-				addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, valStr)
-				isAdd = true
-			}
-			existAddDataMap[av] = av
-		} else {
-			saveValue := utils.SubFloatToString(existVal.Value, 30)
-			if saveValue != valStr {
-				sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-				sql = fmt.Sprintf(sql, dataTableName)
-				err = tx.Exec(sql, val, edbInfoId, av).Error
-				//_, err = o.Raw(sql, val, edbInfoId, av).Exec()
-				if err != nil {
-					return err
-				}
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		//utils.FileLog.Info("addSql:" + addSql)
-		//_, err = o.Raw(addSql).Exec()
-		err = tx.Exec(addSql).Error
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-//刷新所有环比值数据
-func RefreshAllCalculateHbz(edbInfoId, source int, fromEdbInfo *edbInfoModel.EdbInfo, edbCode, startDate, endDate string, formulaInt int) (err error) {
-	tx := global.MYSQL["data"].Begin()
-	defer func() {
-		if err != nil {
-			tx.Rollback()
-		} else {
-			tx.Commit()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, fromEdbInfo.EdbInfoId)
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	dataList, err := edbDataModel.GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
-	if err != nil {
-		return err
-	}
-	var dateArr []string
-	dataMap := make(map[string]*edbDataModel.EdbInfoSearchData)
-	for _, v := range dataList {
-		dateArr = append(dateArr, v.DataTime)
-		dataMap[v.DataTime] = v
-	}
-	fmt.Println("source:", source)
-	//获取指标所有数据
-	existDataList := make([]*edbDataModel.EdbDataBase, 0)
-	dataTableName := edbDataModel.GetEdbDataTableName(source)
-	fmt.Println("dataTableName:", dataTableName)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&existDataList).Error
-	//_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
-	if err != nil {
-		return err
-	}
-	existDataMap := make(map[string]string)
-	for _, v := range existDataList {
-		existDataMap[v.DataTime] = v.Value
-	}
-	addSql := ` INSERT INTO edb_data_calculate_hbz(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	dataLen := len(dataList)
-	fmt.Println("dataLen:", dataLen)
-	for i := 0; i < dataLen; i++ {
-		j := i + formulaInt
-		if j < dataLen {
-			//当期
-			currentItem := dataList[i]
-			preItem := dataList[j]
-			if currentItem != nil && preItem != nil {
-				existKey := edbCode + currentItem.DataTime
-
-				if _, ok := existMap[existKey]; !ok {
-					currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
-					timestamp := currentDate.UnixNano() / 1e6
-					timestampStr := fmt.Sprintf("%d", timestamp)
-					val := HbzDiv(currentItem.Value, preItem.Value)
-					if val != "" {
-						if existVal, findOk := existDataMap[currentItem.DataTime]; !findOk {
-							addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, val)
-							isAdd = true
-						} else {
-							if existVal != val {
-								sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-								sql = fmt.Sprintf(sql, dataTableName)
-								err = tx.Exec(sql, val, edbInfoId, currentItem.DataTime).Error
-								//_, err = o.Raw(sql, val, edbInfoId, currentItem.DataTime).Exec()
-								if err != nil {
-									return err
-								}
-							}
-						}
-					}
-				}
-				existMap[existKey] = currentItem.DataTime
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		err = tx.Exec(addSql).Error
-		//_, err = o.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-//环比值,current:当期,pre:上期 公式: (当期-上期)/上期
-func HbzDiv(current, pre float64) string {
-	if pre == 0 {
-		return ""
-	}
-	currentVal := decimal.NewFromFloat(float64(current))
-	preVal := decimal.NewFromFloat(float64(pre))
-	val, _ := currentVal.Sub(preVal).Div(preVal).Float64()
-	valStr := utils.SubFloatToString(val, 4)
-	return valStr
-}
-
-
-//刷新所有环差值数据
-func RefreshAllCalculateHcz(edbInfoId, source int, fromEdbInfo *edbInfoModel.EdbInfo, edbCode, startDate, endDate string, formulaInt int) (err error) {
-	tx := global.MYSQL["data"].Begin()
-	defer func() {
-		if err != nil {
-			tx.Rollback()
-		} else {
-			tx.Commit()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, fromEdbInfo.EdbInfoId)
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	dataList, err := edbDataModel.GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
-	if err != nil {
-		return err
-	}
-	var dateArr []string
-	dataMap := make(map[string]*edbDataModel.EdbInfoSearchData)
-	for _, v := range dataList {
-		dateArr = append(dateArr, v.DataTime)
-		dataMap[v.DataTime] = v
-	}
-	fmt.Println("source:", source)
-	//获取指标所有数据
-	existDataList := make([]*edbDataModel.EdbDataBase, 0)
-	dataTableName := edbDataModel.GetEdbDataTableName(source)
-	fmt.Println("dataTableName:", dataTableName)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	err = global.MYSQL["data"].Raw(sql, edbInfoId).Scan(&existDataList).Error
-	//_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
-	if err != nil {
-		return err
-	}
-	existDataMap := make(map[string]string)
-	for _, v := range existDataList {
-		existDataMap[v.DataTime] = v.Value
-	}
-	//fmt.Println("existDataMap:", existDataMap)
-	addSql := ` INSERT INTO edb_data_calculate_hcz(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	dataLen := len(dataList)
-	fmt.Println("dataLen:", dataLen)
-	for i := 0; i < dataLen; i++ {
-		j := i + formulaInt
-		if j < dataLen {
-			//当期
-			currentItem := dataList[i]
-			preItem := dataList[j]
-			if currentItem != nil && preItem != nil {
-				existKey := edbCode + currentItem.DataTime
-				if _, ok := existMap[existKey]; !ok {
-					currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
-					timestamp := currentDate.UnixNano() / 1e6
-					timestampStr := fmt.Sprintf("%d", timestamp)
-					val := HczDiv(currentItem.Value, preItem.Value)
-					if val != "" {
-						if existVal, findOk := existDataMap[currentItem.DataTime]; !findOk {
-							addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, val)
-							isAdd = true
-						} else {
-							if existVal != val {
-								sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-								sql = fmt.Sprintf(sql, dataTableName)
-								err = tx.Exec(sql, val, edbInfoId, currentItem.DataTime).Error
-								//_, err = o.Raw(sql, val, edbInfoId, currentItem.DataTime).Exec()
-								if err != nil {
-									return err
-								}
-							}
-						}
-					}
-				}
-				existMap[existKey] = currentItem.DataTime
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		err = tx.Exec(addSql).Error
-		//_, err = o.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-//环差值,current:当期,pre:上期 公式:当期-上期
-func HczDiv(current, pre float64) string {
-	if pre == 0 {
-		return ""
-	}
-	currentVal := decimal.NewFromFloat(current)
-	preVal := decimal.NewFromFloat(pre)
-	val, _ := currentVal.Sub(preVal).Float64()
-	valStr := utils.SubFloatToString(val, 4)
-	return valStr
-}
-
-
-//刷新所有变频数据
-func RefreshAllCalculateBp(edbInfoId, source int, fromEdbInfo *edbInfoModel.EdbInfo, edbCode, startDate, endDate string) (err error) {
-	tx := global.MYSQL["data"].Begin()
-	defer func() {
-		if err != nil {
-			tx.Rollback()
-		} else {
-			tx.Commit()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, fromEdbInfo.EdbInfoId)
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	dataList, err := edbDataModel.GetEdbDataListAll(condition, pars, fromEdbInfo.Source, 0)
-	if err != nil {
-		return err
-	}
-	var dateArr []string
-	dataMap := make(map[string]*edbDataModel.EdbInfoSearchData)
-	for _, v := range dataList {
-		dateArr = append(dateArr, v.DataTime)
-		dataMap[v.DataTime] = v
-	}
-	fmt.Println("source:", source)
-	//获取指标所有数据
-	existDataList := make([]*edbDataModel.EdbDataBase, 0)
-	dataTableName := edbDataModel.GetEdbDataTableName(source)
-	fmt.Println("dataTableName:", dataTableName)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	err = tx.Raw(sql, edbInfoId).Scan(&existDataList).Error
-	//_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
-	if err != nil {
-		return err
-	}
-	existDataMap := make(map[string]string)
-	for _, v := range existDataList {
-		existDataMap[v.DataTime] = v.Value
-	}
-	//fmt.Println("existDataMap:", existDataMap)
-	addSql := ` INSERT INTO edb_data_calculate_bp(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
-	var isAdd bool
-
-	existMap := make(map[string]string)
-	dataLen := len(dataList)
-	for i := 0; i < dataLen; i++ {
-		//当期
-		currentItem := dataList[i]
-		currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
-		var day int
-		var preItem *edbDataModel.EdbInfoSearchData
-		var preDate time.Time
-		if i == 0 {
-			day = int(time.Now().Sub(currentDate).Hours() / float64(24))
-			preDate = time.Now()
-		} else {
-			j := i + 1
-			if j < dataLen {
-				preItem = dataList[j]
-				preDate, _ = time.Parse(utils.FormatDate, preItem.DataTime)
-				day = int(currentDate.Sub(preDate).Hours() / float64(24))
-			}
-		}
-		for k := 0; k <= day; k++ {
-			needDay := preDate.AddDate(0, 0, -k)
-			needDayStr := needDay.Format(utils.FormatDate)
-			existKey := edbCode + needDayStr
-			if _, ok := existMap[existKey]; !ok {
-				timestamp := needDay.UnixNano() / 1e6
-				timestampStr := fmt.Sprintf("%d", timestamp)
-				valStr := decimal.NewFromFloat(currentItem.Value).String()
-				if existVal, ok := existDataMap[needDayStr]; !ok {
-					addSql += GetAddSql(edbInfoIdStr, edbCode, needDayStr, timestampStr, valStr)
-				} else {
-					if existVal != valStr {
-						sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-						sql = fmt.Sprintf(sql, dataTableName)
-						err = tx.Exec(sql, valStr, edbInfoId, needDay).Error
-						//_, err = o.Raw(sql, valStr, edbInfoId, needDay).Exec()
-						if err != nil {
-							return err
-						}
-					}
-				}
-			}
-			existMap[existKey] = needDayStr
-		}
-		existKey := edbCode + currentItem.DataTime
-		if _, ok := existMap[existKey]; !ok {
-			currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
-			timestamp := currentDate.UnixNano() / 1e6
-			timestampStr := fmt.Sprintf("%d", timestamp)
-			valStr := decimal.NewFromFloat(currentItem.Value).String()
-			if existVal, ok := existDataMap[currentItem.DataTime]; !ok {
-				addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, valStr)
-			} else {
-				if existVal != valStr {
-					sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-					sql = fmt.Sprintf(sql, dataTableName)
-					err = tx.Exec(sql, valStr, edbInfoId, currentItem.DataTime).Error
-					//_, err = o.Raw(sql, valStr, edbInfoId, currentItem.DataTime).Exec()
-					if err != nil {
-						return err
-					}
-				}
-			}
-		}
-		existMap[existKey] = currentItem.DataTime
-	}
-
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		err = tx.Exec(addSql).Error
-		//_, err = o.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-
-// RefreshAllCalculateZjpj 刷新所有 直接拼接 数据
-func RefreshAllCalculateZjpj(edbInfo *edbInfoModel.EdbInfo) (err error) {
-	tx := global.MYSQL["data"].Begin()
-	defer func() {
-		if err != nil {
-			tx.Rollback()
-		} else {
-			tx.Commit()
-		}
-	}()
-
-	//查询当前指标现有的数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, edbInfo.EdbInfoId)
-
-	dataList, err := edbDataModel.GetAllEdbDataCalculateZjpjByEdbInfoId(edbInfo.EdbInfoId)
-	if err != nil {
-		return err
-	}
-	var dateArr []string
-	dataMap := make(map[string]*edbDataModel.EdbDataCalculateZjpj)
-	removeDataTimeMap := make(map[string]int) //需要移除的日期数据
-	for _, v := range dataList {
-		dateArr = append(dateArr, v.DataTime)
-		dataMap[v.DataTime] = v
-		removeDataTimeMap[v.DataTime] = 1
-	}
-
-	//查询关联指标信息
-	var existCondition string
-	var existPars []interface{}
-	existCondition += " AND edb_info_id=? "
-	existPars = append(existPars, edbInfo.EdbInfoId)
-	existList, err := edbDataModel.GetEdbInfoCalculateListByCondition(existCondition, existPars)
-	if err != nil {
-		err = errors.New("判断指标是否改变失败,Err:" + err.Error())
-		return
-	}
-
-	var existItemA, existItemB *edbDataModel.EdbInfoCalculateMapping
-	for _, existItem := range existList {
-		if existItem.FromTag == "A" {
-			existItemA = existItem
-		} else if existItem.FromTag == "B" {
-			existItemB = existItem
-		}
-	}
-
-	addDataList := make([]*edbDataModel.EdbDataCalculateZjpj, 0)
-	//第一个指标
-	{
-		var condition string
-		var pars []interface{}
-
-		condition += " AND data_time < ? AND edb_info_id=? "
-		pars = append(pars, edbInfo.CalculateFormula, existItemA.FromEdbInfoId)
-
-		//第一个指标的数据列表
-		firstDataList, tmpErr := edbDataModel.GetEdbDataListAll(condition, pars, existItemA.FromSource, 0)
-		if tmpErr != nil {
-			return tmpErr
-		}
-
-		for _, v := range firstDataList {
-			//校验待删除日期数据里面是否存在该元素,如果存在的话,那么移除该元素
-			if _, ok := removeDataTimeMap[v.DataTime]; ok {
-				delete(removeDataTimeMap, v.DataTime)
-			}
-			//时间戳
-			if edbData, ok := dataMap[v.DataTime]; ok {
-				if edbData.Value != v.Value {
-					//更新指标数据
-					edbData.Value = v.Value
-					tempErr := tx.Model(edbDataModel.EdbDataCalculateZjpj{}).Where("edb_data_id = ?", edbData.EdbDataId).Updates(edbDataModel.EdbDataCalculateZjpj{Value: v.Value}).Error
-					if tempErr != nil {
-						fmt.Println("tmpErr:", tmpErr)
-					}
-					//o.Update(edbData, "Value")
-				}
-			} else {
-				//时间戳
-				currentDate, _ := time.Parse(utils.FormatDate, v.DataTime)
-				timestamp := currentDate.UnixNano() / 1e6
-
-				edbDataZjpj := &edbDataModel.EdbDataCalculateZjpj{
-					EdbInfoId:     edbInfo.EdbInfoId,
-					EdbCode:       edbInfo.EdbCode,
-					DataTime:      v.DataTime,
-					Value:         v.Value,
-					Status:        1,
-					CreateTime:    time.Now(),
-					ModifyTime:    time.Now(),
-					DataTimestamp: timestamp,
-				}
-				addDataList = append(addDataList, edbDataZjpj)
-			}
-		}
-	}
-
-	//第二个指标
-	{
-		condition = ``
-		pars = make([]interface{}, 0)
-
-		condition += " AND data_time >= ? AND edb_info_id = ? "
-		pars = append(pars, edbInfo.CalculateFormula, existItemB.FromEdbInfoId)
-
-		//第二个指标的数据列表
-		secondDataList, tmpErr := edbDataModel.GetEdbDataListAll(condition, pars, existItemB.FromSource, 0)
-		if tmpErr != nil {
-			return tmpErr
-		}
-
-		for _, v := range secondDataList {
-			//校验待删除日期数据里面是否存在该元素,如果存在的话,那么移除该元素
-			if _, ok := removeDataTimeMap[v.DataTime]; ok {
-				delete(removeDataTimeMap, v.DataTime)
-			}
-
-			if edbData, ok := dataMap[v.DataTime]; ok {
-				if edbData.Value != v.Value {
-					//更新指标数据
-					edbData.Value = v.Value
-					edbData.ModifyTime = time.Now()
-					tempErr := tx.Model(edbDataModel.EdbDataCalculateZjpj{}).Where("edb_data_id = ?", edbData.EdbDataId).Updates(edbDataModel.EdbDataCalculateZjpj{Value: v.Value, ModifyTime: time.Now()}).Error
-					if tempErr != nil {
-						fmt.Println("tmpErr:", tmpErr)
-					}
-					//_, tmpErr := o.Update(edbData, "Value", "ModifyTime")
-					//if tmpErr != nil {
-					//	fmt.Println("tmpErr:", tmpErr)
-					//}
-				}
-			} else {
-				//时间戳
-				currentDate, _ := time.Parse(utils.FormatDate, v.DataTime)
-				timestamp := currentDate.UnixNano() / 1e6
-
-				edbDataZjpj := &edbDataModel.EdbDataCalculateZjpj{
-					EdbInfoId:     edbInfo.EdbInfoId,
-					EdbCode:       edbInfo.EdbCode,
-					DataTime:      v.DataTime,
-					Value:         v.Value,
-					Status:        1,
-					CreateTime:    time.Now(),
-					ModifyTime:    time.Now(),
-					DataTimestamp: timestamp,
-				}
-				addDataList = append(addDataList, edbDataZjpj)
-			}
-		}
-	}
-
-	//删除已经不存在的累计同比拼接指标数据(由于同比值当日的数据删除了)
-	{
-		removeDateList := make([]string, 0)
-		for dateTime := range removeDataTimeMap {
-			removeDateList = append(removeDateList, dateTime)
-		}
-		if len(removeDateList) > 0 {
-			removeDateStr := strings.Join(removeDateList, `","`)
-			removeDateStr = `"` + removeDateStr + `"`
-			//如果拼接指标变更了,那么需要删除所有的指标数据
-			tableName := edbDataModel.GetEdbDataTableName(edbInfo.Source)
-			sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time in (%s) `, tableName, removeDateStr)
-
-			err = tx.Exec(sql, edbInfo.EdbInfoId).Error
-			//_, err = o.Raw(sql, edbInfo.EdbInfoId).Exec()
-			if err != nil {
-				err = errors.New("删除不存在的直接拼接指标数据失败,Err:" + err.Error())
-				return
-			}
-		}
-	}
-
-	//数据入库
-	tmpAddDataList := make([]*edbDataModel.EdbDataCalculateZjpj, 0)
-	for _, v := range addDataList {
-		tmpAddDataList = append(tmpAddDataList, v)
-
-		if len(tmpAddDataList) >= 200 {
-			tmpErr := tx.Create(tmpAddDataList).Error
-			//_, tmpErr := o.InsertMulti(len(tmpAddDataList), tmpAddDataList)
-			if tmpErr != nil {
-				err = tmpErr
-				return
-			}
-			//重新初始化需要加入的数据切片
-			tmpAddDataList = make([]*edbDataModel.EdbDataCalculateZjpj, 0)
-		}
-	}
-	//最后如果还有需要新增的数据,那么就统一入库
-	if len(tmpAddDataList) > 0 {
-		tmpErr := tx.Create(tmpAddDataList).Error
-		//_, tmpErr := o.InsertMulti(len(tmpAddDataList), tmpAddDataList)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-	}
-	return
-}
-
-// RefreshAllCalculateLjztbpj 刷新所有 累计值同比拼接 数据
-func RefreshAllCalculateLjztbpj(edbInfo *edbInfoModel.EdbInfo) (err error) {
-	tx := global.MYSQL["data"].Begin()
-	defer func() {
-		if err != nil {
-			tx.Rollback()
-		} else {
-			tx.Commit()
-		}
-	}()
-
-	//查询当前指标现有的数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, edbInfo.EdbInfoId)
-
-	//所有的数据
-	dataList, err := edbDataModel.GetAllEdbDataCalculateLjztbpjByEdbInfoId(edbInfo.EdbInfoId)
-	if err != nil {
-		return err
-	}
-
-	//待拼接指标map
-	pjDataMap := make(map[string]float64)     //需要入库的数据
-	nowEdbDataMap := make(map[string]float64) //当前指标的数据(已经在库里了,不需要重新)
-	//拼接指标的日期切片数据
-	pjEdbDataTimeList := make([]string, 0)
-
-	dataMap := make(map[string]*edbDataModel.EdbDataCalculateLjztbpj)
-	for _, v := range dataList {
-		pjEdbDataTimeList = append(pjEdbDataTimeList, v.DataTime)
-		dataMap[v.DataTime] = v
-		nowEdbDataMap[v.DataTime] = v.Value
-	}
-
-	//查询关联指标信息
-	var existCondition string
-	var existPars []interface{}
-	existCondition += " AND edb_info_id=? "
-	existPars = append(existPars, edbInfo.EdbInfoId)
-	existList, err := edbDataModel.GetEdbInfoCalculateListByCondition(existCondition, existPars)
-	if err != nil {
-		err = errors.New("判断指标是否改变失败,Err:" + err.Error())
-		return
-	}
-
-	var existItemA, existItemB *edbDataModel.EdbInfoCalculateMapping
-	for _, existItem := range existList {
-		if existItem.FromTag == "A" {
-			existItemA = existItem
-		} else if existItem.FromTag == "B" {
-			existItemB = existItem
-		}
-	}
-	// 原数据开始计算日期
-	startCalculationDate, _ := time.ParseInLocation(utils.FormatDate, edbInfo.CalculateFormula, time.Local)
-
-	//待拼接指标
-	{
-		var condition string
-		var pars []interface{}
-
-		condition += " AND data_time <= ? AND edb_info_id=? "
-		pars = append(pars, startCalculationDate, existItemA.FromEdbInfoId)
-
-		//第一个指标的数据列表
-		firstDataList, tmpErr := edbDataModel.GetEdbDataListAll(condition, pars, existItemA.FromSource, 0)
-		if tmpErr != nil {
-			return tmpErr
-		}
-
-		for _, v := range firstDataList {
-			//时间戳
-			if edbData, ok := dataMap[v.DataTime]; ok {
-				if edbData.Value != v.Value {
-					//更新指标数据
-					edbData.Value = v.Value
-					//tempErr := tx.Model()
-					//o.Update(edbData, "Value")
-					tempErr := tx.Model(edbDataModel.EdbDataCalculateLjztbpj{}).Where("edb_data_id = ?", edbData.EdbDataId).Updates(edbDataModel.EdbDataCalculateLjztbpj{Value: v.Value}).Error
-					if tempErr != nil {
-						fmt.Println("tmpErr:", tmpErr)
-					}
-
-					//将新的数据存入已入库指标map里面,以便后续计算
-					nowEdbDataMap[edbData.DataTime] = v.Value
-				}
-			}
-		}
-	}
-
-	//同比值指标map
-	tbzEdbDataMap := make(map[string]float64)
-
-	//同比值日期切片列表
-	tbzEdbDataTimeList := make([]string, 0)
-
-	//同比值指标
-	{
-		var condition string
-		var pars []interface{}
-
-		condition += " AND data_time > ? AND edb_info_id = ? "
-		pars = append(pars, startCalculationDate, existItemB.FromEdbInfoId)
-
-		//第二个指标的数据列表
-		secondDataList, tmpErr := edbDataModel.GetEdbDataListAll(condition, pars, existItemB.FromSource, 0)
-		if tmpErr != nil {
-			return tmpErr
-		}
-
-		for _, v := range secondDataList {
-			tbzEdbDataMap[v.DataTime] = v.Value
-			tbzEdbDataTimeList = append(tbzEdbDataTimeList, v.DataTime)
-		}
-	}
-
-	sort.Strings(tbzEdbDataTimeList)
-
-	// 遍历现有的数据,判断拼接指标中是否存在该日期数据,如果拼接指标无此数据,那么需要删除该日期数据(日期的判断:需要在开始计算日期之后)
-	removeDateList := make([]string, 0)
-	for nowEdbDate := range nowEdbDataMap {
-		nowEdbDateTime, _ := time.ParseInLocation(utils.FormatDate, nowEdbDate, time.Local)
-		//校验日期 需要 大于 拼接前日期
-		if startCalculationDate.Before(nowEdbDateTime) {
-			if _, ok := tbzEdbDataMap[nowEdbDate]; !ok {
-				// 同比指标中,不存在该日期数据,那么需要移除 现有数据 中该日期的数据
-				removeDateList = append(removeDateList, nowEdbDate)
-			}
-		}
-	}
-
-	//待修改的指标数据map(index:日期,value:值)
-	updateEdbDataMap := make(map[string]float64)
-	for _, v := range tbzEdbDataTimeList {
-		tbzDataTime, _ := time.ParseInLocation(utils.FormatDate, v, time.Local)
-
-		//获取拼接指标上一年同一天的数据
-		var pjDataTime time.Time
-		if tbzDataTime.Month() == 2 {
-			pjDataTime = tbzDataTime.AddDate(0, -11, 0)
-			pjDataTime = time.Date(pjDataTime.Year(), pjDataTime.Month(), 1, 0, 0, 0, 0, time.Now().Location()).AddDate(0, 0, -1)
-		} else {
-			pjDataTime = tbzDataTime.AddDate(-1, 0, 0)
-		}
-
-		//校验现有数据中,是否存在该日期的数据,如果存在的话,那么就要去校验 最新计算数据 与 现有数据 是否一致
-		if nowEdbDataValue, isHas := nowEdbDataMap[v]; isHas {
-			//获取去年今日的数据,获取到后,然后是去修改该日期的数据
-			if lastYearEdbDataValue, ok := nowEdbDataMap[pjDataTime.Format(utils.FormatDate)]; ok {
-
-				if v == "2021-08-31" {
-					fmt.Println("进来了")
-				}
-				tbzDataValue := tbzEdbDataMap[v] //同比值
-				currValue := lastYearEdbDataValue * (1 + tbzDataValue/100)
-				currValue, _ = decimal.NewFromFloat(currValue).Truncate(4).Float64() //保留4位小数
-				//如果计算出来的值与库里面的值不匹配,那么就去修改该值
-				if nowEdbDataValue != currValue {
-					//将计算后的数据存入待拼接指标map里面,以便后续计算
-					updateEdbDataMap[v] = currValue
-				}
-			}
-		} else {
-			//因为 现有数据中 不存在该日期数据,那么需要做新增数据处理
-
-			//如果去年今日存在该数据,那么就去计算当前的数据
-			if pjDataValue, ok := nowEdbDataMap[pjDataTime.Format(utils.FormatDate)]; ok {
-				tbzDataValue := tbzEdbDataMap[v] //同比值
-				currValue := pjDataValue * (1 + tbzDataValue/100)
-
-				currValue, _ = decimal.NewFromFloat(currValue).Truncate(4).Float64()
-				//将计算后的数据存入已入库指标map里面,以便后续计算
-				nowEdbDataMap[v] = currValue
-
-				//将计算后的数据存入待拼接指标map里面,以便后续入库
-				pjDataMap[v] = currValue
-				pjEdbDataTimeList = append(pjEdbDataTimeList, v)
-			}
-		}
-	}
-
-	//新增的数据入库
-	{
-		addDataList := make([]*edbDataModel.EdbDataCalculateLjztbpj, 0)
-		for dataTime, dataValue := range pjDataMap {
-			//时间戳
-			currentDate, _ := time.Parse(utils.FormatDate, dataTime)
-			timestamp := currentDate.UnixNano() / 1e6
-
-			edbDataLjztbpj := &edbDataModel.EdbDataCalculateLjztbpj{
-				EdbInfoId:     edbInfo.EdbInfoId,
-				EdbCode:       edbInfo.EdbCode,
-				DataTime:      dataTime,
-				Value:         dataValue,
-				Status:        1,
-				CreateTime:    time.Now(),
-				ModifyTime:    time.Now(),
-				DataTimestamp: timestamp,
-			}
-			addDataList = append(addDataList, edbDataLjztbpj)
-		}
-
-		tmpAddDataList := make([]*edbDataModel.EdbDataCalculateLjztbpj, 0)
-		for _, v := range addDataList {
-			tmpAddDataList = append(tmpAddDataList, v)
-
-			if len(tmpAddDataList) >= 200 {
-				tmpErr := tx.Create(tmpAddDataList).Error
-				//_, tmpErr := o.InsertMulti(len(tmpAddDataList), tmpAddDataList)
-				if tmpErr != nil {
-					err = tmpErr
-					return
-				}
-				//重新初始化需要加入的数据切片
-				tmpAddDataList = make([]*edbDataModel.EdbDataCalculateLjztbpj, 0)
-			}
-		}
-		//最后如果还有需要新增的数据,那么就统一入库
-		if len(tmpAddDataList) > 0 {
-			tmpErr := tx.Create(tmpAddDataList).Error
-			//_, tmpErr := o.InsertMulti(len(tmpAddDataList), tmpAddDataList)
-			if tmpErr != nil {
-				err = tmpErr
-				return
-			}
-		}
-	}
-
-	//删除已经不存在的累计同比拼接指标数据(由于同比值当日的数据删除了)
-	{
-		if len(removeDateList) > 0 {
-			removeDateStr := strings.Join(removeDateList, `","`)
-			removeDateStr = `"` + removeDateStr + `"`
-			//如果拼接指标变更了,那么需要删除所有的指标数据
-			tableName := edbDataModel.GetEdbDataTableName(edbInfo.Source)
-			sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time in (%s) `, tableName, removeDateStr)
-
-			err = tx.Exec(sql, edbInfo.EdbInfoId).Error
-			//_, err = o.Raw(sql, edbInfo.EdbInfoId).Exec()
-			if err != nil {
-				err = errors.New("删除不存在的累计值同比拼接指标数据失败,Err:" + err.Error())
-				return
-			}
-		}
-	}
-
-	//修改现有的数据中对应的值
-	{
-		tableName := edbDataModel.GetEdbDataTableName(edbInfo.Source)
-		for edbDate, edbDataValue := range updateEdbDataMap {
-			sql := fmt.Sprintf(` UPDATE  %s set value = ?,modify_time=now() WHERE edb_info_id = ? and data_time = ? `, tableName)
-
-			err = tx.Exec(sql, edbDataValue, edbInfo.EdbInfoId, edbDate).Error
-			//_, err = o.Raw(sql, edbDataValue, edbInfo.EdbInfoId, edbDate).Exec()
-			if err != nil {
-				err = errors.New("更新现有的累计值同比拼接指标数据失败,Err:" + err.Error())
-				return
-			}
-		}
-	}
-	return
-}
-
 type RefreshResponse struct {
 	Ret         int
 	Msg         string

+ 306 - 8
services/company/permission.go

@@ -1,7 +1,11 @@
 package company
 
 import (
+	"errors"
 	"fmt"
+	companyCache "hongze/hongze_yb/cache/company"
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/models/response"
 	"hongze/hongze_yb/models/tables/admin"
 	"hongze/hongze_yb/models/tables/chart_permission"
 	"hongze/hongze_yb/models/tables/company"
@@ -10,7 +14,10 @@ import (
 	"hongze/hongze_yb/models/tables/company_user_chart_classify_permission"
 	"hongze/hongze_yb/models/tables/wx_user"
 	"hongze/hongze_yb/models/tables/yb_apply_record"
+	"hongze/hongze_yb/services/user"
 	"hongze/hongze_yb/utils"
+	"sort"
+	"strings"
 	"time"
 )
 
@@ -36,6 +43,22 @@ func GetValidPermissionByCompany2ProductId(companyId, productId int64) (list []*
 	return
 }
 
+// GetPurchasePermissionIdsByCompany2ProductId 根据客户id和产品id获取有效的权限id集合
+func GetPurchasePermissionIdsByCompany2ProductId(companyId, productId int64) (permissionIds []int, err error) {
+	where := make(map[string]interface{})
+	where["company_id ="] = companyId
+	where["product_id ="] = productId
+	where["status in"] = []string{"正式", "永续"}
+	list, err := company_report_permission.GetByWhereMap(where)
+	if err != nil {
+		return
+	}
+	for _, v := range list {
+		permissionIds = append(permissionIds, v.ChartPermissionID)
+	}
+	return
+}
+
 // GetValidPermissionIdListByCompany2ProductId 根据客户id和产品id获取有效的权限id列表
 func GetValidPermissionIdListByCompany2ProductId(companyId, productId int64) (list []int, err error) {
 	companyReportPermissionList, err := GetValidPermissionByCompany2ProductId(companyId, productId)
@@ -130,7 +153,7 @@ func CheckPermissionByPermissionIdList2Ficc(companyId int64, userId int, permiss
 			ok, _ = checkPermissionByPermissionIdList2Rai(companyId, userId, permissionIdList)
 		}
 		if ok == false && permissionCheckInfo.Type == "apply" {
-			_, err = yb_apply_record.GetLastNotOpRecordByUserId(userId)	// 从来源我的/活动申请的记录
+			_, err = yb_apply_record.GetLastNotOpRecordByUserId(userId) // 从来源我的/活动申请的记录
 			if err != nil && err != utils.ErrNoRow {
 				return
 			}
@@ -249,6 +272,129 @@ func CheckPermissionByPermissionIdList2Ficc(companyId int64, userId int, permiss
 	return
 }
 
+func GetCheckPermission(companyId int64, userId int, permissionIdList []int) (ok bool, permissionCheckInfo response.PermissionCheckInfo, finalValidPermissionIds []int, err error) {
+	defer func() {
+		// 如果无权限,那么就去查询是否申请过
+		if ok == false {
+			ok, _ = checkPermissionByPermissionIdList2Rai(companyId, userId, permissionIdList)
+		}
+		if ok == false && permissionCheckInfo.Type == "apply" {
+			_, err = yb_apply_record.GetLastNotOpRecordByUserId(userId) // 从来源我的/活动申请的记录
+			if err != nil {
+				if err == utils.ErrNoRow {
+					err = nil
+				}
+				return
+			}
+			//查询是否有申请过,如果有申请过的话,那么err是nil
+			if err == nil {
+				permissionCheckInfo.CustomerInfo.HasApply = true
+			}
+		}
+	}()
+	permissionCheckInfo.HzPhone = utils.HZPHONE
+	//非潜在客户
+	permissionMap := make(map[int]bool)
+	if len(permissionIdList) > 0 {
+		for _, permissionId := range permissionIdList {
+			permissionMap[permissionId] = true
+		}
+	}
+
+	var productId int64
+	productId = 1
+	if companyId > 1 {
+		//查询是否 开通ficc的客户
+		companyProductInfo, tmpErr := company_product.GetByCompany2ProductId(companyId, productId)
+		if tmpErr != nil {
+			// 没有开通ficc的客户
+			if tmpErr == utils.ErrNoRow {
+				permissionCheckInfo.Type = "apply"
+				return
+			}
+			err = tmpErr
+			return
+		}
+
+		wxUser, tmpErr := wx_user.GetByUserId(userId)
+		if tmpErr != nil {
+			permissionCheckInfo.Type = "apply"
+			err = tmpErr
+			return
+		}
+
+		//客户信息
+		companyInfo, tmpErr := companyCache.GetByCompanyId(companyId)
+		if tmpErr != nil {
+			// 没有开通ficc的客户
+			if tmpErr == utils.ErrNoRow {
+				permissionCheckInfo.Type = "apply"
+				return
+			}
+			err = tmpErr
+			return
+		}
+		customerInfo := response.CustomerInfo{
+			CompanyName: companyInfo.CompanyName,
+			Status:      companyProductInfo.Status,
+			Name:        wxUser.RealName,
+			IsSuspend:   companyProductInfo.IsSuspend,
+			Mobile:      wxUser.Mobile,
+		}
+		permissionCheckInfo.CustomerInfo = customerInfo
+
+		// 如果客户ficc产品的状态是流失,那么也是让去申请
+		if companyProductInfo.Status == "流失" {
+			permissionCheckInfo.Type = "apply"
+			return
+		}
+
+		//查找对应客户的销售信息
+		adminInfo, tmpErr := admin.GetByAdminId(companyProductInfo.SellerID)
+		if tmpErr != nil {
+			//if tmpErr ==
+			err = tmpErr
+			return
+		}
+
+		permissionCheckInfo.Name = adminInfo.RealName
+		permissionCheckInfo.Mobile = adminInfo.Mobile
+		if companyProductInfo.Status == "冻结" {
+			permissionCheckInfo.Type = "contact"
+			return
+		}
+
+		//客户状态是:试用暂停状态(联系销售)
+		if companyProductInfo.Status == "试用" && companyProductInfo.IsSuspend == 1 {
+			permissionCheckInfo.Type = "contact"
+			return
+		}
+
+		// 获取有效的权限id列表
+		validPermissionIdList, tmpErr := GetValidPermissionIdListByCompany2ProductId(companyId, productId)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		// 校验在有效的权限id列表中是否存在该权限
+		if len(permissionIdList) > 0 {
+			for _, validPermissionId := range validPermissionIdList {
+				//如果有该权限id,那么直接返回校验通过
+				if _, validOk := permissionMap[validPermissionId]; validOk {
+					finalValidPermissionIds = append(finalValidPermissionIds, validPermissionId)
+					ok = true
+				}
+			}
+			return
+		}
+
+		permissionCheckInfo.Type = "contact"
+	} else {
+		permissionCheckInfo.Type = "apply"
+	}
+	return
+}
+
 // checkPermissionByPermissionIdList2Rai 根据权限id集合权限校验(权益)
 func checkPermissionByPermissionIdList2Rai(companyId int64, userId int, permissionIdList []int) (ok bool, err error) {
 	//非潜在客户
@@ -304,10 +450,10 @@ func checkPermissionByPermissionIdList2Rai(companyId int64, userId int, permissi
 
 // ChartPermissionCheckInfo 图表权限验证信息
 type ChartPermissionCheckInfo struct {
-	Name         	string       	`json:"name" description:"销售名称"`
-	Mobile       	string       	`json:"mobile" description:"手机号"`
-	Type			string			`json:"type" description:"无权限,需要前端处理的类型,枚举值:expired, apply, contact"`
-	CustomerInfo	CustomerInfo 	`json:"customer_info" description:"客户信息"`
+	Name         string       `json:"name" description:"销售名称"`
+	Mobile       string       `json:"mobile" description:"手机号"`
+	Type         string       `json:"type" description:"无权限,需要前端处理的类型,枚举值:expired, apply, contact"`
+	CustomerInfo CustomerInfo `json:"customer_info" description:"客户信息"`
 }
 
 // CheckUserChartPermission 验证用户/联系人的图库权限
@@ -315,7 +461,7 @@ func CheckUserChartPermission(companyId int64, userId int) (ok bool, permissionC
 	defer func() {
 		// 如果无权限,那么就去查询是否申请过
 		if ok == false && permissionCheckInfo.Type == "apply" {
-			_, err = yb_apply_record.GetLastNotOpRecordByUserId(userId)	// 图库申请
+			_, err = yb_apply_record.GetLastNotOpRecordByUserId(userId) // 图库申请
 			// 查询是否有申请过,如果有申请过的话,那么err是nil
 			if err != nil {
 				if err == utils.ErrNoRow {
@@ -416,7 +562,7 @@ func CheckUserChartPermission(companyId int64, userId int) (ok bool, permissionC
 			permissionCheckInfo.Type = "contact"
 			return
 		}
-		endTime := permissionInfo.EndTime.Add(23 * time.Hour + 59 * time.Minute + 59 * time.Second)
+		endTime := permissionInfo.EndTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second)
 		if nowTime.After(permissionInfo.StartTime) && nowTime.Before(endTime) {
 			ok = true
 		} else {
@@ -432,4 +578,156 @@ func CheckUserChartPermission(companyId int64, userId int) (ok bool, permissionC
 	}
 
 	return
-}
+}
+
+type FiccPermissionList struct {
+	ClassifyName  string            `description:"分类"`
+	HasPermission bool              `description:"是否有权限"`
+	Items         []*PermissionItem `description:"子类"`
+}
+
+type PermissionItem struct {
+	PermissionId   int    `description:"权限id"`
+	PermissionName string `description:"权限名称"`
+	HasPermission  bool   `description:"是否有权限"`
+}
+
+func GetHomeFiccPermissions(user user.UserInfo) (ret response.PermissionFiccResp, err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("GetHomeFiccPermissions: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg))
+		}
+	}()
+	validPermissionList, err := GetValidPermissionByCompany2ProductId(user.CompanyID, 1)
+	if err != nil {
+		return
+	}
+	var validPermissionIds []int
+	for _, item := range validPermissionList {
+		validPermissionIds = append(validPermissionIds, item.ChartPermissionID)
+	}
+	permissionList, err := chart_permission.GetFiccListExceptTacticByProductId()
+	if err != nil {
+		return
+	}
+	permissionMap := make(map[uint64]bool)
+	permissionFirstMap := make(map[string]*response.PermissionFirstItem)
+	permissionFirstMap["宏观经济"] = &response.PermissionFirstItem{
+		Sort: 1001,
+	}
+	permissionFirstMap["化工产业"] = &response.PermissionFirstItem{
+		Sort: 1002,
+	}
+	permissionFirstMap["黑色产业"] = &response.PermissionFirstItem{
+		Sort: 1003,
+	}
+	permissionFirstMap["有色产业"] = &response.PermissionFirstItem{
+		Sort: 1004,
+	}
+
+	for k, v := range permissionList {
+		permissionMap[v.ChartPermissionID] = false
+		for _, myPerId := range validPermissionIds {
+			if int(v.ChartPermissionID) == myPerId {
+				permissionMap[v.ChartPermissionID] = true
+				permissionList[k].Sort = v.Sort - 1000
+				if _, ok := permissionFirstMap[v.ClassifyName]; ok && !permissionFirstMap[v.ClassifyName].IsCheck {
+					permissionFirstMap[v.ClassifyName].AuthOk = true
+					permissionFirstMap[v.ClassifyName].Sort -= 1000
+					permissionFirstMap[v.ClassifyName].IsCheck = true
+				}
+				break
+			}
+		}
+	}
+
+	for _, v := range permissionList {
+		temp := new(response.PermissionFiccSecondItem)
+		temp.Sort = v.Sort
+		temp.ChartPermissionID = int(v.ChartPermissionID)
+		temp.ChartPermissionName = v.PermissionName
+		temp.AuthOk = permissionMap[v.ChartPermissionID]
+		if _, ok := permissionFirstMap[v.ClassifyName]; ok {
+			permissionFirstMap[v.ClassifyName].List = append(permissionFirstMap[v.ClassifyName].List, temp)
+		} else {
+			permissionFirstMap[v.ClassifyName] = &response.PermissionFirstItem{
+				List: []*response.PermissionFiccSecondItem{temp},
+			}
+		}
+	}
+
+	var list response.PermissionFiccList
+	for k, v := range permissionFirstMap {
+		temp := new(response.PermissionFiccItem)
+		temp.Sort = v.Sort
+		temp.ClassifyName = k
+		if strings.Contains(temp.ClassifyName, "宏观") {
+			temp.ClassifyName = "宏观经济"
+			temp.SelectIconUrl = utils.ALIYUN_YBIMG_HOST + "ficc_icon_idx_hongguan_select.png"
+			temp.IconUrl = utils.ALIYUN_YBIMG_HOST + "ficc_icon_idx_hongguan.png"
+		} else if temp.ClassifyName == "化工产业" {
+			temp.ClassifyName = "化工"
+			temp.SelectIconUrl = utils.ALIYUN_YBIMG_HOST + "ficc_icon_idx_huagong_select.png"
+			temp.IconUrl = utils.ALIYUN_YBIMG_HOST + "ficc_icon_idx_huagong.png"
+		} else if temp.ClassifyName == "黑色产业" {
+			temp.ClassifyName = "黑色"
+			temp.SelectIconUrl = utils.ALIYUN_YBIMG_HOST + "ficc_icon_idx_black_select.png"
+			temp.IconUrl = utils.ALIYUN_YBIMG_HOST + "ficc_icon_idx_black.png"
+		} else if temp.ClassifyName == "有色产业" {
+			temp.ClassifyName = "有色"
+			temp.SelectIconUrl = utils.ALIYUN_YBIMG_HOST + "ficc_icon_idx_youse_select.png"
+			temp.IconUrl = utils.ALIYUN_YBIMG_HOST + "ficc_icon_idx_youse.png"
+		}
+		if len(v.List) > 0 {
+			temp.List = v.List
+			sort.Sort(temp.List)
+		}
+		list = append(list, temp)
+	}
+
+	if len(list) > 0 {
+		sort.Sort(list)
+	}
+	//判断是否是已购用户,如果是已购用户,需要返回对应的联系人方式
+	companyProduct, err := company_product.GetByCompany2ProductId(user.CompanyID, 1)
+	if err != nil {
+		if err == utils.ErrNoRow {
+			err = nil
+		}
+	}
+
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("查询用户状态失败")
+		return
+	}
+	// 已购仅付费用户可见
+	var contactInfo response.PermissionCheckContactInfo
+	checkFlag := false
+	if companyProduct.Status != "" && strings.Contains("永续,正式", companyProduct.Status) {
+		//查询对应的销售
+		//查找对应客户的销售信息
+		adminInfo, tmpErr := admin.GetByAdminId(companyProduct.SellerID)
+		if tmpErr != nil {
+			errMsg = tmpErr.Error()
+			err = errors.New("查询销售信息出错")
+			return
+		}
+		contactInfo.Name = adminInfo.RealName
+		contactInfo.Mobile = adminInfo.Mobile
+		checkFlag = true
+	}
+
+	temp := new(response.PermissionFiccItem)
+	temp.SelectIconUrl = utils.ALIYUN_YBIMG_HOST + "ficc_icon_idx_more_select.png"
+	temp.IconUrl = utils.ALIYUN_YBIMG_HOST + "ficc_icon_idx_more.png"
+	temp.ClassifyName = "更多报告"
+	temp.Sort = 100000
+	list = append(list, temp)
+
+	ret.PermissionList = list
+	ret.CheckFlag = checkFlag
+	ret.ContactInfo = contactInfo
+	return
+}

+ 292 - 0
services/elastic/report.go

@@ -0,0 +1,292 @@
+package elastic
+
+import (
+	"context"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"github.com/olivere/elastic/v7"
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/utils"
+)
+
+// 首页搜索
+func SearchReport(keyWord string, classifyIdFirsts []int, classifyIdSeconds []int, pageIndex, pageSize int) (searchResp *elastic.SearchResult, total int64, err error) {
+	indexName := global.CONFIG.EsClient.Prefix+utils.ES_INDEX_RDDP_REPORT
+	var must  []map[string]interface{}
+
+	shouldSub := []map[string]interface{}{
+		map[string]interface{}{
+			"match": map[string]interface{}{
+				"Title": map[string]interface{}{
+					"query": keyWord,
+				//"minimum_should_match": "60%",
+					"boost": 3,
+				},
+			},
+		},
+		map[string]interface{}{
+			"match": map[string]interface{}{
+				"Categories": map[string]interface{}{
+					"query": keyWord,
+					//"minimum_should_match": "60%",
+					"boost": 2,
+				},
+			},
+		},
+		map[string]interface{}{
+			"match": map[string]interface{}{
+				"BodyContent": map[string]interface{}{
+					"query": keyWord,
+					//"minimum_should_match": "60%",
+					"boost": 1,
+				},
+			},
+		},
+		map[string]interface{}{
+			"match_phrase": map[string]interface{}{
+				"Title": map[string]interface{}{
+					"query": keyWord,
+					//"slop": "50",
+					"boost": 5,
+				},
+			},
+		},
+		map[string]interface{}{
+			"match_phrase": map[string]interface{}{
+				"Categories": map[string]interface{}{
+					"query": keyWord,
+					"boost": 4,
+				},
+			},
+		},
+		map[string]interface{}{
+			"match_phrase": map[string]interface{}{
+				"BodyContent": map[string]interface{}{
+					"query": keyWord,
+					"boost": 3,
+				},
+			},
+		},
+	}
+	mustMap := map[string]interface{}{
+		"bool": map[string]interface{}{
+			"should": shouldSub,
+		},
+	}
+	must = append(must, mustMap)
+	filterMust := []map[string]interface{}{
+		map[string]interface{}{
+			"term": map[string]interface{}{
+				"PublishState": 2,                     //必须是已发布的报告
+			},
+		},
+		map[string]interface{}{
+			"terms": map[string]interface{}{
+				"ClassifyIdFirst":classifyIdFirsts,     //分类必须是正常显示状态
+			},
+		},
+		map[string]interface{}{
+			"terms": map[string]interface{}{
+				"ClassifyIdSecond":classifyIdSeconds,     //分类必须是正常显示状态
+			},
+		},
+	}
+	filterMustNot := []map[string]interface{}{
+		map[string]interface{}{
+			"term": map[string]interface{}{
+				"BodyContent.keyword": map[string]interface{}{
+					"value": "",                     //过滤没有内容的报告(晨报和周报)bodyContent 不能为空
+				},
+			},
+		},
+	}
+	filterMap := map[string]interface{}{
+		"bool": map[string]interface{}{
+			"must": filterMust,
+			"must_not": filterMustNot,
+		},
+	}
+	source := map[string]interface{}{
+		"query": map[string]interface{}{
+			"bool": map[string]interface{}{
+				"must": must,
+				"filter": filterMap,
+			},
+		},
+	}
+	source["from"] = (pageIndex - 1) * pageSize
+	source["size"] = pageSize
+	source["highlight"] = map[string]interface{}{
+		"fields": map[string]interface{}{
+			"Title":map[string]interface{}{},
+			"Categories":map[string]interface{}{},
+			"BodyContent":map[string]interface{}{
+			//	"pre_tags" : "{{highlight}}",
+			//	"post_tags": "{{/highlight}}",
+			},
+		},
+		"pre_tags" : "<span style=\"color:#E3B377\">",
+		"post_tags": "</span>",
+	}
+
+	source["sort"] = []map[string]interface{}{
+		map[string]interface{}{
+			"_score":map[string]interface{}{
+				"order":"desc",
+			},
+		},
+		map[string]interface{}{
+			"PublishTime.keyword":map[string]interface{}{
+				"order":"desc",
+			},
+		},
+	}
+	jsonstr, err := json.Marshal(source)
+	fmt.Printf("%s",jsonstr)
+	request := global.EsClient.Search(indexName).Source(source) // sets the JSON request
+
+	searchResp, err = request.Do(context.Background())
+	if err != nil {
+		fmt.Print("结果err:")
+		fmt.Println(err.Error())
+		return
+	}
+
+	fmt.Print("结果正常:")
+	fmt.Println(searchResp.Status)
+	if searchResp.Status != 0 {
+		err = errors.New("查询失败")
+	}
+	total = searchResp.TotalHits()
+	return
+}
+
+// ReportListSearch 报告列表页的搜索
+func ReportListSearch(keyWord string, classifyIdFirst int, classifyIdSeconds []int, pageIndex, pageSize int) (searchResp *elastic.SearchResult, total int64, err error) {
+	indexName := global.CONFIG.EsClient.Prefix+utils.ES_INDEX_RDDP_REPORT
+	var must  []map[string]interface{}
+	shouldSub := []map[string]interface{}{
+		map[string]interface{}{
+			"match": map[string]interface{}{
+				"Title": map[string]interface{}{
+					"query": keyWord,
+					"boost": 3,
+				},
+			},
+		},
+		map[string]interface{}{
+			"match": map[string]interface{}{
+				"StageStr": map[string]interface{}{
+					"query": keyWord,
+					"boost": 2,
+				},
+			},
+		},
+		map[string]interface{}{
+			"match": map[string]interface{}{
+				"Abstract": map[string]interface{}{
+					"query": keyWord,
+					"boost": 2,
+				},
+			},
+		},
+		map[string]interface{}{
+			"match_phrase": map[string]interface{}{
+				"Title": map[string]interface{}{
+					"query": keyWord,
+					//"slop": "50",
+					"boost": 5,
+				},
+			},
+		},
+		map[string]interface{}{
+			"match_phrase": map[string]interface{}{
+				"Abstract": map[string]interface{}{
+					"query": keyWord,
+					//"slop": "50",
+					"boost": 5,
+				},
+			},
+		},
+	}
+	mustMap := map[string]interface{}{
+		"bool": map[string]interface{}{
+			"should": shouldSub,
+		},
+	}
+	must = append(must, mustMap)
+
+	filter := []map[string]interface{}{
+		map[string]interface{}{
+			"term": map[string]interface{}{
+				"PublishState": 2,
+			},
+		},
+		map[string]interface{}{
+			"term": map[string]interface{}{
+				"ReportChapterId":0,     //排除章节内容
+			},
+		},
+		map[string]interface{}{
+			"term": map[string]interface{}{
+				"ClassifyIdFirst":classifyIdFirst,
+			},
+		},
+		map[string]interface{}{
+			"terms": map[string]interface{}{
+				"ClassifyIdSecond": classifyIdSeconds,
+			},
+		},
+	}
+	source := map[string]interface{}{
+		"query": map[string]interface{}{
+			"bool": map[string]interface{}{
+				"must": must,
+				"filter": filter,
+			},
+		},
+	}
+
+	source["from"] = (pageIndex - 1) * pageSize
+	source["size"] = pageSize
+	source["highlight"] = map[string]interface{}{
+		"fields": map[string]interface{}{
+			"Title":map[string]interface{}{},
+			"Abstract":map[string]interface{}{},
+			"StageStr":map[string]interface{}{},
+		},
+		"pre_tags" : "<span style=\"color:#E3B377\">",
+		"post_tags": "</span>",
+	}
+
+	source["sort"] = []map[string]interface{}{
+		map[string]interface{}{
+			"_score":map[string]interface{}{
+				"order":"desc",
+			},
+		},
+		map[string]interface{}{
+			"PublishTime.keyword":map[string]interface{}{
+				"order":"desc",
+			},
+		},
+	}
+	jsonstr, err := json.Marshal(source)
+	fmt.Printf("%s",jsonstr)
+	request := global.EsClient.Search(indexName).Source(source) // sets the JSON request
+	searchResp, err = request.Do(context.Background())
+	if err != nil {
+		fmt.Print("结果err:")
+		fmt.Println(err.Error())
+		return
+	}
+
+	fmt.Print("结果正常:")
+	fmt.Println(searchResp.Status)
+	if searchResp.Status != 0 {
+		err = errors.New("查询失败")
+	}
+	total = searchResp.TotalHits()
+	return
+}

+ 75 - 0
services/purchase/purchase.go

@@ -0,0 +1,75 @@
+package purchase
+
+import (
+	"errors"
+	"hongze/hongze_yb/models/response/purchase"
+	activity2 "hongze/hongze_yb/services/activity"
+	"hongze/hongze_yb/services/company"
+	"hongze/hongze_yb/services/report"
+	"hongze/hongze_yb/services/user"
+	"sort"
+	"sync"
+)
+
+func GetLatestReportAndActivity(user user.UserInfo) (list purchase.PurchaseList, err error)  {
+	permissionIds, err := company.GetPurchasePermissionIdsByCompany2ProductId(user.CompanyID, 1)
+	if err != nil {
+		return
+	}
+	if len(permissionIds) == 0 {
+		err = errors.New("用户无权限")
+		return
+	}
+
+	w := sync.WaitGroup{}
+	//查找最新的报告
+	w.Add(1)
+	go func() {
+		defer w.Done()
+		list, err = report.GetLatestClassReport(permissionIds, user.UserID)
+	}()
+	//查找最新的活动
+	w.Add(1)
+	var purItem *purchase.PurchaseListItem
+	var err2 error
+	go func() {
+		defer w.Done()
+		purItem, err2 = activity2.GetLatestActivity(permissionIds, user.UserID)
+	}()
+	w.Wait()
+
+	if err != nil {
+		return
+	}
+	if err2 != nil {
+		err = err2
+		return
+	}
+
+	list = append(list, purItem)
+
+	if len(list) > 0 {
+		sort.Sort(list)
+	}
+	return
+}
+
+// GetDetail 已购详情页面
+func GetDetail(user user.UserInfo, classifyIdFirst int, activityId, pageIndex, pageSize int) (ret *purchase.DetailResp, err error)  {
+	permissionIds, err := company.GetPurchasePermissionIdsByCompany2ProductId(user.CompanyID, 1)
+	if err != nil {
+		return
+	}
+	if len(permissionIds) <= 0 {
+		err = errors.New("用户无权限")
+		return
+	}
+
+	if classifyIdFirst != 0 {
+		ret, err = report.GetPurchaseDetail(permissionIds, user.UserID, classifyIdFirst, pageIndex, pageSize)
+	}else if activityId > 0 {
+		ret, err = activity2.GetPurchaseDetail(permissionIds, user.UserID, pageIndex, pageSize)
+	}
+	return
+}
+

+ 392 - 0
services/report/classify.go

@@ -0,0 +1,392 @@
+package report
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/models/response"
+	"hongze/hongze_yb/models/tables/chart_permission_search_key_word_mapping"
+	"hongze/hongze_yb/models/tables/company_product"
+	"hongze/hongze_yb/models/tables/rddp/classify"
+	"hongze/hongze_yb/models/tables/rddp/report"
+	"hongze/hongze_yb/services/company"
+	"hongze/hongze_yb/services/user"
+	"hongze/hongze_yb/utils"
+	"sort"
+	"strings"
+)
+
+// GetClassListByClassifyId 专栏详情:查询二级分类列表
+func GetClassListByClassifyId(user user.UserInfo, classifyIdFirst int) (list []*response.ClassifyListItem, err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("GetClassListByClassifyName: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg))
+		}
+	}()
+
+	classifyInfo, err := classify.GetByClassifyId(classifyIdFirst)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("分类查询出错")
+		return
+	}
+
+	if classifyInfo.Id == 0 {
+		err = errors.New("分类不存在")
+		return
+	}
+
+	if classifyInfo.ParentId != 0 {
+		err = errors.New("不允许查询二级分类")
+		return
+	}
+
+	classifyList, err := classify.GetListByPid(classifyInfo.Id)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("二级分类查询出错")
+		return
+	}
+	var secondIds []int
+	for _, v := range classifyList {
+		secondIds = append(secondIds,v.Id)
+	}
+
+	//查询二级分类中最新的报告ID
+	reportList, err := report.GetLatestReportsByClassifyIdFirst(classifyIdFirst, secondIds)
+	if err != nil && err != utils.ErrNoRow {
+		errMsg = err.Error()
+		err = errors.New("报告查询出错")
+		return
+	}
+
+	reportMap := make(map[int]*report.Report)
+	for _, v := range reportList {
+		reportMap[v.ClassifyIdSecond] = v
+	}
+	for _, item := range classifyList {
+		temp := new(response.ClassifyListItem)
+		temp.ClassifyIdSecond = item.Id
+		temp.ParentId = item.ParentId
+		temp.AuthorDescript = item.AuthorDescript
+		temp.ReportAuthor = item.ReportAuthor
+		temp.HomeImgUrl = item.HomeImgUrl
+		temp.ClassifyNameSecond = item.ClassifyName
+		if classifyInfo.ClassifyName == "权益研报" {
+			temp.ProductName = "权益"
+		} else {
+			temp.ProductName = "FICC"
+		}
+		// 专栏下无报告则不展示
+		if _, ok := reportMap[item.Id]; ok {
+			list = append(list, temp)
+			temp.Stage = reportMap[item.Id].Stage
+		}
+	}
+	return
+}
+
+func GetClassifyDetail(user user.UserInfo, classifyIdSecond int) (detail *response.ClassifyDetail, err error)  {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("GetClassifyDetail: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg))
+		}
+	}()
+	classifyInfo, err := classify.GetByClassifyId(classifyIdSecond)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("分类查询出错")
+		return
+	}
+
+	if classifyInfo.Id == 0 {
+		err = errors.New("分类不存在")
+		return
+	}
+	if classifyInfo.ParentId == 0 {
+		err = errors.New("只允许查询二级分类")
+		return
+	}
+	//查询权限, 查询当前分类下的最新的报告,
+	permissionIds, err := chart_permission_search_key_word_mapping.GetChartPermissionIdsByKeyWord(classifyInfo.ClassifyName)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("分类权限查询出错")
+		return
+	}
+	authOk, permissionCheckInfo, _, err := company.GetCheckPermission(user.CompanyID, int(user.UserID), permissionIds)
+	if err != nil && err != utils.ErrNoRow {
+		errMsg = err.Error()
+		err = errors.New("权限查询出错")
+		return
+	}
+
+	detail = new(response.ClassifyDetail)
+	detail.ClassifyIdSecond = classifyInfo.Id
+	detail.ParentId = classifyInfo.ParentId
+	detail.AuthorDescript = classifyInfo.AuthorDescript
+	detail.ReportAuthor = classifyInfo.ReportAuthor
+	detail.AvatarImgUrl = classifyInfo.AvatarImgUrl
+	detail.ClassifyNameSecond = classifyInfo.ClassifyName
+	detail.Abstract = classifyInfo.Abstract
+	detail.Descript = classifyInfo.Descript
+	detail.VipTitle = classifyInfo.VipTitle
+	detail.PermissionCheck = &permissionCheckInfo
+	detail.AuthOk = authOk
+
+	return
+}
+
+// GetClassifyReportList 查询二级分类下的报告列表
+func GetClassifyReportList(user user.UserInfo, classifyIdSecond int, pageIndex, pageSize int) (list *response.ClassReportList, err error)  {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("GetClassifyDetail: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg))
+		}
+	}()
+
+	// 判断用户状态是否是正常和永续和试用
+	var productAuthOk bool
+	companyProduct, err := company_product.GetByCompany2ProductId(user.CompanyID, 1)
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("查询用户购买产品出错")
+		return
+	}
+	if companyProduct != nil {
+		// 无FICC权限的客户不可见
+		if companyProduct.CompanyProductID > 0 {
+			// 已购或者试用用户可见
+			if strings.Contains("永续,正式", companyProduct.Status) || (companyProduct.Status == "试用" && companyProduct.IsSuspend != 1) {
+				productAuthOk = true
+			}
+		}
+	}
+	classifyInfo, err := classify.GetByClassifyId(classifyIdSecond)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("分类查询出错")
+		return
+	}
+
+	if classifyInfo.Id == 0 {
+		err = errors.New("分类不存在")
+		return
+	}
+	if classifyInfo.ParentId == 0 {
+		err = errors.New("只允许查询二级分类")
+		return
+	}
+	//查询权限, 查询当前分类下的最新的报告,
+	var permissionIds []int
+	if productAuthOk {
+		permissionIds, err = chart_permission_search_key_word_mapping.GetChartPermissionIdsByKeyWord(classifyInfo.ClassifyName)
+		if err != nil {
+			errMsg = err.Error()
+			err = errors.New("分类权限查询出错")
+			return
+		}
+	}
+	authOk, permissionCheckInfo, _, err := company.GetCheckPermission(user.CompanyID, int(user.UserID), permissionIds)
+	if err != nil && err != utils.ErrNoRow {
+		errMsg = err.Error()
+		err = errors.New("权限查询出错")
+		return
+	}
+	//查询 report列表
+	offset := (pageIndex - 1) * pageSize
+	reportList, err := report.GetListByClassifyIdSecond(classifyIdSecond, offset, pageSize)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("查询报告列表出错")
+		return
+	}
+	total, err := report.GetListCountByClassifyIdSecond(classifyIdSecond)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("查询报告总数出错")
+		return
+	}
+
+	var newList []*response.ClassReportListItem
+	if len(reportList) > 0 {
+		for _, reportInfo := range reportList {
+			reportItem := new(response.ClassReportListItem)
+			reportItem.ReportId = reportInfo.Id
+			reportItem.Title = reportInfo.Title
+			reportItem.PublishTime = reportInfo.PublishTime
+			reportItem.ClassifyNameFirst = reportInfo.ClassifyNameFirst
+			reportItem.ClassifyIdFirst = reportInfo.ClassifyIdFirst
+			reportItem.ClassifyIdSecond = reportInfo.ClassifyIdSecond
+			reportItem.ClassifyNameSecond = reportInfo.ClassifyNameSecond
+			reportItem.Stage = reportInfo.Stage
+			reportItem.Abstract = reportInfo.Abstract
+			if reportInfo.Abstract != "" {
+				reportItem.Abstract = "<div style=\"overflow: hidden;white-space: nowrap;text-overflow: ellipsis;\">" +reportInfo.Abstract+"</div>"
+			}
+			reportItem.Author = reportInfo.Author
+			reportItem.ReportImgUrl = classifyInfo.ReportImgUrl
+			reportItem.VideoName = reportInfo.VideoName
+			reportItem.VideoPlaySeconds = reportInfo.VideoPlaySeconds
+			if  reportInfo.VideoUrl != "" && reportInfo.VideoName == "" {
+				reportItem.VideoName = reportInfo.Title
+			}
+			if authOk {
+				reportItem.VideoUrl = reportInfo.VideoUrl
+			}
+			newList = append(newList, reportItem)
+		}
+	}
+	list = new(response.ClassReportList)
+	list.Paging = response.GetPaging(pageIndex, pageSize, int(total))
+	list.List = newList
+	list.PermissionCheck = &permissionCheckInfo
+	list.AuthOk = authOk
+
+	return
+}
+
+// GetClassifySecondSimpleList 获取二级分类简写名称列表
+func GetClassifySecondSimpleList(user user.UserInfo, classifyIdFirst int) (list []*response.ClassifySimpleListItem, err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("GetClassifySecondSimpleList: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg))
+		}
+	}()
+
+	classifyParent, err := classify.GetByClassifyId(classifyIdFirst)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("分类查询出错")
+		return
+	}
+	if classifyParent.Id == 0 {
+		err = errors.New("该分类不存在")
+		return
+	}
+
+	simpleList, err := classify.GetListByPid(classifyIdFirst)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("二级分类查询出错")
+		return
+	}
+
+	if len(simpleList) > 0 {
+		for _, item := range simpleList {
+			if item.ClassifyName == classifyParent.ClassifyName && len(simpleList) == 1 {
+				break
+			}
+			temp := new(response.ClassifySimpleListItem)
+			temp.ClassifyIdSecond = item.Id
+			temp.ClassifyNameSecond = item.ClassifyName
+			if index := strings.Index(item.ClassifyName, "双周报"); index > 0{
+				temp.ClassifySecondNameSimple = item.ClassifyName[0 : index]
+			}else{
+				temp.ClassifySecondNameSimple = item.ClassifyName
+			}
+
+			list = append(list, temp)
+		}
+	}
+
+	return
+}
+
+
+// GetClassifyFirstList 获取一级分类列表
+func GetClassifyFirstList(user user.UserInfo) (list response.ClassifyFirstList, err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("GetClassifyFirstList: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg))
+		}
+	}()
+
+	classifyParents, err := classify.GetParentList()
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("分类查询出错")
+		return
+	}
+	if len(classifyParents) == 0 {
+		err = errors.New("分类不存在")
+		return
+	}
+
+	// 当前版本一级分类固定
+	classifyIconMap := map[string]string{
+		"晨报": utils.ALIYUN_YBIMG_HOST + "ficc_icon_day_128.png",
+		"周报": utils.ALIYUN_YBIMG_HOST + "ficc_icon_week_128.png",
+		"双周报": utils.ALIYUN_YBIMG_HOST + "ficc_icon_two_week_128.png",
+		"月报": utils.ALIYUN_YBIMG_HOST + "ficc_icon_month_128.png",
+		"草根调研": utils.ALIYUN_YBIMG_HOST + "ficc_icon_grassroots_128.png",
+		"需求报告": utils.ALIYUN_YBIMG_HOST + "ficc_icon_need_report_128.png",
+		"宏观报告": utils.ALIYUN_YBIMG_HOST + "ficc_icon_hongguan_128.png",
+		"日度点评": utils.ALIYUN_YBIMG_HOST + "ficc_icon_daily_comment_128.png",
+		"数据点评": utils.ALIYUN_YBIMG_HOST + "ficc_icon_data_128.png",
+		"碳市场价格周报": utils.ALIYUN_YBIMG_HOST + "ficc_icon_rcarbon_128.png",
+		"行业调研": utils.ALIYUN_YBIMG_HOST + "ficc_icon_research_128.png",
+		"海外视角": utils.ALIYUN_YBIMG_HOST + "ficc_icon_overseas_128.png",
+		"百家谈": utils.ALIYUN_YBIMG_HOST + "ficc_icon_family_128.png",
+		"会议纪要": utils.ALIYUN_YBIMG_HOST + "ficc_icon_meeting_128.png",
+		"大事点评":  utils.ALIYUN_YBIMG_HOST + "ficc_icon_big_thing_128.png",
+		"年报合集": utils.ALIYUN_YBIMG_HOST + "ficc_icon_year_collect_128.png",
+	}
+
+	classifySortMap := map[string]int{
+		"晨报": 1,
+		"周报": 2,
+		"双周报": 3,
+		"月报": 4,
+		"草根调研": 5,
+		"需求报告": 6,
+		"宏观报告": 7,
+		"日度点评": 8,
+		"数据点评": 9,
+		"碳市场价格周报": 10,
+		"行业调研": 11,
+		"海外视角": 12,
+		"百家谈": 13,
+		"会议纪要": 14,
+		"大事点评":  15,
+		"年报合集": 16,
+	}
+	for _, item := range classifyParents {
+		temp := new(response.ClassifyFirstListItem)
+		temp.ClassifyIdFirst = item.Id
+		temp.ClassifyNameFirst = item.ClassifyName
+		temp.IconImgUrl = classifyIconMap[item.ClassifyName]
+		temp.Sort = classifySortMap[item.ClassifyName]
+		if temp.Sort == 0 {
+			continue
+		}
+		// ShowType展示类型:1-列表 2-专栏; RedirectType跳转类型:1-专栏列表 2-报告列表 3-专栏详情
+		temp.RedirectType = 2
+		if item.ShowType == 2 {
+			temp.RedirectType = 1
+			classifyChild, _ := classify.GetChildByPid(item.Id)
+			if classifyChild != nil && len(classifyChild) == 1 {
+				// 存在二级分类且仅有一个时直接跳转专栏详情
+				temp.ClassifyIdSecond = classifyChild[0].Id
+				temp.ClassifyNameSecond = classifyChild[0].ClassifyName
+				temp.RedirectType = 3
+			}
+		}
+		list = append(list, temp)
+	}
+	if len(list) > 0 {
+		sort.Sort(list)
+	}
+
+	return
+}
+
+

+ 1102 - 0
services/report/report.go

@@ -0,0 +1,1102 @@
+package report
+
+import (
+	"encoding/json"
+	"errors"
+	"fmt"
+	report_chapter_type_cache "hongze/hongze_yb/cache/report_chapter_type"
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/models/response"
+	"hongze/hongze_yb/models/response/purchase"
+	"hongze/hongze_yb/models/tables/chart_permission"
+	"hongze/hongze_yb/models/tables/chart_permission_chapter_mapping"
+	"hongze/hongze_yb/models/tables/chart_permission_search_key_word_mapping"
+	"hongze/hongze_yb/models/tables/company_product"
+	"hongze/hongze_yb/models/tables/daily_base_column"
+	"hongze/hongze_yb/models/tables/rddp/classify"
+	"hongze/hongze_yb/models/tables/rddp/report"
+	"hongze/hongze_yb/models/tables/rddp/report_chapter"
+	"hongze/hongze_yb/models/tables/rddp/report_chapter_ticker"
+	"hongze/hongze_yb/models/tables/report_chapter_type"
+	"hongze/hongze_yb/models/tables/report_chapter_type_permission"
+	"hongze/hongze_yb/services/company"
+	elasticService "hongze/hongze_yb/services/elastic"
+	"hongze/hongze_yb/services/user"
+	"hongze/hongze_yb/task"
+	"hongze/hongze_yb/utils"
+	"html"
+	"sort"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// GetLatestClassReport 已购列表最新报告
+func GetLatestClassReport(permissionIds []int, userId uint64) (purchaseList []*purchase.PurchaseListItem, err error) {
+	var errMsg string
+	defer func() {
+		if sysErr := recover(); sysErr != nil {
+			err = errors.New("系统错误")
+			global.LOG.Critical(fmt.Sprintf("GetLatestClassReport: userId=%d, err:%s,sysErr:%s", userId, err.Error(), sysErr))
+		}
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("GetLatestClassReport: userId=%d, err:%s, errMsg:%s", userId, err.Error(), errMsg))
+		}
+	}()
+	//获取所有分类信息
+	classifys, err := classify.GetSimpleAll()
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("分类查询出错")
+		return
+	}
+	classifyFirstIconMap := make(map[int]string)
+	classifySecondNameMap := make(map[string]int)
+	classifyFirstIdMap := make(map[int]bool)
+	classifySecondIdMap := make(map[int]bool)
+	for _, v := range classifys {
+		if v.ParentId == 0 {
+			classifyFirstIdMap[v.Id] = true
+			classifyFirstIconMap[v.Id] = v.YbIconUrl
+		} else {
+			classifySecondIdMap[v.Id] = true
+			classifySecondNameMap[v.ClassifyName] = v.Id
+		}
+	}
+	//获取最新的晨报
+	dayReport, err := report.GetLatestDay()
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("晨报查询出错")
+		return
+	}
+	//获取最新的有权限的周报
+	//typeIds, err := report_chapter_type.GetEffectTypeID()
+	typeIds, err := report_chapter_type_cache.GetEffectTypeID()
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("晨报查询出错")
+		return
+	}
+	weekReport, err := GetLatestWeek(permissionIds, typeIds)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("周报查询出错")
+		return
+	}
+	// 有权限的二级分类
+	var reports []*report.Report
+	var classifyIdSeconds []int
+	classifyIdSecondMap := make(map[int]bool)
+	// 获取晨报和周报以外的其他报告
+	// 获取有权限的二级分类
+	chartPermissions, err := chart_permission_search_key_word_mapping.GetChartPermissionByFrom("rddp")
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("分类权限查询出错")
+		return
+	}
+	if len(chartPermissions) > 0 {
+		for _, v := range chartPermissions {
+			for _, myPerId := range permissionIds {
+				if v.ChartPermissionId == myPerId {
+					if classifyIdSecond, ok := classifySecondNameMap[v.KeyWord]; ok {
+						if _, ok2 := classifyIdSecondMap[classifyIdSecond]; !ok2 {
+							classifyIdSeconds = append(classifyIdSeconds, classifyIdSecond)
+							classifyIdSecondMap[classifyIdSecond] = true
+						}
+					}
+					break
+				}
+			}
+		}
+	}
+	reports, err = report.GetLatestClassReportsByClassifyIdSeconds(classifyIdSeconds)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("二级分类最新报告查询出错")
+		return
+	}
+	if dayReport.Id > 0 {
+		reports = append(reports, dayReport)
+	}
+	if weekReport != nil && weekReport.Id > 0 {
+		reports = append(reports, weekReport)
+	}
+	//获取未读数
+	unReadItem, tErr := GetUnRead(classifyIdSeconds, userId)
+	if tErr != nil {
+		err = tErr
+		return
+	}
+
+	if len(reports) > 0 {
+		otherLatestItem := new(purchase.PurchaseListItem)
+		// 处理其他报告()
+		for _, v := range reports {
+			temp := new(purchase.PurchaseListItem)
+			temp.ReportId = v.Id
+			temp.ClassifyIdFirst = v.ClassifyIdFirst
+			temp.ClassifyNameFirst = v.ClassifyNameFirst
+			temp.Stage = v.Stage
+			temp.Title = v.Title
+			temp.ClassifyIdSecond = v.ClassifyIdSecond
+			temp.ClassifyNameSecond = v.ClassifyNameSecond
+			temp.Time = v.PublishTime
+			if temp.ClassifyNameFirst == "大事点评" || temp.ClassifyNameFirst == "会议纪要" || temp.ClassifyNameFirst == "年报合集" {
+				if otherLatestItem.Time.Format(utils.FormatDateTime) > v.PublishTime.Format(utils.FormatDateTime) {
+					continue
+				}
+				temp.Unread = unReadItem["大事点评"] + unReadItem["会议纪要"] + unReadItem["年报合集"]
+				temp.Content = fmt.Sprintf("【第%d期|FICC】%s", temp.Stage, temp.ClassifyNameFirst)
+				temp.ImgUrl = "https://hzstatic.hzinsights.com/static/yb_wx/purchase_icon_other.png"
+				otherLatestItem = temp
+			}
+		}
+		for _, v := range reports {
+			if v.ClassifyNameFirst != "晨报" && v.ClassifyNameFirst != "周报" {
+				// 报告的分类不存在
+				if !classifyFirstIdMap[v.ClassifyIdFirst] || !classifyIdSecondMap[v.ClassifyIdSecond] {
+					continue
+				}
+			}
+			temp := new(purchase.PurchaseListItem)
+			temp.ReportId = v.Id
+			temp.ClassifyIdFirst = v.ClassifyIdFirst
+			temp.ClassifyNameFirst = v.ClassifyNameFirst
+			temp.Stage = v.Stage
+			temp.Title = v.Title
+			temp.ClassifyIdSecond = v.ClassifyIdSecond
+			temp.ClassifyNameSecond = v.ClassifyNameSecond
+			temp.Time = v.PublishTime
+			temp.Unread = unReadItem[temp.ClassifyNameFirst]
+			if imgUrl, ok := classifyFirstIconMap[temp.ClassifyIdFirst]; ok {
+				temp.ImgUrl = imgUrl
+			}
+			if temp.ClassifyNameFirst == "晨报" || temp.ClassifyNameFirst == "周报" { //晨报或者周报,查询最新的章节信息
+				temp.Content = fmt.Sprintf("【第%d期|FICC】%s", temp.Stage, temp.Title)
+			} else if temp.ClassifyNameFirst == "大事点评" || temp.ClassifyNameFirst == "会议纪要" || temp.ClassifyNameFirst == "年报合集" {
+				continue
+			} else {
+				if temp.ClassifyNameFirst != temp.ClassifyNameSecond { //包含二级分类
+					temp.Content = fmt.Sprintf("【第%d期|FICC| %s】%s", temp.Stage, temp.ClassifyNameSecond, temp.ClassifyNameFirst)
+				} else { //无二级分类
+					temp.Content = fmt.Sprintf("【第%d期|FICC】%s", temp.Stage, temp.ClassifyNameFirst)
+				}
+			}
+
+			purchaseList = append(purchaseList, temp)
+		}
+		if otherLatestItem.ReportId > 0 {
+			purchaseList = append(purchaseList, otherLatestItem)
+		}
+	}
+	return
+}
+
+// GetPurchaseDetail 已购详情页面
+func GetPurchaseDetail(permissionIds []int, userId uint64, classifyIdFirst int, pageIndex, pageSize int) (ret *purchase.DetailResp, err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("GetPurchaseDetail: userId=%d, err:%s, errMsg:%s", userId, err.Error(), errMsg))
+		}
+	}()
+	var reports []*report.Report
+	var weekReportIds []int
+
+	classifyInfo, err := classify.GetByClassifyId(classifyIdFirst)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("分类查询出错")
+		return
+	}
+
+	if classifyInfo.Id == 0 {
+		err = errors.New("分类不存在")
+		return
+	}
+
+	classifyNameFirst := classifyInfo.ClassifyName
+	offset := (pageIndex - 1) * pageSize
+	var total int64
+	var classifyIdSeconds []int
+
+	if classifyNameFirst == "晨报" {
+		//分类获取
+		reports, err = report.GetListByClassifyIdFirst(classifyIdFirst, offset, pageSize)
+		if err != nil {
+			errMsg = err.Error()
+			err = errors.New("晨报查询出错")
+			return
+		}
+		total, err = report.GetListCountByClassifyIdFirst(classifyIdFirst)
+		if err != nil {
+			errMsg = err.Error()
+			err = errors.New("查询报告总数出错")
+			return
+		}
+	} else {
+		if classifyNameFirst == "周报" {
+			newTypeIds, tErr := GetWeekTypeIdsByPermissionIds(permissionIds, []int{})
+			if tErr != nil {
+				return
+			}
+			weekReportIds, err = report_chapter.GetReportIdsByTypeIdsAndClass(newTypeIds, classifyNameFirst)
+			//分类获取
+			reports, err = report.GetListByIDsAndClassifyIdFirst(weekReportIds, classifyIdFirst, offset, pageSize)
+			if err != nil {
+				return
+			}
+			total, err = report.GetListCountByIDsAndClassifyIdFirst(weekReportIds, classifyIdFirst)
+			if err != nil {
+				errMsg = err.Error()
+				err = errors.New("查询报告总数出错")
+				return
+			}
+		} else {
+			//获取有权限的二级分类
+			var classifyNameSeconds []string
+			chartPermissions, tErr := chart_permission_search_key_word_mapping.GetChartPermissionByFrom("rddp")
+			if tErr != nil {
+				errMsg = tErr.Error()
+				err = errors.New("分类权限查询出错")
+				return
+			}
+			if len(chartPermissions) > 0 {
+				for _, v := range chartPermissions {
+					for _, myPerId := range permissionIds {
+						if v.ChartPermissionId == myPerId {
+							if classifyNameFirst == "大事点评" || classifyNameFirst == "会议纪要" || classifyNameFirst == "年报合集" {
+								if v.KeyWord == "大事点评" || v.KeyWord == "会议纪要" || v.KeyWord == "年报合集" { //筛选出用户有权限的二级分类ID
+									classifyNameSeconds = append(classifyNameSeconds, v.KeyWord)
+								}
+							} else {
+								classifyNameSeconds = append(classifyNameSeconds, v.KeyWord)
+							}
+							break
+						}
+					}
+				}
+			}
+			//获取所有二级分类的id
+			if classifyNameFirst == "大事点评" || classifyNameFirst == "会议纪要" || classifyNameFirst == "年报合集" {
+				classifyIdSeconds, tErr = classify.GetOtherSecondIds([]string{"大事点评", "会议纪要", "年报合集"})
+			} else {
+				classifyIdSeconds, tErr = classify.GetIdsByClassifyNameAndParentId(classifyNameSeconds, classifyIdFirst)
+			}
+
+			if tErr != nil {
+				errMsg = tErr.Error()
+				err = errors.New("二级分类查询出错")
+				return
+			}
+			if len(classifyIdSeconds) > 0 {
+				//分类获取
+				reports, err = report.GetListByClassifyIdSeconds(classifyIdSeconds, offset, pageSize)
+				if err != nil {
+					return
+				}
+				total, err = report.GetListCountByClassifyIdSeconds(classifyIdSeconds)
+				if err != nil {
+					errMsg = err.Error()
+					err = errors.New("查询报告总数出错")
+					return
+				}
+			}
+		}
+	}
+
+	var list []*purchase.Detail
+	ret = new(purchase.DetailResp)
+	if len(reports) > 0 {
+		var viewReportIds []int
+		for _, v := range reports {
+			viewReportIds = append(viewReportIds, v.Id)
+			temp := new(purchase.Detail)
+			temp.ReportId = v.Id
+			temp.ClassifyIdFirst = v.ClassifyIdFirst
+			temp.ClassifyNameFirst = v.ClassifyNameFirst
+			temp.Title = v.Title
+			temp.ClassifyIdSecond = v.ClassifyIdSecond
+			temp.ClassifyNameSecond = v.ClassifyNameSecond
+			temp.Stage = v.Stage
+			temp.ImgUrl = classifyInfo.YbBgUrl
+			if temp.ClassifyNameFirst == "晨报" || temp.ClassifyNameFirst == "周报" { //晨报或者周报,查询最新的章节信息
+				temp.Content = fmt.Sprintf("【第%d期|FICC】%s", temp.Stage, temp.Title)
+				temp.TopName = temp.Title
+			} else {
+				if temp.ClassifyNameFirst != temp.ClassifyNameSecond { //包含二级分类
+					temp.Content = fmt.Sprintf("【第%d期|FICC| %s】%s", temp.Stage, temp.ClassifyNameSecond, temp.ClassifyNameFirst)
+					temp.TopName = temp.ClassifyNameSecond
+				} else {
+					temp.Content = fmt.Sprintf("【第%d期|FICC】%s", temp.Stage, temp.ClassifyNameFirst)
+					temp.TopName = temp.ClassifyNameFirst
+				}
+			}
+			temp.Time = v.PublishTime
+			list = append(list, temp)
+		}
+	}
+	ret.List = list
+	ret.Paging = response.GetPaging(pageIndex, pageSize, int(total))
+	// 执行一个协程任务,新增用户浏览记录
+	//_, tErr := BatchInsertReportView(weekReportIds, userId, classifyNameFirst, classifyIdSeconds)
+	task.Task(BatchInsertReportView, weekReportIds, userId, classifyNameFirst, classifyIdSeconds)
+	/*if tErr != nil {
+		err = tErr
+		return
+	}*/
+	return
+}
+
+// 获取报告详情
+func GetReportDetail(userinfo user.UserInfo, reportId int) (reportDetail response.ReportDetail, err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("GetReportDetail: userId=%d, err:%s, errMsg:%s", userinfo.UserID, err.Error(), errMsg))
+		}
+	}()
+	// 判断用户状态是否是正常和永续
+	var productAuthOk bool
+	companyProduct, err := company_product.GetByCompany2ProductId(userinfo.CompanyID, 1)
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("查询用户购买产品出错")
+		return
+	}
+	if companyProduct != nil {
+		// 无FICC权限的客户不可见
+		if companyProduct.CompanyProductID > 0 {
+			// 已购或者试用用户可见
+			if strings.Contains("永续,正式", companyProduct.Status) || (companyProduct.Status == "试用" && companyProduct.IsSuspend != 1) {
+				productAuthOk = true
+			}
+		}
+	}
+	reportInfo, err := report.GetByReportId(reportId)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("报告查询出错")
+		return
+	}
+	if reportInfo.Id == 0 {
+		err = errors.New("报告不存在")
+		return
+	}
+
+	if reportInfo.State != 2 {
+		err = errors.New("报告未发布")
+		return
+	}
+
+	//判断权限
+
+	var authOk bool
+	var permissionCheckInfo response.PermissionCheckInfo
+	var vaildWeekTypeIds []int
+	if reportInfo.ClassifyNameFirst == "晨报" {
+		authOk, permissionCheckInfo, err = CheckDayReportPermission(userinfo, productAuthOk)
+	} else if reportInfo.ClassifyNameFirst == "周报" {
+		authOk, permissionCheckInfo, vaildWeekTypeIds, err = CheckWeekReportPermission(userinfo, productAuthOk)
+	} else {
+		authOk, permissionCheckInfo, err = CheckReportPermission(userinfo, reportId, productAuthOk)
+	}
+	if err != nil {
+		return
+	}
+
+	reportItem := new(response.ReportItem)
+	reportItem.ReportId = reportInfo.Id
+	reportItem.Title = reportInfo.Title
+	reportItem.PublishTime = reportInfo.PublishTime
+	reportItem.ClassifyNameFirst = reportInfo.ClassifyNameFirst
+	reportItem.ClassifyNameSecond = reportInfo.ClassifyNameSecond
+	reportItem.Stage = reportInfo.Stage
+	reportItem.Abstract = reportInfo.Abstract
+	reportItem.ContentSub = html.UnescapeString(reportInfo.ContentSub)
+	reportItem.Frequency = reportInfo.Frequency
+	reportItem.VideoName = reportInfo.VideoName
+	if reportInfo.VideoName == "" && reportInfo.VideoUrl != "" {
+		reportItem.VideoName = reportInfo.Title
+	}
+	reportItem.VideoPlaySeconds = reportInfo.VideoPlaySeconds
+	reportItem.Author = reportInfo.Author
+	var reportTypeList []*response.ReportChapterListItem
+
+	if reportInfo.ClassifyNameFirst == "晨报" || reportInfo.ClassifyNameFirst == "周报" {
+		//(晨报和周报的banner图)
+		if reportInfo.ClassifyNameFirst == "晨报" {
+			reportItem.BannerUrl = utils.ALIYUN_YBIMG_HOST + "report_banner_day.jpg"
+		} else {
+			reportItem.BannerUrl = utils.ALIYUN_YBIMG_HOST + "report_banner_week.jpg"
+		}
+		if authOk {
+			reportTypeList, err = GetChapterListByReport(reportInfo.ClassifyNameFirst, reportInfo.Id, vaildWeekTypeIds, reportInfo.CreateTime)
+			if err != nil {
+				return
+			}
+		}
+	}
+	//如果有权限则展示content
+	if authOk {
+		task.Task(AddViewRecord, userinfo, reportInfo.Id, reportInfo.ClassifyNameFirst, 0)
+		reportItem.Content = html.UnescapeString(reportInfo.Content)
+		reportItem.VideoUrl = reportInfo.VideoUrl
+	}
+	//新增用户访问日志
+	task.Task(AddUserAccessRecord, userinfo, reportInfo.Id, reportInfo.ClassifyNameFirst, 0, authOk)
+	reportDetail.ReportInfo = reportItem
+	reportDetail.ReportChapterList = reportTypeList
+	reportDetail.PermissionCheck = &permissionCheckInfo
+	reportDetail.AuthOk = authOk
+	return
+}
+
+// CheckReportPermission 验证用户查看报告的权限
+func CheckReportPermission(userInfo user.UserInfo, reportId int, productAuthOk bool) (authOk bool, permissionCheckInfo response.PermissionCheckInfo, err error) {
+	var permissionIds []int
+	if productAuthOk {
+		permissionIds, err = chart_permission_chapter_mapping.GetPermissionIdsByReportId(reportId, "rddp")
+		if err != nil && err != utils.ErrNoRow {
+			return
+		}
+	}
+	authOk, permissionCheckInfo, _, err = company.GetCheckPermission(userInfo.CompanyID, int(userInfo.UserID), permissionIds)
+	return
+}
+
+// GetReportList 获取报告列表
+func GetReportList(user user.UserInfo, keyWord string, classifyIdFirst, classifyIdSecond, pageIndex, pageSize int) (ret *response.ReportList, err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("GetReportList: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg))
+		}
+	}()
+
+	// 判断用户状态是否是正常和永续
+	var productAuthOk bool
+	companyProduct, err := company_product.GetByCompany2ProductId(user.CompanyID, 1)
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("查询用户购买产品出错")
+		return
+	}
+	if companyProduct != nil {
+		// 无FICC权限的客户不可见
+		if companyProduct.CompanyProductID > 0 {
+			// 已购或者试用用户可见
+			if strings.Contains("永续,正式", companyProduct.Status) || (companyProduct.Status == "试用" && companyProduct.IsSuspend != 1) {
+				productAuthOk = true
+			}
+		}
+	}
+
+	var condition string
+	pars := make([]interface{}, 0)
+
+	classifyParent, err := classify.GetByClassifyId(classifyIdFirst)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("分类查询出错")
+		return
+	}
+	if classifyParent.Id == 0 {
+		err = errors.New("该分类不存在")
+		return
+	}
+	condition = `classify_id_first = ? and state = 2`
+	pars = append(pars, classifyIdFirst)
+	permissionMap := make(map[string][]int)
+	checkPermissionMap := make(map[string]bool)
+	permissionImageMap := make(map[string]string)
+	chartPermissionImageMap := make(map[int]string)
+	var classifyIdSeconds []int
+	var reportImgUrl string
+
+	chartPermissionList, err := chart_permission.GetFiccListExceptTacticByProductId()
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("分类查询出错")
+		return
+	}
+
+	if len(chartPermissionList) > 0 {
+		for _, v := range chartPermissionList {
+			chartPermissionImageMap[int(v.ChartPermissionID)] = v.YbImgUrl
+		}
+	}
+
+	if classifyIdSecond > 0 && keyWord == "" {
+		classifyInfo, tErr := classify.GetByClassifyId(classifyIdSecond)
+		if tErr != nil {
+			errMsg = tErr.Error()
+			err = errors.New("分类查询出错")
+			return
+		}
+		if classifyInfo.Id == 0 {
+			err = errors.New("该二级分类不存在")
+			return
+		}
+
+		condition += " AND classify_id_second = ?"
+		pars = append(pars, classifyIdSecond)
+		//查询二级分类对应的权限
+		permissionIds, tErr := chart_permission_search_key_word_mapping.GetChartPermissionIdsByKeyWord(classifyInfo.ClassifyName)
+		if tErr != nil {
+			errMsg = tErr.Error()
+			err = errors.New("分类权限查询出错")
+			return
+		}
+		permissionMap[classifyInfo.ClassifyName] = permissionIds
+		if len(permissionIds) > 0 {
+			for _, v := range permissionIds {
+				reportImgUrl = chartPermissionImageMap[v]
+			}
+		}
+
+	} else {
+		if classifyParent.ClassifyName == "晨报" || classifyParent.ClassifyName == "周报" {
+			reportImgUrl = chartPermissionImageMap[1]
+			classifyIdSeconds = append(classifyIdSeconds, 0)
+		}
+
+		chartPermissions, tErr := chart_permission_search_key_word_mapping.GetChartPermissionByFrom("rddp")
+		if tErr != nil {
+			errMsg = tErr.Error()
+			err = errors.New("分类权限查询出错")
+			return
+		}
+
+		if len(chartPermissions) > 0 {
+			for _, v := range chartPermissions {
+				permissionMap[v.KeyWord] = append(permissionMap[v.KeyWord], v.ChartPermissionId)
+				permissionImageMap[v.KeyWord] = chartPermissionImageMap[v.ChartPermissionId]
+			}
+		}
+
+		//获取二级分类的所有头像
+		classifyList, tErr := classify.GetListByPid(classifyIdFirst)
+		if tErr != nil {
+			errMsg = tErr.Error()
+			err = errors.New("二级分类查询出错")
+			return
+		}
+
+		for _, v := range classifyList {
+			classifyIdSeconds = append(classifyIdSeconds, v.Id)
+		}
+
+		if len(classifyIdSeconds) == 0 && classifyParent.ClassifyName != "晨报" && classifyParent.ClassifyName != "周报" {
+			ret = new(response.ReportList)
+			ret.Paging = response.GetPaging(pageIndex, pageSize, 0)
+			return
+		}
+		condition += ` AND classify_id_second IN ? `
+		pars = append(pars, classifyIdSeconds)
+	}
+
+	// 获取有效的权限id列表
+	var validPermissionIdList []int
+	if productAuthOk {
+		validPermissionIdList, err = company.GetValidPermissionIdListByCompany2ProductId(user.CompanyID, 1)
+		if err != nil && err != utils.ErrNoRow {
+			errMsg = err.Error()
+			err = errors.New("查询分类出错")
+			return
+		}
+	}
+
+	if len(validPermissionIdList) > 0 {
+		for classifyName, perIds := range permissionMap {
+		checkLoop:
+			for _, checkId := range perIds {
+				for _, validPerid := range validPermissionIdList {
+					if checkId == validPerid {
+						checkPermissionMap[classifyName] = true
+						break checkLoop
+					}
+				}
+			}
+		}
+	}
+
+	var total int64
+	var list []*report.Report
+	if keyWord == "" {
+		offset := (pageIndex - 1) * pageSize
+		list, err = report.GetReportList(condition, pars, offset, pageSize)
+		if err != nil {
+			errMsg = err.Error()
+			err = errors.New("报告查询出错")
+			return
+		}
+		total, err = report.GetReportListCount(condition, pars)
+		if err != nil {
+			errMsg = err.Error()
+			err = errors.New("查询报告总数出错")
+			return
+		}
+	} else {
+		if classifyIdSecond > 0 {
+			classifyIdSeconds = append(classifyIdSeconds, classifyIdSecond)
+		}
+		if classifyParent.ClassifyName == "晨报" || classifyParent.ClassifyName == "周报" {
+			classifyIdSeconds = append(classifyIdSeconds, 0)
+		}
+		searchResp, total1, tErr := elasticService.ReportListSearch(keyWord, classifyIdFirst, classifyIdSeconds, pageIndex, pageSize)
+		if tErr != nil {
+			errMsg = tErr.Error()
+			err = errors.New("查询失败")
+			return
+		}
+		total = int64(total1)
+		if searchResp.Hits != nil && total > 0 {
+			var reportIds []int
+			for _, v := range searchResp.Hits.Hits {
+				temp := new(report.Report)
+				itemJson, tmpErr := v.Source.MarshalJSON()
+				if tmpErr != nil {
+					errMsg = tmpErr.Error()
+					err = errors.New("解析出错")
+					return
+				}
+				reportItem := new(response.EsReportItem)
+				tmpErr = json.Unmarshal(itemJson, &reportItem)
+				if tmpErr != nil {
+					errMsg = tmpErr.Error()
+					err = errors.New("解析json出错")
+					return
+				}
+				temp.Id = reportItem.ReportId
+				reportIds = append(reportIds, reportItem.ReportId)
+				temp.ClassifyIdFirst = reportItem.ClassifyIdFirst
+				temp.ClassifyNameFirst = reportItem.ClassifyNameFirst
+				temp.ClassifyIdSecond = reportItem.ClassifyIdSecond
+				temp.ClassifyNameSecond = reportItem.ClassifyNameSecond
+				temp.Abstract = reportItem.Abstract
+				temp.StageStr = reportItem.StageStr
+				temp.Title = reportItem.Title
+				temp.PublishTime, err = time.Parse("2006-01-02 15:04:05", reportItem.PublishTime)
+				if len(v.Highlight["Title"]) > 0 {
+					temp.Title = v.Highlight["Title"][0]
+				}
+				if len(v.Highlight["Abstract"]) > 0 {
+					temp.Abstract = v.Highlight["Abstract"][0]
+				}
+				if len(v.Highlight["StageStr"]) > 0 {
+					temp.StageStr = v.Highlight["StageStr"][0]
+				}
+				list = append(list, temp)
+			}
+			reportInfoList, tmpErr := report.GetByReportIds(reportIds)
+			if tmpErr != nil {
+				errMsg = tmpErr.Error()
+				err = errors.New("查询报告出错")
+				return
+			}
+			reportListMap := make(map[int]*report.Report)
+			for _, temp := range reportInfoList {
+				reportListMap[temp.Id] = temp
+			}
+			for k, reportDetail := range list {
+				if v, ok := reportListMap[reportDetail.Id]; ok {
+					list[k].CreateTime = v.CreateTime
+				}
+			}
+		}
+	}
+
+	var reportList []*response.ReportListItem
+	if len(list) > 0 {
+		var videoReportIds []int
+		videoMap := make(map[int][]*response.VideoListItem)
+		weekAuthMap := make(map[int]bool)
+		if classifyParent.ClassifyName == "晨报" && productAuthOk {
+			//获取晨报的音频列表
+			videoMap, _, errMsg, err = GetReportChapterVideoList(validPermissionIdList, classifyParent.ClassifyName, list)
+			if err != nil {
+				return
+			}
+		} else if classifyParent.ClassifyName == "周报" {
+			//查询所有权限typeID
+			//如果存在可以查看的章节ID
+			for _, reportInfo := range list {
+				videoReportIds = append(videoReportIds, reportInfo.Id)
+			}
+			// 判断周报权限\查询周报的音频列表
+			videoMap, weekAuthMap, errMsg, err = GetReportChapterVideoList(validPermissionIdList, classifyParent.ClassifyName, list)
+			if err != nil {
+				return
+			}
+		}
+		for _, reportInfo := range list {
+			reportItem := new(response.ReportListItem)
+			reportItem.ReportId = reportInfo.Id
+			reportItem.Title = reportInfo.Title
+			reportItem.PublishTime = reportInfo.PublishTime
+			reportItem.ClassifyNameFirst = reportInfo.ClassifyNameFirst
+			reportItem.ClassifyNameSecond = reportInfo.ClassifyNameSecond
+			reportItem.ClassifyIdFirst = reportInfo.ClassifyIdFirst
+			reportItem.ClassifyIdSecond = reportInfo.ClassifyIdSecond
+			reportItem.Stage = reportInfo.Stage
+			reportItem.Abstract = reportInfo.Abstract
+			if reportInfo.Abstract != "" {
+				reportItem.Abstract = "<div style=\"overflow: hidden;white-space: nowrap;text-overflow: ellipsis;\">" + reportInfo.Abstract + "</div>"
+			}
+			reportItem.Author = reportInfo.Author
+			stageStr := reportInfo.StageStr
+			if stageStr == "" {
+				stageStr = strconv.Itoa(reportInfo.Stage)
+			}
+			reportItem.TitleInfo = fmt.Sprintf("【第%s期|FICC|%s】", stageStr, reportItem.ClassifyNameSecond)
+			if reportInfo.ClassifyNameFirst == "晨报" || reportInfo.ClassifyNameFirst == "周报" || classifyIdSecond > 0 {
+				reportItem.ReportImgUrl = utils.ALIYUN_YBIMG_HOST + reportImgUrl
+				reportItem.TitleInfo = fmt.Sprintf("【第%s期|FICC|%s】", stageStr, reportItem.ClassifyNameFirst)
+			} else if url, ok := permissionImageMap[reportInfo.ClassifyNameSecond]; ok {
+				reportItem.ReportImgUrl = utils.ALIYUN_YBIMG_HOST + url
+			}
+
+			if classifyParent.ClassifyName == "晨报" && productAuthOk {
+				// 查询当前晨报的所有音频
+				if vList, ok := videoMap[reportInfo.Id]; ok {
+					reportItem.VideoList = vList
+				}
+				reportItem.AuthOk = productAuthOk
+			} else if classifyParent.ClassifyName == "周报" {
+				if wAuth, ok := weekAuthMap[reportInfo.Id]; ok {
+					reportItem.AuthOk = wAuth
+					if wAuth {
+						// 查询当前晨报的所有音频
+						if vList, ok2 := videoMap[reportInfo.Id]; ok2 {
+							reportItem.VideoList = vList
+						}
+					}
+				}
+			} else if authOk, ok := checkPermissionMap[reportInfo.ClassifyNameSecond]; ok && authOk {
+				if reportInfo.VideoUrl != "" {
+					videoTemp := new(response.VideoListItem)
+					videoTemp.VideoUrl = reportInfo.VideoUrl
+					videoTemp.VideoName = reportInfo.VideoName
+					if reportInfo.VideoName == "" {
+						videoTemp.VideoName = reportInfo.Title
+					}
+					videoTemp.VideoPlaySeconds = reportInfo.VideoPlaySeconds
+					reportItem.VideoList = append(reportItem.VideoList, videoTemp)
+				}
+				reportItem.AuthOk = authOk
+			}
+
+			reportList = append(reportList, reportItem)
+		}
+
+	}
+	ret = new(response.ReportList)
+	ret.List = reportList
+	ret.Paging = response.GetPaging(pageIndex, pageSize, int(total))
+	return
+}
+
+// GetCollectReportList 首页展示报告汇总列表
+func GetCollectReportList(user user.UserInfo, chartPermissionId, pageIndex, pageSize int) (ret *response.ReportCollectResp, err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("GetCollectReportList: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg))
+		}
+	}()
+
+	// 查询权限的基本信息
+	permissionInfo, err := chart_permission.GetByChartPermissionId(chartPermissionId)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("查询权限出错")
+		return
+	}
+
+	if permissionInfo.ChartPermissionID == 0 {
+		err = errors.New("权限不存在")
+		return
+	}
+	// 除了晨报和周报以外的其他报告
+	classifyNames, err := chart_permission_search_key_word_mapping.GetKeyWordsByChartPermissionId(chartPermissionId, "rddp")
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("查询权限对应的分类出错")
+		return
+	}
+
+	var classifySecondIds []int
+	if len(classifyNames) > 0 {
+		classifySecondIds, err = classify.GetSecondIdsByClassifyNames(classifyNames)
+		if err != nil {
+			errMsg = err.Error()
+			err = errors.New("查询分类出错")
+			return
+		}
+	}
+
+	// 查询晨报和周报相对应的章节ID
+	reportChapterTypeIds, err := report_chapter_type_permission.GetTypeIdsByChartPermissionId(chartPermissionId)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("查询权限对应的章节出错")
+		return
+	}
+
+	var reportList []*response.ReportCollectListItem
+	list := response.ReportCollectListResp{}
+	var total int64
+	if len(reportChapterTypeIds) > 0 || len(classifySecondIds) > 0 {
+		offset := (pageIndex - 1) * pageSize
+		reportList, err = report.GetReportCollectListByPermission(classifySecondIds, reportChapterTypeIds, offset, pageSize)
+		if err != nil {
+			errMsg = err.Error()
+			err = errors.New("查询报告信息出错")
+			return
+		}
+		listMap := make(map[string]*response.ReportCollectList)
+		for _, v := range reportList {
+			v.ContentSub = GetReportContentSub(v.ContentSub, true)
+			if _, ok := listMap[v.PublishTime.Format("2006-01-02")]; !ok {
+				temp := new(response.ReportCollectList)
+				temp.Date = v.PublishTime.Format("2006-01-02")
+				listMap[v.PublishTime.Format("2006-01-02")] = temp
+			}
+			listMap[v.PublishTime.Format("2006-01-02")].SubList = append(listMap[v.PublishTime.Format("2006-01-02")].SubList, v)
+		}
+		for _, v := range listMap {
+			list = append(list, v)
+		}
+		total, err = report.GetReportCollectCountByPermission(classifySecondIds, reportChapterTypeIds)
+		if err != nil {
+			errMsg = err.Error()
+			err = errors.New("查询报告总数出错")
+			return
+		}
+		if len(list) > 0 {
+			sort.Sort(list)
+		}
+	}
+
+	ret = new(response.ReportCollectResp)
+	ret.List = list
+	ret.Paging = response.GetPaging(pageIndex, pageSize, int(total))
+	return
+}
+
+func SearchReport(user user.UserInfo, keyWord string, pageIndex, pageSize int) (ret *response.ReportSearchResp, err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("SearchReport: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg))
+		}
+	}()
+	//查询正常状态的分类
+	classifys, err := classify.GetSimpleAll()
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("分类查询出错")
+		return
+	}
+	var classifyIdFirsts []int
+	classifyIdSeconds := []int{0}
+	for _, v := range classifys {
+		if v.ParentId == 0 {
+			classifyIdFirsts = append(classifyIdFirsts, v.Id)
+		} else {
+			classifyIdSeconds = append(classifyIdSeconds, v.Id)
+		}
+	}
+	keyWord = addAliasToKeyword(keyWord)
+	searchResp, total, err := elasticService.SearchReport(keyWord, classifyIdFirsts, classifyIdSeconds, pageIndex, pageSize)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("查询失败")
+		return
+	}
+	var reportList []*response.ReportCollectListItem
+	if searchResp.Hits != nil {
+		for _, v := range searchResp.Hits.Hits {
+			temp := new(response.ReportCollectListItem)
+			itemJson, tmpErr := v.Source.MarshalJSON()
+			if tmpErr != nil {
+				errMsg = tmpErr.Error()
+				err = errors.New("解析出错")
+				return
+			}
+			reportItem := new(response.EsReportItem)
+			tmpErr = json.Unmarshal(itemJson, &reportItem)
+			if tmpErr != nil {
+				errMsg = tmpErr.Error()
+				err = errors.New("解析json出错")
+				return
+			}
+			temp.ReportId = reportItem.ReportId
+			temp.ReportChapterId = reportItem.ReportChapterId
+			temp.ClassifyIdFirst = reportItem.ClassifyIdFirst
+			temp.ClassifyNameFirst = reportItem.ClassifyNameFirst
+			temp.ClassifyIdSecond = reportItem.ClassifyIdSecond
+			temp.ClassifyNameSecond = reportItem.ClassifyNameSecond
+			temp.Title = reportItem.Title
+			temp.ContentSub = reportItem.BodyContent
+			temp.PublishTime, err = time.Parse("2006-01-02 15:04:05", reportItem.PublishTime)
+
+			if len(v.Highlight["Title"]) > 0 {
+				temp.Title = v.Highlight["Title"][0]
+			}
+			if len(v.Highlight["BodyContent"]) > 0 {
+				temp.ContentSub = v.Highlight["BodyContent"][0]
+			}
+			//if len(v.Highlight["Categories"]) > 0 {
+			//	if temp.ClassifyNameSecond != "" {
+			//		temp.ClassifyNameSecond = "<span style=\"color:#E3B377\">"+temp.ClassifyNameSecond+"</span>"
+			//	}
+			//	if temp.ClassifyNameFirst != "" {
+			//		temp.ClassifyNameFirst = "<span style=\"color:#E3B377\">"+temp.ClassifyNameFirst+"</span>"
+			//	}
+			//}
+			temp.ContentSub = GetReportContentSub(temp.ContentSub, false)
+			reportList = append(reportList, temp)
+		}
+	}
+	ret = new(response.ReportSearchResp)
+	ret.List = reportList
+	ret.Paging = response.GetPaging(pageIndex, pageSize, int(total))
+	return
+}
+
+// GetTickerData 获取指标数据
+func GetTickerData(user user.UserInfo, reportChapterId int) (ret *response.TickerData, err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("GetTickerData: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg))
+		}
+	}()
+
+	//查询章节类型
+	chapter, err := report_chapter.GetTypeIdById(reportChapterId)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("查询章节失败")
+		return
+	}
+
+	if chapter.ReportChapterId == 0 {
+		err = errors.New("章节不存在或者未发布")
+		return
+	}
+
+	tickers, err := report_chapter_ticker.GetTickerByChapterId(reportChapterId)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("查询章节指标失败")
+		return
+	}
+
+	var list []*response.TickerDataItem
+	if len(tickers) > 0 {
+		var tickerNames []string
+		for _, v := range tickers {
+			tickerNames = append(tickerNames, v.Ticker)
+		}
+		var dataList []*response.TickerDataItem
+		if chapter.TypeId == 17 {
+			dataList, err = daily_base_column.GetDataByBaseColumnTickers17(tickerNames)
+		} else {
+			dataList, err = daily_base_column.GetDataByBaseColumnTickers(tickerNames)
+		}
+
+		if err != nil {
+			errMsg = err.Error()
+			err = errors.New("查询指标数据失败")
+			return
+		}
+		chapterTypeInfo, tErr := report_chapter_type.GetTickerTitleByTypeId(chapter.TypeId)
+		if tErr != nil {
+			errMsg = tErr.Error()
+			err = errors.New("查询章节类型失败")
+			return
+		}
+		if len(dataList) >= 0 {
+			for _, v := range dataList {
+				temp := new(response.TickerDataItem)
+				temp.BaseColumnName = v.BaseColumnName
+				temp.Ticker = v.Ticker
+				temp.Date = v.Date
+				temp.TickerValue, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", v.TickerValue), 2)
+				temp.LastValue, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", v.LastValue), 2)
+				temp.MmValue, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", v.MmValue), 2)
+				temp.DdValue, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", v.DdValue), 2)
+				temp.WwValue, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", v.WwValue), 2)
+
+				list = append(list, temp)
+			}
+		}
+
+		tickerTitle := new(response.TickerTitleData)
+		tickerTitle.TickerTitle = chapterTypeInfo.TickerTitle
+		tickerTitle.ReportChapterTypeId = int(chapterTypeInfo.ReportChapterTypeId)
+		tickerTitle.ReportChapterTypeName = chapterTypeInfo.ReportChapterTypeName
+		tickerTitle.DataTableImage = fmt.Sprintf("http://hongze.oss-cn-shanghai.aliyuncs.com/data_table/%s.png", chapterTypeInfo.ReportChapterTypeKey)
+
+		ret = new(response.TickerData)
+		ret.List = list
+		ret.TickerTitle = tickerTitle
+	}
+	return
+}
+
+// GetReportContentSub 特殊处理contentSub
+func GetReportContentSub(content string, scapeFlag bool) (contentSub string) {
+	if scapeFlag {
+		content = html.UnescapeString(content)
+		content = utils.TrimHtml(content) //只展示纯文本
+	}
+	contentSub = "<div style=\"-webkit-line-clamp: 3;-webkit-box-orient: vertical;display: -webkit-box;overflow: hidden;text-overflow: ellipsis;\">" + content + "</div>"
+	return
+}
+
+// addAliasToKeyword 品种别名
+func addAliasToKeyword(keyword string) string {
+	if keyword == "" {
+		return ""
+	}
+	keywordArr := make([]string, 0)
+	keywordArr = append(keywordArr, keyword)
+	if strings.Contains(keyword, "沥青") || strings.Contains(keyword, "BU") {
+		keywordArr = append(keywordArr, "沥青", "BU")
+	}
+	if strings.Contains(keyword, "MEG") || strings.Contains(keyword, "EG") || strings.Contains(keyword, "乙二醇") {
+		keywordArr = append(keywordArr, "MEG", "EG", "乙二醇")
+	}
+	if strings.Contains(keyword, "聚酯") || strings.Contains(keyword, "长丝") || strings.Contains(keyword, "短纤") || strings.Contains(keyword, "瓶片") {
+		keywordArr = append(keywordArr, "聚酯", "长丝", "短纤", "瓶片")
+	}
+	if strings.Contains(keyword, "纯苯") || strings.Contains(keyword, "苯乙烯") || strings.Contains(keyword, "EB") {
+		keywordArr = append(keywordArr, "纯苯", "苯乙烯", "EB")
+	}
+	if strings.Contains(keyword, "甲醇") || strings.Contains(keyword, "MA") {
+		keywordArr = append(keywordArr, "甲醇", "MA")
+	}
+	if strings.Contains(keyword, "橡胶") || strings.Contains(keyword, "RU") {
+		keywordArr = append(keywordArr, "橡胶", "RU")
+	}
+	if strings.Contains(keyword, "聚乙烯") || strings.Contains(keyword, "PP") || strings.Contains(keyword, "PE") {
+		keywordArr = append(keywordArr, "聚乙烯", "PP", "PE")
+	}
+	if strings.Contains(keyword, "玻璃") || strings.Contains(keyword, "纯碱") || strings.Contains(keyword, "FG") || strings.Contains(keyword, "SA") {
+		keywordArr = append(keywordArr, "玻璃", "纯碱", "FG", "SA")
+	}
+	keyword = strings.Join(keywordArr, ",")
+	return keyword
+}

+ 427 - 0
services/report/report_chapter.go

@@ -0,0 +1,427 @@
+package report
+
+import (
+	"errors"
+	"fmt"
+	report_chapter_type_cache "hongze/hongze_yb/cache/report_chapter_type"
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/models/response"
+	"hongze/hongze_yb/models/tables/chart_permission_chapter_mapping"
+	"hongze/hongze_yb/models/tables/company_product"
+	"hongze/hongze_yb/models/tables/rddp/report"
+	"hongze/hongze_yb/models/tables/rddp/report_chapter"
+	"hongze/hongze_yb/models/tables/report_chapter_type"
+	"hongze/hongze_yb/services/company"
+	"hongze/hongze_yb/services/user"
+	"hongze/hongze_yb/task"
+	"hongze/hongze_yb/utils"
+	"html"
+	"sort"
+	"strings"
+	"time"
+)
+
+// GetReportTypeIdsByPermissionIds 获取所有和权限绑定的报告章节ID
+func GetReportTypeIdsByPermissionIds(permissionIds []int) (ids []int, err error)   {
+	ids, err = chart_permission_chapter_mapping.GetReportIdsByPermisssionIds(permissionIds, "week")
+	return
+}
+
+// GetLatestWeek 获取有权限的最新的周报
+func GetLatestWeek(permissionIds []int, typeIds []int) (reportInfo *report.Report, err error) {
+	newTypeIds, err := GetWeekTypeIdsByPermissionIds(permissionIds, typeIds)
+	chapters, err := report_chapter.GetLatestChaptersByTypeIdsAndClass(newTypeIds,"week")
+	if err != nil {
+		return
+	}
+	var reportIds []int
+	for _, v := range chapters {
+		reportIds = append(reportIds, v.ReportId)
+	}
+	reportInfo, err = report.GetLatestByReportIds(reportIds)
+	return
+}
+
+// GetWeekTypeIdsByPermissionIds 获取有权限的章节类型ID
+func GetWeekTypeIdsByPermissionIds(permissionIds []int, typeIds []int) (newTypeIds []int, err error)  {
+	ids, err := GetReportTypeIdsByPermissionIds(permissionIds)
+	if err != nil {
+		return
+	}
+	if len(typeIds) == 0 {
+		typeIds, err = report_chapter_type_cache.GetEffectTypeID()
+		if err != nil {
+			return
+		}
+	}
+	for _, v1 := range typeIds {
+		for _, v2 := range ids {
+			if v1 == v2 {
+				newTypeIds = append(newTypeIds, v2)
+			}
+		}
+	}
+	return
+}
+
+// GetChapterListByReport 根据报告获取章节列表
+func GetChapterListByReport(classifyNameFirst string, reportId int, validWeekTypeIds []int, reportCreateTime time.Time) (reportTypeList response.ReportChapterList, err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("GetChapterListByReport: err:%s, errMsg:%s", err.Error(), errMsg))
+		}
+	}()
+	//查询有效的章节
+	typeList, tErr := report_chapter_type.GetEffectTypes()
+	if tErr != nil {
+		errMsg = tErr.Error()
+		err = errors.New("章节类型查询出错")
+		return
+	}
+	if len(typeList) == 0 {
+		err = errors.New("无有效的章节")
+		return
+	}
+
+	typeMap := make(map[uint64]*report_chapter_type.ReportChapterType)
+	var typeIds []int
+	newTypeMap := make(map[int]bool)
+	for _, v := range typeList {
+		typeMap[v.ReportChapterTypeId] = v
+		typeIds = append(typeIds, int(v.ReportChapterTypeId))
+	}
+
+	if classifyNameFirst == "周报" {
+		for _, v := range validWeekTypeIds {
+			newTypeMap[v] = true
+		}
+	}
+	//获取所有当前研报的章节
+	chapterList, tErr := report_chapter.GetListByReportId(reportId, classifyNameFirst)
+	if tErr != nil && tErr != utils.ErrNoRow{
+		errMsg = err.Error()
+		err = errors.New("章节查询出错")
+		return
+	}
+	if len(chapterList) == 0 {
+		err = errors.New("无有效章节")
+		return
+	}
+
+	for _, item := range chapterList {
+		if typeItem, ok := typeMap[uint64(item.TypeId)]; ok {
+			// 如果是周报只展示有权限的章节
+			if  classifyNameFirst == "周报" {
+				if _, ok1 := newTypeMap[item.TypeId]; !ok1 {
+					continue
+				}
+			}
+			temp := new(response.ReportChapterListItem)
+			if reportCreateTime.Before(typeItem.PauseStartTime) || reportCreateTime.After(typeItem.PauseEndTime) {
+				temp.ReportChapterId = item.ReportChapterId
+				temp.TypeId = item.TypeId
+				temp.TypeName = item.TypeName
+				temp.Title = item.Title
+				temp.Trend = item.Trend
+				temp.ReportId = item.ReportId
+				temp.Sort = typeItem.Sort
+				temp.PublishTime = item.PublishTime
+				temp.ReportChapterTypeKey = typeItem.ReportChapterTypeKey
+				temp.ReportChapterTypeName = typeItem.ReportChapterTypeName
+				temp.ReportChapterTypeThumb = typeItem.YbIconUrl
+				reportTypeList = append(reportTypeList, temp)
+			}
+		}
+	}
+	if len(reportTypeList) > 0 {
+		sort.Sort(reportTypeList)
+	}
+	return
+}
+
+// GetChapterDetail 获取章节详情
+func GetChapterDetail(user user.UserInfo, reportChapterId int) (reportChapterDetail *response.ReportChapterDetail, err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("GetChapterDetail: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg))
+		}
+	}()
+
+	var authOk bool
+	var productAuthOk bool
+	var chapterAuthOk bool
+	var permissionCheckInfo response.PermissionCheckInfo
+	// 判断用户状态是否是正常和永续
+	companyProduct, err := company_product.GetByCompany2ProductId(user.CompanyID, 1)
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("查询用户购买产品出错")
+		return
+	}
+	if companyProduct != nil {
+		// 无FICC权限的客户不可见
+		if companyProduct.CompanyProductID > 0 {
+			// 已购或者试用用户可见
+			if strings.Contains("永续,正式", companyProduct.Status) || (companyProduct.Status == "试用" && companyProduct.IsSuspend != 1) {
+				productAuthOk = true
+			}
+		}
+	}
+
+	typeIds, err := report_chapter_type_cache.GetEffectTypeID()
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("章节类型查询出错")
+		return
+	}
+	if len(typeIds) == 0 {
+		err = errors.New("无有效的章节类型")
+		return
+	}
+	reportChapter, err := report_chapter.GetContentById(reportChapterId, typeIds)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("章节查询出错")
+		return
+	}
+
+	if reportChapter.ReportChapterId == 0 {
+		err = errors.New("章节不存在")
+		return
+	}
+
+	reportInfo, tErr := report.GetByReportId(reportChapter.ReportId)
+	if tErr != nil {
+		errMsg = err.Error()
+		err = errors.New("报告查询出错")
+		return
+	}
+	if reportInfo.Id == 0 {
+		err = errors.New("报告不存在")
+		return
+	}
+	if reportInfo.ClassifyNameFirst == "周报" && reportChapter.IsEdit != 1 {
+		err = errors.New("章节未编辑")
+		return
+	}
+	//判断权限 TODO 查询章节相关的报告的charPermissionId
+	var newTypeIds []int
+	if reportInfo.ClassifyNameFirst == "晨报"{
+		authOk, permissionCheckInfo, err = CheckDayReportPermission(user, productAuthOk)
+		if err != nil && err != utils.ErrNoRow {
+			errMsg = err.Error()
+			err = errors.New("权限查询出错")
+			return
+		}
+	}else if reportInfo.ClassifyNameFirst == "周报"{
+		authOk, permissionCheckInfo, newTypeIds, err = CheckWeekReportPermission(user, productAuthOk)
+		if err != nil && err != utils.ErrNoRow {
+			errMsg = err.Error()
+			err = errors.New("权限查询出错")
+			return
+		}
+		for _, v := range newTypeIds {
+			if v == reportChapter.TypeId {
+				chapterAuthOk = true
+			}
+		}
+		authOk = chapterAuthOk
+	}
+
+	var chapterMenu []*response.ReportChapterMenu
+	reportChapterItem := new(response.ReportChapterItem)
+	reportChapterItem.ReportChapterId = reportChapter.ReportChapterId
+	reportChapterItem.ReportId = reportChapter.ReportId
+
+	reportChapterItem.TypeId = reportChapter.TypeId
+	reportChapterItem.Title = reportChapter.Title
+	reportChapterItem.ReportId = reportChapter.ReportId
+	reportChapterItem.PublishTime = reportChapter.PublishTime
+	reportChapterItem.VideoPlaySeconds = reportChapter.VideoPlaySeconds
+	reportChapterItem.VideoName = reportChapter.VideoName
+	if reportChapter.VideoUrl != "" && reportChapter.VideoName == "" {
+		reportChapterItem.VideoName = reportChapter.Title
+	}
+	reportChapterItem.VideoSize = reportChapter.VideoSize
+	reportChapterItem.TypeName = reportChapter.TypeName
+	reportChapterItem.Author = reportChapter.Author
+	reportChapterItem.Stage = reportChapter.Stage
+	reportChapterItem.ClassifyNameFirst = reportChapter.ClassifyNameFirst
+	reportChapterItem.ClassifyIdFirst = reportChapter.ClassifyIdFirst
+	if authOk {
+		reportChapterItem.Content = html.UnescapeString(reportChapter.Content)
+		reportChapterItem.VideoUrl = reportChapter.VideoUrl
+		//底部菜单切换
+		if reportInfo.ClassifyNameFirst == "周报" {
+			chapterMenu, err = GetMenuChapter(reportInfo.Id, newTypeIds, reportInfo.ClassifyNameFirst, reportInfo.CreateTime)
+		}else{
+			chapterMenu, err = GetMenuChapter(reportInfo.Id, typeIds, reportInfo.ClassifyNameFirst, reportInfo.CreateTime)
+		}
+
+		task.Task(AddViewRecord, user, reportInfo.Id, reportInfo.ClassifyNameFirst, reportChapterId)
+	}else{
+		reportChapterItem.ContentSub = html.UnescapeString(reportChapter.ContentSub)
+	}
+	task.Task(AddUserAccessRecord, user, reportInfo.Id, reportInfo.ClassifyNameFirst, reportChapterId, authOk)
+	reportChapterDetail = new(response.ReportChapterDetail)
+	reportChapterDetail.ReportChapterItem = reportChapterItem
+	reportChapterDetail.PermissionCheck = &permissionCheckInfo
+	reportChapterDetail.ReportChapterMenuList = chapterMenu
+	reportChapterDetail.AuthOk = authOk
+	return
+}
+
+func GetMenuChapter(reportId int, typeIds []int, classifyNameFirst string, reportCreateTime time.Time) (reportTypeList response.ReportChapterMenuList, err error)  {
+	//查询有效的章节
+	typeList, tErr := report_chapter_type.GetEffectTypes()
+	if tErr != nil {
+		return
+	}
+	if len(typeList) == 0 {
+		err = errors.New("无有效的章节")
+		return
+	}
+
+	typeMap := make(map[uint64]*report_chapter_type.ReportChapterType)
+	for _, v := range typeList {
+		typeMap[v.ReportChapterTypeId] = v
+	}
+
+	//获取所有当前研报的章节
+	chapterList, tErr := report_chapter.GetListByReportIdTypeIds(reportId, typeIds, classifyNameFirst)
+	if tErr != nil && tErr != utils.ErrNoRow{
+		return
+	}
+	if len(chapterList) > 0 {
+		for _, item := range chapterList {
+			if typeItem, ok := typeMap[uint64(item.TypeId)]; ok {
+				if reportCreateTime.Before(typeItem.PauseStartTime) || reportCreateTime.After(typeItem.PauseEndTime) {
+					temp := new(response.ReportChapterMenu)
+					temp.ReportChapterId = item.ReportChapterId
+					temp.ReportId = item.ReportId
+					temp.ReportChapterTypeName = typeItem.ReportChapterTypeName
+					temp.ReportChapterTypeThumb = typeItem.YbBottomIcon
+					temp.Sort = typeItem.Sort
+					reportTypeList = append(reportTypeList, temp)
+				}
+			}
+		}
+	}
+	if len(reportTypeList) > 0{
+		sort.Sort(reportTypeList)
+	}
+	return
+}
+
+// CheckWeekReportPermission 验证周报的权限
+func CheckWeekReportPermission(userInfo user.UserInfo, productAuthOk bool) (authOk bool, permissionCheckInfo response.PermissionCheckInfo, validTypeIds []int,  err error) {
+	var permissionIds []int
+	var validPermissionIds []int    //最后允许显示的章节
+	if productAuthOk {
+		permissionIds, err = chart_permission_chapter_mapping.GetPermissionIdsByWeek()
+		if err != nil && err != utils.ErrNoRow {
+			return
+		}
+	}
+	authOk, permissionCheckInfo, validPermissionIds, err = company.GetCheckPermission(userInfo.CompanyID, int(userInfo.UserID), permissionIds)
+	if err != nil {
+		return
+	}
+	//返回可用的章节列表
+	if len(validPermissionIds) > 0 {
+		validTypeIds, err = chart_permission_chapter_mapping.GetReportIdsByPermisssionIds(validPermissionIds, "week")
+	}
+	return
+}
+
+// CheckDayReportPermission 验证晨报的权限
+func CheckDayReportPermission(userInfo user.UserInfo, productAuthOk bool) (authOk bool, permissionCheckInfo response.PermissionCheckInfo, err error) {
+	if productAuthOk {
+		authOk = true
+		return
+	}
+	authOk, permissionCheckInfo,_, err = company.GetCheckPermission(userInfo.CompanyID, int(userInfo.UserID), []int{})
+	return
+}
+
+
+// GetReportChapterVideoList 根据报告获取章节的音频列表
+func GetReportChapterVideoList(permissionIds []int, classifyName string, list []*report.Report) (videoMap map[int][]*response.VideoListItem, weekAuthMap map[int]bool, errMsg string, err error) {
+	videoMap = make(map[int][]*response.VideoListItem)
+	weekAuthMap = make(map[int]bool)
+	var reportIds []int
+	reportMap := make(map[int]*report.Report)
+	for _, reportInfo := range list {
+		reportMap[reportInfo.Id] = reportInfo
+		reportIds = append(reportIds, reportInfo.Id)
+	}
+	// 查询有效的章节
+	//查询有效的章节
+	typeList, tErr := report_chapter_type.GetEffectTypes()
+	if tErr != nil {
+		errMsg = tErr.Error()
+		err = errors.New("章节类型查询出错")
+		return
+	}
+	if len(typeList) == 0 {
+		err = errors.New("无有效的章节")
+		return
+	}
+
+	typeMap := make(map[int]*report_chapter_type.ReportChapterType)
+	var typeIds []int
+	for _, v := range typeList {
+		typeMap[int(v.ReportChapterTypeId)] = v
+		typeIds = append(typeIds, int(v.ReportChapterTypeId))
+	}
+
+	var chapters []*report_chapter.ReportChapter
+	if classifyName == "周报" {
+		// 查询用户有权限的章节ID
+		newTypeIds, tErr := GetWeekTypeIdsByPermissionIds(permissionIds, typeIds)
+		if tErr != nil {
+			errMsg = tErr.Error()
+			err = errors.New("查询章节类型权限出错")
+			return
+		}
+		// 查询章节列表
+		chapters, err = report_chapter.GetByTypeIdsAndReportIds(newTypeIds, reportIds, classifyName)
+	}else{
+		// 查询章节列表
+		chapters, err = report_chapter.GetByTypeIdsAndReportIds(typeIds, reportIds, classifyName)
+	}
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("查询章节出错")
+		return
+	}
+	for _, v := range chapters {
+		if classifyName == "周报" {
+			weekAuthMap[v.ReportId] = true
+		}
+		if temp, ok := typeMap[v.TypeId]; ok && v.VideoUrl != "" {
+			if reportDetail, ok1 := reportMap[v.ReportId]; ok1 {
+				reportDate := reportDetail.CreateTime
+				if reportDate.Before(temp.PauseStartTime) || reportDate.After(temp.PauseEndTime) {
+					videoItem := new(response.VideoListItem)
+					videoItem.VideoPlaySeconds = v.VideoPlaySeconds
+					videoItem.VideoName = v.VideoName
+					if v.VideoName == "" {
+						videoItem.VideoName = v.Title
+					}
+					videoItem.VideoUrl = v.VideoUrl
+					videoItem.Sort = v.Sort
+					videoMap[v.ReportId] = append(videoMap[v.ReportId], videoItem)
+				}
+			}
+
+		}
+	}
+
+	return
+}

+ 136 - 0
services/report/report_view_log.go

@@ -0,0 +1,136 @@
+package report
+
+import (
+	"fmt"
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/models/tables/rddp/report"
+	"hongze/hongze_yb/models/tables/rddp/report_view_log"
+	"time"
+)
+
+
+// GetUnRead 获取未读数
+func GetUnRead(classifyIdSeconds []int, userId uint64) (unReadItem map[string]int, err error) {
+	firstDay := "2022-01-01"
+	newReports, err := report.GetReportsByClassifyIdSecondsAndDate(classifyIdSeconds, firstDay)
+	if err != nil {
+		return
+	}
+	var newIds []int
+	reportMap := make(map[int]*report.UnReadItem)
+	if len(newReports) > 0 {
+		for _, v := range newReports {
+			newIds = append(newIds, v.Id)
+			temp := new(report.UnReadItem)
+			temp.ReportID = v.Id
+			temp.ClassifyNameFirst = v.ClassifyNameFirst
+			reportMap[v.Id] = temp
+		}
+
+		//获取用户的浏览记录
+		viewReportIds, tErr := report_view_log.GetByReportIdsAndUserIdAndTime(newIds, userId, firstDay)
+		if tErr != nil {
+			err = tErr
+			return
+		}
+
+		//过滤已经浏览过的报告ID
+		if len(viewReportIds) > 0 {
+			for _, item := range viewReportIds {
+				if _, ok := reportMap[item]; ok {
+					delete(reportMap, item)
+				}
+			}
+		}
+
+		unReadItem = make(map[string]int)
+		for _, v := range reportMap {
+			unReadItem[v.ClassifyNameFirst] += 1
+		}
+	}
+	return
+}
+
+// BatchInsertReportView 批量新增报告已读记录
+func BatchInsertReportView(params ...interface{}) {
+	var err error
+	userId   := params[1].(uint64)
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("Task BatchInsertReportView: userId=%d, err:%s, recover:%s", userId, err.Error(), recover()))
+		}
+	}()
+
+	weekReportIds := params[0]
+	classifyNameFirst := params[2]
+	classifyIdSeconds := params[3]
+
+	firstDay := "2022-01-01"
+	var newReports []*report.Report
+	pars := make([]interface{}, 0)
+
+	var condition string
+	// 特殊处理三种分类
+	if classifyNameFirst == "大事点评" || classifyNameFirst == "会议纪要" || classifyNameFirst == "年报合集"  {
+		condition = "state = 2 and publish_time > ? "
+		pars = append(pars, firstDay)
+	}else{
+		condition = "state = 2 and classify_name_first = ? and publish_time > ? "
+		pars = append(pars, classifyNameFirst, firstDay)
+	}
+
+	if classifyNameFirst == "晨报" {
+	} else if classifyNameFirst == "周报" {
+		condition += " and id in (?)"
+		pars = append(pars, weekReportIds)
+	} else {
+		condition += " and classify_id_second in (?)"
+		pars = append(pars, classifyIdSeconds)
+	}
+	newReports, err = report.GetReportListByCondition(condition, pars)
+
+	if err != nil {
+		return
+	}
+	var newIds []int
+	reportMap := make(map[int]int)
+	if len(newReports) > 0 {
+		for _, v := range newReports {
+			newIds = append(newIds, v.Id)
+			reportMap[v.Id] = v.Id
+		}
+		//获取用户的浏览记录
+		viewReportIds, tErr := report_view_log.GetByReportIdsAndUserIdAndTime(newIds, userId, firstDay)
+		if tErr != nil {
+			err = tErr
+			return
+		}
+
+		//过滤已经浏览过的报告ID
+		if len(viewReportIds) > 0 {
+			for _, item := range viewReportIds {
+				if _, ok := reportMap[item]; ok {
+					delete(reportMap, item)
+				}
+			}
+		}
+
+		var reportLogs []*report_view_log.ReportViewLog
+		for _, v := range reportMap{
+			temp := new(report_view_log.ReportViewLog)
+			temp.ReportId = v
+			temp.UserId = userId
+			temp.CreateTime = time.Now()
+			reportLogs = append(reportLogs, temp)
+		}
+		tErr = report_view_log.CreateInBatches(reportLogs)
+		if tErr != nil {
+			err = tErr
+			return
+		}
+		//num := len(reportLogs)
+	}
+	return
+}
+
+

+ 52 - 0
services/report/report_view_record.go

@@ -0,0 +1,52 @@
+package report
+
+import (
+	"errors"
+	"fmt"
+	companyCache "hongze/hongze_yb/cache/company"
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/models/tables/rddp/report_view_record"
+	"hongze/hongze_yb/services/user"
+	"time"
+)
+
+func AddViewRecord(params ...interface{}) {
+	var err error
+	userInter  := params[0]
+	userInfo, ok := (userInter).(user.UserInfo)
+	if !ok {
+		err = errors.New("格式换转失败")
+		return
+	}
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("Task BatchInsertReportView: userId=%d, err:%s", userInfo.UserID, err.Error()))
+		}
+	}()
+
+	reportId := params[1].(int)
+	classifyName := params[2]
+	reportChapterId := params[3].(int)
+	companyInfo, err := companyCache.GetByCompanyId(userInfo.CompanyID)
+	if err != nil {
+		return
+	}
+	record := new(report_view_record.ReportViewRecord)
+	record.UserId = int(userInfo.UserID)
+	record.ReportId = reportId
+	record.Mobile = userInfo.Mobile
+	record.Email = userInfo.Email
+	record.RealName = userInfo.RealName
+	record.CompanyName = companyInfo.CompanyName
+	record.CreateTime = time.Now()
+	if classifyName == "晨报" || classifyName == "周报" {
+		record.ReportChapterId = reportChapterId
+	}
+	err = report_view_record.Create(record)
+	if err != nil {
+		return
+	}
+	//修改联系人最后一次阅读报告时间
+	err = userInfo.WxUser.SetWxUserReportLastViewTime()
+	return
+}

+ 46 - 0
services/report/user_access_record.go

@@ -0,0 +1,46 @@
+package report
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/models/tables/user_access_record"
+	"hongze/hongze_yb/services/user"
+	"time"
+)
+
+// AddUserAccessRecord 新增报告浏览记录
+func AddUserAccessRecord(params ...interface{}){
+	var err error
+	userInter  := params[0]
+	userInfo, ok := (userInter).(user.UserInfo)
+	if !ok {
+		err = errors.New("格式换转失败")
+		return
+	}
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("Task AddUserAccessRecord: userId=%d, err:%s", userInfo.UserID, err.Error()))
+		}
+	}()
+	reportId := params[1].(int)
+	if reportId > 0 {
+		classifyName := params[2]
+		reportChapterId := params[3].(int)
+		authOk := params[4].(bool)
+		record := new(user_access_record.UserAccessRecord)
+		record.Uid = int(userInfo.UserID)
+		record.Token = userInfo.LoginToken
+		record.CreateTime = time.Now()
+		record.Remark = "2" //	无权限
+		if authOk {
+			record.Remark = "0"
+		}
+		record.ReportId = reportId
+		if classifyName == "晨报" || classifyName == "周报" {
+			record.ReportChapterId = reportChapterId
+		}
+		err = record.Create()
+	}
+	return
+}

+ 1 - 0
services/user/user.go

@@ -21,6 +21,7 @@ var ERR_USER_NOT_BIND = errors.New("用户没有绑定")
 type UserInfo struct {
 	wx_user.WxUser
 	RecordInfo *user_record.UserRecord
+	LoginToken string
 }
 
 // GetWxUserItemByOpenId 通过openid获取用户信息

+ 70 - 0
task/task.go

@@ -0,0 +1,70 @@
+package task
+
+import (
+	"fmt"
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/services"
+	"hongze/hongze_yb/utils"
+	"os"
+	"runtime"
+	"sync"
+	"time"
+)
+
+type TaskFunc func(params ...interface{})
+
+var taskList chan *Executor  //任务列表
+
+var once sync.Once
+func GetTaskList() chan *Executor {
+	once.Do(func() {
+		taskList = make(chan *Executor, 1000)
+	})
+	return taskList
+}
+
+type Executor struct {
+	f TaskFunc
+	params []interface{}
+}
+
+func (e *Executor) Exec()  {       //执行任务
+	go func() {
+		defer func() {
+			if err := recover(); err !=nil {
+				stack := ""
+				msg := fmt.Sprintf("当前进程pid:%d; 父进程ppid:%d", os.Getpid(), os.Getppid())
+				stack += msg + "</br>"
+				global.LOG.Critical(msg)
+				msg = fmt.Sprintf("The params data is %v", e.params)
+				stack += msg + "</br>"
+				global.LOG.Critical(msg)
+				msg = fmt.Sprintf("Handler crashed with error %v", err)
+				stack += msg + "</br>"
+				global.LOG.Critical(msg)
+				for i := 1; ; i++ {
+					_, file, line, ok := runtime.Caller(i)
+					if !ok {
+						break
+					}
+					global.LOG.Critical(fmt.Sprintf("%s:%d", file, line))
+					stack = stack + fmt.Sprintln(fmt.Sprintf("%s:%d</br>", file, line))
+				}
+				fmt.Println("stack:", stack)
+				go services.SendEmail(utils.APPNAME+"崩了"+time.Now().Format("2006-01-02 15:04:05"), stack, utils.EmailSendToUsers)
+			}
+		}()
+		//time.Sleep(60*time.Second)
+		//fmt.Println("i am here new")
+		e.f(e.params...)
+	}()
+
+}
+
+func NewExecutor(f TaskFunc, params []interface{}) *Executor {
+	return &Executor{f: f, params: params}
+}
+
+func Task(f TaskFunc, params ...interface{})  {
+	taskList <- NewExecutor(f, params)
+}

+ 1 - 1
utils/common.go

@@ -376,7 +376,7 @@ func TrimHtml(src string) string {
 	src = re.ReplaceAllStringFunc(src, strings.ToLower)
 
 	re, _ = regexp.Compile("\\<img[\\S\\s]+?\\>")
-	src = re.ReplaceAllString(src, "[图片]")
+	src = re.ReplaceAllString(src, "")
 
 	re, _ = regexp.Compile("class[\\S\\s]+?>")
 	src = re.ReplaceAllString(src, "")

+ 14 - 1
utils/constants.go

@@ -25,7 +25,7 @@ const (
 const (
 	APPNAME = "弘则研报"
 	//EmailSendToUsers = "glji@hzinsights.com;pyan@hzinsights.com;cxzhang@hzinsights.com"
-	EmailSendToUsers = "glji@hzinsights.com;pyan@hzinsights.com;hsun@hzinsights.com"
+	EmailSendToUsers = "glji@hzinsights.com;pyan@hzinsights.com;hsun@hzinsights.com;xyxie@hzinsights.com"
 )
 
 //聚合短信
@@ -74,6 +74,7 @@ const (
 
 const (
 	HZ_CHART_LIB_DETAIL = "HZ_CHART_LIB_DETAIL_"
+	HONGZEYB_ = "hongze_yb:"
 )
 
 //var (
@@ -99,13 +100,25 @@ const (
 	EDB_DATA_LIMIT = 10
 )
 
+
+var PermissionFiccClassifyArr = [...]string{"宏观经济", "化工产业", "黑色产业", "有色产业", "市场策略"}
+
 //缓存key
 const (
 	CACHE_KEY_USER_VIEW = "user_view_record" //用户阅读数据
 )
 
+// es相关
+const (
+	ES_INDEX_RDDP_REPORT = "research_report_v1"                //报告
+)
+
 //EDB_LIB
 var (
 	APP_EDB_LIB_NAME_EN = "hongze_edb_lib"
 	EDB_LIB_Md5_KEY     = "GuRaB6dY1bXOJcwG"
 )
+
+const ALIYUN_YBIMG_HOST = "https://hzstatic.hzinsights.com/static/yb_wx/"
+
+const HZPHONE = "057187186319"    //弘则电话