Przeglądaj źródła

指标库相关接口

hsun 1 rok temu
rodzic
commit
8ee0087c38
54 zmienionych plików z 16762 dodań i 31 usunięć
  1. 908 0
      controllers/data_manage/edb_classify.go
  2. 3838 1
      controllers/data_manage/edb_info.go
  3. 287 0
      controllers/data_manage/predict_edb_info.go
  4. 35 0
      controllers/sys_admin.go
  5. 321 0
      models/data_manage/base_from_baiinfo.go
  6. 161 0
      models/data_manage/base_from_eia_stero.go
  7. 93 0
      models/data_manage/base_from_national_statistics_data.go
  8. 260 0
      models/data_manage/base_from_national_statistics_index.go
  9. 321 0
      models/data_manage/base_from_sci.go
  10. 329 0
      models/data_manage/base_from_smm.go
  11. 690 0
      models/data_manage/base_from_trade_index.go
  12. 66 0
      models/data_manage/com_trade_index.go
  13. 185 1
      models/data_manage/edb_classify.go
  14. 99 0
      models/data_manage/edb_data_baiinfo.go
  15. 418 0
      models/data_manage/edb_data_cffex.go
  16. 298 0
      models/data_manage/edb_data_coal.go
  17. 419 0
      models/data_manage/edb_data_dl.go
  18. 66 0
      models/data_manage/edb_data_fubao.go
  19. 554 0
      models/data_manage/edb_data_gie.go
  20. 333 0
      models/data_manage/edb_data_gl.go
  21. 143 0
      models/data_manage/edb_data_insert_config.go
  22. 327 0
      models/data_manage/edb_data_lz.go
  23. 323 0
      models/data_manage/edb_data_manual.go
  24. 13 0
      models/data_manage/edb_data_mysteel_chemical.go
  25. 27 0
      models/data_manage/edb_data_pb.go
  26. 99 0
      models/data_manage/edb_data_sci.go
  27. 416 0
      models/data_manage/edb_data_sh.go
  28. 421 0
      models/data_manage/edb_data_shfe.go
  29. 25 0
      models/data_manage/edb_data_ths.go
  30. 65 0
      models/data_manage/edb_data_wind.go
  31. 548 0
      models/data_manage/edb_data_ys.go
  32. 421 0
      models/data_manage/edb_data_zz.go
  33. 4 2
      models/data_manage/edb_info.go
  34. 28 0
      models/data_manage/edb_info_log.go
  35. 31 0
      models/data_manage/edb_source.go
  36. 156 0
      models/data_manage/gl_data.go
  37. 103 0
      models/data_manage/lz_data.go
  38. 319 0
      models/data_manage/mysteel_chemical_index.go
  39. 8 0
      models/data_manage/request/edb_info.go
  40. 12 0
      models/data_manage/response/edb_info.go
  41. 42 2
      models/db.go
  42. 1444 0
      models/target.go
  43. 288 0
      routers/commentsRouter.go
  44. 3 1
      routers/router.go
  45. 65 1
      services/data/base_edb_lib.go
  46. 4 4
      services/data/chart_info.go
  47. 3 3
      services/data/correlation/chart_info.go
  48. 650 0
      services/data/edb_classify.go
  49. 407 0
      services/data/edb_data.go
  50. 656 2
      services/data/edb_info.go
  51. 3 3
      services/data/future_good/chart_info.go
  52. 2 2
      services/data/predict_edb_info.go
  53. 19 9
      services/elastic/elastic.go
  54. 6 0
      utils/constants.go

+ 908 - 0
controllers/data_manage/edb_classify.go

@@ -0,0 +1,908 @@
+package data_manage
+
+import (
+	"encoding/json"
+	"eta/eta_mobile/controllers"
+	"eta/eta_mobile/models"
+	"eta/eta_mobile/models/data_manage"
+	"eta/eta_mobile/models/system"
+	"eta/eta_mobile/services/data"
+	"eta/eta_mobile/utils"
+)
+
+// EdbClassifyController 数据管理-分类模块
+type EdbClassifyController struct {
+	controllers.BaseAuthController
+}
+
+// ListV2
+// @Title 分类列表
+// @Description 分类列表接口
+// @Success 200 {object} data_manage.EdbClassifyListResp
+// @router /classify/list [get]
+//func (this *EdbClassifyController) ListV2() {
+//	br := new(models.BaseResponse).Init()
+//	defer func() {
+//		this.Data["json"] = br
+//		this.ServeJSON()
+//	}()
+//	rootList, err := data_manage.GetEdbClassifyByParentId(0, 0)
+//	if err != nil && err.Error() != utils.ErrNoRow() {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+//		return
+//	}
+//	classifyAll, err := data_manage.GetEdbClassifyAll()
+//	if err != nil && err.Error() != utils.ErrNoRow() {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+//		return
+//	}
+//
+//	// 获取当前账号的不可见指标
+//	obj := data_manage.EdbInfoNoPermissionAdmin{}
+//	confList, err := obj.GetAllListByAdminId(this.SysUser.AdminId)
+//	if err != nil && err.Error() != utils.ErrNoRow() {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
+//		return
+//	}
+//	noPermissionEdbInfoIdMap := make(map[int]bool)
+//	for _, v := range confList {
+//		noPermissionEdbInfoIdMap[v.EdbInfoId] = true
+//	}
+//	allEdbInfo, err := data_manage.GetEdbInfoAll(utils.EDB_INFO_TYPE)
+//	if err != nil && err.Error() != utils.ErrNoRow() {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+//		return
+//	}
+//	edbInfoMap := make(map[int][]*data_manage.EdbClassifyItems)
+//	for _, v := range allEdbInfo {
+//		// 如果指标不可见,那么就不返回该指标
+//		if _, ok := noPermissionEdbInfoIdMap[v.EdbInfoId]; ok {
+//			continue
+//		}
+//		button := data.GetEdbOpButton(this.SysUser, v.SysUserId, v.EdbType, utils.EDB_INFO_TYPE)
+//		button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
+//		v.Button = button
+//		edbInfoMap[v.ClassifyId] = append(edbInfoMap[v.ClassifyId], v)
+//	}
+//	rootChildMap := make(map[int][]*data_manage.EdbClassifyItems)
+//	for _, v := range classifyAll {
+//		button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId)
+//		button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
+//		v.Button = button
+//
+//		rootChildMap[v.ParentId] = append(rootChildMap[v.ParentId], v)
+//		if existItems, ok := edbInfoMap[v.ClassifyId]; ok {
+//			v.Children = existItems
+//		} else {
+//			items := make([]*data_manage.EdbClassifyItems, 0)
+//			v.Children = items
+//		}
+//	}
+//	nodeAll := make([]*data_manage.EdbClassifyItems, 0)
+//	for _, v := range rootList {
+//		button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId)
+//		v.Button = button
+//
+//		if existItems, ok := rootChildMap[v.ClassifyId]; ok {
+//			v.Children = existItems
+//		} else {
+//			items := make([]*data_manage.EdbClassifyItems, 0)
+//			v.Children = items
+//		}
+//		nodeAll = append(nodeAll, v)
+//	}
+//	resp := new(data_manage.EdbClassifyListResp)
+//	resp.AllNodes = nodeAll
+//	resp.CanOpClassify = true
+//	br.Ret = 200
+//	br.Success = true
+//	br.Msg = "获取成功"
+//	br.Data = resp
+//}
+
+// @Title 获取所有分类接口-不包含指标
+// @Description 获取所有分类接口-不包含指标
+// @Success 200 {object} data_manage.EdbClassifyListResp
+// @router /classify/items [get]
+//func (this *EdbClassifyController) Items() {
+//	br := new(models.BaseResponse).Init()
+//	defer func() {
+//		this.Data["json"] = br
+//		this.ServeJSON()
+//	}()
+//	rootList, err := data_manage.GetEdbClassifyByParentId(0, 0)
+//	if err != nil {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+//		return
+//	}
+//
+//	classifyAll, err := data_manage.GetEdbClassifyAll()
+//	if err != nil {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+//		return
+//	}
+//
+//	nodeAll := make([]*data_manage.EdbClassifyItems, 0)
+//	for k := range rootList {
+//		rootNode := rootList[k]
+//		data.EdbClassifyItemsMakeTree(classifyAll, rootNode)
+//		nodeAll = append(nodeAll, rootNode)
+//	}
+//	resp := new(data_manage.EdbClassifyListResp)
+//	resp.AllNodes = nodeAll
+//	br.Ret = 200
+//	br.Success = true
+//	br.Msg = "获取成功"
+//	br.Data = resp
+//}
+
+// @Title 新增分类
+// @Description 新增分类接口
+// @Param	request	body data_manage.AddEdbClassifyReq true "type json string"
+// @Success 200 Ret=200 保存成功
+// @router /classify/add [post]
+func (this *EdbClassifyController) AddEdbClassify() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req data_manage.AddEdbClassifyReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.ClassifyName == "" {
+		br.Msg = "请输入分类名称"
+		br.IsSendEmail = false
+		return
+	}
+	if req.ParentId < 0 {
+		br.Msg = "参数错误"
+		br.IsSendEmail = false
+		return
+	}
+
+	//添加指标
+	_, err, errMsg := data.AddEdbClassify(req.ClassifyName, req.ParentId, req.Level, 0, this.SysUser.AdminId, this.SysUser.AdminName)
+	if errMsg != `` {
+		br.Msg = errMsg
+		br.ErrMsg = errMsg
+		if err != nil {
+			br.ErrMsg = errMsg + ";Err:" + err.Error()
+		} else {
+			br.IsSendEmail = false
+		}
+		return
+	}
+	//count, err := data_manage.GetEdbClassifyCount(req.ClassifyName, req.ParentId)
+	//if err != nil {
+	//	br.Msg = "判断名称是否已存在失败"
+	//	br.ErrMsg = "判断名称是否已存在失败,Err:" + err.Error()
+	//	return
+	//}
+	//if count > 0 {
+	//	br.Msg = "分类名称已存在,请重新输入"
+	//	br.IsSendEmail = false
+	//	return
+	//}
+	////获取该层级下最大的排序数
+	//maxSort, err := data_manage.GetEdbClassifyMaxSort(req.ParentId, req.ClassifyType)
+	//
+	//classify := new(data_manage.EdbClassify)
+	//classify.ClassifyType = req.ClassifyType
+	//classify.ParentId = req.ParentId
+	//classify.ClassifyName = req.ClassifyName
+	//classify.HasData = 0
+	//classify.CreateTime = time.Now()
+	//classify.ModifyTime = time.Now()
+	//classify.SysUserId = this.SysUser.AdminId
+	//classify.SysUserRealName = this.SysUser.RealName
+	//classify.Level = req.Level + 1
+	//timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+	//classify.UniqueCode = utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
+	//classify.Sort = maxSort
+	//
+	//_, err = data_manage.AddEdbClassify(classify)
+	//if err != nil {
+	//	br.Msg = "保存分类失败"
+	//	br.ErrMsg = "保存分类失败,Err:" + err.Error()
+	//	return
+	//}
+	br.Ret = 200
+	br.Msg = "保存成功"
+	br.Success = true
+	br.IsAddLog = true
+}
+
+// @Title 修改分类
+// @Description 修改分类接口
+// @Param	request	body data_manage.EditEdbClassifyReq true "type json string"
+// @Success 200 Ret=200 修改成功
+// @router /classify/edit [post]
+func (this *EdbClassifyController) EditEdbClassify() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req data_manage.EditEdbClassifyReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.ClassifyName == "" {
+		br.Msg = "请输入分类名称"
+		br.IsSendEmail = false
+		return
+	}
+
+	if req.ClassifyId < 0 {
+		br.Msg = "参数错误"
+		br.IsSendEmail = false
+		return
+	}
+
+	err, errMsg := data.EditEdbClassify(req.ClassifyId, req.ClassifyName, this.SysUser)
+	if errMsg != `` {
+		br.Msg = errMsg
+		br.ErrMsg = errMsg
+		if err != nil {
+			br.ErrMsg = errMsg + ";Err:" + err.Error()
+		} else {
+			br.IsSendEmail = false
+		}
+		return
+	}
+	//item, err := data_manage.GetEdbClassifyById(req.ClassifyId)
+	//if err != nil {
+	//	br.Msg = "保存失败"
+	//	br.Msg = "获取分类信息失败,Err:" + err.Error()
+	//	return
+	//}
+	//
+	//if item.ClassifyName != req.ClassifyName {
+	//	count, err := data_manage.GetEdbClassifyCount(req.ClassifyName, item.ParentId)
+	//	if err != nil {
+	//		br.Msg = "判断名称是否已存在失败"
+	//		br.ErrMsg = "判断名称是否已存在失败,Err:" + err.Error()
+	//		return
+	//	}
+	//	if count > 0 {
+	//		br.Msg = "分类名称已存在,请重新输入"
+	//		br.IsSendEmail = false
+	//		return
+	//	}
+	//
+	//	err = data_manage.EditEdbClassify(req.ClassifyId, req.ClassifyName)
+	//	if err != nil {
+	//		br.Msg = "保存失败"
+	//		br.ErrMsg = "保存失败,Err:" + err.Error()
+	//		return
+	//	}
+	//}
+	br.Ret = 200
+	br.Msg = "保存成功"
+	br.Success = true
+}
+
+// @Title 删除检测接口
+// @Description 删除检测接口
+// @Param	request	body data_manage.ClassifyDeleteCheckReq true "type json string"
+// @Success 200 Ret=200 检测成功
+// @router /classify/delete/check [post]
+func (this *EdbClassifyController) DeleteEdbClassifyCheck() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req data_manage.ClassifyDeleteCheckReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.ClassifyId < 0 && req.EdbInfoId <= 0 {
+		br.Msg = "参数错误"
+		br.IsSendEmail = false
+		return
+	}
+	deleteStatus, tipsMsg, err, errMsg := data.DeleteCheck(req.ClassifyId, req.EdbInfoId, this.SysUser)
+	if errMsg != `` {
+		br.Msg = errMsg
+		br.ErrMsg = errMsg
+		if err != nil {
+			br.ErrMsg = err.Error()
+		} else {
+			br.IsSendEmail = false
+		}
+		return
+	}
+	//var deleteStatus int
+	//var tipsMsg string
+	////删除分类
+	//if req.ClassifyId > 0 && req.EdbInfoId == 0 {
+	//	//判断分类下,是否含有指标
+	//	count, err := data_manage.GetEdbInfoCountByClassifyId(req.ClassifyId)
+	//	if err != nil {
+	//		br.Msg = "删除失败"
+	//		br.ErrMsg = "分类下是否含有指标失败,Err:" + err.Error()
+	//		return
+	//	}
+	//
+	//	if count > 0 {
+	//		deleteStatus = 1
+	//		tipsMsg = "若目录关联指标不可删除"
+	//	}
+	//}
+	//
+	//if deleteStatus != 1 && req.EdbInfoId == 0 {
+	//	classifyCount, err := data_manage.GetClassifyCountByClassifyId(req.ClassifyId)
+	//	if err != nil && err.Error() != utils.ErrNoRow() {
+	//		br.Msg = "删除失败"
+	//		br.ErrMsg = "分类下是否含有指标失败,Err:" + err.Error()
+	//		return
+	//	}
+	//	if classifyCount > 0 {
+	//		deleteStatus = 2
+	//		tipsMsg = "确认删除当前目录及包含的子目录吗"
+	//	}
+	//}
+	//
+	////删除指标
+	//if req.EdbInfoId > 0 {
+	//	//判断指标是否用于作图,如果用于作图,则不可删除
+	//	chartCount, err := data_manage.GetChartEdbMappingCount(req.EdbInfoId)
+	//	if err != nil && err.Error() != utils.ErrNoRow() {
+	//		br.Msg = "删除失败"
+	//		br.ErrMsg = "判断指标是否被用于作图失败,Err:" + err.Error()
+	//		return
+	//	}
+	//	if chartCount > 0 {
+	//		deleteStatus = 3
+	//		tipsMsg = "当前指标已用作画图,不可删除"
+	//	}
+	//	//判断指标是否用于计算
+	//	{
+	//		calculateCount, err := data_manage.GetEdbInfoCalculateMappingCount(req.EdbInfoId)
+	//		if err != nil && err.Error() != utils.ErrNoRow() {
+	//			br.Msg = "删除失败"
+	//			br.ErrMsg = "判断指标是否被用于计算失败,GetEdbInfoCalculateCount Err:" + err.Error()
+	//			return
+	//		}
+	//		if calculateCount > 0 {
+	//			deleteStatus = 4
+	//			tipsMsg = "当前指标已用作,指标运算,不可删除"
+	//		}
+	//	}
+	//}
+
+	resp := new(data_manage.ClassifyDeleteCheckResp)
+	resp.DeleteStatus = deleteStatus
+	resp.TipsMsg = tipsMsg
+	br.Ret = 200
+	br.Msg = "检测成功"
+	br.Success = true
+	br.Data = resp
+}
+
+// @Title 删除分类/指标
+// @Description 删除分类/指标接口
+// @Param	request	body data_manage.DeleteEdbClassifyReq true "type json string"
+// @Success 200 Ret=200 新增成功
+// @router /classify/delete [post]
+func (this *EdbClassifyController) DeleteEdbClassify() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req data_manage.DeleteEdbClassifyReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.ClassifyId < 0 && req.EdbInfoId <= 0 {
+		br.Msg = "参数错误"
+		br.IsSendEmail = false
+		return
+	}
+
+	nextItem, err, errMsg := data.Delete(req.ClassifyId, req.EdbInfoId, sysUser, string(this.Ctx.Input.RequestBody), this.Ctx.Input.URI())
+	if errMsg != `` {
+		br.Msg = errMsg
+		br.ErrMsg = errMsg
+		if err != nil {
+			br.ErrMsg = err.Error()
+		} else {
+			br.IsSendEmail = false
+		}
+		return
+	}
+
+	resp := data_manage.AddEdbInfoResp{}
+	if nextItem != nil {
+		resp = data_manage.AddEdbInfoResp{
+			EdbInfoId:  nextItem.EdbInfoId,
+			UniqueCode: nextItem.UniqueCode,
+		}
+	}
+
+	br.Ret = 200
+	br.Msg = "删除成功"
+	br.Success = true
+	br.IsAddLog = true
+	br.Data = resp
+}
+
+// EdbClassifyMove
+// @Title 分类移动接口
+// @Description 分类移动接口
+// @Success 200 {object} data_manage.MoveEdbClassifyReq
+// @router /edb_classify/move [post]
+func (this *EdbClassifyController) EdbClassifyMove() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req data_manage.MoveEdbClassifyReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.ClassifyId <= 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "分类id小于等于0"
+		return
+	}
+
+	err, errMsg := data.MoveEdbClassify(req.ClassifyId, req.ParentClassifyId, req.PrevClassifyId, req.NextClassifyId, sysUser)
+	if errMsg != `` {
+		br.Msg = errMsg
+		br.ErrMsg = errMsg
+		if err != nil {
+			br.ErrMsg = err.Error()
+		} else {
+			br.IsSendEmail = false
+		}
+		return
+	}
+	////判断分类是否存在
+	//edbClassifyInfo, err := data_manage.GetEdbClassifyById(req.ClassifyId)
+	//if err != nil {
+	//	br.Msg = "移动失败"
+	//	br.ErrMsg = "获取分类信息失败,Err:" + err.Error()
+	//	return
+	//}
+	//updateCol := make([]string, 0)
+	//
+	////判断上级id是否一致,如果不一致的话,那么需要移动该分类层级
+	//if edbClassifyInfo.ParentId != req.ParentClassifyId && req.ParentClassifyId != 0 {
+	//	parentEdbClassifyInfo, err := data_manage.GetEdbClassifyById(req.ParentClassifyId)
+	//	if err != nil {
+	//		br.Msg = "移动失败"
+	//		br.ErrMsg = "获取上级分类信息失败,Err:" + err.Error()
+	//		return
+	//	}
+	//	edbClassifyInfo.ParentId = parentEdbClassifyInfo.ClassifyId
+	//	edbClassifyInfo.Level = parentEdbClassifyInfo.Level + 1
+	//	edbClassifyInfo.ModifyTime = time.Now()
+	//	updateCol = append(updateCol, "ParentId", "Level", "ModifyTime")
+	//}
+	//
+	////如果有传入 上一个兄弟节点分类id
+	//if req.PrevClassifyId > 0 {
+	//	prevClassify, err := data_manage.GetEdbClassifyById(req.PrevClassifyId)
+	//	if err != nil {
+	//		br.Msg = "移动失败"
+	//		br.ErrMsg = "获取上一个兄弟节点分类信息失败,Err:" + err.Error()
+	//		return
+	//	}
+	//
+	//	//如果是移动在两个兄弟节点之间
+	//	if req.NextClassifyId > 0 {
+	//		//下一个兄弟节点
+	//		nextClassify, err := data_manage.GetEdbClassifyById(req.NextClassifyId)
+	//		if err != nil {
+	//			br.Msg = "移动失败"
+	//			br.ErrMsg = "获取下一个兄弟节点分类信息失败,Err:" + err.Error()
+	//			return
+	//		}
+	//		//如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
+	//		if prevClassify.Sort == nextClassify.Sort || prevClassify.Sort == edbClassifyInfo.Sort {
+	//			//变更兄弟节点的排序
+	//			updateSortStr := `sort + 2`
+	//			_ = data_manage.UpdateEdbClassifySortByParentId(prevClassify.ParentId, prevClassify.ClassifyId, prevClassify.Sort, updateSortStr)
+	//		} else {
+	//			//如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
+	//			if nextClassify.Sort-prevClassify.Sort == 1 {
+	//				//变更兄弟节点的排序
+	//				updateSortStr := `sort + 1`
+	//				_ = data_manage.UpdateEdbClassifySortByParentId(prevClassify.ParentId, 0, prevClassify.Sort, updateSortStr)
+	//			}
+	//		}
+	//	}
+	//
+	//	edbClassifyInfo.Sort = prevClassify.Sort + 1
+	//	edbClassifyInfo.ModifyTime = time.Now()
+	//	updateCol = append(updateCol, "Sort", "ModifyTime")
+	//} else {
+	//	firstClassify, err := data_manage.GetFirstEdbClassifyByParentId(edbClassifyInfo.ParentId)
+	//	if err != nil && err.Error() != utils.ErrNoRow() {
+	//		br.Msg = "移动失败"
+	//		br.ErrMsg = "获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + err.Error()
+	//		return
+	//	}
+	//
+	//	//如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
+	//	if firstClassify != nil && firstClassify.Sort == 0 {
+	//		updateSortStr := ` sort + 1 `
+	//		_ = data_manage.UpdateEdbClassifySortByParentId(firstClassify.ParentId, firstClassify.ClassifyId-1, 0, updateSortStr)
+	//	}
+	//
+	//	edbClassifyInfo.Sort = 0 //那就是排在第一位
+	//	edbClassifyInfo.ModifyTime = time.Now()
+	//	updateCol = append(updateCol, "Sort", "ModifyTime")
+	//}
+	//
+	////更新
+	//if len(updateCol) > 0 {
+	//	err = edbClassifyInfo.Update(updateCol)
+	//	if err != nil {
+	//		br.Msg = "移动失败"
+	//		br.ErrMsg = "修改失败,Err:" + err.Error()
+	//		return
+	//	}
+	//}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "移动成功"
+}
+
+// ItemsV2
+// @Title 分类列表
+// @Description 分类列表接口
+// @Success 200 {object} data_manage.EdbClassifyListResp
+// @router /classify/items/v2 [get]
+//func (this *EdbClassifyController) ItemsV2() {
+//	br := new(models.BaseResponse).Init()
+//	defer func() {
+//		this.Data["json"] = br
+//		this.ServeJSON()
+//	}()
+//	rootList, err := data_manage.GetEdbClassifyByParentId(0, 0)
+//	if err != nil && err.Error() != utils.ErrNoRow() {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+//		return
+//	}
+//	classifyAll, err := data_manage.GetEdbClassifyAll()
+//	if err != nil && err.Error() != utils.ErrNoRow() {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+//		return
+//	}
+//	//allEdbInfo, err := data_manage.GetEdbInfoAll(0)
+//	//if err != nil && err.Error() != utils.ErrNoRow() {
+//	//	br.Msg = "获取失败"
+//	//	br.ErrMsg = "获取数据失败,Err:" + err.Error()
+//	//	return
+//	//}
+//	//edbInfoMap := make(map[int][]*data_manage.EdbClassifyItems)
+//	//for _, v := range allEdbInfo {
+//	//	button := data.GetEdbOpButton(this.SysUser, v.SysUserId)
+//	//	button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
+//	//	v.Button = button
+//	//	edbInfoMap[v.ClassifyId] = append(edbInfoMap[v.ClassifyId], v)
+//	//}
+//	rootChildMap := make(map[int][]*data_manage.EdbClassifyItems)
+//	for _, v := range classifyAll {
+//		button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId)
+//		button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
+//		v.Button = button
+//
+//		rootChildMap[v.ParentId] = append(rootChildMap[v.ParentId], v)
+//		//if existItems, ok := edbInfoMap[v.ClassifyId]; ok {
+//		//	v.Children = existItems
+//		//} else {
+//		//	items := make([]*data_manage.EdbClassifyItems, 0)
+//		//	v.Children = items
+//		//}
+//	}
+//	nodeAll := make([]*data_manage.EdbClassifyItems, 0)
+//	for _, v := range rootList {
+//		button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId)
+//		v.Button = button
+//
+//		if existItems, ok := rootChildMap[v.ClassifyId]; ok {
+//			v.Children = existItems
+//		} else {
+//			items := make([]*data_manage.EdbClassifyItems, 0)
+//			v.Children = items
+//		}
+//		nodeAll = append(nodeAll, v)
+//	}
+//	language := `CN`
+//	// 指标显示的语言
+//	{
+//		configDetail, _ := system.GetConfigDetailByCode(this.SysUser.AdminId, system.EdbLanguageVar)
+//		if configDetail != nil {
+//			language = configDetail.ConfigValue
+//		} else {
+//			configDetail, _ = system.GetDefaultConfigDetailByCode(system.EdbLanguageVar)
+//			if configDetail != nil {
+//				language = configDetail.ConfigValue
+//			}
+//		}
+//	}
+//
+//	// 是否允许添加一级分类
+//	canOpClassify := true
+//	//button := data.GetEdbClassifyOpButton(this.SysUser, 0)
+//	//if !button.AddButton {
+//	//	canOpClassify = false
+//	//}
+//
+//	resp := data_manage.EdbClassifyListResp{
+//		AllNodes:      nodeAll,
+//		CanOpClassify: canOpClassify,
+//		Language:      language,
+//	}
+//
+//	br.Ret = 200
+//	br.Success = true
+//	br.Msg = "获取成功"
+//	br.Data = resp
+//}
+
+// @Title 获取分类下指标接口
+// @Description 获取分类下指标接口
+// @Param   ClassifyId   query   int  true       "分类id"
+// @Success 200 {object} data_manage.EdbClassifyListResp
+// @router /classify/edb_info/list [get]
+//func (this *EdbClassifyController) ClassifyEdbInfoList() {
+//	br := new(models.BaseResponse).Init()
+//	defer func() {
+//		this.Data["json"] = br
+//		this.ServeJSON()
+//	}()
+//
+//	classifyId, _ := this.GetInt("ClassifyId")
+//	if classifyId <= 0 {
+//		br.Msg = "参数错误,请刷新页面"
+//		return
+//	}
+//
+//	// 获取当前账号的不可见指标
+//	obj := data_manage.EdbInfoNoPermissionAdmin{}
+//	confList, err := obj.GetAllListByAdminId(this.SysUser.AdminId)
+//	if err != nil && err.Error() != utils.ErrNoRow() {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
+//		return
+//	}
+//	noPermissionEdbInfoIdMap := make(map[int]bool)
+//	for _, v := range confList {
+//		noPermissionEdbInfoIdMap[v.EdbInfoId] = true
+//	}
+//
+//	allEdbInfo, err := data_manage.GetEdbInfoByClassifyId(classifyId, 0)
+//	if err != nil && err.Error() != utils.ErrNoRow() {
+//		br.Msg = "获取失败"
+//		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+//		return
+//	}
+//
+//	list := make([]*data_manage.EdbClassifyItems, 0)
+//	for _, v := range allEdbInfo {
+//		// 如果指标不可见,那么就不返回该指标
+//		if _, ok := noPermissionEdbInfoIdMap[v.EdbInfoId]; ok {
+//			continue
+//		}
+//		button := data.GetEdbOpButton(this.SysUser, v.SysUserId, v.EdbType, utils.EDB_INFO_TYPE)
+//		button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
+//		v.Button = button
+//
+//		list = append(list, v)
+//	}
+//
+//	resp := new(data_manage.ClassifyEdbInfoListResp)
+//	resp.EdbInfoList = list
+//	br.Ret = 200
+//	br.Success = true
+//	br.Msg = "获取成功"
+//	br.Data = resp
+//}
+
+// ItemsV3
+// @Title 分类列表
+// @Description 分类列表接口
+// @Success 200 {object} data_manage.EdbClassifyListResp
+// @router /classify/items/v3 [get]
+func (this *EdbClassifyController) ItemsV3() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	rootList, err := data_manage.GetEdbClassifyByParentId(0, 0)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	rootTwoList, err := data_manage.GetEdbClassifyByParentIdTwo(0)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	classifyAll, err := data_manage.GetEdbClassifyAllV2(0)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	rootTwoMap := make(map[int][]*data_manage.EdbClassifyItems)
+	for _, v := range rootTwoList {
+		button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId)
+		v.Button = button
+
+		rootTwoMap[v.ParentId] = append(rootTwoMap[v.ParentId], v)
+	}
+	rootTwoChildMap := make(map[int][]*data_manage.EdbClassifyItems)
+	for _, v := range classifyAll {
+		button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId)
+		v.Button = button
+		if v.Level == 3 {
+			rootTwoChildMap[v.ParentId] = append(rootTwoChildMap[v.ParentId], v)
+		}
+	}
+
+	nodeAll := make([]*data_manage.EdbClassifyItems, 0)
+	for _, v := range rootList {
+		button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId)
+		v.Button = button
+
+		if existItems, ok := rootTwoMap[v.ClassifyId]; ok {
+			v.Children = existItems
+			for _, item := range existItems {
+				button := data.GetEdbClassifyOpButton(this.SysUser, item.SysUserId)
+				item.Button = button
+
+				if existItems, ok := rootTwoChildMap[item.ClassifyId]; ok {
+					for _, existItem := range existItems {
+						button := data.GetEdbClassifyOpButton(this.SysUser, v.SysUserId)
+						button.AddButton = false //不管有没有权限,指标都是没有添加按钮的
+						existItem.Button = button
+					}
+					item.Children = existItems
+				} else {
+					items := make([]*data_manage.EdbClassifyItems, 0)
+					item.Children = items
+				}
+			}
+		} else {
+			items := make([]*data_manage.EdbClassifyItems, 0)
+			v.Children = items
+		}
+		nodeAll = append(nodeAll, v)
+	}
+	language := `CN`
+	// 指标显示的语言
+	{
+		configDetail, _ := system.GetConfigDetailByCode(this.SysUser.AdminId, system.EdbLanguageVar)
+		if configDetail != nil {
+			language = configDetail.ConfigValue
+		} else {
+			configDetail, _ = system.GetDefaultConfigDetailByCode(system.EdbLanguageVar)
+			if configDetail != nil {
+				language = configDetail.ConfigValue
+			}
+		}
+	}
+	// 是否允许添加一级分类
+
+	// 是否允许添加一级分类
+	canOpClassify := true
+	button := data.GetEdbClassifyOpButton(this.SysUser, 0)
+	if !button.AddButton {
+		canOpClassify = false
+	}
+
+	resp := new(data_manage.EdbClassifyListResp)
+	resp.AllNodes = nodeAll
+	resp.Language = language
+	resp.CanOpClassify = canOpClassify
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// EdbClassifyMoveV2
+// @Title 分类移动接口v2
+// @Description 分类移动接口v2
+// @Success 200 {object} data_manage.MoveEdbClassifyReq
+// @router /edb_classify/move/v2 [post]
+//func (this *EdbClassifyController) EdbClassifyMoveV2() {
+//	br := new(models.BaseResponse).Init()
+//	defer func() {
+//		this.Data["json"] = br
+//		this.ServeJSON()
+//	}()
+//
+//	sysUser := this.SysUser
+//	if sysUser == nil {
+//		br.Msg = "请登录"
+//		br.ErrMsg = "请登录,SysUser Is Empty"
+//		br.Ret = 408
+//		return
+//	}
+//
+//	var req data_manage.MoveEdbClassifyReq
+//	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+//	if err != nil {
+//		br.Msg = "参数解析异常!"
+//		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+//		return
+//	}
+//
+//	if req.ClassifyId <= 0 {
+//		br.Msg = "参数错误"
+//		br.ErrMsg = "分类id小于等于0"
+//		return
+//	}
+//
+//	err, errMsg := data.MoveEdbClassify(req.ClassifyId, req.ParentClassifyId, req.PrevClassifyId, req.NextClassifyId)
+//	if errMsg != `` {
+//		br.Msg = errMsg
+//		br.ErrMsg = errMsg
+//		if err != nil {
+//			br.ErrMsg = err.Error()
+//		} else {
+//			br.IsSendEmail = false
+//		}
+//		return
+//	}
+//
+//	br.Ret = 200
+//	br.Success = true
+//	br.Msg = "移动成功"
+//}

Plik diff jest za duży
+ 3838 - 1
controllers/data_manage/edb_info.go


+ 287 - 0
controllers/data_manage/predict_edb_info.go

@@ -0,0 +1,287 @@
+package data_manage
+
+import (
+	"eta/eta_mobile/controllers"
+	"eta/eta_mobile/models"
+	"eta/eta_mobile/models/data_manage"
+	"eta/eta_mobile/services/data"
+	"eta/eta_mobile/utils"
+	"github.com/rdlucklib/rdluck_tools/paging"
+)
+
+// PredictEdbInfoController 预测指标
+type PredictEdbInfoController struct {
+	controllers.BaseAuthController
+}
+
+// List
+// @Title 指标数据列表接口
+// @Description 指标数据列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   EdbInfoId   query   int  true       "指标id"
+// @Param   KeyWord   query   string  false       "搜索关键词:指标ID/指标名称"
+// @Success 200 {object} data_manage.EdbInfoListResp
+// @router /predict_edb_info/list [get]
+func (this *PredictEdbInfoController) List() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	edbInfoId, _ := this.GetInt("EdbInfoId")
+	keyWord := this.GetString("KeyWord")
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+
+	var total int
+	page := paging.GetPaging(currentIndex, pageSize, total)
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	var condition string
+	var pars []interface{}
+
+	// 指标类型,0:普通指标,1:预测指标
+	condition += " AND edb_info_type=? "
+	pars = append(pars, 1)
+
+	if edbInfoId > 0 {
+		condition += " AND edb_info_id=? "
+		pars = append(pars, edbInfoId)
+	}
+
+	if keyWord != "" {
+		condition += ` AND  ( edb_code LIKE '%` + keyWord + `%'  OR  edb_name LIKE '%` + keyWord + `%' )`
+		//pars = append(pars, keyWord)
+		//pars = append(pars, keyWord)
+	}
+
+	resp := data_manage.EdbInfoListResp{}
+	if condition == "" {
+		item := new(data_manage.EdbInfoList)
+		resp.Paging = page
+		resp.Item = item
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		return
+	}
+	//获取指标信息
+	edbInfoItem, err := data_manage.GetEdbInfoByCondition(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Success = true
+		br.Msg = "获取指标信息失败"
+		br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
+		return
+	}
+
+	if edbInfoItem == nil || (err != nil && err.Error() == utils.ErrNoRow()) {
+		item := new(data_manage.EdbInfoList)
+		resp.Paging = page
+		resp.Item = item
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		return
+	}
+
+	//获取英文频度
+	edbInfoItem.FrequencyEn = data.GetFrequencyEn(edbInfoItem.Frequency)
+
+	//查询目录
+	resultList, _ := data_manage.GetClassifyAllByClassifyId(edbInfoItem.ClassifyId)
+
+	// 未来的指标预测数据
+	predictDataList := make([]*data_manage.EdbData, 0)
+
+	var existCondition string
+	var existPars []interface{}
+	existCondition += " AND edb_info_id=? "
+	existPars = append(existPars, edbInfoId)
+
+	//查询出所有的关联指标
+	sourceEdbInfoCalculateMappingList, err := data_manage.GetEdbInfoCalculateListByCondition(existCondition, existPars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取预测指标关联信息失败,Err:" + err.Error()
+		return
+	}
+	if len(sourceEdbInfoCalculateMappingList) <= 0 {
+		br.Msg = "获取失败"
+		br.ErrMsg = "查找预测指标关联信息失败"
+		return
+	}
+	if edbInfoItem.EdbType == 1 { //普通的预测指标
+		// 查找该预测指标配置
+		predictEdbConfList, err := data_manage.GetPredictEdbConfListById(edbInfoId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取预测指标配置信息失败,Err:" + err.Error()
+			return
+		}
+		if len(predictEdbConfList) == 0 {
+			br.Msg = "找不到该预测指标配置"
+			br.ErrMsg = "找不到该预测指标配置"
+			return
+		}
+		predictEdbConf := predictEdbConfList[0]
+
+		//预测数据的配置
+		edbInfoItem.RuleType = predictEdbConf.RuleType
+		edbInfoItem.FixedValue = predictEdbConf.FixedValue
+
+		// 来源指标
+		//sourceEdbInfoId := sourceEdbInfoCalculateMappingList[0].FromEdbInfoId
+		sourceEdbInfoId := predictEdbConf.SourceEdbInfoId
+		sourceEdbInfoItem, err := data_manage.GetEdbInfoById(sourceEdbInfoId)
+		if err != nil {
+			br.Msg = "获取来源指标信息失败"
+			br.ErrMsg = "获取来源指标信息失败"
+			if err.Error() != utils.ErrNoRow() {
+				br.ErrMsg = "获取来源指标信息失败,Err:" + err.Error()
+			}
+			br.Success = true
+			return
+		}
+
+		//获取指标数据(实际已生成)
+		{
+			var dataCondition string
+			var dataPars []interface{}
+
+			dataCondition += ` AND edb_info_id=? `
+			dataPars = append(dataPars, sourceEdbInfoItem.EdbInfoId)
+
+			dataCount, err := data_manage.GetEdbDataCountByCondition(dataCondition, dataPars, sourceEdbInfoItem.Source)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				br.Msg = "获取指标信息失败"
+				br.ErrMsg = "获取指标数据总数失败,Err:" + err.Error()
+				return
+			}
+			page = paging.GetPaging(currentIndex, pageSize, dataCount)
+			dataList, err := data_manage.GetEdbDataListByCondition(dataCondition, dataPars, sourceEdbInfoItem.Source, pageSize, startSize)
+			if err != nil {
+				br.Msg = "获取指标信息失败"
+				br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
+				return
+			}
+			edbInfoItem.DataList = dataList
+		}
+
+		// 第一页才需要 获取预测指标未来的数据
+		if currentIndex == 1 {
+			allDataList, err := data_manage.GetEdbDataList(sourceEdbInfoItem.Source, sourceEdbInfoItem.EdbInfoId, "", "")
+			if err != nil {
+				br.Msg = "获取失败"
+				br.Msg = "获取失败,Err:" + err.Error()
+				return
+			}
+			predictEdbConfDataList := make([]data_manage.PredictEdbConfAndData, 0)
+			for _, v := range predictEdbConfList {
+				predictEdbConfDataList = append(predictEdbConfDataList, data_manage.PredictEdbConfAndData{
+					ConfigId:         v.ConfigId,
+					PredictEdbInfoId: v.PredictEdbInfoId,
+					SourceEdbInfoId:  v.SourceEdbInfoId,
+					RuleType:         v.RuleType,
+					FixedValue:       v.FixedValue,
+					Value:            v.Value,
+					EndDate:          v.EndDate,
+					ModifyTime:       v.ModifyTime,
+					CreateTime:       v.CreateTime,
+					DataList:         make([]*data_manage.EdbDataList, 0),
+				})
+			}
+			tmpPredictDataList, _, _, err, _ := data.GetChartPredictEdbInfoDataListByConfList(predictEdbConfDataList, sourceEdbInfoItem.LatestDate, sourceEdbInfoItem.LatestDate, edbInfoItem.EndDate, sourceEdbInfoItem.Frequency, edbInfoItem.DataDateType, allDataList)
+			if err != nil {
+				br.Msg = "获取预测指标数据失败"
+				br.ErrMsg = "获取预测指标数据失败" + err.Error()
+				return
+			}
+			lenTmpPredictDataList := len(tmpPredictDataList)
+			if lenTmpPredictDataList > 0 {
+				for i := lenTmpPredictDataList - 1; i >= 0; i-- {
+					v := tmpPredictDataList[i]
+					predictDataList = append(predictDataList, &data_manage.EdbData{
+						EdbDataId: v.EdbDataId,
+						EdbInfoId: v.EdbInfoId,
+						DataTime:  v.DataTime,
+						Value:     v.Value,
+					})
+				}
+			}
+		}
+	} else {
+		//获取指标数据(实际已生成)
+		{
+			var dataCondition string
+			var dataPars []interface{}
+
+			dataCondition += ` AND edb_info_id=? AND data_time <= ? `
+			dataPars = append(dataPars, edbInfoItem.EdbInfoId, edbInfoItem.LatestDate)
+
+			dataCount, err := data_manage.GetEdbDataCountByCondition(dataCondition, dataPars, edbInfoItem.Source)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				br.Msg = "获取指标信息失败"
+				br.ErrMsg = "获取指标数据总数失败,Err:" + err.Error()
+				return
+			}
+			page = paging.GetPaging(currentIndex, pageSize, dataCount)
+			dataList, err := data_manage.GetEdbDataListByCondition(dataCondition, dataPars, edbInfoItem.Source, pageSize, startSize)
+			if err != nil {
+				br.Msg = "获取指标信息失败"
+				br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
+				return
+			}
+			edbInfoItem.DataList = dataList
+		}
+
+		// 第一页才需要 获取预测指标未来的数据
+		if currentIndex == 1 {
+			var dataCondition string
+			var dataPars []interface{}
+
+			dataCondition += ` AND edb_info_id=? AND data_time > ? `
+			dataPars = append(dataPars, edbInfoItem.EdbInfoId, edbInfoItem.LatestDate)
+
+			predictDataList, err = data_manage.GetAllEdbDataListByCondition(dataCondition, dataPars, edbInfoItem.Source)
+			if err != nil {
+				br.Msg = "获取指标信息失败"
+				br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
+				return
+			}
+			if err != nil {
+				br.Msg = "获取预测指标数据失败"
+				br.ErrMsg = "获取预测指标数据失败" + err.Error()
+				return
+			}
+		}
+	}
+
+	// 如果预测数据没有,那么返回空数组
+	if predictDataList == nil {
+		predictDataList = make([]*data_manage.EdbData, 0)
+	}
+	edbInfoItem.PredictDataList = predictDataList
+
+	// 如果实际数据没有,那么返回空数组
+	if edbInfoItem.DataList == nil {
+		edbInfoItem.DataList = make([]*data_manage.EdbData, 0)
+	}
+	resp.Paging = page
+	resp.Item = edbInfoItem
+	resp.ClassifyList = resultList
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 35 - 0
controllers/sys_admin.go

@@ -87,3 +87,38 @@ func (this *SysAdminController) SetConfig() {
 	br.Success = true
 	br.Msg = "设置成功"
 }
+
+// ConfigLanguage
+// @Title 用户语言配置
+// @Description 用户语言配置
+// @Success 200 string "获取成功"
+// @router /config/language [get]
+func (this *SysAdminController) ConfigLanguage() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	sourceKey := this.GetString("SourceKey")
+
+	language := `CN`
+	confDetail, _ := system.GetConfigDetailByCode(sysUser.AdminId, sourceKey)
+	if confDetail != nil {
+		language = confDetail.ConfigValue
+	}
+
+	br.Data = language
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}

+ 321 - 0
models/data_manage/base_from_baiinfo.go

@@ -0,0 +1,321 @@
+package data_manage
+
+import (
+	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type BaseFromBaiinfo struct {
+	BaseFromBaiinfoId int `orm:"column(base_from_baiinfo_id);pk"`
+	Aid               int
+	Name              string
+	Interface         string
+	ApiUpdate         int
+	ApiUpdateType     string
+	ApiType           int
+	ApiTypeAll        string
+	Type1             string `orm:"column(type_1)"`
+	Type2             string `orm:"column(type_2)"`
+	Type3             string `orm:"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
+}
+
+func AddBaseFromBaiinfo(item *BaseFromBaiinfo) (lastId int64, err error) {
+	o := orm.NewOrmUsingDB("data")
+	lastId, err = o.Insert(item)
+	return
+}
+
+func GetBaseFromBaiinfoList() (list []*BaseFromBaiinfo, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_baiinfo `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+func GetBaseFromBaiinfoByBaiinfoCode(baiinfoCode string) (item *BaseFromBaiinfo, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_baiinfo WHERE interface=?`
+	err = o.Raw(sql, baiinfoCode).QueryRow(&item)
+	return
+}
+
+type BaseFromBaiinfoIndex struct {
+	BaseFromBaiinfoIndexId int `orm:"column(base_from_baiinfo_index_id);pk"`
+	ClassifyId             int
+	Interface              string
+	IndexCode              string
+	IndexName              string
+	Frequency              string
+	Unit                   string
+	Sort                   int
+	CreateTime             time.Time
+	ModifyTime             time.Time
+}
+
+func AddBaseFromBaiinfoIndex(item *BaseFromBaiinfoIndex) (lastId int64, err error) {
+	o := orm.NewOrmUsingDB("data")
+	lastId, err = o.Insert(item)
+	return
+}
+
+func GetBaseFromBaiinfoIndex() (list []*BaseFromBaiinfoIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_baiinfo_index `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+type BaseFromBaiinfoData struct {
+	BaiinfoDataId          int `orm:"column(baiinfo_data_id);pk"`
+	BaseFromBaiinfoIndexId int
+	IndexCode              string
+	DataTime               string
+	Value                  string
+	CreateTime             time.Time
+	ModifyTime             time.Time
+	DataTimestamp          int64
+}
+
+func AddBaseFromBaiinfoData(item *BaseFromBaiinfoData) (lastId int64, err error) {
+	o := orm.NewOrmUsingDB("data")
+	lastId, err = o.Insert(item)
+	return
+}
+
+func GetBaseFromBaiinfoDataAll() (list []*BaseFromBaiinfoData, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_baiinfo_data `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+func ModifyBaseFromBaiinfoData(baiinfoDataId int, value string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `UPDATE base_from_baiinfo_data SET value=?,modify_time=NOW() WHERE baiinfo_data_id=? `
+	_, err = o.Raw(sql, value, baiinfoDataId).Exec()
+	return
+}
+
+func GetBaseFromBaiinfoIndexByBaiinfoCode(baiinfoCode string) (list []*BaseFromBaiinfoIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_baiinfo_index WHERE interface=? `
+	_, err = o.Raw(sql, baiinfoCode).QueryRows(&list)
+	return
+}
+
+func GetBaseFromBaiinfoMaxOrMinDate(indexCode string) (min_date, max_date string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date FROM base_from_baiinfo_data WHERE index_code=? `
+	err = o.Raw(sql, indexCode).QueryRow(&min_date, &max_date)
+	return
+}
+
+func ModifyBaseFromBaiinfoMinDateAndMaxDate(baseFromBaiinfoIndexId int, minDate, maxDate string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` UPDATE base_from_baiinfo_index SET start_date=?,end_date=?,modify_time=NOW() WHERE base_from_baiinfo_index_id=? `
+	_, err = o.Raw(sql, minDate, maxDate, baseFromBaiinfoIndexId).Exec()
+	return
+}
+
+func GetBaseFromBaiinfoDataAllByIndexCode(indexCode string) (list []*BaseFromBaiinfoData, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_baiinfo_data WHERE index_code=? `
+	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	return
+}
+
+func GetBaseFromBaiinfoIndexByIndexCode(indexCode string) (list *BaseFromBaiinfoIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_baiinfo_index WHERE index_code=? `
+	err = o.Raw(sql, indexCode).QueryRow(&list)
+	return
+}
+
+// GetBaseFromBaiinfoIndexCountByClassifyIds 获取分类下指标的个数
+func GetBaseFromBaiinfoIndexCountByClassifyIds(classifyIds []int) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	num := len(classifyIds)
+	if num <= 0 {
+		return
+	}
+	sql := `SELECT COUNT(1) AS count FROM base_from_baiinfo_index WHERE classify_id IN (` + utils.GetOrmInReplace(num) + `) `
+	err = o.Raw(sql, classifyIds).QueryRow(&count)
+	return
+}
+
+// GetBaseFromBaiinfoIndexByClassifyId 获取根据分类查询指标
+func GetBaseFromBaiinfoIndexByClassifyId(classifyId int) (list []*BaseFromBaiinfoIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_baiinfo_index WHERE classify_id =? ORDER BY sort ASC, base_from_baiinfo_index_id ASC `
+	_, err = o.Raw(sql, classifyId).QueryRows(&list)
+	return
+}
+
+//// GetBaiinfoIndexAll 用于分类展示
+//func GetBaiinfoIndexAll() (items []*BaseFromBaiinfoClassifyItems, err error) {
+//	o := orm.NewOrmUsingDB("data")
+//	sql := ` SELECT base_from_baiinfo_index_id, classify_id, index_name as classify_name, index_code as base_from_baiinfo_index_code
+//            FROM base_from_baiinfo_index ORDER BY sort ASC, base_from_baiinfo_index_id ASC `
+//	_, err = o.Raw(sql).QueryRows(&items)
+//	return
+//}
+
+// GetBaseFromBaiinfoIndexByIndexId 根据指标id获取指标信息
+func GetBaseFromBaiinfoIndexByIndexId(indexId int) (item *BaseFromBaiinfoIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_baiinfo_index WHERE base_from_baiinfo_index_id=? `
+	err = o.Raw(sql, indexId).QueryRow(&item)
+	return
+}
+
+// GetBaseFromBaiinfoIndexMaxSortByClassifyId 根据指标id获取指标信息
+func GetBaseFromBaiinfoIndexMaxSortByClassifyId(classifyId int) (sort int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT max(sort) FROM base_from_baiinfo_index WHERE classify_id=? `
+	err = o.Raw(sql, classifyId).QueryRow(&sort)
+	return
+}
+
+// GetBaseFromBaiinfoIndexMinSortByClassifyId 获取最小不等于0的排序
+func GetBaseFromBaiinfoIndexMinSortByClassifyId(classifyId int) (sort int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT min(sort) FROM base_from_baiinfo_index WHERE classify_id=? and sort <> 0 `
+	err = o.Raw(sql, classifyId).QueryRow(&sort)
+	return
+}
+
+type BaseFromBaiinfoIndexType struct {
+	Type2 string `orm:"column(type_2)"`
+	Type3 string `orm:"column(type_3)"`
+}
+
+// GetBaseFromBaiinfoIndexType 获取历史指标信息类型
+func GetBaseFromBaiinfoIndexType() (list []BaseFromBaiinfoIndexType, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT type_2, type_3 from base_from_baiinfo_index where type_2 <> "" GROUP BY type_2, type_3`
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+// MoveBaseFromBaiinfoIndex 移动指标分类
+func MoveBaseFromBaiinfoIndex(chartInfoId, classifyId int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` UPDATE base_from_baiinfo_index
+			SET
+			  classify_id = ?, modify_time=NOW() 
+			WHERE base_from_baiinfo_index_id = ?`
+	_, err = o.Raw(sql, classifyId, chartInfoId).Exec()
+	return
+}
+
+// UpdateBaseFromBaiinfoIndexByClassifyId 根据指标id更新排序
+func UpdateBaseFromBaiinfoIndexByClassifyId(classifyId, nowSort, prevIndexInfoId int, updateSort string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` update base_from_baiinfo_index set sort = ` + updateSort + ` WHERE classify_id=? AND  `
+	if prevIndexInfoId > 0 {
+		sql += ` ( sort > ? or (base_from_baiinfo_index_id > ` + fmt.Sprint(prevIndexInfoId) + ` and sort = ` + fmt.Sprint(nowSort) + `))`
+	}
+	_, err = o.Raw(sql, classifyId, nowSort).Exec()
+	return
+}
+
+// MoveUpBaiinfoIndexBySort 往上移动
+func MoveUpBaiinfoIndexBySort(classifyId, nextSort, currentSort int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `update base_from_baiinfo_index set sort = sort + 1 where classify_id=? and sort >= ? and sort< ?`
+	_, err = o.Raw(sql, classifyId, nextSort, currentSort).Exec()
+	return
+}
+
+// MoveDownBaiinfoIndexBySort 往下移动
+func MoveDownBaiinfoIndexBySort(classifyId, prevSort, currentSort int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `update base_from_baiinfo_index set sort = sort - 1 where classify_id=? and sort <= ? and sort> ? `
+	_, err = o.Raw(sql, classifyId, prevSort, currentSort).Exec()
+	return
+}
+
+// GetFirstBaseFromBaiinfoIndexByClassifyId 获取当前分类下,且排序数相同 的排序第一条的数据
+func GetFirstBaseFromBaiinfoIndexByClassifyId(classifyId int) (item *BaseFromBaiinfoIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_baiinfo_index WHERE classify_id=? order by sort asc,base_from_baiinfo_index_id asc limit 1`
+	err = o.Raw(sql, classifyId).QueryRow(&item)
+	return
+}
+
+// Update 更新Baiinfo指标基础信息
+func (item *BaseFromBaiinfoIndex) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Update(item, cols...)
+	return
+}
+
+// DeleteBaseFromBaiinfoIndexById 根据指标id删除对应的指标、指标数据
+func DeleteBaseFromBaiinfoIndexById(baiinfoIndexId int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	//删除指标
+	sql := `DELETE FROM base_from_baiinfo_index WHERE base_from_baiinfo_index_id = ? `
+	_, err = to.Raw(sql, baiinfoIndexId).Exec()
+	if err != nil {
+		return
+	}
+
+	//删除指标数据
+	sql = `DELETE FROM base_from_baiinfo_data WHERE base_from_baiinfo_index_id = ? `
+	_, err = to.Raw(sql, baiinfoIndexId).Exec()
+	if err != nil {
+		return
+	}
+
+	return
+}
+
+// EditBaiinfoIndexInfoResp 新增指标的返回
+type EditBaiinfoIndexInfoResp struct {
+	BaseFromBaiinfoIndexId int    `description:"指标ID"`
+	IndexCode              string `description:"指标code"`
+}
+
+//type BaiinfoSingleDataResp struct {
+//	BaseFromBaiinfoIndexId int
+//	ClassifyId             int
+//	Interface              string
+//	Name                   string
+//	IndexCode              string
+//	IndexName              string
+//	Frequency              string
+//	Unit                   string
+//	ApiStartTime           string
+//	ApiUpdateTime          string
+//	StartTime              string
+//	FinishTime             string
+//	CreateTime             string
+//	ModifyTime             string
+//	Data                   []*BaiinfoIndexData
+//}

+ 161 - 0
models/data_manage/base_from_eia_stero.go

@@ -0,0 +1,161 @@
+package data_manage
+
+import (
+	"eta/eta_mobile/utils"
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+// BaseFromEiaSteoIndex EiaSteo指标
+type BaseFromEiaSteoIndex struct {
+	BaseFromEiaSteoIndexId    int       `orm:"column(base_from_eia_steo_index_id);pk"`
+	BaseFromEiaSteoClassifyId int       `description:"指标分类id"`
+	IndexCode                 string    `description:"指标编码"`
+	IndexName                 string    `description:"指标名称(中文名称)"`
+	IndexNameOriginal         string    `description:"指标名称(原始名称)"`
+	Frequency                 string    `description:"频度"`
+	Level                     int       `description:"指标层级(原始层级)"`
+	Unit                      string    `description:"单位"`
+	Super                     string    `description:"我也不知道是个啥,反正先存起来,万一用到了呢"`
+	Precision                 int       `description:"精度,我也不知道会不会用到,反正先存起来,万一用到了呢"`
+	LastHistorical            string    `description:"最近的历史记录,我也不知道会不会用到,反正先存起来,万一用到了呢"`
+	Description               string    `description:"备注信息,我也不知道会不会用到,反正先存起来,万一用到了呢"`
+	IsMappable                int       `description:"是否可映射,我也不知道会不会用到,反正先存起来,万一用到了呢"`
+	StartDate                 time.Time `description:"开始日期"`
+	EndDate                   time.Time `description:"结束日期"`
+	ModifyTime                time.Time `description:"最新更新时间"`
+	CreateTime                time.Time `description:"创建时间"`
+}
+
+// BaseFromEiaSteoIndexItem EiaSteo指标
+type BaseFromEiaSteoIndexItem struct {
+	BaseFromEiaSteoIndexId    int    `orm:"column(base_from_eia_steo_index_id);pk"`
+	BaseFromEiaSteoClassifyId int    `description:"指标分类id"`
+	IndexCode                 string `description:"指标编码"`
+	IndexName                 string `description:"指标名称(中文名称)"`
+	IndexNameOriginal         string `description:"指标名称(原始名称)"`
+	Frequency                 string `description:"频度"`
+	Level                     int    `description:"指标层级(原始层级)"`
+	Unit                      string `description:"单位"`
+	Super                     string `description:"我也不知道是个啥,反正先存起来,万一用到了呢"`
+	Precision                 int    `description:"精度,我也不知道会不会用到,反正先存起来,万一用到了呢"`
+	LastHistorical            string `description:"最近的历史记录,我也不知道会不会用到,反正先存起来,万一用到了呢"`
+	Description               string `description:"备注信息,我也不知道会不会用到,反正先存起来,万一用到了呢"`
+	IsMappable                int    `description:"是否可映射,我也不知道会不会用到,反正先存起来,万一用到了呢"`
+	StartDate                 string `description:"开始日期"`
+	EndDate                   string `description:"结束日期"`
+	ModifyTime                string `description:"最新更新时间"`
+	CreateTime                string `description:"创建时间"`
+}
+
+// BaseFromEiaSteoClassify EiaSteo分类
+type BaseFromEiaSteoClassify struct {
+	BaseFromEiaSteoClassifyId int       `orm:"column(base_from_eia_steo_classify_id);pk"`
+	ClassifyName              string    `description:"分类名称(中文名称)"`
+	ClassifyNameOriginal      string    `description:"分类名称(原始名称)"`
+	ModifyTime                time.Time `description:"最新更新时间"`
+	CreateTime                time.Time `description:"创建时间"`
+}
+
+// BaseFromEiaSteoData EiaSteo数据表
+type BaseFromEiaSteoData struct {
+	BaseFromEiaSteoDataId  int       `orm:"column(base_from_eia_steo_data_id);pk"`
+	BaseFromEiaSteoIndexId int       `description:"指标id"`
+	IndexCode              string    `description:"指标编码"`
+	DataTime               time.Time `description:"数据日期"`
+	Value                  float64   `description:"数据值"`
+	ModifyTime             time.Time `description:"最新更新时间"`
+	CreateTime             time.Time `description:"创建时间"`
+}
+
+// BaseFromEiaSteoDataItem EiaSteo数据
+type BaseFromEiaSteoDataItem struct {
+	BaseFromEiaSteoDataId  int     `orm:"column(base_from_eia_steo_data_id);pk"`
+	BaseFromEiaSteoIndexId int     `description:"指标id"`
+	IndexCode              string  `description:"指标编码"`
+	DataTime               string  `description:"数据日期"`
+	Value                  float64 `description:"数据值"`
+	ModifyTime             string  `description:"最新更新时间"`
+	CreateTime             string  `description:"创建时间"`
+}
+
+// GetEiaSteoClassifyList 获取分类列表
+func GetEiaSteoClassifyList() (items []*BaseFromEiaSteoClassify, err error) {
+	sql := ` SELECT * FROM base_from_eia_steo_classify  ORDER BY base_from_eia_steo_classify_id ASC `
+	o := orm.NewOrmUsingDB("data")
+	o.Raw(sql).QueryRows(&items)
+	return
+}
+
+type EiaSteoIndexListResp struct {
+	BaseFromEiaSteoIndexId    int                `orm:"column(base_from_eia_steo_index_id);pk"`
+	BaseFromEiaSteoClassifyId int                `description:"指标分类id"`
+	IndexCode                 string             `description:"指标编码"`
+	IndexName                 string             `description:"指标名称(中文名称)"`
+	Unit                      string             `description:"单位"`
+	Frequency                 string             `description:"频度"`
+	StartDate                 string             `description:"开始日期"`
+	EndDate                   string             `description:"结束日期"`
+	ModifyTime                string             `description:"最新更新时间"`
+	CreateTime                string             `description:"创建时间"`
+	Paging                    *paging.PagingItem `description:"分页数据"`
+	DataList                  []*BaseFromEiaSteoDataItem
+}
+
+// GetEiaSteoIndexList 获取指标列表
+func GetEiaSteoIndexList(condition string, pars []interface{}) (items []*BaseFromEiaSteoIndex, err error) {
+	sql := ` SELECT *  FROM base_from_eia_steo_index WHERE 1=1  `
+	sql += condition
+	sql += ` ORDER BY base_from_eia_steo_index_id ASC `
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// GetEiaSteoIndexDataCount 获取指标数据总数
+func GetEiaSteoIndexDataCount(indexCode string) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT COUNT(1) AS count FROM base_from_eia_steo_data where index_code = ? `
+	err = o.Raw(sql, indexCode).QueryRow(&count)
+	return
+}
+
+// GetEiaSteoIndexDataList 获取指标数据总数列表
+func GetEiaSteoIndexDataList(indexCode string, startSize, pageSize int) (items []*BaseFromEiaSteoDataItem, err error) {
+	//sql := ` SELECT *  FROM mb_index_main_data WHERE INDEX_CODE=? ORDER BY DATA_DATE DESC,PUBLISH_TIME DESC LIMIT ?,?`
+	sql := ` SELECT * FROM base_from_eia_steo_data AS a WHERE index_code=? ORDER BY data_time DESC LIMIT ?,? `
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sql, indexCode, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// GetEiaSteoItemList 模糊查询EiaSteo数据库指标列表
+func GetEiaSteoItemList(keyword string) (items []*BaseFromEiaSteoIndexItem, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := "SELECT * FROM base_from_eia_steo_index WHERE index_name LIKE ?  OR index_code like ?"
+	_, err = o.Raw(sql, `%`+keyword+`%`, `%`+keyword+`%`).QueryRows(&items)
+	return
+}
+
+// GetEiaSteoDateList 根据指标code获取日期数据
+func GetEiaSteoDateList(indexCodeList []string) (items []*BaseFromEiaSteoDataItem, err error) {
+	num := len(indexCodeList)
+	if num <= 0 {
+		return
+	}
+
+	sql := ` SELECT data_time FROM base_from_eia_steo_data WHERE index_code IN(` + utils.GetOrmInReplace(num) + `)  GROUP BY data_time ORDER BY data_time DESC `
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sql, indexCodeList).QueryRows(&items)
+
+	return
+}
+
+// GetBaseFromEiaSteoIndexByCode 根据指标code获取指标信息
+func GetBaseFromEiaSteoIndexByCode(indexCode string) (item *BaseFromEiaSteoIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_eia_steo_index WHERE index_code=? `
+	err = o.Raw(sql, indexCode).QueryRow(&item)
+	return
+}

+ 93 - 0
models/data_manage/base_from_national_statistics_data.go

@@ -0,0 +1,93 @@
+package data_manage
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strings"
+	"time"
+)
+
+// BaseFromNationalStatisticsData 国统局-指标
+type BaseFromNationalStatisticsData struct {
+	BaseFromNationalStatisticsDataId  int       `orm:"column(base_from_national_statistics_data_id);pk"`
+	BaseFromNationalStatisticsIndexId int       `description:"指标ID"`
+	IndexCode                         string    `description:"指标编码"`
+	DataTime                          time.Time `description:"数据日期"`
+	Value                             float64   `description:"数据值"`
+	CreateTime                        time.Time `description:"创建时间"`
+	ModifyTime                        time.Time `description:"更新时间"`
+}
+
+func (m *BaseFromNationalStatisticsData) TableName() string {
+	return "base_from_national_statistics_data"
+}
+
+func (m *BaseFromNationalStatisticsData) Create() (err error) {
+	o := orm.NewOrmUsingDB("data")
+	id, err := o.Insert(m)
+	if err != nil {
+		return
+	}
+	m.BaseFromNationalStatisticsDataId = int(id)
+	return
+}
+
+func (m *BaseFromNationalStatisticsData) CreateMulti(items []*BaseFromNationalStatisticsData) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.InsertMulti(len(items), items)
+	return
+}
+
+func (m *BaseFromNationalStatisticsData) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Update(m, cols...)
+	return
+}
+
+func (m *BaseFromNationalStatisticsData) Del() (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `DELETE FROM base_from_national_statistics_data WHERE base_from_national_statistics_data_id = ? LIMIT 1`
+	_, err = o.Raw(sql, m.BaseFromNationalStatisticsDataId).Exec()
+	return
+}
+
+func (m *BaseFromNationalStatisticsData) GetItemById(id int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_national_statistics_data WHERE base_from_national_statistics_data_id = ? LIMIT 1`
+	err = o.Raw(sql, id).QueryRow(&m)
+	return
+}
+
+func (m *BaseFromNationalStatisticsData) GetItemByCondition(condition string, pars []interface{}) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_national_statistics_data WHERE 1=1 `
+	sql += condition
+	sql += ` LIMIT 1`
+	err = o.Raw(sql, pars).QueryRow(&m)
+	return
+}
+
+func (m *BaseFromNationalStatisticsData) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+func (m *BaseFromNationalStatisticsData) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*BaseFromNationalStatisticsData, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 260 - 0
models/data_manage/base_from_national_statistics_index.go

@@ -0,0 +1,260 @@
+package data_manage
+
+import (
+	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strings"
+	"time"
+)
+
+// BaseFromNationalStatisticsIndex 国统局-指标
+type BaseFromNationalStatisticsIndex struct {
+	BaseFromNationalStatisticsIndexId    int       `orm:"column(base_from_national_statistics_index_id);pk"`
+	BaseFromNationalStatisticsClassifyId int       `description:"指标分类ID"`
+	Dbcode                               string    `description:"dbcode"`
+	IndexCode                            string    `description:"指标编码"`
+	IndexName                            string    `description:"指标名称"`
+	Unit                                 string    `description:"单位"`
+	Frequency                            string    `description:"频度"`
+	Reg                                  string    `description:"地区"`
+	StartDate                            time.Time `description:"开始日期"`
+	EndDate                              time.Time `description:"结束日期"`
+	CreateTime                           time.Time `description:"创建时间"`
+	ModifyTime                           time.Time `description:"更新时间"`
+}
+
+func (m *BaseFromNationalStatisticsIndex) TableName() string {
+	return "base_from_national_statistics_index"
+}
+
+func (m *BaseFromNationalStatisticsIndex) Create() (err error) {
+	o := orm.NewOrmUsingDB("data")
+	id, err := o.Insert(m)
+	if err != nil {
+		return
+	}
+	m.BaseFromNationalStatisticsIndexId = int(id)
+	return
+}
+
+func (m *BaseFromNationalStatisticsIndex) CreateMulti(items []*BaseFromNationalStatisticsIndex) (err error) {
+	if len(items) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.InsertMulti(len(items), items)
+	return
+}
+
+func (m *BaseFromNationalStatisticsIndex) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Update(m, cols...)
+	return
+}
+
+func (m *BaseFromNationalStatisticsIndex) Del() (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `DELETE FROM base_from_national_statistics_index WHERE base_from_national_statistics_index_id = ? LIMIT 1`
+	_, err = o.Raw(sql, m.BaseFromNationalStatisticsIndexId).Exec()
+	return
+}
+
+func (m *BaseFromNationalStatisticsIndex) GetItemById(id int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_national_statistics_index WHERE base_from_national_statistics_index_id = ? LIMIT 1`
+	err = o.Raw(sql, id).QueryRow(&m)
+	return
+}
+
+func (m *BaseFromNationalStatisticsIndex) GetItemByCondition(condition string, pars []interface{}) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_national_statistics_index WHERE 1=1 `
+	sql += condition
+	sql += ` LIMIT 1`
+	err = o.Raw(sql, pars).QueryRow(&m)
+	return
+}
+
+func (m *BaseFromNationalStatisticsIndex) GetCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE 1=1 %s`, m.TableName(), condition)
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+func (m *BaseFromNationalStatisticsIndex) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string, limitNum int) (items []*BaseFromNationalStatisticsIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY create_time DESC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	limit := ``
+	if limitNum > 0 {
+		limit += fmt.Sprintf(` LIMIT %d`, limitNum)
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s %s`, fields, m.TableName(), condition, order, limit)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// SaveNationalStatisticsIndexAndDataReq 保存指标和数据请求体
+type SaveNationalStatisticsIndexAndDataReq struct {
+	Index      *BaseFromNationalStatisticsIndex  `description:"指标信息"`
+	IndexExist bool                              `description:"指标是否存在"`
+	DataList   []*BaseFromNationalStatisticsData `description:"新增的指标数据"`
+}
+
+// SaveNationalStatisticsIndexAndData 保存指标和值
+func SaveNationalStatisticsIndexAndData(req *SaveNationalStatisticsIndexAndDataReq) (err error) {
+	if req.Index == nil {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	tx, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+			return
+		}
+		_ = tx.Commit()
+	}()
+
+	if !req.IndexExist {
+		id, e := tx.Insert(req.Index)
+		if e != nil {
+			return e
+		}
+		req.Index.BaseFromNationalStatisticsIndexId = int(id)
+	}
+	indexId := req.Index.BaseFromNationalStatisticsIndexId
+	if req.DataList != nil && len(req.DataList) > 0 {
+		for _, d := range req.DataList {
+			d.BaseFromNationalStatisticsIndexId = indexId
+		}
+		_, e := tx.InsertMulti(len(req.DataList), req.DataList)
+		if e != nil {
+			return e
+		}
+	}
+	return
+}
+
+// BatchSaveNationalStatisticsIndexAndData 批量保存指标和值
+func BatchSaveNationalStatisticsIndexAndData(indexArr []*BaseFromNationalStatisticsIndex, indexDataMap map[string][]*BaseFromNationalStatisticsData) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	tx, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+			return
+		}
+		_ = tx.Commit()
+	}()
+
+	// 指标
+	for _, v := range indexArr {
+		id, e := tx.Insert(v)
+		if e != nil {
+			return e
+		}
+		indexId := int(id)
+
+		// 数据
+		dataList := indexDataMap[v.IndexCode]
+		if dataList != nil && len(dataList) > 0 {
+			for _, d := range dataList {
+				d.BaseFromNationalStatisticsIndexId = indexId
+			}
+			_, e = tx.InsertMulti(len(dataList), dataList)
+			if e != nil {
+				return e
+			}
+		}
+	}
+	return
+}
+
+// UpdateNationalStatisticsIndexStartEndDate 更新指标开始结束日期
+func UpdateNationalStatisticsIndexStartEndDate() (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `UPDATE base_from_national_statistics_index AS a
+			JOIN (
+				SELECT
+					index_code,
+					MIN(data_time) AS min_time,
+					MAX(data_time) AS max_time
+				FROM
+					base_from_national_statistics_data
+				GROUP BY
+					index_code
+			) AS b ON a.index_code = b.index_code
+			SET a.start_date = b.min_time, a.end_date = b.max_time`
+	_, err = o.Raw(sql).Exec()
+	return
+}
+
+type BaseFromNationalStatisticsIndexItem struct {
+	IndexId          int    `description:"指标ID"`
+	ClassifyId       int    `description:"指标分类ID"`
+	Dbcode           string `description:"dbcode"`
+	IndexCode        string `description:"指标编码"`
+	IndexName        string `description:"指标名称"`
+	Unit             string `description:"单位"`
+	Frequency        string `description:"频度"`
+	Reg              string `description:"地区"`
+	StartDate        string `description:"开始日期"`
+	EndDate          string `description:"结束日期"`
+	CreateTime       string `description:"创建时间"`
+	ModifyTime       string `description:"更新时间"`
+	ChildrenIndexIds []int  `description:"有地区维度的指标-子指标ID集合-用于前端定位"`
+}
+
+type BaseFromNationalStatisticsIndexListResp struct {
+	List    []*BaseFromNationalStatisticsIndexItem `description:"指标列表"`
+	RegList []string                               `description:"地区列表"`
+}
+
+func FormatBaseFromNationalStatisticsIndex2Item(v *BaseFromNationalStatisticsIndex) (item *BaseFromNationalStatisticsIndexItem) {
+	item = new(BaseFromNationalStatisticsIndexItem)
+	item.IndexId = v.BaseFromNationalStatisticsIndexId
+	item.ClassifyId = v.BaseFromNationalStatisticsClassifyId
+	item.Dbcode = v.Dbcode
+	item.IndexCode = v.IndexCode
+	item.IndexName = v.IndexName
+	item.Unit = v.Unit
+	item.Frequency = v.Frequency
+	item.Reg = v.Reg
+	item.StartDate = v.StartDate.Format(utils.FormatDate)
+	item.EndDate = v.EndDate.Format(utils.FormatDate)
+	item.CreateTime = v.CreateTime.Format(utils.FormatDateTime)
+	item.ModifyTime = v.ModifyTime.Format(utils.FormatDateTime)
+	return
+}
+
+type BaseFromNationalStatisticsIndexDetailItem struct {
+	BaseFromNationalStatisticsIndexItem
+	DataList []*BaseFromNationalStatisticsIndexDetailData `description:"数据列表"`
+}
+
+type BaseFromNationalStatisticsIndexDetailData struct {
+	DataTime string  `description:"数据日期"`
+	Value    float64 `description:"数据值"`
+}
+
+func GetBaseFromNationalStatisticsIndexByIndexCode(indexCode string) (item *BaseFromNationalStatisticsIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_national_statistics_index WHERE index_code = ? LIMIT 1`
+	err = o.Raw(sql, indexCode).QueryRow(&item)
+	return
+}

+ 321 - 0
models/data_manage/base_from_sci.go

@@ -0,0 +1,321 @@
+package data_manage
+
+import (
+	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type BaseFromSci struct {
+	BaseFromSciId int `orm:"column(base_from_sci_id);pk"`
+	Aid           int
+	Name          string
+	Interface     string
+	ApiUpdate     int
+	ApiUpdateType string
+	ApiType       int
+	ApiTypeAll    string
+	Type1         string `orm:"column(type_1)"`
+	Type2         string `orm:"column(type_2)"`
+	Type3         string `orm:"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
+}
+
+func AddBaseFromSci(item *BaseFromSci) (lastId int64, err error) {
+	o := orm.NewOrmUsingDB("data")
+	lastId, err = o.Insert(item)
+	return
+}
+
+func GetBaseFromSciList() (list []*BaseFromSci, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_sci `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+func GetBaseFromSciBySciCode(sciCode string) (item *BaseFromSci, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_sci WHERE interface=?`
+	err = o.Raw(sql, sciCode).QueryRow(&item)
+	return
+}
+
+type BaseFromSciIndex struct {
+	BaseFromSciIndexId int `orm:"column(base_from_sci_index_id);pk"`
+	ClassifyId         int
+	Interface          string
+	IndexCode          string
+	IndexName          string
+	Frequency          string
+	Unit               string
+	Sort               int
+	CreateTime         time.Time
+	ModifyTime         time.Time
+}
+
+func AddBaseFromSciIndex(item *BaseFromSciIndex) (lastId int64, err error) {
+	o := orm.NewOrmUsingDB("data")
+	lastId, err = o.Insert(item)
+	return
+}
+
+func GetBaseFromSciIndex() (list []*BaseFromSciIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_sci_index `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+type BaseFromSciData struct {
+	SciDataId          int `orm:"column(sci_data_id);pk"`
+	BaseFromSciIndexId int
+	IndexCode          string
+	DataTime           string
+	Value              string
+	CreateTime         time.Time
+	ModifyTime         time.Time
+	DataTimestamp      int64
+}
+
+func AddBaseFromSciData(item *BaseFromSciData) (lastId int64, err error) {
+	o := orm.NewOrmUsingDB("data")
+	lastId, err = o.Insert(item)
+	return
+}
+
+func GetBaseFromSciDataAll() (list []*BaseFromSciData, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_sci_data `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+func ModifyBaseFromSciData(sciDataId int, value string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `UPDATE base_from_sci_data SET value=?,modify_time=NOW() WHERE sci_data_id=? `
+	_, err = o.Raw(sql, value, sciDataId).Exec()
+	return
+}
+
+func GetBaseFromSciIndexBySciCode(sciCode string) (list []*BaseFromSciIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_sci_index WHERE interface=? `
+	_, err = o.Raw(sql, sciCode).QueryRows(&list)
+	return
+}
+
+func GetBaseFromSciMaxOrMinDate(indexCode string) (min_date, max_date string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date FROM base_from_sci_data WHERE index_code=? `
+	err = o.Raw(sql, indexCode).QueryRow(&min_date, &max_date)
+	return
+}
+
+func ModifyBaseFromSciMinDateAndMaxDate(baseFromSciIndexId int, minDate, maxDate string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` UPDATE base_from_sci_index SET start_date=?,end_date=?,modify_time=NOW() WHERE base_from_sci_index_id=? `
+	_, err = o.Raw(sql, minDate, maxDate, baseFromSciIndexId).Exec()
+	return
+}
+
+func GetBaseFromSciDataAllByIndexCode(indexCode string) (list []*BaseFromSciData, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_sci_data WHERE index_code=? `
+	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	return
+}
+
+func GetBaseFromSciIndexByIndexCode(indexCode string) (list *BaseFromSciIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_sci_index WHERE index_code=? `
+	err = o.Raw(sql, indexCode).QueryRow(&list)
+	return
+}
+
+// GetBaseFromSciIndexCountByClassifyIds 获取分类下指标的个数
+func GetBaseFromSciIndexCountByClassifyIds(classifyIds []int) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	num := len(classifyIds)
+	if num <= 0 {
+		return
+	}
+	sql := `SELECT COUNT(1) AS count FROM base_from_sci_index WHERE classify_id IN (` + utils.GetOrmInReplace(num) + `) `
+	err = o.Raw(sql, classifyIds).QueryRow(&count)
+	return
+}
+
+// GetBaseFromSciIndexByClassifyId 获取根据分类查询指标
+func GetBaseFromSciIndexByClassifyId(classifyId int) (list []*BaseFromSciIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_sci_index WHERE classify_id =? ORDER BY sort ASC, base_from_sci_index_id ASC `
+	_, err = o.Raw(sql, classifyId).QueryRows(&list)
+	return
+}
+
+// GetSciIndexAll 用于分类展示
+//func GetSciIndexAll() (items []*BaseFromSciClassifyItems, err error) {
+//	o := orm.NewOrmUsingDB("data")
+//	sql := ` SELECT base_from_sci_index_id, classify_id, index_name as classify_name, index_code as base_from_sci_index_code
+//            FROM base_from_sci_index ORDER BY sort ASC, base_from_sci_index_id ASC `
+//	_, err = o.Raw(sql).QueryRows(&items)
+//	return
+//}
+
+// GetBaseFromSciIndexByIndexId 根据指标id获取指标信息
+func GetBaseFromSciIndexByIndexId(indexId int) (item *BaseFromSciIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_sci_index WHERE base_from_sci_index_id=? `
+	err = o.Raw(sql, indexId).QueryRow(&item)
+	return
+}
+
+// GetBaseFromSciIndexMaxSortByClassifyId 根据指标id获取指标信息
+func GetBaseFromSciIndexMaxSortByClassifyId(classifyId int) (sort int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT max(sort) FROM base_from_sci_index WHERE classify_id=? `
+	err = o.Raw(sql, classifyId).QueryRow(&sort)
+	return
+}
+
+// GetBaseFromSciIndexMinSortByClassifyId 获取最小不等于0的排序
+func GetBaseFromSciIndexMinSortByClassifyId(classifyId int) (sort int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT min(sort) FROM base_from_sci_index WHERE classify_id=? and sort <> 0 `
+	err = o.Raw(sql, classifyId).QueryRow(&sort)
+	return
+}
+
+type BaseFromSciIndexType struct {
+	Type2 string `orm:"column(type_2)"`
+	Type3 string `orm:"column(type_3)"`
+}
+
+// GetBaseFromSciIndexType 获取历史指标信息类型
+func GetBaseFromSciIndexType() (list []BaseFromSciIndexType, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT type_2, type_3 from base_from_sci_index where type_2 <> "" GROUP BY type_2, type_3`
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+// MoveBaseFromSciIndex 移动指标分类
+func MoveBaseFromSciIndex(chartInfoId, classifyId int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` UPDATE base_from_sci_index
+			SET
+			  classify_id = ?, modify_time=NOW() 
+			WHERE base_from_sci_index_id = ?`
+	_, err = o.Raw(sql, classifyId, chartInfoId).Exec()
+	return
+}
+
+// UpdateBaseFromSciIndexByClassifyId 根据指标id更新排序
+func UpdateBaseFromSciIndexByClassifyId(classifyId, nowSort, prevIndexInfoId int, updateSort string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` update base_from_sci_index set sort = ` + updateSort + ` WHERE classify_id=? AND  `
+	if prevIndexInfoId > 0 {
+		sql += ` ( sort > ? or (base_from_sci_index_id > ` + fmt.Sprint(prevIndexInfoId) + ` and sort = ` + fmt.Sprint(nowSort) + `))`
+	}
+	_, err = o.Raw(sql, classifyId, nowSort).Exec()
+	return
+}
+
+// MoveUpSciIndexBySort 往上移动
+func MoveUpSciIndexBySort(classifyId, nextSort, currentSort int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `update base_from_sci_index set sort = sort + 1 where classify_id=? and sort >= ? and sort< ?`
+	_, err = o.Raw(sql, classifyId, nextSort, currentSort).Exec()
+	return
+}
+
+// MoveDownSciIndexBySort 往下移动
+func MoveDownSciIndexBySort(classifyId, prevSort, currentSort int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `update base_from_sci_index set sort = sort - 1 where classify_id=? and sort <= ? and sort> ? `
+	_, err = o.Raw(sql, classifyId, prevSort, currentSort).Exec()
+	return
+}
+
+// GetFirstBaseFromSciIndexByClassifyId 获取当前分类下,且排序数相同 的排序第一条的数据
+func GetFirstBaseFromSciIndexByClassifyId(classifyId int) (item *BaseFromSciIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_sci_index WHERE classify_id=? order by sort asc,base_from_sci_index_id asc limit 1`
+	err = o.Raw(sql, classifyId).QueryRow(&item)
+	return
+}
+
+// Update 更新Sci指标基础信息
+func (item *BaseFromSciIndex) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Update(item, cols...)
+	return
+}
+
+// DeleteBaseFromSciIndexById 根据指标id删除对应的指标、指标数据
+func DeleteBaseFromSciIndexById(sciIndexId int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	//删除指标
+	sql := `DELETE FROM base_from_sci_index WHERE base_from_sci_index_id = ? `
+	_, err = to.Raw(sql, sciIndexId).Exec()
+	if err != nil {
+		return
+	}
+
+	//删除指标数据
+	sql = `DELETE FROM base_from_sci_data WHERE base_from_sci_index_id = ? `
+	_, err = to.Raw(sql, sciIndexId).Exec()
+	if err != nil {
+		return
+	}
+
+	return
+}
+
+// EditSciIndexInfoResp 新增指标的返回
+type EditSciIndexInfoResp struct {
+	BaseFromSciIndexId int    `description:"指标ID"`
+	IndexCode          string `description:"指标code"`
+}
+
+//type SciSingleDataResp struct {
+//	BaseFromSciIndexId int
+//	ClassifyId         int
+//	Interface          string
+//	Name               string
+//	IndexCode          string
+//	IndexName          string
+//	Frequency          string
+//	Unit               string
+//	ApiStartTime       string
+//	ApiUpdateTime      string
+//	StartTime          string
+//	FinishTime         string
+//	CreateTime         string
+//	ModifyTime         string
+//	Data               []*SciIndexData
+//}

+ 329 - 0
models/data_manage/base_from_smm.go

@@ -0,0 +1,329 @@
+package data_manage
+
+import (
+	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type BaseFromSmm struct {
+	BaseFromSmmId int `orm:"column(base_from_smm_id);pk"`
+	Aid           int
+	Name          string
+	Interface     string
+	ApiUpdate     int
+	ApiUpdateType string
+	ApiType       int
+	ApiTypeAll    string
+	Type1         string `orm:"column(type_1)"`
+	Type2         string `orm:"column(type_2)"`
+	Type3         string `orm:"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
+}
+
+func AddBaseFromSmm(item *BaseFromSmm) (lastId int64, err error) {
+	o := orm.NewOrmUsingDB("data")
+	lastId, err = o.Insert(item)
+	return
+}
+
+func GetBaseFromSmmList() (list []*BaseFromSmm, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_smm `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+func GetBaseFromSmmBySmmCode(smmCode string) (item *BaseFromSmm, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_smm WHERE interface=?`
+	err = o.Raw(sql, smmCode).QueryRow(&item)
+	return
+}
+
+type BaseFromSmmIndex struct {
+	BaseFromSmmIndexId int `orm:"column(base_from_smm_index_id);pk"`
+	ClassifyId         int
+	Interface          string
+	Name               string
+	IndexCode          string
+	IndexName          string
+	Type1              string `orm:"column(type_1)"`
+	Type2              string `orm:"column(type_2)"`
+	Type3              string `orm:"column(type_3)"`
+	Frequency          string
+	Unit               string
+	ApiStartTime       string
+	ApiUpdateTime      string
+	StartTime          string
+	FinishTime         string
+	Sort               int
+	CreateTime         time.Time
+	ModifyTime         time.Time
+}
+
+func AddBaseFromSmmIndex(item *BaseFromSmmIndex) (lastId int64, err error) {
+	o := orm.NewOrmUsingDB("data")
+	lastId, err = o.Insert(item)
+	return
+}
+
+func GetBaseFromSmmIndex() (list []*BaseFromSmmIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_smm_index `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+type BaseFromSmmData struct {
+	SmmDataId          int `orm:"column(smm_data_id);pk"`
+	BaseFromSmmIndexId int
+	IndexCode          string
+	DataTime           string
+	Value              string
+	CreateTime         time.Time
+	ModifyTime         time.Time
+	DataTimestamp      int64
+}
+
+func AddBaseFromSmmData(item *BaseFromSmmData) (lastId int64, err error) {
+	o := orm.NewOrmUsingDB("data")
+	lastId, err = o.Insert(item)
+	return
+}
+
+func GetBaseFromSmmDataAll() (list []*BaseFromSmmData, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_smm_data `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+func ModifyBaseFromSmmData(smmDataId int, value string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `UPDATE base_from_smm_data SET value=?,modify_time=NOW() WHERE smm_data_id=? `
+	_, err = o.Raw(sql, value, smmDataId).Exec()
+	return
+}
+
+func GetBaseFromSmmIndexBySmmCode(smmCode string) (list []*BaseFromSmmIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_smm_index WHERE interface=? `
+	_, err = o.Raw(sql, smmCode).QueryRows(&list)
+	return
+}
+
+func GetBaseFromSmmMaxOrMinDate(indexCode string) (min_date, max_date string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date FROM base_from_smm_data WHERE index_code=? `
+	err = o.Raw(sql, indexCode).QueryRow(&min_date, &max_date)
+	return
+}
+
+func ModifyBaseFromSmmMinDateAndMaxDate(baseFromSmmIndexId int, minDate, maxDate string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` UPDATE base_from_smm_index SET start_date=?,end_date=?,modify_time=NOW() WHERE base_from_smm_index_id=? `
+	_, err = o.Raw(sql, minDate, maxDate, baseFromSmmIndexId).Exec()
+	return
+}
+
+func GetBaseFromSmmDataAllByIndexCode(indexCode string) (list []*BaseFromSmmData, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_smm_data WHERE index_code=? `
+	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	return
+}
+
+func GetBaseFromSmmIndexByIndexCode(indexCode string) (list *BaseFromSmmIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_smm_index WHERE index_code=? `
+	err = o.Raw(sql, indexCode).QueryRow(&list)
+	return
+}
+
+// GetBaseFromSmmIndexCountByClassifyIds 获取分类下指标的个数
+func GetBaseFromSmmIndexCountByClassifyIds(classifyIds []int) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	num := len(classifyIds)
+	if num <= 0 {
+		return
+	}
+	sql := `SELECT COUNT(1) AS count FROM base_from_smm_index WHERE classify_id IN (` + utils.GetOrmInReplace(num) + `) `
+	err = o.Raw(sql, classifyIds).QueryRow(&count)
+	return
+}
+
+// GetBaseFromSmmIndexByClassifyId 获取根据分类查询指标
+func GetBaseFromSmmIndexByClassifyId(classifyId int) (list []*BaseFromSmmIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_smm_index WHERE classify_id =? ORDER BY sort ASC, base_from_smm_index_id ASC `
+	_, err = o.Raw(sql, classifyId).QueryRows(&list)
+	return
+}
+
+// GetSmmIndexAll 用于分类展示
+//func GetSmmIndexAll() (items []*BaseFromSmmClassifyItems, err error) {
+//	o := orm.NewOrmUsingDB("data")
+//	sql := ` SELECT base_from_smm_index_id, classify_id, index_name as classify_name, index_code as base_from_smm_index_code
+//            FROM base_from_smm_index ORDER BY sort ASC, base_from_smm_index_id ASC `
+//	_, err = o.Raw(sql).QueryRows(&items)
+//	return
+//}
+
+// GetBaseFromSmmIndexByIndexId 根据指标id获取指标信息
+func GetBaseFromSmmIndexByIndexId(indexId int) (item *BaseFromSmmIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_smm_index WHERE base_from_smm_index_id=? `
+	err = o.Raw(sql, indexId).QueryRow(&item)
+	return
+}
+
+// GetBaseFromSmmIndexMaxSortByClassifyId 根据指标id获取指标信息
+func GetBaseFromSmmIndexMaxSortByClassifyId(classifyId int) (sort int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT max(sort) FROM base_from_smm_index WHERE classify_id=? `
+	err = o.Raw(sql, classifyId).QueryRow(&sort)
+	return
+}
+
+// GetBaseFromSmmIndexMinSortByClassifyId 获取最小不等于0的排序
+func GetBaseFromSmmIndexMinSortByClassifyId(classifyId int) (sort int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT min(sort) FROM base_from_smm_index WHERE classify_id=? and sort <> 0 `
+	err = o.Raw(sql, classifyId).QueryRow(&sort)
+	return
+}
+
+type BaseFromSmmIndexType struct {
+	Type2 string `orm:"column(type_2)"`
+	Type3 string `orm:"column(type_3)"`
+}
+
+// GetBaseFromSmmIndexType 获取历史指标信息类型
+func GetBaseFromSmmIndexType() (list []BaseFromSmmIndexType, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT type_2, type_3 from base_from_smm_index where type_2 <> "" GROUP BY type_2, type_3`
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+// MoveBaseFromSmmIndex 移动指标分类
+func MoveBaseFromSmmIndex(chartInfoId, classifyId int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` UPDATE base_from_smm_index
+			SET
+			  classify_id = ?, modify_time=NOW() 
+			WHERE base_from_smm_index_id = ?`
+	_, err = o.Raw(sql, classifyId, chartInfoId).Exec()
+	return
+}
+
+// UpdateBaseFromSmmIndexByClassifyId 根据指标id更新排序
+func UpdateBaseFromSmmIndexByClassifyId(classifyId, nowSort, prevIndexInfoId int, updateSort string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` update base_from_smm_index set sort = ` + updateSort + ` WHERE classify_id=? AND  `
+	if prevIndexInfoId > 0 {
+		sql += ` ( sort > ? or (base_from_smm_index_id > ` + fmt.Sprint(prevIndexInfoId) + ` and sort = ` + fmt.Sprint(nowSort) + `))`
+	}
+	_, err = o.Raw(sql, classifyId, nowSort).Exec()
+	return
+}
+
+// MoveUpSmmIndexBySort 往上移动
+func MoveUpSmmIndexBySort(classifyId, nextSort, currentSort int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `update base_from_smm_index set sort = sort + 1 where classify_id=? and sort >= ? and sort< ?`
+	_, err = o.Raw(sql, classifyId, nextSort, currentSort).Exec()
+	return
+}
+
+// MoveDownSmmIndexBySort 往下移动
+func MoveDownSmmIndexBySort(classifyId, prevSort, currentSort int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `update base_from_smm_index set sort = sort - 1 where classify_id=? and sort <= ? and sort> ? `
+	_, err = o.Raw(sql, classifyId, prevSort, currentSort).Exec()
+	return
+}
+
+// GetFirstBaseFromSmmIndexByClassifyId 获取当前分类下,且排序数相同 的排序第一条的数据
+func GetFirstBaseFromSmmIndexByClassifyId(classifyId int) (item *BaseFromSmmIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_smm_index WHERE classify_id=? order by sort asc,base_from_smm_index_id asc limit 1`
+	err = o.Raw(sql, classifyId).QueryRow(&item)
+	return
+}
+
+// Update 更新Smm指标基础信息
+func (item *BaseFromSmmIndex) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Update(item, cols...)
+	return
+}
+
+// DeleteBaseFromSmmIndexById 根据指标id删除对应的指标、指标数据
+func DeleteBaseFromSmmIndexById(smmIndexId int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	//删除指标
+	sql := `DELETE FROM base_from_smm_index WHERE base_from_smm_index_id = ? `
+	_, err = to.Raw(sql, smmIndexId).Exec()
+	if err != nil {
+		return
+	}
+
+	//删除指标数据
+	sql = `DELETE FROM base_from_smm_data WHERE base_from_smm_index_id = ? `
+	_, err = to.Raw(sql, smmIndexId).Exec()
+	if err != nil {
+		return
+	}
+
+	return
+}
+
+// EditSmmIndexInfoResp 新增指标的返回
+type EditSmmIndexInfoResp struct {
+	BaseFromSmmIndexId int    `description:"指标ID"`
+	IndexCode          string `description:"指标code"`
+}
+
+//type SmmSingleDataResp struct {
+//	BaseFromSmmIndexId int
+//	ClassifyId         int
+//	Interface          string
+//	Name               string
+//	IndexCode          string
+//	IndexName          string
+//	Frequency          string
+//	Unit               string
+//	ApiStartTime       string
+//	ApiUpdateTime      string
+//	StartTime          string
+//	FinishTime         string
+//	CreateTime         string
+//	ModifyTime         string
+//	Data               []*SmmIndexData
+//}

+ 690 - 0
models/data_manage/base_from_trade_index.go

@@ -0,0 +1,690 @@
+package data_manage
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+type BaseFromTradeShanghaiIndex struct {
+	BaseFromTradeShangHaiIndexId int `orm:"column(base_from_trade_shanghai_index_id);pk"`
+	Rank                         int
+	DealShortName                string
+	DealName                     string
+	DealCode                     string
+	DealValue                    string
+	DealChange                   string
+	BuyShortName                 string
+	BuyName                      string
+	BuyCode                      string
+	BuyValue                     string
+	BuyChange                    string
+	SoldShortName                string
+	SoldName                     string
+	SoldCode                     string
+	SoldValue                    string
+	SoldChange                   string
+	Frequency                    string
+	ClassifyName                 string
+	ClassifyType                 string
+	CreateTime                   time.Time
+	ModifyTime                   time.Time
+	DataTime                     string
+}
+
+type BaseFromTradeCffexIndex struct {
+	BaseFromTradeCffexIndexId int `orm:"column(base_from_trade_cffex_index_id);pk"`
+	Rank                      int
+	DealShortName             string
+	DealName                  string
+	DealCode                  string
+	DealValue                 string
+	DealChange                string
+	BuyShortName              string
+	BuyName                   string
+	BuyCode                   string
+	BuyValue                  string
+	BuyChange                 string
+	SoldShortName             string
+	SoldName                  string
+	SoldCode                  string
+	SoldValue                 string
+	SoldChange                string
+	Frequency                 string
+	ClassifyName              string
+	ClassifyType              string
+	CreateTime                time.Time
+	ModifyTime                time.Time
+	DataTime                  string
+}
+
+type BaseFromTradeIneIndex struct {
+	BaseFromTradeIneIndexId int `orm:"column(base_from_trade_ine_index_id);pk"`
+	Rank                    int
+	DealShortName           string
+	DealName                string
+	DealCode                string
+	DealValue               string
+	DealChange              string
+	BuyShortName            string
+	BuyName                 string
+	BuyCode                 string
+	BuyValue                string
+	BuyChange               string
+	SoldShortName           string
+	SoldName                string
+	SoldCode                string
+	SoldValue               string
+	SoldChange              string
+	Frequency               string
+	ClassifyName            string
+	ClassifyType            string
+	CreateTime              time.Time
+	ModifyTime              time.Time
+	DataTime                string
+}
+
+type BaseFromTradeEicIndex struct {
+	BaseFromEicIndexId     int `orm:"column(base_from_eic_index_id);pk"`
+	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 GetBaseFromTradeIndexByParam(exchange, date, classifyName, classifyType string) (list []*BaseFromTradeShanghaiIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	if classifyName == "" {
+		sql := "SELECT * FROM base_from_trade_" + exchange + "_index where data_time=?"
+		_, err = o.Raw(sql, date).QueryRows(&list)
+		return
+	} else if classifyType == "" {
+		sql := "SELECT * FROM base_from_trade_" + exchange + "_index where data_time=? and classify_name=? ORDER BY classify_type,rank"
+		_, err = o.Raw(sql, date, classifyName).QueryRows(&list)
+		return
+	} else {
+		sql := "SELECT * FROM base_from_trade_" + exchange + "_index where data_time=? and classify_name=? and classify_type=?"
+		_, err = o.Raw(sql, date, classifyName, classifyType).QueryRows(&list)
+		return
+	}
+}
+
+func GetExchangeClassify(exchange, dataTime string) (classifyName []*string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := "SELECT DISTINCT classify_name FROM base_from_trade_" + exchange + "_index where data_time=? ORDER BY CONVERT(classify_name using gbk) DESC"
+	_, err = o.Raw(sql, dataTime).QueryRows(&classifyName)
+	return
+}
+
+func GetLatestDate(exchange string) (date []*BaseFromTradeIneIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := "SELECT * FROM base_from_trade_" + exchange + "_index ORDER BY data_time desc limit 1"
+	_, err = o.Raw(sql).QueryRows(&date)
+	return
+}
+
+func GetExchangeClassifyContract(exchange, Classify, dataTime string) (classifyName []*string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := "SELECT DISTINCT classify_type FROM base_from_trade_" + exchange + "_index where classify_name=? and data_time=?"
+	_, err = o.Raw(sql, Classify, dataTime).QueryRows(&classifyName)
+	return
+}
+
+func GetContinentEicDate(date string) (data []*BaseFromTradeEicIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := "SELECT * FROM base_from_trade_eic_index where gas_day_started_on=? and type='continent' "
+	_, err = o.Raw(sql, date).QueryRows(&data)
+	return
+}
+
+func GetCountryEicDate(date string) (data []*BaseFromTradeEicIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := "SELECT * FROM base_from_trade_eic_index where gas_day_started_on=? and type='country' "
+	_, err = o.Raw(sql, date).QueryRows(&data)
+	return
+}
+
+func GetSSOEicDate(date, country string) (data []*BaseFromTradeEicIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := "SELECT * FROM base_from_trade_eic_index where gas_day_started_on=? and country=? and type='SSO' "
+	_, err = o.Raw(sql, date, country).QueryRows(&data)
+	return
+}
+
+func GetStorageEicDate(date, country string) (data []*BaseFromTradeEicIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := "SELECT * FROM base_from_trade_eic_index where gas_day_started_on=? and country=? " +
+		" and (type='Storage Facility' or type='Storage Group') "
+	_, err = o.Raw(sql, date, country).QueryRows(&data)
+	return
+}
+
+func GetEicDate() (date []*BaseFromTradeEicIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := "SELECT * FROM base_from_trade_eic_index ORDER BY gas_day_started_on desc limit 1"
+	_, err = o.Raw(sql).QueryRows(&date)
+	return
+}
+
+func GetEicHistoryDate(code string) (date []*BaseFromTradeEicIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := "SELECT * FROM base_from_trade_eic_index WHERE eic_code=? ORDER BY gas_day_started_on desc limit 30"
+	_, err = o.Raw(sql, code).QueryRows(&date)
+	return
+}
+
+func GetEicHistoryDateByDate(code, startDate, endDate string) (date []*BaseFromTradeEicIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := "SELECT * FROM base_from_trade_eic_index WHERE eic_code=? and gas_day_started_on between ? and ? ORDER BY gas_day_started_on desc"
+	_, err = o.Raw(sql, code, startDate, endDate).QueryRows(&date)
+	return
+}
+
+type BaseFromCoalmineJsmIndex struct {
+	BaseFromCoalmineJsmIndexId int    `orm:"column(base_from_coalmine_jsm_index_id);pk"`
+	IndexName                  string `description:"持买单量指标名称"`
+	IndexCode                  string `description:"持买单量指标编码"`
+	Exchange                   string `description:"样本统计类别"`
+	DealValue                  string `description:"成交量"`
+	DataTime                   string `description:"数据日期"`
+	Source                     string `description:"来源"`
+	Province                   string `description:"省份"`
+	Description                string `description:"描述"`
+	Unit                       string `description:"单位"`
+	Frequency                  string `description:"频率"`
+	CreateTime                 string `description:"插入时间"`
+	ModifyTime                 string `description:"修改时间"`
+}
+
+// GetBaseFromCoalmineIndex 查询数据
+func GetBaseFromCoalmineIndex(startDate, endDate string) (items []*BaseFromCoalmineJsmIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_coalmine_jsm_index WHERE data_time between ? and ? `
+	_, err = o.Raw(sql, startDate, endDate).QueryRows(&items)
+	return
+}
+
+type BaseFromCoalmineCompanyIndex struct {
+	BaseFromCoalmineCompanyIndexId int    `orm:"column(base_from_coalmine_company_index_id);pk"`
+	IndexName                      string `description:"持买单量指标名称"`
+	IndexCode                      string `description:"持买单量指标编码"`
+	DealValue                      string `description:"成交量"`
+	DataTime                       string `description:"数据日期"`
+	Source                         string `description:"来源"`
+	Province                       string `description:"省份"`
+	City                           string `description:"城市"`
+	GroupName                      string `description:"集团名称"`
+	Unit                           string `description:"单位"`
+	Frequency                      string `description:"频率"`
+	CreateTime                     string `description:"插入时间"`
+	ModifyTime                     string `description:"修改时间"`
+}
+
+// GetBaseFromCoalmineCompanyIndex 查询公司指标
+func GetBaseFromCoalmineCompanyIndex(startDate, endDate string) (items []*BaseFromCoalmineCompanyIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_coalmine_company_index WHERE data_time between ? and ? `
+	_, err = o.Raw(sql, startDate, endDate).QueryRows(&items)
+	return
+}
+
+// BaseFromCoalmineFirmIndex 煤矿产量周度公司数据表
+type BaseFromCoalmineFirmIndex struct {
+	BaseFromCoalmineFirmIndexID int    `orm:"column(base_from_coalmine_firm_index_id);pk"`
+	IndexName                   string // 省份/企业名称
+	IndexCode                   string // 持买单量指标编码
+	DataTime                    string // 指标时间
+	DealValue                   string // 数据量
+	GroupName                   string // 集团名
+	Source                      string // 来源
+	Unit                        string // 来源
+	Frequency                   string `description:"频率"`
+	CreateTime                  string `description:"插入时间"`
+	ModifyTime                  string `description:"修改时间"`
+}
+
+// 查询指标
+func GetBaseFromCoalmineFirmIndex(dataTime string) (items []*BaseFromCoalmineFirmIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_coalmine_firm_index WHERE data_time LIKE  `
+	sql = sql + "'" + dataTime + "%" + "'"
+	_, err = o.Raw(sql).QueryRows(&items)
+	fmt.Println(sql)
+	return
+}
+
+// BaseFromCoalmineCoastalIndex 沿海八省动力煤用户供耗存数据指标表
+type BaseFromCoalmineCoastalIndex struct {
+	BaseFromCoalmineCoastalIndexID int    `orm:"column(base_from_coalmine_coastal_index_id);pk"`
+	IndexName                      string // 省份/企业名称
+	IndexCode                      string // 持买单量指标编码
+	DataTime                       string // 指标时间
+	DealValue                      string // 数据量
+	GroupName                      string // 地区
+	Source                         string // 来源
+	Unit                           string //单位
+	Frequency                      string `description:"频率"`
+	CreateTime                     string `description:"插入时间"`
+	ModifyTime                     string `description:"修改时间"`
+}
+
+// 查询指标
+func GetBaseFromCoalmineCoastalIndex(startDate, endDate string) (items []*BaseFromCoalmineCoastalIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_coalmine_coastal_index WHERE data_time between ? and ? `
+	_, err = o.Raw(sql, startDate, endDate).QueryRows(&items)
+	return
+}
+
+// BaseFromCoalmineInlandIndex 内陆动力煤用户供耗存数据指标表
+type BaseFromCoalmineInlandIndex struct {
+	BaseFromCoalmineInlandIndexID int    `orm:"column(base_from_coalmine_inland_index_id);pk"`
+	IndexName                     string // 省份/企业名称
+	IndexCode                     string // 持买单量指标编码
+	DataTime                      string // 指标时间
+	DealValue                     string // 数据量
+	GroupName                     string // 地区
+	Source                        string // 来源
+	Unit                          string // 来源
+	Frequency                     string `description:"频率"`
+	CreateTime                    string `description:"插入时间"`
+	ModifyTime                    string `description:"修改时间"`
+}
+
+// 查询指标
+func GetBaseFromCoalmineInlandIndex(startDate, endDate string) (items []*BaseFromCoalmineInlandIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_coalmine_inland_index WHERE data_time between ? and ? `
+	_, err = o.Raw(sql, startDate, endDate).QueryRows(&items)
+	return
+}
+
+type BaseFromCoalmineClassify struct {
+	ClassifyId   int
+	ClassifyName string
+	Child        []CoalChild
+}
+
+type CoalChild struct {
+	ClassifyId   int
+	ClassifyName string
+}
+
+type CoalmineDataResp struct {
+	IndexName  string
+	IndexCode  string // 持买单量指标编码
+	Unit       string // 来源
+	Frequency  string
+	ModifyTime string
+	DataList   []DataList
+}
+
+type CoalmineDataPageResp struct {
+	IndexName  string
+	IndexCode  string // 持买单量指标编码
+	Unit       string // 来源
+	Frequency  string
+	ModifyTime string
+	Paging     *paging.PagingItem `description:"分页数据"`
+	DataList   []DataList
+}
+
+type CoalmineSingalDataResp struct {
+	IndexName  string
+	IndexCode  string // 持买单量指标编码
+	Unit       string // 来源
+	GroupId    int    // 二级id
+	GroupName  string // 二级名称
+	Frequency  string
+	ModifyTime string
+	ClassifyId int
+	DataList   []DataList
+}
+
+type DataList struct {
+	Value    string
+	DataTime string
+}
+
+type FrequencyResp struct {
+	Frequency int
+}
+
+// GetFrequencyFromCoal 获取指标信息
+func GetFrequencyFromCoal(suffix string) (list *string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT DISTINCT frequency FROM base_from_coalmine_%s `
+	sql = fmt.Sprintf(sql, suffix)
+	err = o.Raw(sql).QueryRow(&list)
+	return
+}
+
+// 查询数据
+func GetBaseFromCoalmineIndexByFrequency(frequency, groupName string) (items []*BaseFromCoalmineJsmIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_coalmine_jsm_index WHERE frequency=? AND province=?`
+	_, err = o.Raw(sql, frequency, groupName).QueryRows(&items)
+	return
+}
+
+// 查询数据
+func GetGroupNameFromCoalmineIndex(suffix string) (items []*string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT DISTINCT group_name FROM base_from_coalmine_%s `
+	sql = fmt.Sprintf(sql, suffix)
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// 查询数据
+func GetProvinceFromCoalmineIndex(suffix string) (items []*string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT DISTINCT province FROM base_from_coalmine_%s `
+	sql = fmt.Sprintf(sql, suffix)
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// 查询数据
+func GetClassifyCoalmineIndexByGroupName(groupName string) (items []*string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT DISTINCT index_code FROM base_from_coalmine_jsm_index WHERE province=? `
+	_, err = o.Raw(sql, groupName).QueryRows(&items)
+	return
+}
+
+// 查询数据
+func GetPageFromCoalmineIndexByFrequency(frequency, classify string, startSize, pageSize int) (items []*BaseFromCoalmineJsmIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_coalmine_jsm_index WHERE frequency=? AND index_code=? ORDER BY data_time DESC LIMIT ?,?  `
+	_, err = o.Raw(sql, frequency, classify, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// 查询数据
+func GetCountFromJsm(indexCode string) (item int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT COUNT(1) FROM base_from_coalmine_jsm_index WHERE index_code=? `
+	err = o.Raw(sql, indexCode).QueryRow(&item)
+	return
+}
+
+func GetClassifyCompanyByGroupName(groupName string) (items []*string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT DISTINCT index_code FROM base_from_coalmine_company_index WHERE group_name=? `
+	_, err = o.Raw(sql, groupName).QueryRows(&items)
+	return
+}
+
+func GetClassifyJsmByGroupName(groupName string) (items []*string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT DISTINCT index_code FROM base_from_coalmine_jsm_index WHERE province=? `
+	_, err = o.Raw(sql, groupName).QueryRows(&items)
+	return
+}
+
+// 查询公司指标
+func GetPageFromCoalmineCompanyIndexByFrequency(frequency, classify string, startSize, pageSize int) (items []*BaseFromCoalmineCompanyIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_coalmine_company_index WHERE frequency=? AND index_code=? ORDER BY data_time DESC LIMIT ?,? `
+	_, err = o.Raw(sql, frequency, classify, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+func GetCountFromCompany(indexCode string) (item int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT COUNT(1) FROM base_from_coalmine_company_index WHERE index_code=? `
+	err = o.Raw(sql, indexCode).QueryRow(&item)
+	return
+}
+
+func GetCountFromFirm(indexCode string) (item int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT COUNT(1) FROM base_from_coalmine_firm_index WHERE index_code=? `
+	err = o.Raw(sql, indexCode).QueryRow(&item)
+	return
+}
+
+func GetClassifyFirmByGroupName(groupName string) (items []*string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT DISTINCT index_code FROM base_from_coalmine_firm_index WHERE group_name=? `
+	_, err = o.Raw(sql, groupName).QueryRows(&items)
+	return
+}
+
+// 查询指标
+func GetPageFromCoalmineFirmIndexByFrequency(frequency, classify string, startSize, pageSize int) (items []*BaseFromCoalmineFirmIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_coalmine_firm_index WHERE frequency=? AND index_code=? ORDER BY data_time DESC LIMIT ?,?  `
+	_, err = o.Raw(sql, frequency, classify, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+func GetCountFromCoastal(indexCode string) (item int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT COUNT(1) FROM base_from_coalmine_coastal_index WHERE index_code=? `
+	err = o.Raw(sql, indexCode).QueryRow(&item)
+	return
+}
+
+func GetClassifyCoastalByGroupName(groupName string) (items []*string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT DISTINCT index_code FROM base_from_coalmine_coastal_index WHERE group_name=? `
+	_, err = o.Raw(sql, groupName).QueryRows(&items)
+	return
+}
+
+// 查询指标
+func GetPageFromCoalmineCoastalIndexByFrequency(frequency, classify string, startSize, pageSize int) (items []*BaseFromCoalmineCoastalIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_coalmine_coastal_index WHERE frequency=? AND index_code=? ORDER BY data_time DESC LIMIT ?,? `
+	_, err = o.Raw(sql, frequency, classify, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+func GetCountFromInland(indexCode string) (item int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT COUNT(1) FROM base_from_coalmine_inland_index WHERE index_code=? `
+	err = o.Raw(sql, indexCode).QueryRow(&item)
+	return
+}
+
+func GetClassifyInlandByGroupName(groupName string) (items []*string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT DISTINCT index_code FROM base_from_coalmine_inland_index WHERE group_name=? `
+	_, err = o.Raw(sql, groupName).QueryRows(&items)
+	return
+}
+
+// 查询指标
+func GetPageFromCoalmineInlandIndexByFrequency(frequency, classify string, startSize, pageSize int) (items []*BaseFromCoalmineInlandIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_coalmine_inland_index WHERE frequency=? AND index_code=? ORDER BY data_time DESC LIMIT ?,? `
+	_, err = o.Raw(sql, frequency, classify, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// 查询公司指标
+func GetBaseFromCoalmineCompanyIndexByFrequency(frequency, groupName string) (items []*BaseFromCoalmineCompanyIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_coalmine_company_index WHERE frequency=? AND group_name=? `
+	_, err = o.Raw(sql, frequency, groupName).QueryRows(&items)
+	return
+}
+
+// 查询指标
+func GetBaseFromCoalmineFirmIndexByFrequency(frequency, groupName string) (items []*BaseFromCoalmineFirmIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_coalmine_firm_index WHERE frequency=? AND group_name=? `
+	_, err = o.Raw(sql, frequency, groupName).QueryRows(&items)
+	return
+}
+
+// 查询指标
+func GetBaseFromCoalmineCoastalIndexByFrequency(frequency, groupName string) (items []*BaseFromCoalmineCoastalIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_coalmine_coastal_index WHERE frequency=? AND group_name=? `
+	_, err = o.Raw(sql, frequency, groupName).QueryRows(&items)
+	return
+}
+
+// 查询指标
+func GetBaseFromCoalmineInlandIndexByFrequency(frequency, groupName string) (items []*BaseFromCoalmineInlandIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_coalmine_inland_index WHERE frequency=? AND group_name=? `
+	_, err = o.Raw(sql, frequency, groupName).QueryRows(&items)
+	return
+}
+
+// 查询数据
+func GetBaseFromCoalmineIndexByCode(indexCode string) (items []*BaseFromCoalmineJsmIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_coalmine_jsm_index WHERE index_code=?`
+	_, err = o.Raw(sql, indexCode).QueryRows(&items)
+	return
+}
+
+// 查询公司指标
+func GetBaseFromCoalmineCompanyIndexByCode(indexCode string) (items []*BaseFromCoalmineCompanyIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_coalmine_company_index WHERE index_code=? `
+	_, err = o.Raw(sql, indexCode).QueryRows(&items)
+	return
+}
+
+// 查询指标
+func GetBaseFromCoalmineFirmIndexByCode(indexCode string) (items []*BaseFromCoalmineFirmIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_coalmine_firm_index WHERE index_code=? `
+	_, err = o.Raw(sql, indexCode).QueryRows(&items)
+	return
+}
+
+// 查询指标
+func GetBaseFromCoalmineCoastalIndexByCode(indexCode string) (items []*BaseFromCoalmineCoastalIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_coalmine_coastal_index WHERE index_code=? `
+	_, err = o.Raw(sql, indexCode).QueryRows(&items)
+	return
+}
+
+// 查询指标
+func GetBaseFromCoalmineInlandIndexByCode(indexCode string) (items []*BaseFromCoalmineInlandIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_coalmine_inland_index WHERE index_code=? `
+	_, err = o.Raw(sql, indexCode).QueryRows(&items)
+	return
+}
+
+type BaseFromTradeEicIndexV2 struct {
+	BaseFromEicIndexId     int `orm:"column(base_from_eic_index_id);pk"`
+	Type                   string
+	EicCode                string
+	Name                   string
+	Status                 string
+	GasDayStart            string
+	GasInStorage           float64
+	GasInStorageCode       string
+	Consumption            string
+	ConsumptionCode        string
+	ConsumptionFull        string
+	ConsumptionFullCode    string
+	Full                   float64
+	FullCode               string
+	Trend                  float64
+	TrendCode              string
+	Injection              float64
+	InjectionCode          string
+	Withdrawal             float64
+	WithdrawalCode         string
+	WorkingGasVolume       float64
+	WorkingGasVolumeCode   string
+	InjectionCapacity      float64
+	InjectionCapacityCode  string
+	WithdrawalCapacity     float64
+	WithdrawalCapacityCode string
+	Info                   string
+	Parent                 string
+	CreateTime             time.Time
+	ModifyTime             time.Time
+	Children               []BaseFromTradeEicIndexV2
+}
+
+func GetEicDateV2() (date []*BaseFromTradeEicIndexV2, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := "SELECT * FROM base_from_trade_eic_index_v2 ORDER BY gas_day_start desc limit 1"
+	_, err = o.Raw(sql).QueryRows(&date)
+	return
+}
+
+func GetEicDataV2(date string) (data []*BaseFromTradeEicIndexV2, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := "SELECT * FROM base_from_trade_eic_index_v2 where gas_day_start=? "
+	_, err = o.Raw(sql, date).QueryRows(&data)
+	return
+}
+
+func GetEicHistoryDateByDateV2(code, startDate, endDate string) (date []*BaseFromTradeEicIndexV2, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := "SELECT * FROM base_from_trade_eic_index_v2 WHERE eic_code=? and gas_day_start between ? and ? ORDER BY gas_day_start desc"
+	_, err = o.Raw(sql, code, startDate, endDate).QueryRows(&date)
+	return
+}
+
+func GetEicHistoryDateV2(code string) (date []*BaseFromTradeEicIndexV2, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := "SELECT * FROM base_from_trade_eic_index_v2 WHERE eic_code=? ORDER BY gas_day_start desc limit 30"
+	_, err = o.Raw(sql, code).QueryRows(&date)
+	return
+}
+
+func GetContinentAndCountryEicDateV2(date string) (data []*BaseFromTradeEicIndexV2, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := "SELECT * FROM base_from_trade_eic_index_v2 where gas_day_start=? and (type='continent' OR type='country') "
+	_, err = o.Raw(sql, date).QueryRows(&data)
+	return
+}
+
+func GetSSOAndFacEicDateV2(date, name string) (data []*BaseFromTradeEicIndexV2, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := "SELECT * FROM base_from_trade_eic_index_v2 where gas_day_start=? and (type='sso' OR type='fac') "
+	_, err = o.Raw(sql, date).QueryRows(&data)
+	return
+}
+
+func GetBaseFromTradeIndexByDate(exchange, startDate, endDate string) (list []*BaseFromTradeShanghaiIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := "SELECT * FROM base_from_trade_" + exchange + "_index where rank < 50 and data_time between ? and ? order by data_time asc"
+	_, err = o.Raw(sql, startDate, endDate).QueryRows(&list)
+	return
+}
+
+func GetFirstBaseFromTradeIndexByDate(exchange string) (item *BaseFromTradeShanghaiIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := "SELECT * FROM base_from_trade_" + exchange + "_index where rank < 50 order by data_time asc"
+	err = o.Raw(sql).QueryRow(&item)
+	return
+}

+ 66 - 0
models/data_manage/com_trade_index.go

@@ -0,0 +1,66 @@
+package data_manage
+
+import (
+	"eta/eta_mobile/utils"
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// ComTradeIndex 联合国商品贸易数据指标表
+type ComTradeIndex struct {
+	ComTradeId  int       `orm:"column(com_trade_id);pk"`
+	IndexCode   string    `description:"联合国商品贸易编码"`
+	IndexName   string    `description:"联合国商品名称"`
+	IndexNameCn string    `description:"联合国商品名称(中文)"`
+	UpdateTime  time.Time `description:"数据最近更新时间"`
+	CreateTime  time.Time `description:"创建时间"`
+}
+
+// GetComTradeIndexList 获取指标数据列表
+func GetComTradeIndexList(condition string, pars []interface{}) (list []*ComTradeIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM com_trade_index WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += `ORDER BY com_trade_id DESC `
+	_, err = o.Raw(sql, pars).QueryRows(&list)
+	return
+}
+
+// GetComTradeIndexByIdList 获取指标数据列表
+func GetComTradeIndexByIdList(idList []int) (list []*ComTradeIndex, err error) {
+	num := len(idList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM com_trade_index WHERE com_trade_id in (` + utils.GetOrmInReplace(num) + `) `
+	_, err = o.Raw(sql, idList).QueryRows(&list)
+	return
+}
+
+// GetAllComTradeIndexList 获取指标数据列表
+func GetAllComTradeIndexList() (list []*ComTradeIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM com_trade_index  ORDER BY com_trade_id DESC `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+// ComTradeCodeMapping 联合国商品贸易数据指标编码与分类编码的关系表
+type ComTradeCodeMapping struct {
+	Code       int       `orm:"column(code);pk"`
+	IndexCode  string    `description:"联合国商品贸易编码"`
+	Type       int       `description:"1:价格;2:重量"`
+	Name       string    `description:"指标名称"`
+	CreateTime time.Time `description:"创建时间"`
+}
+
+// GetComTradeIndex 根据指标code获取指标信息
+func GetComTradeIndex(indexCode string) (item *ComTradeCodeMapping, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM com_trade_code_mapping WHERE code=? `
+	err = o.Raw(sql, indexCode).QueryRow(&item)
+	return
+}

+ 185 - 1
models/data_manage/edb_classify.go

@@ -1,8 +1,10 @@
 package data_manage
 
 import (
+	"eta/eta_mobile/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
+	"strconv"
 	"time"
 )
 
@@ -135,6 +137,7 @@ type EdbClassifyItems struct {
 	ClassifyId      int `description:"分类id"`
 	EdbInfoId       int `description:"指标id"`
 	ClassifyName    string
+	ClassifyNameEn  string
 	ParentId        int
 	Level           int    `description:"层级"`
 	Sort            int    `description:"排序字段,越小越靠前,默认值:10"`
@@ -163,7 +166,8 @@ type EdbClassifyItemsButton struct {
 
 type EdbClassifyListResp struct {
 	AllNodes      []*EdbClassifyItems
-	CanOpClassify bool `description:"是否允许操作分类"`
+	CanOpClassify bool   `description:"是否允许操作分类"`
+	Language      string `description:"指标的展示语言,CN:中文,EN:英文"`
 }
 
 type ClassifyDeleteCheckResp struct {
@@ -264,3 +268,183 @@ func GetEdbClassifyMaxSort(parentId int, classifyType uint8) (sort int, err erro
 type ClassifyEdbInfoListResp struct {
 	EdbInfoList []*EdbClassifyItems
 }
+
+// GetEdbClassifyAllV2 获取普通指标的分类列表
+func GetEdbClassifyAllV2(classifyType int8) (items []*EdbClassifyItems, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_classify WHERE parent_id <>0  AND classify_type = ?  order by sort asc,classify_id asc`
+	_, err = o.Raw(sql, classifyType).QueryRows(&items)
+	return
+}
+
+func GetEdbClassifyByParentIdTwo(classifyType int8) (items []*EdbClassifyItems, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_classify WHERE level=2 AND classify_type = ?  order by sort asc,classify_id asc`
+	_, err = o.Raw(sql, classifyType).QueryRows(&items)
+	return
+}
+
+type AddEdbClassifyReqV2 struct {
+	ClassifyName string `description:"分类名称"`
+	ParentId     int    `description:"父级id,第一级传0"`
+	Level        int    `description:"层级,第一级传0,其余传上一级的层级"`
+	ClassifyType uint8  `description:"分类类型,0:普通指标分类,1:预测指标分类"`
+}
+
+// GetEdbClassifyMaxSortV2 获取分类下最大的排序数
+func GetEdbClassifyMaxSortV2(parentId int, classifyType uint8) (sort int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT Max(sort) AS sort FROM edb_classify WHERE parent_id=? AND parent_id_two=? AND classify_type=? `
+	err = o.Raw(sql, parentId, classifyType).QueryRow(&sort)
+	return
+}
+
+func GetEdbClassifyByLevel(level, source int) (items []*EdbClassifyItems, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_classify WHERE level=? AND classify_type = ? `
+	_, err = o.Raw(sql, level, source).QueryRows(&items)
+	return
+}
+
+func FIXEdbClassifyId(newId, oldId int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` UPDATE edb_info SET classify_id=? WHERE classify_id=? `
+	_, err = o.Raw(sql, newId, oldId).Exec()
+	return
+}
+
+func FixEdbClassify() {
+	//新增三级分类
+	list, err := GetEdbClassifyByLevel(2, 0)
+	if err != nil {
+		return
+	}
+
+	for _, v := range list {
+		timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+		classifyInfo := &EdbClassify{
+			//ClassifyId:      0,
+			ClassifyType:    0,
+			ClassifyName:    v.ClassifyName,
+			ParentId:        v.ClassifyId,
+			HasData:         0,
+			CreateTime:      time.Now(),
+			ModifyTime:      time.Now(),
+			SysUserRealName: "admin",
+			Level:           3,
+			UniqueCode:      utils.MD5(utils.DATA_PREFIX + "_" + timestamp),
+			Sort:            v.Sort,
+		}
+		if utils.RunMode == "debug" {
+			classifyInfo.SysUserId = 11
+		} else {
+			classifyInfo.SysUserId = 163
+		}
+		id, err := AddEdbClassify(classifyInfo)
+		if err != nil {
+			return
+		}
+
+		err = FIXEdbClassifyId(int(id), v.ClassifyId)
+		if err != nil {
+			return
+		}
+	}
+}
+
+func FixPredictEdbClassify() {
+	//新增三级分类
+	list, err := GetEdbClassifyByLevel(2, 1)
+	if err != nil {
+		return
+	}
+
+	for _, v := range list {
+		timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+		classifyInfo := &EdbClassify{
+			//ClassifyId:      0,
+			ClassifyType:    1,
+			ClassifyName:    v.ClassifyName,
+			ParentId:        v.ClassifyId,
+			HasData:         0,
+			CreateTime:      time.Now(),
+			ModifyTime:      time.Now(),
+			SysUserRealName: "admin",
+			Level:           3,
+			UniqueCode:      utils.MD5(utils.DATA_PREFIX + "_" + timestamp),
+			Sort:            v.Sort,
+		}
+		if utils.RunMode == "debug" {
+			classifyInfo.SysUserId = 11
+		} else {
+			classifyInfo.SysUserId = 163
+		}
+		id, err := AddEdbClassify(classifyInfo)
+		if err != nil {
+			return
+		}
+
+		err = FIXEdbClassifyId(int(id), v.ClassifyId)
+		if err != nil {
+			return
+		}
+	}
+}
+
+func GetEdbClassify(classifyId int) (classifyIds string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT GROUP_CONCAT(t.classify_id) AS classify_ids FROM (
+			SELECT a.classify_id FROM edb_classify AS a 
+			WHERE a.classify_id=?
+			UNION ALL
+			SELECT a.classify_id FROM edb_classify AS a 
+			WHERE a.parent_id=? UNION ALL
+	SELECT
+		classify_id 
+	FROM
+		edb_classify 
+WHERE
+	parent_id IN ( SELECT classify_id FROM edb_classify WHERE parent_id = ? )
+			)AS t`
+	err = o.Raw(sql, classifyId, classifyId, classifyId).QueryRow(&classifyIds)
+	return
+}
+
+func FixEdbClassifySysUser() {
+	list, err := GetEdbClassifyByLevel(2, 0)
+	if err != nil {
+		return
+	}
+
+	for _, v := range list {
+		err := EditEdbClassifySysUser(v.ClassifyId, v.SysUserId, v.SysUserRealName)
+		if err != nil {
+			return
+		}
+		fmt.Println("ClassifyId:", v.ClassifyId)
+	}
+	fmt.Println("FixEdbClassifySysUser end")
+}
+
+func EditEdbClassifySysUser(classifyId, sysUserId int, chartClassifyName string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `UPDATE edb_classify SET sys_user_id=?,sys_user_real_name=?,modify_time=NOW() WHERE parent_id=?  AND level=3 `
+	_, err = o.Raw(sql, sysUserId, chartClassifyName, classifyId).Exec()
+	return
+}
+
+func FixPredictEdbClassifySysUser() {
+	list, err := GetEdbClassifyByLevel(2, 1)
+	if err != nil {
+		return
+	}
+
+	for _, v := range list {
+		err := EditEdbClassifySysUser(v.ClassifyId, v.SysUserId, v.SysUserRealName)
+		if err != nil {
+			return
+		}
+		fmt.Println("ClassifyId:", v.ClassifyId)
+	}
+	fmt.Println("EditChartClassifySysUser end")
+}

+ 99 - 0
models/data_manage/edb_data_baiinfo.go

@@ -0,0 +1,99 @@
+package data_manage
+
+import (
+	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type BaseFromBaiinfoDataSimple struct {
+	BaiinfoDataId          int `orm:"column(baiinfo_data_id);pk"`
+	BaseFromBaiinfoIndexId int
+	IndexCode              string
+	DataTime               string
+	Value                  string
+}
+
+func GetEdbDataBaiinfoMaxAndMinDate(edbCode string) (min_date, max_date string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date FROM edb_data_baiinfo WHERE edb_code=? `
+	err = o.Raw(sql, edbCode).QueryRow(&min_date, &max_date)
+	return
+}
+
+// 全部刷新有色数据
+func RefreshAllEdbDataByBaiinfo(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	if err != nil {
+		return
+	}
+	edbInfoIdStr := strconv.Itoa(edbInfoId)
+
+	//获取已存在指标所有数据
+	existDataList := make([]*EdbDataBase, 0)
+	dataTableName := GetEdbDataTableName(source)
+	sql := `SELECT * FROM %s WHERE edb_info_id=? `
+	sql = fmt.Sprintf(sql, dataTableName)
+	_, err = to.Raw(sql, edbInfoId).QueryRows(&existDataList)
+	if err != nil {
+		return err
+	}
+	existDataMap := make(map[string]string)
+	for _, v := range existDataList {
+		existDataMap[v.DataTime] = v.Value
+	}
+
+	baiinfoDateList := make([]*BaseFromBaiinfoDataSimple, 0)
+	baiinfoSql := ` SELECT * FROM base_from_baiinfo_data WHERE index_code=? AND data_time>=? `
+	_, err = to.Raw(baiinfoSql, edbCode, startDate).QueryRows(&baiinfoDateList)
+	if err != nil {
+		return err
+	}
+
+	addSql := ` INSERT INTO edb_data_baiinfo(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+	var isAdd bool
+	for _, sv := range baiinfoDateList {
+		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 = to.Raw(sql, sv.Value, edbInfoId, sv.DataTime).Exec()
+				if err != nil {
+					return err
+				}
+			}
+		}
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}

+ 418 - 0
models/data_manage/edb_data_cffex.go

@@ -0,0 +1,418 @@
+package data_manage
+
+import (
+	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type CffexData struct {
+	InputValue string `orm:"column(DATA_VALUE)" description:"日期"`
+	DataTime   string `orm:"column(DATA_DATE)" description:"值"`
+}
+
+type BaseFromCffexDataSimple struct {
+	Id        int `orm:"column(base_from_trade_cffex_index_id);pk"`
+	DealCode  string
+	BuyCode   string
+	SoldCode  string
+	DataTime  string
+	DealValue string
+	BuyValue  string
+	SoldValue string
+}
+
+type BaseInfoFromCffex struct {
+	DealName string
+	BuyName  string
+	SoldName string
+}
+
+type BaseFromTradeCFFEXIndex struct {
+	BaseFromTradeCffexIndexId int `orm:"column(base_from_trade_cffex_index_id);pk"`
+	Rank                      int
+	DealShortName             string
+	DealName                  string
+	DealCode                  string
+	DealValue                 string
+	DealChange                int
+	BuyShortName              string
+	BuyName                   string
+	BuyCode                   string
+	BuyValue                  string
+	BuyChange                 int
+	SoldShortName             string
+	SoldName                  string
+	SoldCode                  string
+	SoldValue                 string
+	SoldChange                int
+	Frequency                 string
+	ClassifyName              string
+	ClassifyType              string
+	CreateTime                time.Time
+	ModifyTime                time.Time
+	DataTime                  string
+}
+
+func GetEdbDataCffexMaxOrMinDate(edbCode string) (minDate, maxDate string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT MIN(data_time) AS minDate,MAX(data_time) AS maxDate FROM edb_data_cffex WHERE edb_code=? `
+	err = o.Raw(sql, edbCode).QueryRow(&minDate, &maxDate)
+	return
+}
+
+func GetEdbDataByCffex(edbCode, suffix, startDate, endDate string) (searchItem *EdbInfoSearch, err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	searchItem = new(EdbInfoSearch)
+	searchItem.EdbCode = edbCode
+	cffexBaseDataAll, err := GetBaseFromCffexDataAllByIndexCode(edbCode, suffix)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+
+	var isAdd bool
+	addSql := ` INSERT INTO edb_data_cffex(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+	dataList := make([]*EdbInfoSearchData, 0)
+	existMap := make(map[string]string)
+
+	for _, sv := range cffexBaseDataAll {
+		eDate := sv.DataTime
+		dataTime, err := time.Parse(utils.FormatDate, eDate)
+		if err != nil {
+			fmt.Println("time.Parse Err:" + eDate)
+			return nil, err
+		}
+		timestamp := dataTime.UnixNano() / 1e6
+		timeStr := fmt.Sprintf("%d", timestamp)
+		if _, ok := existMap[eDate]; !ok {
+			if suffix == "deal" {
+				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.DealValue)
+			} else if suffix == "buy" {
+				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.BuyValue)
+			} else {
+				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.SoldValue)
+			}
+			isAdd = true
+		}
+		if suffix == "deal" {
+			existMap[eDate] = sv.DealValue
+		} else if suffix == "buy" {
+			existMap[eDate] = sv.BuyValue
+		} else {
+			existMap[eDate] = sv.SoldValue
+		}
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		utils.FileLog.Info("addSql:" + addSql)
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return searchItem, err
+		}
+	}
+	if err != nil {
+		_ = to.Rollback()
+	} else {
+		_ = to.Commit()
+	}
+	size := utils.EDB_DATA_LIMIT
+	dataList, err = GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_CFFEX, size)
+	if err != nil {
+		utils.FileLogData.Info("GetEdbDataCffexByCode Err:%s", err.Error())
+		return searchItem, err
+	}
+	minDate, maxDate, err := GetEdbDataCffexMaxOrMinDate(edbCode)
+	if err != nil {
+		return searchItem, err
+	}
+	searchItem.DataList = dataList
+	searchItem.StartDate = minDate
+	searchItem.EndDate = maxDate
+	if searchItem.DataList == nil {
+		searchItem.DataList = make([]*EdbInfoSearchData, 0)
+	}
+	return
+}
+
+// RefreshEdbDataByCffex 刷新中金所指标数据
+func RefreshEdbDataByCffex(edbInfoId int, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.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 := GetCffexDataByTradeCode(condition, pars)
+
+	addSql := ` INSERT INTO edb_data_cffex(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,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 := GetEdbDataCffexByCodeAndDate(edbCode, v.DataTime)
+			if err != nil && err.Error() != 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 {
+				err = ModifyEdbDataCffex(int64(edbInfoId), v.DataTime, value)
+				if err != nil {
+					return err
+				}
+			}
+		}
+		existMap[v.DataTime] = value
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+// RefreshAllEdbDataByCffex 全部刷新中金所
+func RefreshAllEdbDataByCffex(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	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 := GetCffexDataByTradeCode(condition, pars)
+
+	//获取指标所有数据
+	dataList := make([]*EdbDataBase, 0)
+	dataTableName := GetEdbDataTableName(source)
+	sql := `SELECT * FROM %s WHERE edb_info_id=? `
+	sql = fmt.Sprintf(sql, dataTableName)
+	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)
+	if err != nil {
+		return err
+	}
+	dataMap := make(map[string]string)
+	for _, v := range dataList {
+		dataMap[v.DataTime] = v.Value
+	}
+
+	addSql := ` INSERT INTO edb_data_cffex(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,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 {
+			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)
+				saveValue := sValue
+
+				if existVal, ok := dataMap[eDate]; !ok {
+					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 = to.Raw(sql, sValue, edbInfoId, eDate).Exec()
+						if err != nil {
+							return err
+						}
+					}
+				}
+			}
+		}
+		existMap[v.DataTime] = v.DataTime
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+// GetBaseInfoFromCffexByIndexCode 获取指标信息
+func GetBaseInfoFromCffexByIndexCode(indexCode, suffix string) (list []*BaseInfoFromCffex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_trade_cffex_index WHERE %s_code=? `
+	sql = fmt.Sprintf(sql, suffix)
+	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	return
+}
+
+func GetCffexDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromCffexDataSimple, err error) {
+	sql := ` SELECT * FROM base_from_trade_cffex_index WHERE 1=1 `
+	o := orm.NewOrmUsingDB("data")
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY data_time DESC `
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}
+
+func AddEdbDataCffexBySql(sqlStr string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sqlStr).Exec()
+	return
+}
+
+func GetEdbDataCffexByCode(edbCode string) (items []*EdbInfoSearchData, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_data_cffex WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
+	_, err = o.Raw(sql, edbCode, utils.EDB_DATA_LIMIT).QueryRows(&items)
+	return
+}
+
+func GetBaseFromCffexDataAllByIndexCode(indexCode, suffix string) (list []*BaseFromTradeCFFEXIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_trade_cffex_index WHERE %s_code=? `
+	sql = fmt.Sprintf(sql, suffix)
+	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	return
+}
+
+func GetEdbDataCffexByCodeAndDate(edbCode string, startDate string) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT COUNT(1) AS count FROM edb_data_cffex WHERE edb_code=? AND data_time=? `
+	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
+	return
+}
+
+func ModifyEdbDataCffex(edbInfoId int64, dataTime, value string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` UPDATE edb_data_cffex SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
+	return
+}

+ 298 - 0
models/data_manage/edb_data_coal.go

@@ -0,0 +1,298 @@
+package data_manage
+
+import (
+	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type CoalData struct {
+	InputValue string `orm:"column(DATA_VALUE)" description:"日期"`
+	DataTime   string `orm:"column(DATA_DATE)" description:"值"`
+}
+
+type BaseFromCoalDataSimple struct {
+	Id        int `orm:"column(base_from_trade_coal_index_id);pk"`
+	DealCode  string
+	BuyCode   string
+	SoldCode  string
+	DataTime  string
+	DealValue string
+	BuyValue  string
+	SoldValue string
+}
+
+type BaseInfoFromCoal struct {
+	IndexName string
+	Frequency string
+	Unit      string
+}
+
+type BaseFromTradeCoalIndex struct {
+	BaseFromTradeCoalIndexId int `orm:"column(base_from_trade_coal_index_id);pk"`
+	Rank                     int
+	DealShortName            string
+	DealName                 string
+	DealCode                 string
+	DealValue                string
+	DealChange               int
+	BuyShortName             string
+	BuyName                  string
+	BuyCode                  string
+	BuyValue                 string
+	BuyChange                int
+	SoldShortName            string
+	SoldName                 string
+	SoldCode                 string
+	SoldValue                string
+	SoldChange               int
+	Frequency                string
+	ClassifyName             string
+	ClassifyType             string
+	CreateTime               time.Time
+	ModifyTime               time.Time
+	DataTime                 string
+}
+
+func GetEdbDataCoalMaxOrMinDate(edbCode string) (minDate, maxDate string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT MIN(data_time) AS minDate,MAX(data_time) AS maxDate FROM edb_data_coal WHERE edb_code=? `
+	err = o.Raw(sql, edbCode).QueryRow(&minDate, &maxDate)
+	return
+}
+
+// RefreshEdbDataByCoal 刷新煤炭网指标数据
+func RefreshEdbDataByCoal(edbInfoId int, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	var suffix string
+	if strings.Contains(edbCode, "jsm") {
+		suffix = "jsm_index"
+	} else if strings.Contains(edbCode, "company") {
+		suffix = "company_index"
+	} else if strings.Contains(edbCode, "firm") {
+		suffix = "firm_index"
+	} else if strings.Contains(edbCode, "coastal") {
+		suffix = "coastal_index"
+	} else if strings.Contains(edbCode, "inland") {
+		suffix = "inland_index"
+	}
+	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_time>=? "
+		pars = append(pars, startDate)
+	}
+
+	if endDate != "" {
+		condition += " AND data_time<=? "
+		pars = append(pars, endDate)
+	}
+
+	coalDataList, err := GetCoalDataByTradeCode(condition, suffix, pars)
+
+	addSql := ` INSERT INTO edb_data_coal(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+	var isAdd bool
+	existMap := make(map[string]string)
+	for _, v := range coalDataList {
+		item := v
+		itemValue := v.DealValue
+		if _, ok := existMap[v.DataTime]; !ok {
+			count, err := GetEdbDataCoalByCodeAndDate(edbCode, v.DataTime)
+			if err != nil && err.Error() != 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 {
+				err = ModifyEdbDataCoal(int64(edbInfoId), v.DataTime, v.DealValue)
+				if err != nil {
+					return err
+				}
+			}
+		}
+		existMap[v.DataTime] = v.DealValue
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+// RefreshAllEdbDataByCoal 全部刷新中金所
+func RefreshAllEdbDataByCoal(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	var suffix string
+	if strings.Contains(edbCode, "jsm") {
+		suffix = "jsm_index"
+	} else if strings.Contains(edbCode, "company") {
+		suffix = "company_index"
+	} else if strings.Contains(edbCode, "firm") {
+		suffix = "firm_index"
+	} else if strings.Contains(edbCode, "coastal") {
+		suffix = "coastal_index"
+	} else if strings.Contains(edbCode, "inland") {
+		suffix = "inland_index"
+	}
+	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_time>=? "
+		pars = append(pars, startDate)
+	}
+
+	if endDate != "" {
+		condition += " AND data_time<=? "
+		pars = append(pars, endDate)
+	}
+
+	coalDataList, err := GetCoalDataByTradeCode(condition, suffix, pars)
+
+	//获取指标所有数据
+	dataList := make([]*EdbDataBase, 0)
+	dataTableName := GetEdbDataTableName(source)
+	sql := `SELECT * FROM %s WHERE edb_info_id=? `
+	sql = fmt.Sprintf(sql, dataTableName)
+	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)
+	if err != nil {
+		return err
+	}
+	dataMap := make(map[string]string)
+	for _, v := range dataList {
+		dataMap[v.DataTime] = v.Value
+	}
+
+	addSql := ` INSERT INTO edb_data_coal(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+	var isAdd bool
+	existMap := make(map[string]string)
+	for _, v := range coalDataList {
+		item := v
+		itemValue := v.DealValue
+		if _, ok := existMap[v.DataTime]; !ok {
+			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)
+				saveValue := sValue
+
+				if existVal, ok := dataMap[eDate]; !ok {
+					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 = to.Raw(sql, sValue, edbInfoId, eDate).Exec()
+						if err != nil {
+							return err
+						}
+					}
+				}
+			}
+		}
+		existMap[v.DataTime] = v.DataTime
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+// GetBaseInfoFromCoalByIndexCode 获取指标信息
+func GetBaseInfoFromCoalByIndexCode(indexCode, suffix string) (list []*BaseInfoFromCoal, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_coalmine_%s WHERE index_code=? `
+	sql = fmt.Sprintf(sql, suffix)
+	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	return
+}
+
+func GetCoalDataByTradeCode(condition, suffix string, pars []interface{}) (item []*BaseFromCoalDataSimple, err error) {
+	sql := ` SELECT * FROM base_from_coalmine_%s WHERE 1=1 `
+	sql = fmt.Sprintf(sql, suffix)
+	o := orm.NewOrmUsingDB("data")
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY data_time DESC `
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}
+
+func GetEdbDataCoalByCodeAndDate(edbCode string, startDate string) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT COUNT(1) AS count FROM edb_data_coal WHERE edb_code=? AND data_time=? `
+	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
+	return
+}
+
+func ModifyEdbDataCoal(edbInfoId int64, dataTime, value string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` UPDATE edb_data_coal SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
+	return
+}

+ 419 - 0
models/data_manage/edb_data_dl.go

@@ -0,0 +1,419 @@
+package data_manage
+
+import (
+	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type DlData struct {
+	InputValue string `orm:"column(DATA_VALUE)" description:"日期"`
+	DataTime   string `orm:"column(DATA_DATE)" description:"值"`
+}
+
+type BaseFromDlDataSimple struct {
+	Id        int `orm:"column(base_from_trade_dalian_index_id);pk"`
+	DealCode  string
+	BuyCode   string
+	SoldCode  string
+	DataTime  string
+	DealValue string
+	BuyValue  string
+	SoldValue string
+}
+
+type BaseInfoFromDl struct {
+	DealName string
+	BuyName  string
+	SoldName string
+}
+
+type BaseFromTradeDalianIndex struct {
+	BaseFromTradeDalianIndexId int `orm:"column(base_from_trade_dalian_index_id);pk"`
+	Rank                       int
+	DealShortName              string
+	DealName                   string
+	DealCode                   string
+	DealValue                  string
+	DealChange                 int
+	BuyShortName               string
+	BuyName                    string
+	BuyCode                    string
+	BuyValue                   string
+	BuyChange                  int
+	SoldShortName              string
+	SoldName                   string
+	SoldCode                   string
+	SoldValue                  string
+	SoldChange                 int
+	Frequency                  string
+	ClassifyName               string
+	ClassifyType               string
+	CreateTime                 time.Time
+	ModifyTime                 time.Time
+	DataTime                   string
+}
+
+func GetEdbDataDlMaxOrMinDate(edbCode string) (minDate, maxDate string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT MIN(data_time) AS minDate,MAX(data_time) AS maxDate FROM edb_data_dl WHERE edb_code=? `
+	err = o.Raw(sql, edbCode).QueryRow(&minDate, &maxDate)
+	return
+}
+
+func GetEdbDataByDl(edbCode, suffix, startDate, endDate string) (searchItem *EdbInfoSearch, err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	searchItem = new(EdbInfoSearch)
+	searchItem.EdbCode = edbCode
+	dlBaseDataAll, err := GetBaseFromDalianDataAllByIndexCode(edbCode, suffix)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+
+	var isAdd bool
+	addSql := ` INSERT INTO edb_data_dl(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+	dataList := make([]*EdbInfoSearchData, 0)
+	existMap := make(map[string]string)
+
+	for _, sv := range dlBaseDataAll {
+		eDate := sv.DataTime
+		dataTime, err := time.Parse(utils.FormatDate, eDate)
+		if err != nil {
+			fmt.Println("time.Parse Err:" + eDate)
+			return nil, err
+		}
+		timestamp := dataTime.UnixNano() / 1e6
+		timeStr := fmt.Sprintf("%d", timestamp)
+		if _, ok := existMap[eDate]; !ok {
+			if suffix == "deal" {
+				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.DealValue)
+			} else if suffix == "buy" {
+				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.BuyValue)
+			} else {
+				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.SoldValue)
+			}
+			isAdd = true
+		}
+		if suffix == "deal" {
+			existMap[eDate] = sv.DealValue
+		} else if suffix == "buy" {
+			existMap[eDate] = sv.BuyValue
+		} else {
+			existMap[eDate] = sv.SoldValue
+		}
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		utils.FileLog.Info("addSql:" + addSql)
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return searchItem, err
+		}
+	}
+	if err != nil {
+		_ = to.Rollback()
+	} else {
+		_ = to.Commit()
+	}
+
+	size := utils.EDB_DATA_LIMIT
+	dataList, err = GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_DL, size)
+	if err != nil {
+		utils.FileLogData.Info("GetEdbDataDlByCode Err:%s", err.Error())
+		return searchItem, err
+	}
+	minDate, maxDate, err := GetEdbDataDlMaxOrMinDate(edbCode)
+	if err != nil {
+		return searchItem, err
+	}
+	searchItem.DataList = dataList
+	searchItem.StartDate = minDate
+	searchItem.EndDate = maxDate
+	if searchItem.DataList == nil {
+		searchItem.DataList = make([]*EdbInfoSearchData, 0)
+	}
+	return
+}
+
+// RefreshEdbDataByDl 刷新大商所指标数据
+func RefreshEdbDataByDl(edbInfoId int, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.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 := GetDlDataByTradeCode(condition, pars)
+
+	addSql := ` INSERT INTO edb_data_dl(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,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 := GetEdbDataDlByCodeAndDate(edbCode, v.DataTime)
+			if err != nil && err.Error() != 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 {
+				err = ModifyEdbDataDl(int64(edbInfoId), v.DataTime, value)
+				if err != nil {
+					return err
+				}
+			}
+		}
+		existMap[v.DataTime] = value
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+// RefreshAllEdbDataByDl 全部刷新大商所
+func RefreshAllEdbDataByDl(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	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 := GetDlDataByTradeCode(condition, pars)
+
+	//获取指标所有数据
+	dataList := make([]*EdbDataBase, 0)
+	dataTableName := GetEdbDataTableName(source)
+	sql := `SELECT * FROM %s WHERE edb_info_id=? `
+	sql = fmt.Sprintf(sql, dataTableName)
+	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)
+	if err != nil {
+		return err
+	}
+	dataMap := make(map[string]string)
+	for _, v := range dataList {
+		dataMap[v.DataTime] = v.Value
+	}
+
+	addSql := ` INSERT INTO edb_data_dl(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,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 {
+			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)
+				saveValue := sValue
+
+				if existVal, ok := dataMap[eDate]; !ok {
+					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 = to.Raw(sql, sValue, edbInfoId, eDate).Exec()
+						if err != nil {
+							return err
+						}
+					}
+				}
+			}
+		}
+		existMap[v.DataTime] = v.DataTime
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+// GetBaseInfoFromDalianByIndexCode 获取指标信息
+func GetBaseInfoFromDalianByIndexCode(indexCode, suffix string) (list []*BaseInfoFromDl, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_trade_dalian_index WHERE %s_code=? `
+	sql = fmt.Sprintf(sql, suffix)
+	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	return
+}
+
+func GetDlDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromDlDataSimple, err error) {
+	sql := ` SELECT * FROM base_from_trade_dalian_index WHERE 1=1 `
+	o := orm.NewOrmUsingDB("data")
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY data_time DESC `
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}
+
+func AddEdbDataDlBySql(sqlStr string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sqlStr).Exec()
+	return
+}
+
+func GetEdbDataDlByCode(edbCode string) (items []*EdbInfoSearchData, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_data_dl WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
+	_, err = o.Raw(sql, edbCode, utils.EDB_DATA_LIMIT).QueryRows(&items)
+	return
+}
+
+func GetBaseFromDalianDataAllByIndexCode(indexCode, suffix string) (list []*BaseFromTradeDalianIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_trade_dalian_index WHERE %s_code=? `
+	sql = fmt.Sprintf(sql, suffix)
+	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	return
+}
+
+func GetEdbDataDlByCodeAndDate(edbCode string, startDate string) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT COUNT(1) AS count FROM edb_data_dl WHERE edb_code=? AND data_time=? `
+	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
+	return
+}
+
+func ModifyEdbDataDl(edbInfoId int64, dataTime, value string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` UPDATE edb_data_dl SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
+	return
+}

+ 66 - 0
models/data_manage/edb_data_fubao.go

@@ -0,0 +1,66 @@
+package data_manage
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+//富宝数据
+
+type EdbDataFubao struct {
+	EdbDataId     int `orm:"column(edb_data_id);pk"`
+	EdbInfoId     int
+	EdbCode       string
+	DataTime      string
+	Value         float64
+	Status        int
+	CreateTime    time.Time
+	ModifyTime    time.Time
+	DataTimestamp int64
+}
+
+func AddEdbDataFubaoBySql(sqlStr string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sqlStr).Exec()
+	return
+}
+
+func ModifyEdbDataFubao(edbInfoId int64, dataTime string, value float64) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` UPDATE edb_data_ths SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
+	return
+}
+
+func GetEdbDataFubaoMaxOrMinDate(edbCode string) (min_date, max_date string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date FROM edb_data_ths WHERE edb_code=? `
+	err = o.Raw(sql, edbCode).QueryRow(&min_date, &max_date)
+	return
+}
+
+func GetEdbDataFubaoByCodeAndDate(edbCode string, startDate string) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT COUNT(1) AS count FROM edb_data_ths WHERE edb_code=? AND data_time=? `
+	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
+	return
+}
+
+func GetEdbDataFubaoByCode(edbCode string, size int) (items []*EdbInfoSearchData, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_data_ths WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
+	_, err = o.Raw(sql, edbCode, size).QueryRows(&items)
+	return
+}
+
+type EdbDataFromFubao 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"`
+}

+ 554 - 0
models/data_manage/edb_data_gie.go

@@ -0,0 +1,554 @@
+package data_manage
+
+import (
+	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type GieData struct {
+	InputValue string `orm:"column(DATA_VALUE)" description:"日期"`
+	DataTime   string `orm:"column(DATA_DATE)" description:"值"`
+}
+
+func GetEdbDataGieMaxOrMinDate(edbCode string) (minDate, maxDate string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT MIN(data_time) AS minDate,MAX(data_time) AS maxDate FROM edb_data_gie WHERE edb_code=? `
+	err = o.Raw(sql, edbCode).QueryRow(&minDate, &maxDate)
+	return
+}
+
+//func GetEdbDataByGie(edbCode, suffix, startDate, endDate string) (searchItem *EdbInfoSearch, err error) {
+//	o := orm.NewOrmUsingDB("data")
+//	to, err := o.Begin()
+//	if err != nil {
+//		return
+//	}
+//	searchItem = new(EdbInfoSearch)
+//	searchItem.EdbCode = edbCode
+//	eicBaseDataAll, err := GetBaseFromEicDataAllByIndexCode(edbCode, suffix)
+//	if err != nil && err.Error() != utils.ErrNoRow() {
+//		fmt.Println("GetBaseFromEicDataAllByIndexCode err:", err)
+//		return
+//	}
+//
+//	var isAdd bool
+//	addSql := ` INSERT INTO edb_data_gie(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+//	dataList := make([]*EdbInfoSearchData, 0)
+//	existMap := make(map[string]string)
+//
+//	for _, sv := range eicBaseDataAll {
+//		eDate := sv.GasDayStartedOn
+//		dataTime, err := time.Parse(utils.FormatDate, eDate)
+//		if err != nil {
+//			fmt.Println("time.Parse Err:" + eDate)
+//			return nil, err
+//		}
+//		timestamp := dataTime.UnixNano() / 1e6
+//		timeStr := fmt.Sprintf("%d", timestamp)
+//		//var name string
+//		if _, ok := existMap[eDate]; !ok {
+//			if suffix == "GS" {
+//				//name = "gas_in_storage"
+//				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.GasInStorage)
+//				existMap[eDate] = sv.GasInStorage
+//			} else if suffix == "F" {
+//				//name = "full"
+//				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.Full)
+//				existMap[eDate] = sv.Full
+//			} else if suffix == "T" {
+//				//name = "trend"
+//				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.Trend)
+//				existMap[eDate] = sv.Trend
+//			} else if suffix == "In" {
+//				//name = "injection"
+//				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.Injection)
+//				existMap[eDate] = sv.Injection
+//			} else if suffix == "Out" {
+//				//name = "withdrawal"
+//				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.Withdrawal)
+//				existMap[eDate] = sv.Withdrawal
+//			} else if suffix == "WGV" {
+//				//name = "working_gas_volume"
+//				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.WorkingGasVolume)
+//				existMap[eDate] = sv.WorkingGasVolume
+//			} else if suffix == "IC" {
+//				//name = "injection_capacity"
+//				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.InjectionCapacity)
+//				existMap[eDate] = sv.InjectionCapacity
+//			} else if suffix == "WC" {
+//				//name = "withdrawal_capacity"
+//				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.WithdrawalCapacity)
+//				existMap[eDate] = sv.WithdrawalCapacity
+//			}
+//			isAdd = true
+//		}
+//	}
+//	if isAdd {
+//		addSql = strings.TrimRight(addSql, ",")
+//		utils.FileLog.Info("addSql:" + addSql)
+//		_, err = to.Raw(addSql).Exec()
+//		if err != nil {
+//			fmt.Println("addSql err:", err)
+//			return searchItem, err
+//		}
+//	}
+//	if err != nil {
+//		_ = to.Rollback()
+//	} else {
+//		_ = to.Commit()
+//	}
+//	size := utils.EDB_DATA_LIMIT
+//	dataList, err = GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_GIE, size)
+//	if err != nil {
+//		utils.FileLogData.Info("GetEdbDataGieByCode Err:%s", err.Error())
+//		return searchItem, err
+//	}
+//	minDate, maxDate, err := GetEdbDataGieMaxOrMinDate(edbCode)
+//	if err != nil {
+//		return searchItem, err
+//	}
+//	searchItem.DataList = dataList
+//	searchItem.StartDate = minDate
+//	searchItem.EndDate = maxDate
+//	if searchItem.DataList == nil {
+//		searchItem.DataList = make([]*EdbInfoSearchData, 0)
+//	}
+//	return
+//}
+
+// RefreshEdbDataByGie 刷新欧洲天然气指标数据
+func RefreshEdbDataByGie(edbInfoId int, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.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-2:], "CF") {
+		suffix = "CF"
+	} 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 if strings.Contains(edbCode[l-1:], "F") {
+		suffix = "F"
+	} else if strings.Contains(edbCode[l-1:], "C") {
+		suffix = "C"
+	} 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 := GetGieDataByTradeCodeV2(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,status,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 == "C" {
+			value = v.Consumption
+		} else if suffix == "CF" {
+			value = v.ConsumptionFull
+		} 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.GasDayStart]; !ok {
+			count, err := GetEdbDataGieByCodeAndDate(edbCode, v.GasDayStart)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				return err
+			}
+			if count <= 0 {
+				eDate := item.GasDayStart
+				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 {
+				err = ModifyEdbDataGie(int64(edbInfoId), v.GasDayStart, value)
+				if err != nil {
+					return err
+				}
+			}
+		}
+		existMap[v.GasDayStart] = value
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+// RefreshAllEdbDataByGie 全部刷新欧洲天然气
+func RefreshAllEdbDataByGie(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	if err != nil {
+		return
+	}
+	var suffix string
+	l := len(edbCode)
+	if strings.Contains(edbCode[l-2:], "GS") {
+		suffix = "GS"
+	} else if strings.Contains(edbCode[l-2:], "CF") {
+		suffix = "CF"
+	} 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 if strings.Contains(edbCode[l-1:], "F") {
+		suffix = "F"
+	} else if strings.Contains(edbCode[l-1:], "C") {
+		suffix = "C"
+	} 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_start>=? "
+		pars = append(pars, startDate)
+	}
+
+	if endDate != "" {
+		condition += " AND gas_day_start<=? "
+		pars = append(pars, endDate)
+	}
+
+	eicDataList, err := GetGieDataByTradeCodeV2(condition, pars)
+	fmt.Println("all eicDataList", len(eicDataList))
+	//获取指标所有数据
+	dataList := make([]*EdbDataBase, 0)
+	dataTableName := GetEdbDataTableName(source)
+	sql := `SELECT * FROM %s WHERE edb_info_id=? `
+	sql = fmt.Sprintf(sql, dataTableName)
+	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)
+	if err != nil {
+		return err
+	}
+	dataMap := make(map[string]string)
+	for _, v := range dataList {
+		dataMap[v.DataTime] = v.Value
+	}
+
+	addSql := ` INSERT INTO edb_data_gie(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,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 == "C" {
+			value = v.Consumption
+		} else if suffix == "CF" {
+			value = v.ConsumptionFull
+		} 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.GasDayStart]; !ok {
+			eDate := item.GasDayStart
+			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)
+				saveValue := sValue
+
+				if existVal, ok := dataMap[eDate]; !ok {
+					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 = to.Raw(sql, sValue, edbInfoId, eDate).Exec()
+						if err != nil {
+							return err
+						}
+					}
+				}
+			}
+		}
+		existMap[v.GasDayStart] = v.GasDayStart
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+// GetBaseInfoFromEicByIndexCode 获取指标信息
+func GetBaseInfoFromEicByIndexCode(indexCode, suffix string) (list []*BaseFromTradeEicIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_trade_eic_index WHERE %s_code=? `
+	sql = fmt.Sprintf(sql, suffix)
+	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	return
+}
+
+func GetGieDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromTradeEicIndex, err error) {
+	sql := ` SELECT * FROM base_from_trade_eic_index WHERE 1=1 `
+	o := orm.NewOrmUsingDB("data")
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY gas_day_started_on DESC `
+	fmt.Println(sql, pars)
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}
+
+type EicIndexV2 struct {
+	BaseFromEicIndexId     int `orm:"column(base_from_eic_index_id);pk"`
+	Type                   string
+	EicCode                string
+	Name                   string
+	Status                 string
+	GasDayStart            string
+	GasInStorage           string
+	GasInStorageCode       string
+	Consumption            string
+	ConsumptionCode        string
+	ConsumptionFull        string
+	ConsumptionFullCode    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
+	Parent                 string
+	CreateTime             time.Time
+	ModifyTime             time.Time
+	Children               []BaseFromTradeEicIndexV2
+}
+
+func GetGieDataByTradeCodeV2(condition string, pars []interface{}) (item []*EicIndexV2, err error) {
+	sql := ` SELECT * FROM base_from_trade_eic_index_v2 WHERE 1=1 `
+	o := orm.NewOrmUsingDB("data")
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY gas_day_start DESC `
+	fmt.Println(sql, pars)
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}
+
+func AddEdbDataGieBySql(sqlStr string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sqlStr).Exec()
+	return
+}
+
+func GetEdbDataGieByCode(edbCode string) (items []*EdbInfoSearchData, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_data_gie WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
+	_, err = o.Raw(sql, edbCode, utils.EDB_DATA_LIMIT).QueryRows(&items)
+	return
+}
+
+func GetBaseFromEicDataAllByIndexCode(indexCode, suffix string) (list []*BaseFromTradeEicIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	var name string
+	if suffix == "" {
+		name = "eic_code"
+	} else if suffix == "GS" {
+		name = "gas_in_storage_code"
+	} else if suffix == "C" {
+		name = "consumption_code"
+	} else if suffix == "CF" {
+		name = "consumption_full_code"
+	} else if suffix == "F" {
+		name = "full_code"
+	} else if suffix == "T" {
+		name = "trend_code"
+	} else if suffix == "In" {
+		name = "injection_code"
+	} else if suffix == "Out" {
+		name = "withdrawal_code"
+	} else if suffix == "WGV" {
+		name = "working_gas_volume_code"
+	} else if suffix == "IC" {
+		name = "injection_capacity_code"
+	} else if suffix == "WC" {
+		name = "withdrawal_capacity_code"
+	}
+	sql := `SELECT * FROM base_from_trade_eic_index_v2 WHERE %s=? `
+	sql = fmt.Sprintf(sql, name)
+	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	return
+}
+
+func GetBaseFromEicDataAllByIndexCodeV2(indexCode, suffix string) (list []*BaseFromTradeEicIndexV2, err error) {
+	o := orm.NewOrmUsingDB("data")
+	var name string
+	if suffix == "" {
+		name = "eic_code"
+	} else if suffix == "GS" {
+		name = "gas_in_storage_code"
+	} else if suffix == "C" {
+		name = "consumption_code"
+	} else if suffix == "CF" {
+		name = "consumption_full_code"
+	} else if suffix == "F" {
+		name = "full_code"
+	} else if suffix == "T" {
+		name = "trend_code"
+	} else if suffix == "In" {
+		name = "injection_code"
+	} else if suffix == "Out" {
+		name = "withdrawal_code"
+	} else if suffix == "WGV" {
+		name = "working_gas_volume_code"
+	} else if suffix == "IC" {
+		name = "injection_capacity_code"
+	} else if suffix == "WC" {
+		name = "withdrawal_capacity_code"
+	}
+	sql := `SELECT * FROM base_from_trade_eic_index_v2 WHERE %s=? `
+	sql = fmt.Sprintf(sql, name)
+	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	return
+}
+
+func GetEdbDataGieByCodeAndDate(edbCode string, startDate string) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT COUNT(1) AS count FROM edb_data_gie WHERE edb_code=? AND data_time=? `
+	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
+	return
+}
+
+func ModifyEdbDataGie(edbInfoId int64, dataTime, value string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` UPDATE edb_data_gie SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
+	return
+}

+ 333 - 0
models/data_manage/edb_data_gl.go

@@ -0,0 +1,333 @@
+package data_manage
+
+import (
+	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+func AddEdbDataGlBySql(sqlStr string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sqlStr).Exec()
+	return
+}
+
+func GetEdbDataGlByEdbCode(edbCode string) (items []*EdbInfoSearchData, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_data_gl WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
+	_, err = o.Raw(sql, edbCode, utils.EDB_DATA_LIMIT).QueryRows(&items)
+	return
+}
+
+func GetEdbDataGlMaxOrMinDate(edbCode string) (min_date, max_date string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date FROM edb_data_gl WHERE edb_code=? `
+	err = o.Raw(sql, edbCode).QueryRow(&min_date, &max_date)
+	return
+}
+
+type GlData struct {
+	InputValue string `orm:"column(DATA_VALUE)" description:"日期"`
+	DataTime   string `orm:"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 `
+	o := orm.NewOrmUsingDB("gl")
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY PUBLISH_TIME DESC `
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}
+
+func GetEdbDataGlByCode(edbCode string) (items []*EdbInfoSearchData, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_data_gl WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
+	_, err = o.Raw(sql, edbCode, utils.EDB_DATA_LIMIT).QueryRows(&items)
+	return
+}
+
+func GetEdbDataByGl(edbCode, startDate, endDate string) (searchItem *EdbInfoSearch, err error) {
+
+	var condition string
+	var pars []interface{}
+
+	if edbCode != "" {
+		condition += " AND INDEX_CODE=? "
+		pars = append(pars, edbCode)
+	}
+
+	glDataList, err := GetGlDataByTradeCode(condition, pars)
+	if err != nil {
+		return
+	}
+	searchItem = new(EdbInfoSearch)
+	searchItem.EdbCode = edbCode
+	dataLen := len(glDataList)
+
+	existMap := make(map[string]string)
+	if dataLen > 0 {
+		var isAdd bool
+		addSql := ` INSERT INTO edb_data_gl(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+		dataList := make([]*EdbInfoSearchData, 0)
+		for i := 0; i < dataLen; i++ {
+			item := glDataList[i]
+			eDate := item.DataTime
+			sValue := item.InputValue
+			if sValue != "" {
+				if _, ok := existMap[eDate]; !ok {
+					dataTime, err := time.Parse(utils.FormatDate, eDate)
+					if err != nil {
+						return nil, err
+					}
+					timestamp := dataTime.UnixNano() / 1e6
+					timeStr := fmt.Sprintf("%d", timestamp)
+					addSql += GetAddSql("0", edbCode, eDate, timeStr, sValue)
+					isAdd = true
+				}
+			}
+			existMap[eDate] = eDate
+		}
+		fmt.Println("isAdd:", isAdd)
+		if isAdd {
+			//addSql = strings.TrimRight(addSql, ",")
+			//fmt.Println("addSql:exec start")
+			//_, err = o.Raw(addSql).Exec()
+			//if err != nil {
+			//	utils.FileLogData.Info("GetEdbDataByGl Err:%s", err.Error())
+			//	return
+			//}
+			//fmt.Println("addSql:exec end")
+			addSql = strings.TrimRight(addSql, ",")
+			utils.FileLog.Info(addSql)
+			err = AddEdbDataGlBySql(addSql)
+			if err != nil {
+				utils.FileLogData.Info("AddEdbDataGlBySql Err:%s", err.Error())
+				return
+			}
+		}
+		dataList, err := GetEdbDataGlByCode(edbCode)
+		if err != nil {
+			utils.FileLogData.Info("GetEdbDataGlByCode Err:%s", err.Error())
+			return searchItem, err
+		}
+		minDate, maxDate, err := GetEdbDataGlMaxOrMinDate(edbCode)
+		if err != nil {
+			return searchItem, err
+		}
+		searchItem.DataList = dataList
+		searchItem.StartDate = minDate
+		searchItem.EndDate = maxDate
+	}
+	if searchItem.DataList == nil {
+		searchItem.DataList = make([]*EdbInfoSearchData, 0)
+	}
+	return
+}
+
+func ModifyEdbDataGlStatus(edbInfoId int64, edbCode string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` UPDATE edb_data_gl SET edb_info_id=?, status=1,modify_time=NOW() WHERE edb_code=? `
+	_, err = o.Raw(sql, edbInfoId, edbCode).Exec()
+	return
+}
+
+func GetEdbDataGlByCodeAndDate(edbCode string, startDate string) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT COUNT(1) AS count FROM edb_data_gl WHERE edb_code=? AND data_time=? `
+	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
+	return
+}
+
+func ModifyEdbDataGl(edbInfoId int64, dataTime, value string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` UPDATE edb_data_gl SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
+	return
+}
+
+// 刷新钢联指标数据
+func RefreshEdbDataByGl(edbInfoId int, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.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 := GetGlDataByTradeCode(condition, pars)
+
+	addSql := ` INSERT INTO edb_data_gl(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,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 := GetEdbDataGlByCodeAndDate(edbCode, v.DataTime)
+			if err != nil && err.Error() != 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 {
+				err = ModifyEdbDataGl(int64(edbInfoId), v.DataTime, v.InputValue)
+				if err != nil {
+					return err
+				}
+			}
+		}
+		existMap[v.DataTime] = v.InputValue
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+// 全部刷新隆众数据
+func RefreshAllEdbDataByGl(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.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 := GetGlDataByTradeCode(condition, pars)
+
+	//获取指标所有数据
+	dataList := make([]*EdbDataBase, 0)
+	dataTableName := GetEdbDataTableName(source)
+	sql := `SELECT * FROM %s WHERE edb_info_id=? `
+	sql = fmt.Sprintf(sql, dataTableName)
+	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)
+	if err != nil {
+		return err
+	}
+	dataMap := make(map[string]string)
+	for _, v := range dataList {
+		dataMap[v.DataTime] = v.Value
+	}
+
+	addSql := ` INSERT INTO edb_data_gl(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+	var isAdd bool
+	existMap := make(map[string]string)
+	for _, v := range glDataList {
+		item := v
+		if _, ok := existMap[v.DataTime]; !ok {
+			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)
+				saveValue := sValue
+
+				if existVal, ok := dataMap[eDate]; !ok {
+					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 = to.Raw(sql, sValue, edbInfoId, eDate).Exec()
+						if err != nil {
+							return err
+						}
+					}
+				}
+			}
+		}
+		existMap[v.DataTime] = v.DataTime
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}

+ 143 - 0
models/data_manage/edb_data_insert_config.go

@@ -0,0 +1,143 @@
+package data_manage
+
+import (
+	"errors"
+	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// EdbDataInsertConfig 指标数据插入配置表
+type EdbDataInsertConfig struct {
+	EdbInfoId  int       `orm:"column(edb_info_id);pk" description:"指标id"`
+	Date       time.Time `description:"插入的日期"`
+	Value      string    `description:"插入的值"`
+	RealDate   time.Time `description:"实际数据的值日期"`
+	ModifyTime time.Time `description:"数据更新时间"`
+	CreateTime time.Time `description:"数据插入的时间"`
+}
+
+// GetEdbDataInsertConfigByEdbId 根据指标id 获取数据插入配置详情
+func GetEdbDataInsertConfigByEdbId(edbInfoId int) (item *EdbDataInsertConfig, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_data_insert_config WHERE edb_info_id=? `
+	err = o.Raw(sql, edbInfoId).QueryRow(&item)
+	return
+}
+
+// CreateEdbDataInsertConfigAndData 创建数据插入配置规则,及插入数据
+func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value float64) (err error, errMsg string, isSendEmail bool) {
+	isSendEmail = true
+
+	tableName := GetEdbDataTableName(edbInfo.Source)
+	if tableName == `` {
+		err = errors.New("找不到该指标的数据表")
+		return
+	}
+
+	dateStr := date.Format(utils.FormatDate)
+	timestamp := date.UnixNano() / 1e6
+	timeStr := fmt.Sprintf("%d", timestamp)
+	saveValue := utils.SubFloatToString(value, 30)
+
+	to, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	var oldConfigDate time.Time //之前配置的日期
+	// 添加/变更配置
+	{
+		var item *EdbDataInsertConfig
+		sql := ` SELECT * FROM edb_data_insert_config WHERE edb_info_id=? `
+		err = to.Raw(sql, edbInfo.EdbInfoId).QueryRow(&item)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			return
+		}
+		err = nil
+
+		// 如果是没有配置,那么就需要添加配置
+		if item == nil {
+			var currLatestDate time.Time
+			currLatestDateStr := edbInfo.LatestDate // 实际日期
+			if currLatestDateStr != `` && currLatestDateStr != `0000-00-00` {
+				currLatestDate, _ = time.ParseInLocation(utils.FormatDate, currLatestDateStr, time.Local)
+			}
+			if !currLatestDate.IsZero() && (currLatestDate.After(date) || currLatestDate.Equal(date)) {
+				errMsg = `选择日期不能早于/等于数据最新日期`
+				err = errors.New("选择日期不能早于/等于数据最新日期,数据最新日期:" + edbInfo.EndDate + ";填写日期:" + dateStr)
+				isSendEmail = false
+				return
+			}
+
+			realDate, _ := time.ParseInLocation(utils.FormatDate, edbInfo.LatestDate, time.Local)
+			item = &EdbDataInsertConfig{
+				EdbInfoId:  edbInfo.EdbInfoId,
+				Date:       date,
+				Value:      saveValue,
+				RealDate:   realDate,
+				ModifyTime: time.Now(),
+				CreateTime: time.Now(),
+			}
+			_, err = to.Insert(item)
+		} else {
+			if date.Equal(item.RealDate) || date.Before(item.RealDate) {
+				errMsg = `选择日期不能早于/等于数据最新日期`
+				err = errors.New("选择日期不能早于/等于数据最新日期,数据最新日期:" + edbInfo.EndDate + ";填写日期:" + dateStr)
+				isSendEmail = false
+				return
+			}
+			oldConfigDate = item.Date // 之前配置的日期
+
+			item.Date = date
+			item.Value = saveValue
+			item.ModifyTime = time.Now()
+			_, err = to.Update(item, "Date", "Value", "ModifyTime")
+		}
+		if err != nil {
+			return
+		}
+	}
+
+	// 更改数据
+	{
+		var edbDateData *EdbDataList
+		if !oldConfigDate.IsZero() {
+			sql := `SELECT edb_data_id,edb_info_id,data_time,value,data_timestamp FROM %s WHERE edb_info_id=? AND data_time = ?`
+			sql = fmt.Sprintf(sql, tableName)
+			err = to.Raw(sql, edbInfo.EdbInfoId, oldConfigDate.Format(utils.FormatDate)).QueryRow(&edbDateData)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				return
+			}
+			err = nil
+		}
+
+		// 如果是没有历史数据,那么就需要增加数据
+		if edbDateData == nil {
+			addSql := ` INSERT INTO %s (edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) VALUES ( %d, "%s", "%s", "%s", now(), now(), %s) `
+			addSql = fmt.Sprintf(addSql, tableName, edbInfo.EdbInfoId, edbInfo.EdbCode, dateStr, saveValue, timeStr)
+			_, err = to.Raw(addSql).Exec()
+		} else {
+			updateSql := `UPDATE %s SET data_time = "%s", value = "%s", modify_time= now(), data_timestamp= %s WHERE edb_data_id = %d;`
+			updateSql = fmt.Sprintf(updateSql, tableName, dateStr, saveValue, timeStr, edbDateData.EdbDataId)
+			_, err = to.Raw(updateSql).Exec()
+		}
+		if err != nil {
+			return
+		}
+	}
+
+	// 更改指标的数据结束日期
+	edbInfo.EndDate = dateStr
+	_, err = to.Update(edbInfo, "EndDate")
+
+	return
+}

+ 327 - 0
models/data_manage/edb_data_lz.go

@@ -0,0 +1,327 @@
+package data_manage
+
+import (
+	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+func AddEdbDataLzBySql(sqlStr string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sqlStr).Exec()
+	return
+}
+
+func GetEdbDataLzByEdbCode(edbCode string) (items []*EdbInfoSearchData, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_data_lz WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
+	_, err = o.Raw(sql, edbCode, utils.EDB_DATA_LIMIT).QueryRows(&items)
+	return
+}
+
+func GetEdbDataLzMaxOrMinDate(edbCode string) (min_date, max_date string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date FROM edb_data_lz WHERE edb_code=? `
+	err = o.Raw(sql, edbCode).QueryRow(&min_date, &max_date)
+	return
+}
+
+type lzSurveyData struct {
+	DataTime   string `orm:"column(data_time)" description:"日期"`
+	InputValue string `orm:"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 `
+	o := orm.NewOrmUsingDB("edb")
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY a.data_time DESC `
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}
+
+func GetEdbDataLzByCode(edbCode string) (items []*EdbInfoSearchData, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_data_lz WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
+	_, err = o.Raw(sql, edbCode, utils.EDB_DATA_LIMIT).QueryRows(&items)
+	return
+}
+
+func GetEdbDataByLz(edbCode, startDate, endDate string) (searchItem *EdbInfoSearch, err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	var condition string
+	var pars []interface{}
+
+	if edbCode != "" {
+		condition += " AND b.lz_code=? "
+		pars = append(pars, edbCode)
+	}
+
+	lzDataList, err := GetLzSurveyDataByTradeCode(condition, pars)
+	if err != nil {
+		return
+	}
+	searchItem = new(EdbInfoSearch)
+	searchItem.EdbCode = edbCode
+	dataLen := len(lzDataList)
+
+	if dataLen > 0 {
+		var isAdd bool
+		addSql := ` INSERT INTO edb_data_lz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+		nowStr := time.Now().Format(utils.FormatDateTime)
+		dataList := make([]*EdbInfoSearchData, 0)
+		for i := 0; i < dataLen; i++ {
+			item := lzDataList[i]
+			eDate := item.DataTime
+			sValue := item.InputValue
+			dataTime, err := time.Parse(utils.FormatDate, eDate)
+			if err != nil {
+				return nil, err
+			}
+			timestamp := dataTime.UnixNano() / 1e6
+			timeStr := fmt.Sprintf("%d", timestamp)
+			addSql += "("
+			addSql += "0," + "'" + edbCode + "'" + "," + "'" + eDate + "'" + "," + sValue + "," + "'" + nowStr + "'" +
+				"," + "'" + nowStr + "'" + "," + "0" + "," + "'" + timeStr + "'"
+			addSql += "),"
+			isAdd = true
+		}
+		if isAdd {
+			addSql = strings.TrimRight(addSql, ",")
+			err = AddEdbDataLzBySql(addSql)
+			if err != nil {
+				utils.FileLogData.Info("AddEdbDataLzBySql Err:%s", err.Error())
+				return
+			}
+		}
+
+		dataList, err := GetEdbDataLzByCode(edbCode)
+		if err != nil {
+			utils.FileLogData.Info("GetEdbDataLzByCode Err:%s", err.Error())
+			return searchItem, err
+		}
+		minDate, maxDate, err := GetEdbDataLzMaxOrMinDate(edbCode)
+		if err != nil {
+			return searchItem, err
+		}
+		searchItem.DataList = dataList
+		searchItem.StartDate = minDate
+		searchItem.EndDate = maxDate
+	}
+	if searchItem.DataList == nil {
+		searchItem.DataList = make([]*EdbInfoSearchData, 0)
+	}
+	return
+}
+
+func ModifyEdbDataLzStatus(edbInfoId int64, edbCode string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` UPDATE edb_data_lz SET edb_info_id=?, status=1,modify_time=NOW() WHERE edb_code=? `
+	_, err = o.Raw(sql, edbInfoId, edbCode).Exec()
+	return
+}
+
+func GetEdbDataLzByCodeAndDate(edbCode string, startDate string) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT COUNT(1) AS count FROM edb_data_lz WHERE edb_code=? AND data_time=? `
+	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
+	return
+}
+
+func ModifyEdbDataLz(edbInfoId int64, dataTime, value string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` UPDATE edb_data_lz SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
+	return
+}
+
+// 刷新隆众指标数据
+func RefreshEdbDataByLz(edbInfoId int, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.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 := GetLzSurveyDataByTradeCode(condition, pars)
+
+	addSql := ` INSERT INTO edb_data_lz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+	var isAdd bool
+	for _, v := range lzDataList {
+		item := v
+		count, err := GetEdbDataLzByCodeAndDate(edbCode, v.DataTime)
+		if err != nil && err.Error() != 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 + "'" + "," + "1" + "," + "'" + timeStr + "'"
+			addSql += "),"
+			isAdd = true
+		} else {
+			err = ModifyEdbDataLz(int64(edbInfoId), v.DataTime, v.InputValue)
+			if err != nil {
+				return err
+			}
+		}
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+// 全部刷新隆众数据
+func RefreshAllEdbDataByLz(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.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 := GetLzSurveyDataByTradeCode(condition, pars)
+
+	//获取指标所有数据
+	dataList := make([]*EdbDataBase, 0)
+	dataTableName := GetEdbDataTableName(source)
+	sql := `SELECT * FROM %s WHERE edb_info_id=? `
+	sql = fmt.Sprintf(sql, dataTableName)
+	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)
+	if err != nil {
+		return err
+	}
+	dataMap := make(map[string]string)
+	for _, v := range dataList {
+		dataMap[v.DataTime] = v.Value
+	}
+
+	addSql := ` INSERT INTO edb_data_lz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+	var isAdd bool
+	for _, v := range lzDataList {
+		item := v
+
+		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)
+		saveValue := sValue
+
+		if existVal, ok := dataMap[eDate]; !ok {
+			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 = to.Raw(sql, sValue, edbInfoId, eDate).Exec()
+				if err != nil {
+					return err
+				}
+			}
+		}
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}

+ 323 - 0
models/data_manage/edb_data_manual.go

@@ -0,0 +1,323 @@
+package data_manage
+
+import (
+	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+func AddEdbDataManualBySql(sqlStr string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sqlStr).Exec()
+	return
+}
+
+func GetEdbDataManualMaxOrMinDate(edbCode string) (min_date, max_date string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date FROM edb_data_manual WHERE edb_code=? `
+	err = o.Raw(sql, edbCode).QueryRow(&min_date, &max_date)
+	return
+}
+
+type ManualEdbdata struct {
+	TradeCode  string    `orm:"column(TRADE_CODE);pk" description:"指标编码"`
+	Dt         string    `orm:"column(DT)" description:"日期"`
+	Close      string    `orm:"column(CLOSE)" description:"值"`
+	ModifyTime time.Time `orm:"column(modify_time)" description:"修改时间"`
+}
+
+func GetEdbdataManualByTradeCode(condition string, pars []interface{}) (item []*ManualEdbdata, err error) {
+	sql := ` SELECT  * FROM edbdata WHERE 1=1 `
+	o := orm.NewOrmUsingDB("edb")
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY DT DESC `
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}
+
+func GetEdbDataManualByCode(edbCode string, size int) (items []*EdbInfoSearchData, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_data_manual WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
+	_, err = o.Raw(sql, edbCode, size).QueryRows(&items)
+	return
+}
+
+func GetEdbDataByManual(edbCode, startDate, endDate string) (searchItem *EdbInfoSearch, err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	var condition string
+	var pars []interface{}
+
+	if edbCode != "" {
+		condition += " AND TRADE_CODE=? "
+		pars = append(pars, edbCode)
+	}
+
+	manualDataList, err := GetEdbdataManualByTradeCode(condition, pars)
+	if err != nil {
+		return
+	}
+	searchItem = new(EdbInfoSearch)
+	searchItem.EdbCode = edbCode
+	dataLen := len(manualDataList)
+
+	if dataLen > 0 {
+		var isAdd bool
+		addSql := ` INSERT INTO edb_data_manual(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+		nowStr := time.Now().Format(utils.FormatDateTime)
+		dataList := make([]*EdbInfoSearchData, 0)
+		for i := 0; i < dataLen; i++ {
+			item := manualDataList[i]
+			eDate := item.Dt
+			sValue := item.Close
+			dataTime, err := time.Parse(utils.FormatDate, eDate)
+			if err != nil {
+				return nil, err
+			}
+			timestamp := dataTime.UnixNano() / 1e6
+			timeStr := fmt.Sprintf("%d", timestamp)
+			addSql += "("
+			addSql += "0," + "'" + edbCode + "'" + "," + "'" + eDate + "'" + "," + sValue + "," + "'" + nowStr + "'" +
+				"," + "'" + nowStr + "'" + "," + "0" + "," + "'" + timeStr + "'"
+			addSql += "),"
+			isAdd = true
+		}
+		if isAdd {
+			addSql = strings.TrimRight(addSql, ",")
+			err = AddEdbDataManualBySql(addSql)
+			if err != nil {
+				utils.FileLogData.Info("AddEdbDataThsBySql Err:%s", err.Error())
+				return
+			}
+		}
+
+		size := utils.EDB_DATA_LIMIT
+		dataList, err := GetEdbDataManualByCode(edbCode, size)
+		if err != nil {
+			utils.FileLogData.Info("GetEdbDataThsByCode Err:%s", err.Error())
+			return searchItem, err
+		}
+		minDate, maxDate, err := GetEdbDataManualMaxOrMinDate(edbCode)
+		if err != nil {
+			return searchItem, err
+		}
+		searchItem.DataList = dataList
+		searchItem.StartDate = minDate
+		searchItem.EndDate = maxDate
+	}
+	if searchItem.DataList == nil {
+		searchItem.DataList = make([]*EdbInfoSearchData, 0)
+	}
+	return
+}
+
+func GetEdbDataManualByCodeAndDate(edbCode string, startDate string) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT COUNT(1) AS count FROM edb_data_manual WHERE edb_code=? AND data_time=? `
+	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
+	return
+}
+
+func ModifyEdbDataManual(edbInfoId int64, dataTime, value string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` UPDATE edb_data_manual SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
+	return
+}
+
+// 刷新手工指标数据
+func RefreshEdbDataByManual(edbInfoId int, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.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)
+	}
+
+	if startDate != "" {
+		condition += " AND DT>=? "
+		pars = append(pars, startDate)
+	}
+
+	if endDate != "" {
+		condition += " AND DT<=? "
+		pars = append(pars, endDate)
+	}
+
+	manualDataList, err := GetEdbdataManualByTradeCode(condition, pars)
+
+	addSql := ` INSERT INTO edb_data_manual(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+	var isAdd bool
+	for _, v := range manualDataList {
+		item := v
+		count, err := GetEdbDataManualByCodeAndDate(v.TradeCode, v.Dt)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			return err
+		}
+		if count <= 0 {
+			nowStr := time.Now().Format(utils.FormatDateTime)
+			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 += "("
+			addSql += edbInfoIdStr + "," + "'" + edbCode + "'" + "," + "'" + eDate + "'" + "," + sValue + "," + "'" + nowStr + "'" +
+				"," + "'" + nowStr + "'" + "," + "1" + "," + "'" + timeStr + "'"
+			addSql += "),"
+			isAdd = true
+		} else {
+			err = ModifyEdbDataManual(int64(edbInfoId), v.Dt, v.Close)
+			if err != nil {
+				return err
+			}
+		}
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+// 刷新手工指标数据
+func RefreshAllEdbDataByManual(edbInfoId, source int, edbCode string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.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 := GetEdbdataManualByTradeCode(condition, pars)
+	//获取指标所有数据
+	existDataList := make([]*EdbDataBase, 0)
+	dataTableName := GetEdbDataTableName(source)
+	sql := `SELECT * FROM %s WHERE edb_info_id=? `
+	sql = fmt.Sprintf(sql, dataTableName)
+	_, err = to.Raw(sql, edbInfoId).QueryRows(&existDataList)
+	if err != nil {
+		return err
+	}
+	existDataMap := make(map[string]*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,status,data_timestamp) values `
+	var isAdd bool
+	manualMap := make(map[string]*ManualEdbdata)
+	fmt.Println("manualDataList:", len(manualDataList))
+	for _, v := range manualDataList {
+		item := v
+		fmt.Println("Item:", item.Dt, item.Close, item.TradeCode, item.ModifyTime)
+		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 = to.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 DeleteEdbDataByIdAndSource(v.EdbDataId, utils.DATA_SOURCE_MANUAL)
+		}
+	}
+	fmt.Println("isAdd:", isAdd)
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = to.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 := GetEdbDataTableName(source)
+	sql = fmt.Sprintf(sql, tableName)
+
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sql, edbDataId).Exec()
+	return
+}

+ 13 - 0
models/data_manage/edb_data_mysteel_chemical.go

@@ -0,0 +1,13 @@
+package data_manage
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+)
+
+// GetEdbDataMysteelChemicalMaxOrMinDate 根据钢联化工指标code获取最大、最小日期
+func GetEdbDataMysteelChemicalMaxOrMinDate(edbCode string) (minDate, maxDate string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT MIN(data_time) AS minDate,MAX(data_time) AS maxDate FROM edb_data_mysteel_chemical WHERE edb_code=? `
+	err = o.Raw(sql, edbCode).QueryRow(&minDate, &maxDate)
+	return
+}

+ 27 - 0
models/data_manage/edb_data_pb.go

@@ -0,0 +1,27 @@
+package data_manage
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type EdbDataPb struct {
+	EdbDataId     int `orm:"column(edb_data_id);pk"`
+	EdbInfoId     int
+	EdbCode       string
+	DataTime      string
+	Value         float64
+	Status        int
+	CreateTime    time.Time
+	ModifyTime    time.Time
+	Ticker        string
+	Field         string
+	DataTimestamp int64
+}
+
+func GetEdbDataPbMaxOrMinDate(edbCode string) (min_date, max_date string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date FROM edb_data_pb WHERE edb_code=? `
+	err = o.Raw(sql, edbCode).QueryRow(&min_date, &max_date)
+	return
+}

+ 99 - 0
models/data_manage/edb_data_sci.go

@@ -0,0 +1,99 @@
+package data_manage
+
+import (
+	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type BaseFromSciDataSimple struct {
+	SciDataId          int `orm:"column(sci_data_id);pk"`
+	BaseFromSciIndexId int
+	IndexCode          string
+	DataTime           string
+	Value              string
+}
+
+func GetEdbDataSciMaxAndMinDate(edbCode string) (min_date, max_date string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date FROM edb_data_sci WHERE edb_code=? `
+	err = o.Raw(sql, edbCode).QueryRow(&min_date, &max_date)
+	return
+}
+
+// 全部刷新有色数据
+func RefreshAllEdbDataBySci(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	if err != nil {
+		return
+	}
+	edbInfoIdStr := strconv.Itoa(edbInfoId)
+
+	//获取已存在指标所有数据
+	existDataList := make([]*EdbDataBase, 0)
+	dataTableName := GetEdbDataTableName(source)
+	sql := `SELECT * FROM %s WHERE edb_info_id=? `
+	sql = fmt.Sprintf(sql, dataTableName)
+	_, err = to.Raw(sql, edbInfoId).QueryRows(&existDataList)
+	if err != nil {
+		return err
+	}
+	existDataMap := make(map[string]string)
+	for _, v := range existDataList {
+		existDataMap[v.DataTime] = v.Value
+	}
+
+	sciDateList := make([]*BaseFromSciDataSimple, 0)
+	sciSql := ` SELECT * FROM base_from_sci_data WHERE index_code=? AND data_time>=? `
+	_, err = to.Raw(sciSql, edbCode, startDate).QueryRows(&sciDateList)
+	if err != nil {
+		return err
+	}
+
+	addSql := ` INSERT INTO edb_data_sci(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+	var isAdd bool
+	for _, sv := range sciDateList {
+		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 = to.Raw(sql, sv.Value, edbInfoId, sv.DataTime).Exec()
+				if err != nil {
+					return err
+				}
+			}
+		}
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}

+ 416 - 0
models/data_manage/edb_data_sh.go

@@ -0,0 +1,416 @@
+package data_manage
+
+import (
+	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type ShData struct {
+	InputValue string `orm:"column(DATA_VALUE)" description:"日期"`
+	DataTime   string `orm:"column(DATA_DATE)" description:"值"`
+}
+
+type BaseFromShDataSimple struct {
+	Id        int `orm:"column(base_from_trade_shanghai_index_id);pk"`
+	DealCode  string
+	BuyCode   string
+	SoldCode  string
+	DataTime  string
+	DealValue string
+	BuyValue  string
+	SoldValue string
+}
+
+type BaseInfoFromSh struct {
+	DealName string
+	BuyName  string
+	SoldName string
+}
+
+type BaseFromTradeShIndex struct {
+	BaseFromTradeShIndexId int `orm:"column(base_from_trade_shanghai_index_id);pk"`
+	Rank                   int
+	DealShortName          string
+	DealName               string
+	DealCode               string
+	DealValue              string
+	DealChange             int
+	BuyShortName           string
+	BuyName                string
+	BuyCode                string
+	BuyValue               string
+	BuyChange              int
+	SoldShortName          string
+	SoldName               string
+	SoldCode               string
+	SoldValue              string
+	SoldChange             int
+	Frequency              string
+	ClassifyName           string
+	ClassifyType           string
+	CreateTime             time.Time
+	ModifyTime             time.Time
+	DataTime               string
+}
+
+func GetEdbDataShMaxOrMinDate(edbCode string) (minDate, maxDate string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT MIN(data_time) AS minDate,MAX(data_time) AS maxDate FROM edb_data_sh WHERE edb_code=? `
+	err = o.Raw(sql, edbCode).QueryRow(&minDate, &maxDate)
+	return
+}
+
+func GetEdbDataBySh(edbCode, suffix, startDate, endDate string) (searchItem *EdbInfoSearch, err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	searchItem = new(EdbInfoSearch)
+	searchItem.EdbCode = edbCode
+	shBaseDataAll, err := GetBaseFromShDataAllByIndexCode(edbCode, suffix)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+
+	var isAdd bool
+	addSql := ` INSERT INTO edb_data_sh(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+	dataList := make([]*EdbInfoSearchData, 0)
+	existMap := make(map[string]string)
+
+	for _, sv := range shBaseDataAll {
+		eDate := sv.DataTime
+		dataTime, err := time.Parse(utils.FormatDate, eDate)
+		if err != nil {
+			fmt.Println("time.Parse Err:" + eDate)
+			return nil, err
+		}
+		timestamp := dataTime.UnixNano() / 1e6
+		timeStr := fmt.Sprintf("%d", timestamp)
+		if _, ok := existMap[eDate]; !ok {
+			if suffix == "deal" {
+				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.DealValue)
+			} else if suffix == "buy" {
+				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.BuyValue)
+			} else {
+				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.SoldValue)
+			}
+			isAdd = true
+		}
+		if suffix == "deal" {
+			existMap[eDate] = sv.DealValue
+		} else if suffix == "buy" {
+			existMap[eDate] = sv.BuyValue
+		} else {
+			existMap[eDate] = sv.SoldValue
+		}
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		utils.FileLog.Info("addSql:" + addSql)
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return searchItem, err
+		}
+	}
+	if err != nil {
+		_ = to.Rollback()
+	} else {
+		_ = to.Commit()
+	}
+
+	size := utils.EDB_DATA_LIMIT
+	dataList, err = GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_SH, size)
+	if err != nil {
+		utils.FileLogData.Info("GetEdbDataShByCode Err:%s", err.Error())
+		return searchItem, err
+	}
+	minDate, maxDate, err := GetEdbDataShMaxOrMinDate(edbCode)
+	if err != nil {
+		return searchItem, err
+	}
+	searchItem.DataList = dataList
+	searchItem.StartDate = minDate
+	searchItem.EndDate = maxDate
+	if searchItem.DataList == nil {
+		searchItem.DataList = make([]*EdbInfoSearchData, 0)
+	}
+	return
+}
+
+// RefreshEdbDataBySh 刷新上期所指标数据
+func RefreshEdbDataBySh(edbInfoId int, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	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 := GetShDataByTradeCode(condition, pars)
+
+	addSql := ` INSERT INTO edb_data_sh(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,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 := GetEdbDataShByCodeAndDate(edbCode, v.DataTime)
+			if err != nil && err.Error() != 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 {
+				err = ModifyEdbDataSh(int64(edbInfoId), v.DataTime, value)
+				if err != nil {
+					return err
+				}
+			}
+		}
+		existMap[v.DataTime] = value
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+// RefreshAllEdbDataBySh 全部刷新上期所
+func RefreshAllEdbDataBySh(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	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 := GetShDataByTradeCode(condition, pars)
+
+	//获取指标所有数据
+	dataList := make([]*EdbDataBase, 0)
+	dataTableName := GetEdbDataTableName(source)
+	sql := `SELECT * FROM %s WHERE edb_info_id=? `
+	sql = fmt.Sprintf(sql, dataTableName)
+	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)
+	if err != nil {
+		return err
+	}
+	dataMap := make(map[string]string)
+	for _, v := range dataList {
+		dataMap[v.DataTime] = v.Value
+	}
+
+	addSql := ` INSERT INTO edb_data_sh(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,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 {
+			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)
+				saveValue := sValue
+
+				if existVal, ok := dataMap[eDate]; !ok {
+					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 = to.Raw(sql, sValue, edbInfoId, eDate).Exec()
+						if err != nil {
+							return err
+						}
+					}
+				}
+			}
+		}
+		existMap[v.DataTime] = v.DataTime
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+// GetBaseInfoFromShByIndexCode 获取指标信息
+func GetBaseInfoFromShByIndexCode(indexCode, suffix string) (list []*BaseInfoFromSh, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_trade_shanghai_index WHERE %s_code=? `
+	sql = fmt.Sprintf(sql, suffix)
+	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	return
+}
+
+func GetShDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromShDataSimple, err error) {
+	sql := ` SELECT * FROM base_from_trade_shanghai_index WHERE 1=1 `
+	o := orm.NewOrmUsingDB("data")
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY data_time DESC `
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}
+
+func AddEdbDataShBySql(sqlStr string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sqlStr).Exec()
+	return
+}
+
+func GetEdbDataShByCode(edbCode string) (items []*EdbInfoSearchData, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_data_sh WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
+	_, err = o.Raw(sql, edbCode, utils.EDB_DATA_LIMIT).QueryRows(&items)
+	return
+}
+
+func GetBaseFromShDataAllByIndexCode(indexCode, suffix string) (list []*BaseFromTradeShIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_trade_shanghai_index WHERE %s_code=? `
+	sql = fmt.Sprintf(sql, suffix)
+	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	return
+}
+
+func GetEdbDataShByCodeAndDate(edbCode string, startDate string) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT COUNT(1) AS count FROM edb_data_sh WHERE edb_code=? AND data_time=? `
+	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
+	return
+}
+
+func ModifyEdbDataSh(edbInfoId int64, dataTime, value string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` UPDATE edb_data_sh SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
+	return
+}

+ 421 - 0
models/data_manage/edb_data_shfe.go

@@ -0,0 +1,421 @@
+package data_manage
+
+import (
+	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type ShfeData struct {
+	InputValue string `orm:"column(DATA_VALUE)" description:"日期"`
+	DataTime   string `orm:"column(DATA_DATE)" description:"值"`
+}
+
+type BaseFromShfeDataSimple struct {
+	Id        int `orm:"column(base_from_trade_ine_index_id);pk"`
+	DealCode  string
+	BuyCode   string
+	SoldCode  string
+	DataTime  string
+	DealValue string
+	BuyValue  string
+	SoldValue string
+}
+
+type BaseInfoFromShfe struct {
+	DealName string
+	BuyName  string
+	SoldName string
+}
+
+type BaseFromTradeShfeIndex struct {
+	BaseFromTradeShfeIndexId int `orm:"column(base_from_trade_ine_index_id);pk"`
+	Rank                     int
+	DealShortName            string
+	DealName                 string
+	DealCode                 string
+	DealValue                string
+	DealChange               int
+	BuyShortName             string
+	BuyName                  string
+	BuyCode                  string
+	BuyValue                 string
+	BuyChange                int
+	SoldShortName            string
+	SoldName                 string
+	SoldCode                 string
+	SoldValue                string
+	SoldChange               int
+	Frequency                string
+	ClassifyName             string
+	ClassifyType             string
+	CreateTime               time.Time
+	ModifyTime               time.Time
+	DataTime                 string
+}
+
+func GetEdbDataShfeMaxOrMinDate(edbCode string) (minDate, maxDate string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT MIN(data_time) AS minDate,MAX(data_time) AS maxDate FROM edb_data_ine WHERE edb_code=? `
+	err = o.Raw(sql, edbCode).QueryRow(&minDate, &maxDate)
+	return
+}
+
+func GetEdbDataByShfe(edbCode, suffix, startDate, endDate string) (searchItem *EdbInfoSearch, err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	searchItem = new(EdbInfoSearch)
+	searchItem.EdbCode = edbCode
+	ineBaseDataAll, err := GetBaseFromShfeDataAllByIndexCode(edbCode, suffix)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+
+	var isAdd bool
+	addSql := ` INSERT INTO edb_data_ine(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+	dataList := make([]*EdbInfoSearchData, 0)
+	existMap := make(map[string]string)
+
+	for _, sv := range ineBaseDataAll {
+		eDate := sv.DataTime
+		dataTime, err := time.Parse(utils.FormatDate, eDate)
+		if err != nil {
+			fmt.Println("time.Parse Err:" + eDate)
+			return nil, err
+		}
+		timestamp := dataTime.UnixNano() / 1e6
+		timeStr := fmt.Sprintf("%d", timestamp)
+		if _, ok := existMap[eDate]; !ok {
+			if suffix == "deal" {
+				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.DealValue)
+			} else if suffix == "buy" {
+				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.BuyValue)
+			} else {
+				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.SoldValue)
+			}
+			isAdd = true
+		}
+		if suffix == "deal" {
+			existMap[eDate] = sv.DealValue
+		} else if suffix == "buy" {
+			existMap[eDate] = sv.BuyValue
+		} else {
+			existMap[eDate] = sv.SoldValue
+		}
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		utils.FileLog.Info("addSql:" + addSql)
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return searchItem, err
+		}
+	}
+	if err != nil {
+		_ = to.Rollback()
+	} else {
+		_ = to.Commit()
+	}
+	size := utils.EDB_DATA_LIMIT
+	dataList, err = GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_SHFE, size)
+	if err != nil {
+		utils.FileLogData.Info("GetEdbDataShfeByCode Err:%s", err.Error())
+		return searchItem, err
+	}
+	minDate, maxDate, err := GetEdbDataShfeMaxOrMinDate(edbCode)
+	if err != nil {
+		return searchItem, err
+	}
+	searchItem.DataList = dataList
+	searchItem.StartDate = minDate
+	searchItem.EndDate = maxDate
+	if searchItem.DataList == nil {
+		searchItem.DataList = make([]*EdbInfoSearchData, 0)
+	}
+	return
+}
+
+// RefreshEdbDataByShfe 刷新上期能源指标数据
+func RefreshEdbDataByShfe(edbInfoId int, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.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 := GetShfeDataByTradeCode(condition, pars)
+
+	addSql := ` INSERT INTO edb_data_ine(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,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 := GetEdbDataShfeByCodeAndDate(edbCode, v.DataTime)
+			if err != nil && err.Error() != 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 {
+				err = ModifyEdbDataShfe(int64(edbInfoId), v.DataTime, value)
+				if err != nil {
+					return err
+				}
+			}
+		}
+		existMap[v.DataTime] = value
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+// RefreshAllEdbDataByShfe 全部刷新上期能源
+func RefreshAllEdbDataByShfe(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.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 := GetShfeDataByTradeCode(condition, pars)
+
+	//获取指标所有数据
+	dataList := make([]*EdbDataBase, 0)
+	dataTableName := GetEdbDataTableName(source)
+	sql := `SELECT * FROM %s WHERE edb_info_id=? `
+	sql = fmt.Sprintf(sql, dataTableName)
+	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)
+	if err != nil {
+		return err
+	}
+	dataMap := make(map[string]string)
+	for _, v := range dataList {
+		dataMap[v.DataTime] = v.Value
+	}
+
+	addSql := ` INSERT INTO edb_data_ine(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,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 {
+			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)
+				saveValue := sValue
+
+				if existVal, ok := dataMap[eDate]; !ok {
+					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 = to.Raw(sql, sValue, edbInfoId, eDate).Exec()
+						if err != nil {
+							return err
+						}
+					}
+				}
+			}
+		}
+		existMap[v.DataTime] = v.DataTime
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+// GetBaseInfoFromShfeByIndexCode 获取指标信息
+func GetBaseInfoFromShfeByIndexCode(indexCode, suffix string) (list []*BaseInfoFromShfe, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_trade_ine_index WHERE %s_code=? `
+	sql = fmt.Sprintf(sql, suffix)
+	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	return
+}
+
+func GetShfeDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromShfeDataSimple, err error) {
+	sql := ` SELECT * FROM base_from_trade_ine_index WHERE 1=1 `
+	o := orm.NewOrmUsingDB("data")
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY data_time DESC `
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}
+
+func AddEdbDataShfeBySql(sqlStr string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sqlStr).Exec()
+	return
+}
+
+func GetEdbDataShfeByCode(edbCode string) (items []*EdbInfoSearchData, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_data_ine WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
+	_, err = o.Raw(sql, edbCode, utils.EDB_DATA_LIMIT).QueryRows(&items)
+	return
+}
+
+func GetBaseFromShfeDataAllByIndexCode(indexCode, suffix string) (list []*BaseFromTradeShfeIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_trade_ine_index WHERE %s_code=? `
+	sql = fmt.Sprintf(sql, suffix)
+	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	return
+}
+
+func GetEdbDataShfeByCodeAndDate(edbCode string, startDate string) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT COUNT(1) AS count FROM edb_data_ine WHERE edb_code=? AND data_time=? `
+	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
+	return
+}
+
+func ModifyEdbDataShfe(edbInfoId int64, dataTime, value string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` UPDATE edb_data_ine SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
+	return
+}

+ 25 - 0
models/data_manage/edb_data_ths.go

@@ -0,0 +1,25 @@
+package data_manage
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type EdbDataThs struct {
+	EdbDataId     int `orm:"column(edb_data_id);pk"`
+	EdbInfoId     int
+	EdbCode       string
+	DataTime      string
+	Value         float64
+	Status        int
+	CreateTime    time.Time
+	ModifyTime    time.Time
+	DataTimestamp int64
+}
+
+func GetEdbDataThsMaxOrMinDate(edbCode string) (min_date, max_date string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date FROM edb_data_ths WHERE edb_code=? `
+	err = o.Raw(sql, edbCode).QueryRow(&min_date, &max_date)
+	return
+}

+ 65 - 0
models/data_manage/edb_data_wind.go

@@ -0,0 +1,65 @@
+package data_manage
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type EdbDataWind struct {
+	EdbDataId     int `orm:"column(edb_data_id);pk"`
+	EdbInfoId     int
+	EdbCode       string
+	DataTime      string
+	Value         float64
+	Status        int
+	CreateTime    time.Time
+	ModifyTime    time.Time
+	DataTimestamp int64
+}
+
+func AddEdbDataWindBySql(sqlStr string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sqlStr).Exec()
+	return
+}
+
+func DeleteEdbDataWind(edbCode string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `DELETE FROM edb_data_wind WHERE edb_code=? `
+	_, err = o.Raw(sql, edbCode).Exec()
+	return
+}
+
+func ModifyEdbDataWind(edbInfoId int64, dataTime string, value float64) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` UPDATE edb_data_wind SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
+	return
+}
+
+func GetEdbDataWindByCode(edbCode string, size int) (items []*EdbInfoSearchData, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_data_wind WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
+	_, err = o.Raw(sql, edbCode, size).QueryRows(&items)
+	return
+}
+
+func GetEdbDataWindMaxOrMinDate(edbCode string) (min_date, max_date string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date FROM edb_data_wind WHERE edb_code=? `
+	err = o.Raw(sql, edbCode).QueryRow(&min_date, &max_date)
+	return
+}
+
+func GetEdbDataWindByCodeAndDate(edbCode string, startDate string) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT COUNT(1) AS count FROM edb_data_wind WHERE edb_code=? AND data_time=? `
+	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
+	return
+}
+
+type EdbDataFromWind struct {
+	Close  map[string]float64 `json:"CLOSE"`
+	Dt     map[string]int64   `json:"DT"`
+	ErrMsg string
+}

+ 548 - 0
models/data_manage/edb_data_ys.go

@@ -0,0 +1,548 @@
+/**
+* @Author: jgl
+* @Date: 2021/9/14 13:33
+ */
+
+package data_manage
+
+import (
+	"crypto/md5"
+	"encoding/hex"
+	"encoding/json"
+	"errors"
+	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+	"strconv"
+)
+
+type BaseFromSmmDataSimple struct {
+	SmmDataId          int `orm:"column(smm_data_id);pk"`
+	BaseFromSmmIndexId int
+	IndexCode          string
+	DataTime           string
+	Value              string
+}
+
+func GetEdbDataYsMaxAndMinDate(edbCode string) (min_date, max_date string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date FROM edb_data_ys WHERE edb_code=? `
+	err = o.Raw(sql, edbCode).QueryRow(&min_date, &max_date)
+	return
+}
+
+// 有色
+//func GetEdbDataByYs(edbCode, startDate, endDate string) (searchItem *EdbInfoSearch, err error) {
+//	o := orm.NewOrmUsingDB("data")
+//	to, err := o.Begin()
+//	if err != nil {
+//		return
+//	}
+//	searchItem = new(EdbInfoSearch)
+//	searchItem.EdbCode = edbCode
+//	smmBaseDataAll, err := GetBaseFromSmmDataAllByIndexCode(edbCode)
+//	if err != nil && err.Error() != utils.ErrNoRow() {
+//		return
+//	}
+//
+//	var isAdd bool
+//	addSql := ` INSERT INTO edb_data_ys(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+//	dataList := make([]*EdbInfoSearchData, 0)
+//	existMap := make(map[string]string)
+//
+//	for _, sv := range smmBaseDataAll {
+//		eDate := sv.DataTime
+//		dataTime, err := time.Parse(utils.FormatDate, eDate)
+//		if err != nil {
+//			fmt.Println("time.Parse Err:" + eDate)
+//			return nil, err
+//		}
+//		timestamp := dataTime.UnixNano() / 1e6
+//		timeStr := fmt.Sprintf("%d", timestamp)
+//		if _, ok := existMap[eDate]; !ok {
+//			addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.Value)
+//			isAdd = true
+//		}
+//		existMap[eDate] = sv.Value
+//	}
+//	if isAdd {
+//		addSql = strings.TrimRight(addSql, ",")
+//		utils.FileLog.Info("addSql:" + addSql)
+//		_, err = to.Raw(addSql).Exec()
+//		if err != nil {
+//			return searchItem, err
+//		}
+//	}
+//	if err != nil {
+//		_ = to.Rollback()
+//	} else {
+//		_ = to.Commit()
+//	}
+//	size := utils.EDB_DATA_LIMIT
+//	dataList, err = GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_YS, size)
+//	if err != nil {
+//		utils.FileLogData.Info("GetEdbDataThsByCode Err:%s", err.Error())
+//		return searchItem, err
+//	}
+//	minDate, maxDate, err := GetEdbDataYsMaxAndMinDate(edbCode)
+//	if err != nil {
+//		return searchItem, err
+//	}
+//	searchItem.DataList = dataList
+//	searchItem.StartDate = minDate
+//	searchItem.EndDate = maxDate
+//	if searchItem.DataList == nil {
+//		searchItem.DataList = make([]*EdbInfoSearchData, 0)
+//	}
+//	return
+//}
+
+// 全部刷新有色数据
+//func RefreshAllEdbDataByYs(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
+//	o := orm.NewOrmUsingDB("data")
+//	to, err := o.Begin()
+//	if err != nil {
+//		return
+//	}
+//	defer func() {
+//		if err != nil {
+//			_ = to.Rollback()
+//		} else {
+//			_ = to.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([]*EdbDataBase, 0)
+//	dataTableName := GetEdbDataTableName(source)
+//	sql := `SELECT * FROM %s WHERE edb_info_id=? `
+//	sql = fmt.Sprintf(sql, dataTableName)
+//	_, err = to.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([]*BaseFromSmmDataSimple, 0)
+//	smmSql := ` SELECT * FROM base_from_smm_data WHERE index_code=? AND data_time>=? `
+//	_, err = to.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,status,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 = to.Raw(sql, sv.Value, edbInfoId, sv.DataTime).Exec()
+//				if err != nil {
+//					return err
+//				}
+//			}
+//		}
+//	}
+//	if isAdd {
+//		addSql = strings.TrimRight(addSql, ",")
+//		_, err = to.Raw(addSql).Exec()
+//		if err != nil {
+//			return err
+//		}
+//	}
+//	return
+//}
+
+//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 := GetBaseFromSmmBySmmCode(smmCode)
+//	if err != nil {
+//		fmt.Println(err)
+//		return
+//	}
+//
+//	if baseSmmItem == nil {
+//		err = errors.New("GetBaseFromSmmBySmmCode Err:" + err.Error())
+//		return
+//	}
+//
+//	smmIndexAll, err := GetBaseFromSmmIndexBySmmCode(smmCode)
+//	if err != nil {
+//		fmt.Println("GetBaseFromSmmIndex Err:" + err.Error())
+//		return
+//	}
+//	existIndexMap := make(map[string]*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(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 := 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]*BaseFromSmmData)
+//		for _, mv := range indexCodeMap {
+//			indexCode := mv
+//			dataAllList, err := 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(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 = 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 = ModifyBaseFromSmmData(findData.SmmDataId, val)
+//									if err != nil {
+//										err = errors.New("ModifyBaseFromSmmData Err:" + err.Error())
+//										return err
+//									}
+//								}
+//							}
+//						}
+//					}
+//					addExistDataMap[key] = key
+//				}
+//			}
+//		}
+//
+//		//修改数据开始,结束日期
+//		{
+//			indexList, err := GetBaseFromSmmIndexBySmmCode(smmCode)
+//			if err != nil {
+//				fmt.Println("GetBaseFromSmmIndexBySmmCode Err:" + err.Error())
+//			}
+//			for _, sv := range indexList {
+//				minDate, maxDate, err := GetBaseFromSmmMaxOrMinDate(sv.IndexCode)
+//				if err != nil {
+//					fmt.Println("GetEdbDataSmmMaxOrMinDate Err:" + err.Error())
+//				} else {
+//					err = ModifyBaseFromSmmMinDateAndMaxDate(sv.BaseFromSmmIndexId, minDate, maxDate)
+//					if err != nil {
+//						fmt.Println("ModifyBaseFromSmmMinDateAndMaxDate Err:" + err.Error())
+//					}
+//				}
+//			}
+//		}
+//	}
+//	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
+}
+
+// request response
+type DataResp struct {
+	Code int      `json:"Code"`
+	Msg  string   `json:"Msg"`
+	Data *ApiData `json:"Data"`
+}
+
+// api data response
+type ApiData struct {
+	Status  int        `json:"Status"` //0 no permission,1 ok
+	Field   []ApiField `json:"Field"`
+	Content [][]string `json:"Content"`
+}
+
+// api title
+type ApiField struct {
+	Unit       string `json:"Unit"`
+	Info       string `json:"Info"`
+	Name       string `json:"Name"`
+	ColumnType string `json:"ColumnType"`
+	ColIndex   uint   `json:"ColIndex"`
+	IsDate     string `json:"IsDate"`
+}
+
+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"`
+}
+
+/*
+ * 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 *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(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
+}

+ 421 - 0
models/data_manage/edb_data_zz.go

@@ -0,0 +1,421 @@
+package data_manage
+
+import (
+	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type ZzData struct {
+	InputValue string `orm:"column(DATA_VALUE)" description:"日期"`
+	DataTime   string `orm:"column(DATA_DATE)" description:"值"`
+}
+
+type BaseFromZzDataSimple struct {
+	Id        int `orm:"column(base_from_trade_zhengzhou_index_id);pk"`
+	DealCode  string
+	BuyCode   string
+	SoldCode  string
+	DataTime  string
+	DealValue string
+	BuyValue  string
+	SoldValue string
+}
+
+type BaseInfoFromZz struct {
+	DealName string
+	BuyName  string
+	SoldName string
+}
+
+type BaseFromTradeZhengzhouIndex struct {
+	BaseFromTradeZhengzhouIndexId int `orm:"column(base_from_trade_zhengzhou_index_id);pk"`
+	Rank                          int
+	DealShortName                 string
+	DealName                      string
+	DealCode                      string
+	DealValue                     string
+	DealChange                    int
+	BuyShortName                  string
+	BuyName                       string
+	BuyCode                       string
+	BuyValue                      string
+	BuyChange                     int
+	SoldShortName                 string
+	SoldName                      string
+	SoldCode                      string
+	SoldValue                     string
+	SoldChange                    int
+	Frequency                     string
+	ClassifyName                  string
+	ClassifyType                  string
+	CreateTime                    time.Time
+	ModifyTime                    time.Time
+	DataTime                      string
+}
+
+func GetEdbDataZzMaxOrMinDate(edbCode string) (minDate, maxDate string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT MIN(data_time) AS minDate,MAX(data_time) AS maxDate FROM edb_data_zz WHERE edb_code=? `
+	err = o.Raw(sql, edbCode).QueryRow(&minDate, &maxDate)
+	return
+}
+
+func GetEdbDataByZz(edbCode, suffix, startDate, endDate string) (searchItem *EdbInfoSearch, err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	searchItem = new(EdbInfoSearch)
+	searchItem.EdbCode = edbCode
+	zzBaseDataAll, err := GetBaseFromZhengzhouDataAllByIndexCode(edbCode, suffix)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+
+	var isAdd bool
+	addSql := ` INSERT INTO edb_data_zz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
+	dataList := make([]*EdbInfoSearchData, 0)
+	existMap := make(map[string]string)
+
+	for _, sv := range zzBaseDataAll {
+		eDate := sv.DataTime
+		dataTime, err := time.Parse(utils.FormatDate, eDate)
+		if err != nil {
+			fmt.Println("time.Parse Err:" + eDate)
+			return nil, err
+		}
+		timestamp := dataTime.UnixNano() / 1e6
+		timeStr := fmt.Sprintf("%d", timestamp)
+		if _, ok := existMap[eDate]; !ok {
+			if suffix == "deal" {
+				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.DealValue)
+			} else if suffix == "buy" {
+				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.BuyValue)
+			} else {
+				addSql += GetAddSql("0", edbCode, eDate, timeStr, sv.SoldValue)
+			}
+			isAdd = true
+		}
+		if suffix == "deal" {
+			existMap[eDate] = sv.DealValue
+		} else if suffix == "buy" {
+			existMap[eDate] = sv.BuyValue
+		} else {
+			existMap[eDate] = sv.SoldValue
+		}
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		utils.FileLog.Info("addSql:" + addSql)
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return searchItem, err
+		}
+	}
+	if err != nil {
+		_ = to.Rollback()
+	} else {
+		_ = to.Commit()
+	}
+	size := utils.EDB_DATA_LIMIT
+	dataList, err = GetEdbDataAllByEdbCode(edbCode, utils.DATA_SOURCE_ZZ, size)
+	if err != nil {
+		utils.FileLogData.Info("GetEdbDataZzByCode Err:%s", err.Error())
+		return searchItem, err
+	}
+	minDate, maxDate, err := GetEdbDataZzMaxOrMinDate(edbCode)
+	if err != nil {
+		return searchItem, err
+	}
+	searchItem.DataList = dataList
+	searchItem.StartDate = minDate
+	searchItem.EndDate = maxDate
+	if searchItem.DataList == nil {
+		searchItem.DataList = make([]*EdbInfoSearchData, 0)
+	}
+	return
+}
+
+// RefreshEdbDataByZz 刷新郑商所指标数据
+func RefreshEdbDataByZz(edbInfoId int, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.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 := GetZzDataByTradeCode(condition, pars)
+
+	addSql := ` INSERT INTO edb_data_zz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,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 := GetEdbDataZzByCodeAndDate(edbCode, v.DataTime)
+			if err != nil && err.Error() != 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 {
+				err = ModifyEdbDataZz(int64(edbInfoId), v.DataTime, value)
+				if err != nil {
+					return err
+				}
+			}
+		}
+		existMap[v.DataTime] = value
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+// RefreshAllEdbDataByZz 全部刷新郑商所
+func RefreshAllEdbDataByZz(edbInfoId, source int, edbCode, startDate, endDate string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.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 := GetZzDataByTradeCode(condition, pars)
+
+	//获取指标所有数据
+	dataList := make([]*EdbDataBase, 0)
+	dataTableName := GetEdbDataTableName(source)
+	sql := `SELECT * FROM %s WHERE edb_info_id=? `
+	sql = fmt.Sprintf(sql, dataTableName)
+	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)
+	if err != nil {
+		return err
+	}
+	dataMap := make(map[string]string)
+	for _, v := range dataList {
+		dataMap[v.DataTime] = v.Value
+	}
+
+	addSql := ` INSERT INTO edb_data_zz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,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 {
+			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)
+				saveValue := sValue
+
+				if existVal, ok := dataMap[eDate]; !ok {
+					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 = to.Raw(sql, sValue, edbInfoId, eDate).Exec()
+						if err != nil {
+							return err
+						}
+					}
+				}
+			}
+		}
+		existMap[v.DataTime] = v.DataTime
+	}
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = to.Raw(addSql).Exec()
+		if err != nil {
+			return err
+		}
+	}
+	return
+}
+
+// GetBaseInfoFromZhengzhouByIndexCode 获取指标信息
+func GetBaseInfoFromZhengzhouByIndexCode(indexCode, suffix string) (list []*BaseInfoFromZz, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_trade_zhengzhou_index WHERE %s_code=? `
+	sql = fmt.Sprintf(sql, suffix)
+	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	return
+}
+
+func GetZzDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromZzDataSimple, err error) {
+	sql := ` SELECT * FROM base_from_trade_zhengzhou_index WHERE 1=1 `
+	o := orm.NewOrmUsingDB("data")
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY data_time DESC `
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}
+
+func AddEdbDataZzBySql(sqlStr string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sqlStr).Exec()
+	return
+}
+
+func GetEdbDataZzByCode(edbCode string) (items []*EdbInfoSearchData, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_data_zz WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
+	_, err = o.Raw(sql, edbCode, utils.EDB_DATA_LIMIT).QueryRows(&items)
+	return
+}
+
+func GetBaseFromZhengzhouDataAllByIndexCode(indexCode, suffix string) (list []*BaseFromTradeZhengzhouIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_trade_zhengzhou_index WHERE %s_code=? `
+	sql = fmt.Sprintf(sql, suffix)
+	_, err = o.Raw(sql, indexCode).QueryRows(&list)
+	return
+}
+
+func GetEdbDataZzByCodeAndDate(edbCode string, startDate string) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT COUNT(1) AS count FROM edb_data_zz WHERE edb_code=? AND data_time=? `
+	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
+	return
+}
+
+func ModifyEdbDataZz(edbInfoId int64, dataTime, value string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` UPDATE edb_data_zz SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
+	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
+	return
+}

+ 4 - 2
models/data_manage/edb_info.go

@@ -1,11 +1,11 @@
 package data_manage
 
 import (
+	"eta/eta_mobile/services/alarm_msg"
+	"eta/eta_mobile/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
-	"eta/eta_mobile/services/alarm_msg"
-	"eta/eta_mobile/utils"
 	"time"
 )
 
@@ -43,6 +43,7 @@ type EdbInfo struct {
 	ChartImage       string  `description:"图表图片"`
 	Calendar         string  `description:"公历/农历" orm:"default(公历);"`
 	DataDateType     string  `orm:"column(data_date_type);size(255);null;default(交易日)"`
+	ManualSave       int     `description:"是否有手动保存过上下限: 0-否; 1-是"`
 }
 
 func AddEdbInfo(item *EdbInfo) (lastId int64, err error) {
@@ -275,6 +276,7 @@ type EdbInfoList struct {
 	Button           EdbClassifyItemsButton  `description:"操作权限"`
 	IsEnEdb          bool                    `description:"是否展示英文标识"`
 	DataInsertConfig EdbDataInsertConfigItem `description:"指标数据插入配置"`
+	DataDateType     string                  `description:"数据日期类型,枚举值:交易日、自然日"`
 }
 
 type EdbDataInsertConfigItem struct {

+ 28 - 0
models/data_manage/edb_info_log.go

@@ -0,0 +1,28 @@
+package data_manage
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type EdbInfoLog struct {
+	EdbInfoLogId    int `orm:"column(edb_info_log_id);pk"`
+	EdbInfoId       int
+	SourceName      string `description:"来源名称"`
+	Source          int    `description:"来源id"`
+	EdbCode         string `description:"指标编码"`
+	EdbName         string `description:"指标名称"`
+	ClassifyId      int    `description:"分类id"`
+	SysUserId       int
+	SysUserRealName string
+	CreateTime      time.Time
+	Content         string `description:"内容"`
+	Status          string `description:"状态"`
+	Method          string `description:"执行方法"`
+}
+
+func AddEdbInfoLog(item *EdbInfoLog) (lastId int64, err error) {
+	o := orm.NewOrmUsingDB("data")
+	lastId, err = o.Insert(item)
+	return
+}

+ 31 - 0
models/data_manage/edb_source.go

@@ -0,0 +1,31 @@
+package data_manage
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strings"
+)
+
+// EdbSource 指标来源表
+type EdbSource struct {
+	EdbSourceId int    `orm:"column(edb_source_id);pk"`
+	SourceName  string `description:"指标来源名称"`
+	TableName   string `description:"数据表名"`
+	IsBase      int    `description:"是否为基础指标: 0-否; 1-是"`
+}
+
+// GetEdbSourceItemsByCondition 获取指标来源
+func GetEdbSourceItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*EdbSource, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY edb_source_id ASC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM edb_source WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 156 - 0
models/data_manage/gl_data.go

@@ -0,0 +1,156 @@
+package data_manage
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+)
+
+type GlClassify struct {
+	BreedShortName string `orm:"column(BREED_SHORT_NAME)" description:"分类名称"`
+}
+
+func GetGlSurveyClassify() (items []*GlClassify, err error) {
+	sql := ` SELECT CASE WHEN BREED_SHORT_NAME IS NULL THEN '无' ELSE BREED_SHORT_NAME END BREED_SHORT_NAME  FROM mb_index_main_info GROUP BY BREED_SHORT_NAME ORDER BY BREED_SHORT_NAME ASC `
+	o := orm.NewOrmUsingDB("gl")
+	o.Raw(sql).QueryRows(&items)
+	return
+}
+
+type GlFrequency struct {
+	Frequency string `description:"频度:1-日度 2-周度 3-月度 4-季度 5-年度 99-无固定频率"`
+}
+
+func GetGlFrequencyByClassifyId(breedShortName string) (items []*GlFrequency, err error) {
+	o := orm.NewOrmUsingDB("gl")
+	if breedShortName == "无" {
+		sql := ` SELECT FREQUENCY_NAME AS frequency FROM mb_index_main_info WHERE BREED_SHORT_NAME IS NULL GROUP BY FREQUENCY_CODE ORDER BY FREQUENCY_CODE ASC `
+		_, err = o.Raw(sql).QueryRows(&items)
+		return
+	} else {
+		sql := ` SELECT FREQUENCY_NAME AS frequency FROM mb_index_main_info WHERE BREED_SHORT_NAME=? GROUP BY FREQUENCY_CODE ORDER BY FREQUENCY_CODE ASC `
+		_, err = o.Raw(sql, breedShortName).QueryRows(&items)
+		return
+	}
+}
+
+type GlIndex struct {
+	Id            int    `orm:"column(ID)"`
+	IndexCode     string `orm:"column(INDEX_CODE)"`
+	IndexName     string `orm:"column(INDEX_NAME)"`
+	UnitName      string `orm:"column(UNIT_NAME)"`
+	FrequencyName string `orm:"column(FREQUENCY_NAME)"`
+	UpdateTime    string `orm:"column(UPDATE_TIME)"`
+}
+
+func GetGlIndex(breedShortName, frequency string) (items []*GlIndex, err error) {
+	o := orm.NewOrmUsingDB("gl")
+	if breedShortName == "无" {
+		sql := ` SELECT * FROM mb_index_main_info WHERE BREED_SHORT_NAME IS NULL AND FREQUENCY_NAME=? ORDER BY INDEX_CODE ASC `
+		_, err = o.Raw(sql, frequency).QueryRows(&items)
+		return
+	} else {
+		sql := ` SELECT * FROM mb_index_main_info WHERE BREED_SHORT_NAME=? AND FREQUENCY_NAME=? ORDER BY INDEX_CODE ASC `
+		_, err = o.Raw(sql, breedShortName, frequency).QueryRows(&items)
+		return
+	}
+}
+
+func GetGlFrequency(productName string) (items []*string, err error) {
+	sql := `SELECT DISTINCT FREQUENCY_NAME FROM mb_index_main_info WHERE BREED_SHORT_NAME=? ORDER BY FIELD(FREQUENCY_NAME,'日度','周度','旬度','月度','季度','半年','年度') `
+	o := orm.NewOrmUsingDB("gl")
+	_, err = o.Raw(sql, productName).QueryRows(&items)
+	return
+}
+
+type GlIndexList struct {
+	Id            int                `orm:"column(ID)"`
+	IndexCode     string             `orm:"column(INDEX_CODE)"`
+	IndexName     string             `orm:"column(INDEX_NAME)"`
+	UnitName      string             `orm:"column(UNIT_NAME)"`
+	FrequencyName string             `orm:"column(FREQUENCY_NAME)"`
+	UpdateTime    string             `orm:"column(UPDATE_TIME)"`
+	Paging        *paging.PagingItem `description:"分页数据"`
+	DataList      []*GlIndexData
+}
+
+type GlIndexData struct {
+	InputValue string `orm:"column(DATA_VALUE)" description:"日期"`
+	DataTime   string `orm:"column(DATA_DATE)" description:"值"`
+}
+
+func GetGlIndexData(indexCode string, startSize, pageSize int) (items []*GlIndexData, err error) {
+	//sql := ` SELECT *  FROM mb_index_main_data WHERE INDEX_CODE=? ORDER BY DATA_DATE DESC,PUBLISH_TIME DESC LIMIT ?,?`
+	sql := ` SELECT * FROM (
+	SELECT DISTINCT a.INDEX_CODE,a.DATA_VALUE,a.DATA_DATE FROM mb_index_main_data AS a WHERE INDEX_CODE=? AND IS_DELETE=0
+	ORDER BY DATA_DATE DESC,PUBLISH_TIME DESC 
+	)AS t
+	GROUP BY t.DATA_DATE
+	ORDER BY t.DATA_DATE DESC LIMIT ?,? `
+	o := orm.NewOrmUsingDB("gl")
+	_, err = o.Raw(sql, indexCode, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+func GetGlIndexByCode(indexCode string) (items *GlIndex, err error) {
+	sql := ` SELECT *  FROM mb_index_main_info WHERE INDEX_CODE=? `
+	o := orm.NewOrmUsingDB("gl")
+	err = o.Raw(sql, indexCode).QueryRow(&items)
+	return
+}
+
+func GetGlIndexDataCount(indexCode string) (count int, err error) {
+	o := orm.NewOrmUsingDB("gl")
+	sql := `SELECT COUNT(1) AS count FROM (
+			SELECT * FROM (
+				SELECT DISTINCT a.INDEX_CODE,a.DATA_VALUE,a.DATA_DATE FROM mb_index_main_data AS a WHERE INDEX_CODE=? AND IS_DELETE=0
+				ORDER BY DATA_DATE DESC,PUBLISH_TIME DESC 
+				)AS t
+				GROUP BY t.DATA_DATE
+				ORDER BY t.DATA_DATE DESC
+			)AS n `
+	err = o.Raw(sql, indexCode).QueryRow(&count)
+	return
+}
+
+type GlSearchIndex struct {
+	Id             int    `orm:"column(ID)"`
+	IndexCode      string `orm:"column(INDEX_CODE)"`
+	IndexName      string `orm:"column(INDEX_NAME)"`
+	UnitName       string `orm:"column(UNIT_NAME)"`
+	FrequencyName  string `orm:"column(FREQUENCY_NAME)"`
+	UpdateTime     string `orm:"column(UPDATE_TIME)"`
+	BreedShortName string `orm:"column(BREED_SHORT_NAME)"`
+}
+
+// GetGlItemList 模糊查询隆众数据库指标列表
+func GetGlItemList(keyword string) (items []*GlSearchIndex, err error) {
+	o := orm.NewOrmUsingDB("gl")
+	sql := "SELECT * FROM mb_index_main_info WHERE CONCAT(INDEX_NAME,INDEX_CODE) LIKE '%" + keyword + "%'"
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+
+}
+
+func GetGlDataMaxCount(classifyName string) (count int, err error) {
+	o := orm.NewOrmUsingDB("gl")
+	sql := `SELECT MAX(t.num) AS count FROM (
+				SELECT COUNT(1) AS num  FROM mb_index_main_info AS a
+				INNER JOIN mb_index_main_data AS b ON a.INDEX_CODE=b.INDEX_CODE
+				WHERE a.BREED_SHORT_NAME=?
+				GROUP BY a.INDEX_CODE
+			)AS t `
+	err = o.Raw(sql, classifyName).QueryRow(&count)
+	return
+}
+
+func GetGlDataByCode(indexCode string) (items []*GlIndexData, err error) {
+	o := orm.NewOrmUsingDB("gl")
+	sql := `SELECT
+	* 
+FROM
+	( SELECT * FROM mb_index_main_data WHERE INDEX_CODE = ? GROUP BY UPDATE_TIME DESC, DATA_DATE DESC ) a 
+GROUP BY
+	a.DATA_DATE DESC `
+	_, err = o.Raw(sql, indexCode).QueryRows(&items)
+	return
+}

+ 103 - 0
models/data_manage/lz_data.go

@@ -0,0 +1,103 @@
+package data_manage
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type LzClassify struct {
+	BreedId   int    `description:"分类id"`
+	BreedName string `description:"分类名称"`
+}
+
+func GetLzSurveyClassify() (items []*LzClassify, err error) {
+	sql := ` SELECT breed_id,breed_name FROM longzhong_survey_product GROUP BY breed_name ORDER BY breed_name DESC `
+	o := orm.NewOrmUsingDB("edb")
+	o.Raw(sql).QueryRows(&items)
+	return
+}
+
+type LzFrequency struct {
+	Frequency int `description:"频度:1-日度 2-周度 3-月度 4-季度 5-年度 99-无固定频率"`
+}
+
+func GetLzFrequencyByClassifyId(breedId int) (items []*LzFrequency, err error) {
+	sql := ` SELECT frequency  FROM longzhong_survey_product WHERE breed_id=? GROUP BY frequency ORDER BY frequency ASC `
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql, breedId).QueryRows(&items)
+	return
+}
+
+type LongzhongSurveyProduct struct {
+	SurveyProductId      int `orm:"column(survey_product_id);pk"`
+	ProjectQuotaId       int64
+	BreedId              string
+	BreedName            string
+	QuotaId              string
+	QuotaName            string
+	UnitId               string
+	UnitName             string
+	SampleType           int64
+	SampleId             string
+	SampleName           string
+	DeviceId             string
+	Device               string
+	ProductCraftId       string
+	ProductCraft         string
+	ProductLine          string
+	InputMode            int64
+	Frequency            int64
+	InputValue           string
+	TaskShouldFinishTime int
+	CustomId             string
+	CustomType           int64
+	Custom               string
+	QuotaSampleId        int64
+	StartDate            string
+	EndDate              string
+	ModifyTime           time.Time
+	LzCode               string
+}
+
+func GetLongzhongSurveyProduct(breedId, frequency int) (items []*LongzhongSurveyProduct, err error) {
+	sql := ` SELECT *  FROM longzhong_survey_product WHERE breed_id=? AND frequency=? ORDER BY survey_product_id ASC `
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql, breedId, frequency).QueryRows(&items)
+	return
+}
+
+type LzProductList struct {
+	SurveyProductId int    `orm:"column(survey_product_id);pk"`
+	BreedName       string `description:"品种名称"`
+	QuotaName       string `description:"指标名称"`
+	UnitName        string `description:"单位"`
+	SampleType      int64  `description:"样本类型 0-空 1-企业 2-港口 3-运距 4-区域/国家 99-不确定"`
+	SampleName      string `description:"样本名称"`
+	Device          string `description:"设备"`
+	Frequency       int64  `description:"频度"`
+	Custom          string `description:"扩展字段"`
+	StartDate       string `description:"开始日期"`
+	EndDate         string `description:"结束日期"`
+	ModifyTime      string `description:"修改时间"`
+	LzCode          string `description:"指标编码"`
+	DataList        []*LzProductData
+}
+
+type LzProductData struct {
+	InputValue string `description:"日期"`
+	DataTime   string `description:"值"`
+}
+
+func GetLongzhongSurveyProductData(surveyProductId int) (items []*LzProductData, err error) {
+	sql := ` SELECT *  FROM longzhong_survey_data WHERE survey_product_id=? ORDER BY data_time DESC `
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql, surveyProductId).QueryRows(&items)
+	return
+}
+
+func GetLongzhongSurveyProductByCode(lzCode string) (items *LongzhongSurveyProduct, err error) {
+	sql := ` SELECT *  FROM longzhong_survey_product WHERE lz_code=? `
+	o := orm.NewOrmUsingDB("edb")
+	err = o.Raw(sql, lzCode).QueryRow(&items)
+	return
+}

+ 319 - 0
models/data_manage/mysteel_chemical_index.go

@@ -0,0 +1,319 @@
+package data_manage
+
+import (
+	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+// BaseFromMysteelChemicalIndex 钢联化工指标表
+type BaseFromMysteelChemicalIndex struct {
+	BaseFromMysteelChemicalIndexId    int       `orm:"column(base_from_mysteel_chemical_index_id);pk"`
+	BaseFromMysteelChemicalClassifyId int       `orm:"column(base_from_mysteel_chemical_classify_id)" description:"钢联化工指标分类id"`
+	IndexCode                         string    `description:"指标编码"`
+	IndexName                         string    `description:"指标名称"`
+	Unit                              string    `description:"单位"`
+	Source                            string    `description:"数据来源"`
+	Frequency                         string    `description:"频度"`
+	StartDate                         string    `description:"开始日期"`
+	EndDate                           string    `description:"结束日期"`
+	Describe                          string    `description:"指标描述"`
+	UpdateWeek                        string    `description:"更新周期"`
+	UpdateTime                        string    `description:"更新时间1"`
+	UpdateTime2                       string    `description:"更新时间2"`
+	SysUserId                         int       `description:"创建人id"`
+	SysUserRealName                   string    `description:"创建人姓名"`
+	ModifyTime                        time.Time `description:"修改时间"`
+	CreateTime                        time.Time `description:"创建时间"`
+	Sort                              int       `description:"排序字段"`
+	MergeFilePath                     string    `description:"合并文件"`
+}
+
+// Update 更新钢联化工指标基础信息
+func (item *BaseFromMysteelChemicalIndex) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Update(item, cols...)
+	return
+}
+
+// AddBaseFromMysteelChemicalIndex 添加钢联化工指标
+func AddBaseFromMysteelChemicalIndex(item *BaseFromMysteelChemicalIndex) (lastId int64, err error) {
+	o := orm.NewOrmUsingDB("data")
+	lastId, err = o.Insert(item)
+	return
+}
+
+// BaseFromMysteelChemicalData 钢联化工指标数据表
+type BaseFromMysteelChemicalData struct {
+	BaseFromMysteelChemicalDataId  int       `orm:"column(base_from_mysteel_chemical_data_id);pk"`
+	BaseFromMysteelChemicalIndexId int       `orm:"column(base_from_mysteel_chemical_index_id)" description:"钢联化工指标id"`
+	IndexCode                      string    `description:"指标编码"`
+	DataTime                       time.Time `description:"数据日期"`
+	Value                          float64   `description:"数据值"`
+	ModifyTime                     time.Time `description:"修改时间"`
+	CreateTime                     time.Time `description:"创建时间"`
+}
+
+// MysteelChemicalFrequency 钢联化工频度
+type MysteelChemicalFrequency struct {
+	Frequency string `description:"频度:1-日度 2-周度 3-月度 4-季度 5-年度 99-无固定频率"`
+}
+
+// GetMysteelChemicalIndexAll 用于分类展示
+//func GetMysteelChemicalIndexAll() (items []*BaseFromMysteelChemicalClassifyItems, err error) {
+//	o := orm.NewOrmUsingDB("data")
+//	sql := ` SELECT base_from_mysteel_chemical_index_id,base_from_mysteel_chemical_classify_id,index_name AS classify_name,
+//             sys_user_id,sys_user_real_name,sort
+//            FROM base_from_mysteel_chemical_index ORDER BY sort asc, create_time ASC `
+//	_, err = o.Raw(sql).QueryRows(&items)
+//	return
+//}
+
+// MysteelChemicalFrequencyByClassifyId 根据分类id获取钢联化工频度数据列表
+func MysteelChemicalFrequencyByClassifyId(classifyId int) (items []*MysteelChemicalFrequency, err error) {
+	o := orm.NewOrmUsingDB("data")
+	if classifyId == 0 {
+		sql := ` SELECT frequency  FROM base_from_mysteel_chemical_index WHERE frequency != "" GROUP BY frequency ORDER BY frequency ASC `
+		_, err = o.Raw(sql).QueryRows(&items)
+		return
+	} else {
+		sql := ` SELECT frequency  FROM base_from_mysteel_chemical_index WHERE base_from_mysteel_chemical_classify_id = ? AND frequency != "" GROUP BY frequency ORDER BY frequency ASC `
+		_, err = o.Raw(sql, classifyId).QueryRows(&items)
+		return
+	}
+}
+
+// GetMysteelChemicalFrequency 获取钢联化工频度数据列表
+func GetMysteelChemicalFrequency(condition string, pars []interface{}) (items []*MysteelChemicalFrequency, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT frequency FROM base_from_mysteel_chemical_index WHERE 1=1 AND frequency != "" `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` GROUP BY frequency ORDER BY frequency ASC `
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// MysteelChemicalList 钢联化工指标列表
+type MysteelChemicalList struct {
+	Id                                int                `orm:"column(base_from_mysteel_chemical_index_id)"`
+	BaseFromMysteelChemicalClassifyId int                `orm:"column(base_from_mysteel_chemical_classify_id)" description:"钢联化工指标分类id"`
+	IndexCode                         string             `description:"指标编码"`
+	IndexName                         string             `description:"指标名称"`
+	UnitName                          string             `orm:"column(unit)"`
+	UniqueCode                        string             `description:"唯一编码"`
+	FrequencyName                     string             `orm:"column(frequency)"`
+	UpdateTime                        string             `orm:"column(modify_time)"`
+	Paging                            *paging.PagingItem `description:"分页数据"`
+	DataList                          []*MysteelChemicalData
+}
+
+// MysteelChemicalData 钢联化工数据列表
+type MysteelChemicalData struct {
+	InputValue string `orm:"column(value)" description:"值"`
+	DataTime   string `orm:"column(data_time)" description:"日期"`
+}
+
+// GetMysteelChemicalIndex 根据分类id获取钢联化工频度数据列表
+func GetMysteelChemicalIndex(condition string, pars []interface{}) (items []*MysteelChemicalList, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_mysteel_chemical_index WHERE 1=1 `
+
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY base_from_mysteel_chemical_index_id ASC `
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// GetMysteelChemicalIndexData 根据指标code获取钢联化工数据列表
+func GetMysteelChemicalIndexData(indexCode string, startSize, pageSize int) (items []*MysteelChemicalData, err error) {
+	sql := ` SELECT * FROM (
+	SELECT DISTINCT a.index_code,a.value,a.data_time FROM base_from_mysteel_chemical_data AS a WHERE index_code=? 
+	ORDER BY data_time DESC
+	)AS t
+	GROUP BY t.data_time
+	ORDER BY t.data_time DESC LIMIT ?,? `
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sql, indexCode, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// GetMysteelChemicalIndexDataCount 根据指标code获取钢联化工数据列表 获取钢联数据总数
+func GetMysteelChemicalIndexDataCount(indexCode string) (count int, err error) {
+	sql := `SELECT COUNT(1) AS count FROM (
+			SELECT * FROM (
+	SELECT DISTINCT a.index_code,a.value,a.data_time FROM base_from_mysteel_chemical_data AS a WHERE index_code=? 
+	ORDER BY data_time DESC
+	)AS t
+	GROUP BY t.data_time
+	ORDER BY t.data_time DESC
+			)AS n `
+	o := orm.NewOrmUsingDB("data")
+	err = o.Raw(sql, indexCode).QueryRow(&count)
+	return
+}
+
+// GetBaseFromMysteelChemicalIndexByIndexId 根据指标id获取指标信息
+func GetBaseFromMysteelChemicalIndexByIndexId(indexId int) (item *BaseFromMysteelChemicalIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_mysteel_chemical_index WHERE base_from_mysteel_chemical_index_id=? `
+	err = o.Raw(sql, indexId).QueryRow(&item)
+	return
+}
+
+// GetBaseFromMysteelChemicalIndexByCode 根据指标code获取指标信息
+func GetBaseFromMysteelChemicalIndexByCode(indexCode string) (item *BaseFromMysteelChemicalIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_mysteel_chemical_index WHERE index_code=? `
+	err = o.Raw(sql, indexCode).QueryRow(&item)
+	return
+}
+
+// GetBaseFromMysteelChemicalIndexByClassifyIdAndName 根据分类id和指标名名获取指标信息
+func GetBaseFromMysteelChemicalIndexByClassifyIdAndName(classifyId int, chartName string) (item *BaseFromMysteelChemicalIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_mysteel_chemical_index WHERE base_from_mysteel_chemical_classify_id = ? and index_name = ? `
+	err = o.Raw(sql, classifyId, chartName).QueryRow(&item)
+	return
+}
+
+// GetBaseFromMysteelChemicalIndexListByClassifyId 根据指标分类id获取指标列表信息
+func GetBaseFromMysteelChemicalIndexListByClassifyId(classifyId int) (items []*BaseFromMysteelChemicalIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_mysteel_chemical_index WHERE base_from_mysteel_chemical_classify_id=? `
+	_, err = o.Raw(sql, classifyId).QueryRows(&items)
+	return
+}
+
+// GetBaseFromMysteelChemicalIndexListByClassifyIdList 根据指标分类id集合获取指标列表信息
+func GetBaseFromMysteelChemicalIndexListByClassifyIdList(classifyIdList []int) (items []*BaseFromMysteelChemicalIndex, err error) {
+	num := len(classifyIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM base_from_mysteel_chemical_index WHERE base_from_mysteel_chemical_classify_id IN (` + utils.GetOrmInReplace(num) + `) `
+	_, err = o.Raw(sql, classifyIdList).QueryRows(&items)
+	return
+}
+
+// GetBaseFromMysteelChemicalDataMaxCount 获取分类下指标的最大数量
+func GetBaseFromMysteelChemicalDataMaxCount(classifyId int) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT MAX(t.num) AS count FROM (
+				SELECT COUNT(1) AS num  FROM base_from_mysteel_chemical_index AS a
+				INNER JOIN base_from_mysteel_chemical_data AS b ON a.base_from_mysteel_chemical_index_id=b.base_from_mysteel_chemical_index_id
+				WHERE a.base_from_mysteel_chemical_classify_id=?
+				GROUP BY a.base_from_mysteel_chemical_index_id
+			)AS t `
+	err = o.Raw(sql, classifyId).QueryRow(&count)
+	return
+}
+
+// GetMysteelChemicalIndexDataByCode 通过钢联化工指标code获取所有数据列表
+func GetMysteelChemicalIndexDataByCode(indexCode string) (items []*MysteelChemicalData, err error) {
+	sql := ` SELECT * FROM (
+	SELECT DISTINCT a.index_code,a.value,a.data_time FROM base_from_mysteel_chemical_data AS a WHERE index_code=? 
+	ORDER BY data_time DESC
+	)AS t
+	GROUP BY t.data_time
+	ORDER BY t.data_time DESC `
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sql, indexCode).QueryRows(&items)
+	return
+}
+
+// MoveBaseFromMysteelChemicalIndex 移动钢联化工指标分类
+func MoveBaseFromMysteelChemicalIndex(chartInfoId, classifyId int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` UPDATE base_from_mysteel_chemical_index
+			SET
+			  base_from_mysteel_chemical_classify_id = ?
+			WHERE base_from_mysteel_chemical_index_id = ?`
+	_, err = o.Raw(sql, classifyId, chartInfoId).Exec()
+	return
+}
+
+// UpdateBaseFromMysteelChemicalIndexByClassifyId 根据指标id更新排序
+func UpdateBaseFromMysteelChemicalIndexByClassifyId(classifyId, nowSort, prevIndexInfoId int, updateSort string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` update base_from_mysteel_chemical_index set sort = ` + updateSort + ` WHERE base_from_mysteel_chemical_classify_id=? AND  `
+	if prevIndexInfoId > 0 {
+		sql += ` ( sort > ? or (base_from_mysteel_chemical_index_id > ` + fmt.Sprint(prevIndexInfoId) + ` and sort = ` + fmt.Sprint(nowSort) + `))`
+	}
+	_, err = o.Raw(sql, classifyId, nowSort).Exec()
+	return
+}
+
+// GetFirstBaseFromMysteelChemicalIndexByClassifyId 获取当前分类下,且排序数相同 的排序第一条的数据
+func GetFirstBaseFromMysteelChemicalIndexByClassifyId(classifyId int) (item *BaseFromMysteelChemicalIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_mysteel_chemical_index WHERE base_from_mysteel_chemical_classify_id=? order by sort asc,base_from_mysteel_chemical_index_id asc limit 1`
+	err = o.Raw(sql, classifyId).QueryRow(&item)
+	return
+}
+
+// GetMysteelChemicalIndexCount 根据条件获取钢联化工数据
+func GetMysteelChemicalIndexCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT COUNT(1) AS count FROM base_from_mysteel_chemical_index WHERE 1=1 `
+
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY base_from_mysteel_chemical_index_id ASC `
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+// GetMysteelChemicalIndexList 根据分类id获取钢联化工频度数据列表
+func GetMysteelChemicalIndexList(condition string, pars []interface{}, startSize, pageSize int) (items []*BaseFromMysteelChemicalIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_mysteel_chemical_index WHERE 1=1 `
+
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY base_from_mysteel_chemical_index_id ASC LIMIT ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// GetMysteelChemicalIndexListGroupByUserId 根据指标id列表、用户分组获取指标信息
+func GetMysteelChemicalIndexListGroupByUserId(edbIdList []string) (items []*BaseFromMysteelChemicalIndex, err error) {
+	num := len(edbIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_mysteel_chemical_index WHERE base_from_mysteel_chemical_index_id in (` + utils.GetOrmInReplace(num) + `) GROUP BY sys_user_id `
+
+	_, err = o.Raw(sql, edbIdList).QueryRows(&items)
+	return
+}
+
+// ModifyMysteelChemicalIndexUserIdByCodeList 根据指标code列表修改创建人
+func ModifyMysteelChemicalIndexUserIdByCodeList(edbIdList []string, userId int, userName string) (err error) {
+	num := len(edbIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := `UPDATE base_from_mysteel_chemical_index SET sys_user_id=?,sys_user_real_name=? WHERE base_from_mysteel_chemical_index_id in (` + utils.GetOrmInReplace(num) + `) `
+	_, err = o.Raw(sql, userId, userName, edbIdList).Exec()
+	return
+}
+
+// GetMysteelChemicalIndexAdminList 获取所有指标创建人
+func GetMysteelChemicalIndexAdminList() (list []int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT sys_user_id FROM base_from_mysteel_chemical_index GROUP BY sys_user_id `
+
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}

+ 8 - 0
models/data_manage/request/edb_info.go

@@ -0,0 +1,8 @@
+package request
+
+// ModifyEdbInfoReq 修改普通指标基础信息请求
+type ModifyEdbInfoReq struct {
+	EdbInfoId int     `description:"指标ID"`
+	MaxValue  float64 `description:"最大值"`
+	MinValue  float64 `description:"最小值"`
+}

+ 12 - 0
models/data_manage/response/edb_info.go

@@ -0,0 +1,12 @@
+package response
+
+import (
+	"eta/eta_mobile/models/data_manage"
+	"github.com/rdlucklib/rdluck_tools/paging"
+)
+
+// EdbInfoChartListResp ETA指标图列表返回数据
+type EdbInfoChartListResp struct {
+	Paging *paging.PagingItem
+	List   []*data_manage.EdbInfoList
+}

+ 42 - 2
models/db.go

@@ -1,12 +1,12 @@
 package models
 
 import (
-	_ "github.com/go-sql-driver/mysql"
 	"eta/eta_mobile/models/data_manage"
 	"eta/eta_mobile/models/ppt_english"
 	"eta/eta_mobile/models/sandbox"
 	"eta/eta_mobile/models/system"
 	"eta/eta_mobile/utils"
+	_ "github.com/go-sql-driver/mysql"
 	"time"
 
 	"github.com/beego/beego/v2/client/orm"
@@ -67,6 +67,10 @@ func init() {
 
 	initChart()
 
+	// 上海指标服务 数据表
+	initShEdbData()
+
+	// 指标服务 数据表
 	initEdbData()
 
 	// 英文ppt
@@ -126,11 +130,47 @@ func initChart() {
 	)
 }
 
+// initShEdbData 上海服务器指标 数据表
+func initShEdbData() {
+	orm.RegisterModel(
+		new(Edbdata),
+		new(EdbdataDeleteRecord),
+		new(Edbinfo), //edb库的edbinfo表
+	)
+}
+
 // initEdbData 指标服务 数据表
 func initEdbData() {
 	orm.RegisterModel(
+		new(data_manage.EdbClassify),
+		new(data_manage.EdbInfo), //hz_data库的edb_info表
+		new(data_manage.EdbDataThs),
+		new(data_manage.EdbDataWind),
+		new(data_manage.EdbDataPb),
+		new(data_manage.EdbInfoCalculate),
+		new(data_manage.EdbDataCalculate),
+		new(data_manage.EdbInfoCalculateTbz),
 		new(data_manage.SearchKeyword),
-		new(data_manage.ExcelClassify), //ETA excel表格分类
+		new(data_manage.BaseFromSmm),
+		new(data_manage.BaseFromSmmIndex),
+		new(data_manage.BaseFromSmmData),
+		new(data_manage.EdbInfoLog),
+		new(data_manage.EdbInfoCalculateMapping),
+		new(data_manage.ExcelClassify),                //ETA excel表格分类
+		new(data_manage.ExcelInfo),                    //ETA excel表格
+		new(data_manage.PredictEdbConf),               //预测指标配置
+		new(data_manage.BaseFromMysteelChemicalIndex), //钢联化工
+		new(data_manage.BaseFromEiaSteoClassify),      // Eia steo 报告指标
+		new(data_manage.BaseFromEiaSteoIndex),         // Eia steo 报告指标分类
+		new(data_manage.PredictEdbRuleData),           //预测指标,动态规则的计算数据
+		new(data_manage.BaseFromSci),
+		new(data_manage.BaseFromSciIndex),
+		new(data_manage.BaseFromSciData),
+		new(data_manage.BaseFromBaiinfo),
+		new(data_manage.BaseFromBaiinfoIndex),
+		new(data_manage.BaseFromBaiinfoData),
+		new(data_manage.EdbDataInsertConfig),      // 指标数据插入配置表
+		new(data_manage.EdbInfoNoPermissionAdmin), //指标不可见用户配置表
 	)
 }
 

+ 1444 - 0
models/target.go

@@ -0,0 +1,1444 @@
+package models
+
+import (
+	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"sort"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type DataList struct {
+	TradeCode    string  `orm:"column(TRADE_CODE)" description:"指标编码"`
+	SecName      string  `orm:"column(SEC_NAME)" description:"指标名称"`
+	Unit         string  `orm:"column(UNIT)" description:"单位"`
+	Remark       string  `orm:"column(REMARK)" description:"备注"`
+	Frequency    string  `description:"频度"`
+	ClassifyId   int     `description:"分类id"`
+	ClassifyName string  `description:"分类名称"`
+	Dt           string  `orm:"column(DT)" description:"录入日期"`
+	Close        float64 `orm:"column(CLOSE)" description:"录入值"`
+	ModifyTime   string  `description:"修改时间"`
+}
+
+type DataListResp struct {
+	List   []*DataList
+	Paging *paging.PagingItem `description:"分页数据"`
+}
+
+func GetDataList(condition string, pars []interface{}, startSize, pageSize int) (items []*DataList, err error) {
+	sql := `select a.TRADE_CODE,a.SEC_NAME,a.UNIT,a.frequency,a.classify_id,b.classify_name,c.DT,c.CLOSE,c.modify_time FROM edbdata AS c
+                inner join edbinfo AS a ON a.TRADE_CODE=c.TRADE_CODE
+                left join edbdata_classify AS b ON a.classify_id=b.classify_id
+                where left(a.TRADE_CODE,1)='W' AND a.REMARK='手动' AND a.classify_id>0`
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` order by c.DT desc limit ?,? `
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+func GetDataListCount(condition string, pars []interface{}) (count int, err error) {
+	sql := ` select count(1) as count FROM edbdata AS c
+                    inner join edbinfo AS a ON a.TRADE_CODE=c.TRADE_CODE    
+                    left join edbdata_classify AS b ON a.classify_id=b.classify_id
+                    where left(a.TRADE_CODE,1)='W' AND a.REMARK='手动' AND a.classify_id>0 `
+	if condition != "" {
+		sql += condition
+	}
+	o := orm.NewOrmUsingDB("edb")
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+type DataAddReq struct {
+	TradeCode  string `description:"指标唯一编码"`
+	CreateDate string `description:"创建日期"`
+	Close      string `description:"录入值"`
+}
+
+type Edbdata struct {
+	TradeCode  string    `orm:"column(TRADE_CODE);pk" description:"指标编码"`
+	Dt         string    `orm:"column(DT)" description:"日期"`
+	Close      string    `orm:"column(CLOSE)" description:"值"`
+	ModifyTime time.Time `orm:"column(modify_time)" description:"修改时间"`
+}
+
+func GetDataInfo(tradeCode, creteDate string) (item *Edbdata, err error) {
+	sql := " SELECT * FROM edbdata WHERE TRADE_CODE=? AND DT=? "
+	o := orm.NewOrmUsingDB("edb")
+	err = o.Raw(sql, tradeCode, creteDate).QueryRow(&item)
+	return
+}
+
+func AddEdbdata(item *Edbdata) (lastId int64, err error) {
+	o := orm.NewOrmUsingDB("edb")
+	lastId, err = o.Insert(item)
+	return
+}
+
+type DataEditReq struct {
+	TradeCode     string      `description:"指标唯一编码"`
+	CreateDate    string      `description:"创建日期"`
+	Close         interface{} `description:"录入值"`
+	OldCreateDate string      `description:"旧的录入日期"`
+}
+
+// BatchDataEditReq 批量修改指标
+type BatchDataEditReq struct {
+	OldCreateDate string        `description:"旧的录入日期"`
+	CreateDate    string        `description:"新的录入日期"`
+	List          []DataEditReq `description:"需要修改的数据"`
+}
+
+// 编辑数据
+func EditEdbdata(item *Edbdata) (err error) {
+	o := orm.NewOrmUsingDB("edb")
+	sql := ` UPDATE edbdata SET CLOSE = ?,modify_time=NOW() WHERE TRADE_CODE = ? AND DT = ? `
+	_, err = o.Raw(sql, item.Close, item.TradeCode, item.Dt).Exec()
+	return
+}
+
+type EdbdataDeleteRecord struct {
+	Id         int       `orm:"column(id);pk"`
+	TradeCode  string    `orm:"column(TRADE_CODE)" description:"指标编码"`
+	Dt         string    `orm:"column(DT)" description:"日期"`
+	Close      string    `orm:"column(CLOSE)" description:"值"`
+	ModifyTime time.Time `orm:"column(modify_time)" description:"修改时间"`
+	CreateTime time.Time
+	SysUserId  int
+}
+
+func AddEdbdataDeleteRecord(item *EdbdataDeleteRecord) (lastId int64, err error) {
+	o := orm.NewOrmUsingDB("edb")
+	lastId, err = o.Insert(item)
+	return
+}
+
+// DeleteEdbData 根据指标code和日期删除数据
+func DeleteEdbData(tradeCode, dt string) (err error) {
+	o := orm.NewOrmUsingDB("edb")
+	sql := ` DELETE FROM edbdata WHERE TRADE_CODE = ? AND DT = ? `
+	_, err = o.Raw(sql, tradeCode, dt).Exec()
+	return
+}
+
+// DeleteAllEdbData 根据指标code删除数据
+func DeleteAllEdbData(tradeCode string) (err error) {
+	o := orm.NewOrmUsingDB("edb")
+	sql := ` DELETE FROM edbdata WHERE TRADE_CODE = ? `
+	_, err = o.Raw(sql, tradeCode).Exec()
+	return
+}
+
+type Edbinfo struct {
+	TradeCode    string `orm:"column(TRADE_CODE);pk" description:"指标code"`
+	SecName      string `orm:"column(SEC_NAME);" description:"指标名称"`
+	Unit         string `orm:"column(UNIT);" description:"单位"`
+	Remark       string `orm:"column(REMARK);" description:"备注"`
+	Frequency    string `description:"频度"`
+	ClassifyId   int    `description:"分类id"`
+	ClassifyName string `description:"分类名称"`
+	CreateDate   string `description:"创建时间"`
+	UserId       int    `description:"录入用户id"`
+	UserName     string `description:"录入用户名称"`
+	NoticeTime   string `description:"通知时间"`
+	Mobile       string `description:"录入者手机号"`
+}
+
+func GetEdbinfoListCount(condition string, pars []interface{}, mobile string, roleType int) (count int, err error) {
+	o := orm.NewOrmUsingDB("edb")
+	sql := ``
+	if mobile != "" && roleType == 1 {
+		sql = `SELECT COUNT(1) AS count FROM edbinfo AS a 
+             INNER JOIN edbinfo_user AS c ON a.TRADE_CODE=c.TRADE_CODE AND c.mobile=?
+             WHERE LEFT(a.TRADE_CODE,1)='W' AND a.REMARK='手动' AND a.classify_id>0`
+
+		if condition != "" {
+			sql += condition
+		}
+		err = o.Raw(sql, mobile, pars).QueryRow(&count)
+	} else {
+		sql := `SELECT COUNT(1) AS count FROM edbinfo AS a WHERE LEFT(a.TRADE_CODE,1)='W' AND a.REMARK='手动' AND a.classify_id>0`
+
+		if condition != "" {
+			sql += condition
+		}
+		err = o.Raw(sql, pars).QueryRow(&count)
+	}
+	return
+}
+
+func GetEdbinfoList(condition string, pars []interface{}, startSize, pageSize int, mobile string, roleType int) (items []*Edbinfo, err error) {
+	o := orm.NewOrmUsingDB("edb")
+	sql := ``
+	if mobile != "" && roleType == 1 {
+		sql = ` SELECT DISTINCT a.*,b.classify_name FROM edbinfo AS a
+                    LEFT JOIN edbdata_classify AS b ON a.classify_id=b.classify_id
+                    INNER JOIN edbinfo_user AS c ON a.TRADE_CODE=c.TRADE_CODE AND c.mobile=?
+                    WHERE LEFT(a.TRADE_CODE,1)='W' AND a.REMARK='手动' AND a.classify_id>0`
+		if condition != "" {
+			sql += condition
+		}
+		sql += ` ORDER BY a.create_date DESC LIMIT ?,? `
+		_, err = o.Raw(sql, mobile, pars, startSize, pageSize).QueryRows(&items)
+	} else {
+		sql = `SELECT DISTINCT a.*,b.classify_name FROM edbinfo AS a
+                     LEFT JOIN edbdata_classify AS b on a.classify_id=b.classify_id
+                     WHERE LEFT(a.TRADE_CODE,1)='W' AND a.REMARK='手动' AND a.classify_id>0`
+		if condition != "" {
+			sql += condition
+		}
+		sql += ` ORDER BY a.create_date DESC LIMIT ?,? `
+		_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	}
+	return
+}
+
+// EdbParamsInfo 指标数据结构体
+type EdbParamsInfo struct {
+	Unit      string `orm:"column(UNIT);" description:"单位"`
+	Frequency string `orm:"column(frequency);" description:"单位"`
+}
+
+// GetEdbUnitList 获取指标单位
+func GetEdbUnitList() (items []*EdbParamsInfo, err error) {
+	o := orm.NewOrmUsingDB("edb")
+	sql := `SELECT UNIT from edbinfo group by UNIT`
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// GetEdbFrequencyList 获取指标频度
+func GetEdbFrequencyList(classifyId, userId int) (items []*EdbParamsInfo, err error) {
+	o := orm.NewOrmUsingDB("edb")
+	sql := `SELECT frequency from edbinfo a 
+join edbdata b on a.TRADE_CODE=b.TRADE_CODE
+ where classify_id = ? `
+	if userId > 0 {
+		sql += ` and a.user_id = ` + fmt.Sprint(userId) + ` `
+	}
+	sql += ` group by a.frequency`
+	_, err = o.Raw(sql, classifyId).QueryRows(&items)
+	return
+}
+
+type TargetListResp struct {
+	List   []*Edbinfo
+	Paging *paging.PagingItem `description:"分页数据"`
+}
+
+type EdbinfoAddReq struct {
+	SecName    string `description:"指标名称"`
+	Unit       string `description:"单位"`
+	Frequency  string `description:"频度"`
+	ClassifyId int    `description:"分类id"`
+	NoticeTime string `description:"通知时间"`
+}
+
+// GetMaxTradeCode 获取指标最大trade_code
+func GetMaxTradeCode() (max_trade_code string, err error) {
+	sql := " SELECT MAX(TRADE_CODE) AS max_trade_code FROM edbinfo WHERE LEFT(TRADE_CODE,1)='W' AND TRADE_CODE not like '%index%'"
+	o := orm.NewOrmUsingDB("edb")
+	err = o.Raw(sql).QueryRow(&max_trade_code)
+	if (err != nil && err.Error() == utils.ErrNoRow()) || max_trade_code == `` {
+		max_trade_code = "W00"
+	}
+	return
+}
+
+func GetEdbinfoBySecName(secName string) (item *Edbinfo, err error) {
+	sql := `SELECT * FROM edbinfo WHERE SEC_NAME=? AND left(TRADE_CODE,1)='W' AND REMARK='手动' `
+	o := orm.NewOrmUsingDB("edb")
+	err = o.Raw(sql, secName).QueryRow(&item)
+	return
+}
+
+func GetEdbinfoByTradeCode(tradeCode string) (item *Edbinfo, err error) {
+	sql := `SELECT * FROM edbinfo WHERE TRADE_CODE=? `
+	o := orm.NewOrmUsingDB("edb")
+	err = o.Raw(sql, tradeCode).QueryRow(&item)
+	return
+}
+
+func AddEdbinfo(tradeCode, secName, unit, remark, frequency, noticeTime string, classifyId int, userId int) (err error) {
+	sql := `INSERT INTO edbinfo(TRADE_CODE, SEC_NAME,UNIT, REMARK,frequency, classify_id,notice_time,user_id,create_date) 
+			VALUES(?,?,?,?,?,?,?,?,now()) `
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql, tradeCode, secName, unit, remark, frequency, classifyId, noticeTime, userId).Exec()
+	return
+}
+
+func AddEdbinfoUser(tradeCode, mobile string) (err error) {
+	o := orm.NewOrmUsingDB("edb")
+	sql := `INSERT INTO edbinfo_user(TRADE_CODE, mobile) VALUES (?,?)`
+	_, err = o.Raw(sql, tradeCode, mobile).Exec()
+	return
+}
+
+type EdbinfoEditReq struct {
+	TradeCode  string `description:"指标code"`
+	SecName    string `description:"指标名称"`
+	Unit       string `description:"单位"`
+	Frequency  string `description:"频度"`
+	ClassifyId int    `description:"分类id"`
+	NoticeTime string `description:"通知时间"`
+}
+
+func EditEdbinfo(tradeCode, secName, unit, frequency, noticeTime string, classifyId int) (err error) {
+	sql := `UPDATE edbinfo SET SEC_NAME= ?, UNIT = ?,classify_id=?,frequency=?,notice_time=?,create_date=NOW() WHERE TRADE_CODE=? `
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql, secName, unit, classifyId, frequency, noticeTime, tradeCode).Exec()
+	return
+}
+
+func SearchTargetEntry(classifyId int, keyWord string) (items []*Edbinfo, err error) {
+	where := ""
+	if keyWord != "" {
+		where = `AND SEC_NAME LIKE '%` + keyWord + `%'`
+	}
+	sql := `SELECT * FROM edbinfo WHERE LEFT(TRADE_CODE,1)='W' AND REMARK='手动' AND classify_id>0 AND classify_id=? `
+	sql += where
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql, classifyId).QueryRows(&items)
+	return
+}
+
+type SearchTargetListResp struct {
+	List []*Edbinfo
+}
+
+type EdbdataClassify struct {
+	ClassifyId   int
+	ClassifyName string
+	ParentId     int
+	EdbInfoTotal int
+}
+
+func GetEdbdataClassifyByClassifyName(classifyName string) (item *EdbdataClassify, err error) {
+	sql := `SELECT * FROM edbdata_classify WHERE classify_name=? `
+	o := orm.NewOrmUsingDB("edb")
+	err = o.Raw(sql, classifyName).QueryRow(&item)
+	return
+}
+
+type EdbdataClassifyList struct {
+	ClassifyId   int
+	ClassifyName string
+	ParentId     int
+	Child        []*EdbdataClassify
+}
+
+func GetEdbdataClassify(userId int64) (items []*EdbdataClassifyList, err error) {
+	var newItems []*EdbdataClassifyList
+	o := orm.NewOrmUsingDB("edb")
+	sql := ` SELECT classify_id,classify_name,parent_id FROM edbdata_classify WHERE parent_id=0 `
+	_, err = o.Raw(sql).QueryRows(&newItems)
+	if err != nil {
+		return
+	}
+	classifyLen := len(newItems)
+
+	for i := 0; i < classifyLen; i++ {
+		var childItems []*EdbdataClassify
+		parentId := newItems[i].ClassifyId
+		childSql := ``
+		if userId > 0 {
+			userClassifyList, _ := GetManualUserClassify(int(userId))
+			var userIdArr []string
+			for _, v := range userClassifyList {
+				userIdArr = append(userIdArr, strconv.Itoa(v.ClassifyId))
+			}
+
+			userIdStr := strings.Join(userIdArr, ",")
+			if userIdStr != "" {
+				childSql = "SELECT a.classify_id,a.classify_name,a.parent_id FROM edbdata_classify AS a WHERE a.is_show=1 and a.classify_id IN(" + userIdStr + ") AND parent_id=? ORDER BY a.create_time ASC "
+				_, err = o.Raw(childSql, parentId).QueryRows(&childItems)
+			}
+		} else {
+			childSql = "SELECT classify_id,classify_name,parent_id FROM edbdata_classify WHERE is_show=1 and parent_id=? ORDER BY create_time ASC "
+			_, err = o.Raw(childSql, parentId).QueryRows(&childItems)
+		}
+		if err != nil {
+			return
+		}
+		newItems[i].Child = childItems
+	}
+	for _, v := range newItems {
+		childLen := len(v.Child)
+		if childLen > 0 {
+			items = append(items, v)
+		}
+	}
+	return
+}
+
+type ManualUserClassify struct {
+	ManualUserClassifyId int `orm:"column(manual_user_classify_id);pk"`
+	AdminId              int
+	ClassifyId           int
+	CreateTime           time.Time
+}
+
+func GetManualUserClassify(sysUserId int) (list []*ManualUserClassify, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM manual_user_classify WHERE admin_id=? `
+	_, err = o.Raw(sql, sysUserId).QueryRows(&list)
+	return
+}
+
+type EdbdataClassifyResp struct {
+	List []*EdbdataClassifyList
+}
+
+func GetTargetBySecName(secName string) (item *Edbinfo, err error) {
+	sql := `SELECT * FROM edbinfo WHERE SEC_NAME=? AND left(TRADE_CODE,1)='W' AND REMARK='手动' `
+	o := orm.NewOrmUsingDB("edb")
+	err = o.Raw(sql, secName).QueryRow(&item)
+	return
+}
+
+// 更新指标数据信息
+func (edbinfo *Edbinfo) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Update(edbinfo, cols...)
+	return
+}
+
+func ModifyTargetClassifyId(tradeCode string, classifyId int) (err error) {
+	sql := `UPDATE edbinfo SET classify_id=? WHERE TRADE_CODE=? `
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql, classifyId, tradeCode).Exec()
+	return
+}
+
+func GetTargetsDataCount(tradeCode, dt string) (count int, err error) {
+	sql := `SELECT COUNT(1) AS count FROM edbdata WHERE TRADE_CODE=? AND DT=? `
+	o := orm.NewOrmUsingDB("edb")
+	err = o.Raw(sql, tradeCode, dt).QueryRow(&count)
+	return
+}
+
+// GetTargetsDataList 根据code获取指标数据列表
+func GetTargetsDataList(tradeCode string) (items []*Edbdata, err error) {
+	o := orm.NewOrmUsingDB("edb")
+	sql := `SELECT * FROM edbdata WHERE TRADE_CODE=? ORDER BY DT ASC `
+	_, err = o.Raw(sql, tradeCode).QueryRows(&items)
+	return
+}
+
+func GetTargetsData(tradeCode, dt string) (item *Edbdata, err error) {
+	sql := `SELECT * FROM edbdata WHERE TRADE_CODE=? AND DT=? `
+	o := orm.NewOrmUsingDB("edb")
+	err = o.Raw(sql, tradeCode, dt).QueryRow(&item)
+	return
+}
+
+func ModifyTargetsDataByImport(tradeCode, dt, close string) (err error) {
+	sql := `UPDATE  edbdata SET CLOSE=?,modify_time=NOW() WHERE  TRADE_CODE=? AND DT=? `
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql, close, tradeCode, dt).Exec()
+	return
+}
+
+func AddTargetsDataByImport(tradeCode, dt, close string) (err error) {
+	sql := `INSERT INTO edbdata(TRADE_CODE, DT,CLOSE, modify_time)VALUES(?,?,?,NOW()) `
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql, tradeCode, dt, close).Exec()
+	return
+}
+
+type EdbdataImportResp struct {
+	Status       int
+	Msg          string
+	SuccessCount int
+	FailCount    int
+}
+
+//func GetFailList(sysUserId int) (items []*EdbdataImportFail, err error) {
+//	o := orm.NewOrmUsingDB("edb")
+//	sql := ` SELECT * FROM edbdata_import_fail WHERE sys_user_id=? `
+//	_, err = o.Raw(sql, sysUserId).QueryRows(&items)
+//	return
+//}
+
+type DataListForExport struct {
+	TradeCode    string `orm:"column(TRADE_CODE)" description:"指标code"`
+	SecName      string `orm:"column(SEC_NAME)" description:"指标名称"`
+	Unit         string `orm:"column(UNIT)" description:"单位"`
+	Frequency    string `description:"频度"`
+	ClassifyId   int    `description:"分类id"`
+	NoticeTime   string `description:"通知时间"`
+	ClassifyName string
+	Dt           string  `orm:"column(DT)" description:"日期"`
+	Close        float64 `orm:"column(CLOSE)" description:"值"`
+}
+
+func GetDataListForExport(startDate, endDate, frequency, keyWord string, classifyId int) (items []*DataListForExport, err error) {
+	where := ``
+	var pars []interface{}
+	if keyWord != "" {
+		where = ` AND SEC_NAME LIKE '%` + keyWord + `%`
+	}
+	if startDate != "" {
+		where += ` AND create_date>=? `
+		pars = append(pars, startDate)
+	}
+	if endDate != "" {
+		where += ` AND create_date<=? `
+		pars = append(pars, endDate)
+	}
+	if frequency != "" {
+		where += ` AND frequency=? `
+		pars = append(pars, frequency)
+	}
+	if classifyId > 0 {
+		where += ` AND classify_id=? `
+		pars = append(pars, classifyId)
+	}
+
+	sql := ` SELECT a.TRADE_CODE,a.SEC_NAME,a.UNIT,a.frequency,a.classify_id,b.classify_name,c.DT,c.CLOSE FROM edbdata AS c
+                INNER JOIN edbinfo AS a ON a.TRADE_CODE=c.TRADE_CODE
+                LEFT JOIN edbdata_classify AS b ON a.classify_id=b.classify_id
+                WHERE LEFT(a.TRADE_CODE,1)='W' AND a.REMARK='手动' AND a.classify_id>0 `
+	if where != "" {
+		sql += where
+	}
+	sql = sql + " ORDER BY c.DT DESC "
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+type DataDeleteReq struct {
+	TradeCode  string `description:"指标唯一编码"`
+	CreateDate string `description:"数据录入日期"`
+}
+
+func DataDelete(tradeCode, createDate, close string, modifyTime time.Time, sysUserId int) (err error) {
+	o := orm.NewOrmUsingDB("edb")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	recordSql := ` INSERT INTO edbdata_delete_record(TRADE_CODE,DT,CLOSE,modify_time,create_time,sys_user_id) 
+                 VALUES(?,?,?,?,?,?)`
+	_, err = to.Raw(recordSql, tradeCode, createDate, close, modifyTime, time.Now(), sysUserId).Exec()
+	sql := ` DELETE FROM edbdata WHERE TRADE_CODE = ? AND DT = ? `
+	_, err = to.Raw(sql, tradeCode, createDate).Exec()
+	return
+}
+
+func GetTargetInfoCount(tradeCode string) (count int, err error) {
+	sql := ` SELECT COUNT(1) AS count FROM edbdata AS c
+           INNER JOIN edbinfo AS a ON a.TRADE_CODE=c.TRADE_CODE
+           WHERE a.TRADE_CODE=? `
+	o := orm.NewOrmUsingDB("edb")
+	err = o.Raw(sql, tradeCode).QueryRow(&count)
+	return
+}
+
+type TargetDeleteReq struct {
+	TradeCode string `description:"指标唯一编码"`
+}
+
+func TargetDelete(tradeCode string) (err error) {
+	o := orm.NewOrmUsingDB("edb")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	sql := " DELETE FROM edbinfo WHERE TRADE_CODE = ? "
+	_, err = to.Raw(sql, tradeCode).Exec()
+
+	sql = " DELETE FROM edbdata WHERE TRADE_CODE = ? "
+	_, err = to.Raw(sql, tradeCode).Exec()
+
+	return
+}
+
+type Researcher struct {
+	AdminId     int    `description:"系统用户id"`
+	AdminName   string `description:"系统用户名称"`
+	RealName    string `description:"系统用户姓名"`
+	Role        string `description:"系统用户角色"`
+	Mobile      string `description:"手机号"`
+	TargetCount int    `description:"指标数量"`
+}
+
+type ResearcherListResp struct {
+	List []*Researcher
+}
+
+func GetResearcherEntry() (items []*Researcher, err error) {
+	sql := ` SELECT admin_id,admin_name,real_name,mobile,0 as target_count FROM admin WHERE role_type=1 `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql).QueryRows(&items)
+	researchLen := len(items)
+	edbO := orm.NewOrmUsingDB("edb")
+	for i := 0; i < researchLen; i++ {
+		var count int
+		mobile := items[i].Mobile
+		sqlCount := ` SELECT COUNT(DISTINCT a.TRADE_CODE) AS count FROM  edbinfo_user AS a
+            INNER JOIN edbinfo AS b ON a.TRADE_CODE=b.TRADE_CODE
+            WHERE a.mobile=? AND LEFT(b.TRADE_CODE,1)='W' AND b.REMARK='手动' AND b.classify_id>0 `
+		err = edbO.Raw(sqlCount, mobile).QueryRow(&count)
+		items[i].TargetCount = count
+	}
+	return
+}
+
+func GetResearcherEntryByMobile(mobile string) (items []*Researcher, err error) {
+	sql := ` SELECT admin_id,admin_name,real_name,mobile,0 as target_count FROM admin WHERE  role_type=1 `
+	if mobile != "" {
+		sql += ` AND mobile IN(` + mobile + `)`
+	}
+	o := orm.NewOrm()
+	_, err = o.Raw(sql).QueryRows(&items)
+	researchLen := len(items)
+	edbO := orm.NewOrmUsingDB("edb")
+	for i := 0; i < researchLen; i++ {
+		var count int
+		mobile := items[i].Mobile
+		sqlCount := ` SELECT COUNT(DISTINCT a.TRADE_CODE) AS count FROM  edbinfo_user AS a
+            INNER JOIN edbinfo AS b ON a.TRADE_CODE=b.TRADE_CODE
+            WHERE a.mobile=? AND LEFT(b.TRADE_CODE,1)='W' AND b.REMARK='手动' AND b.classify_id>0 `
+		err = edbO.Raw(sqlCount, mobile).QueryRow(&count)
+		items[i].TargetCount = count
+	}
+	return
+}
+
+type EdbinfoItems struct {
+	TradeCode    string `orm:"column(TRADE_CODE);pk" description:"指标code"`
+	SecName      string `orm:"column(SEC_NAME);" description:"指标名称"`
+	Unit         string `orm:"column(UNIT);" description:"单位"`
+	Remark       string `orm:"column(REMARK);" description:"备注"`
+	Frequency    string `description:"频度"`
+	ClassifyId   int    `description:"分类id"`
+	ClassifyName string `description:"分类名称"`
+	CreateDate   string `description:"创建时间"`
+	UserId       int    `description:"录入用户id"`
+	NoticeTime   string `description:"通知时间"`
+	Mobile       string `description:"录入者手机号"`
+	ModifyDate   string `description:"待更新日期"`
+	Status       string `description:"状态:未完成/完成"`
+}
+
+type TargetItemsResp struct {
+	List SortEdbInfo
+}
+
+type SortEdbInfo []EdbinfoItems
+
+func GetTargetItems(mobile string, classifyId int) (lastItems SortEdbInfo, err error) {
+	var items []*EdbinfoItems
+	o := orm.NewOrmUsingDB("edb")
+	//sql := ` SELECT *,'' modify_date,'' status FROM edbinfo AS a WHERE LEFT(a.TRADE_CODE,1)='W' AND a.REMARK='手动' AND a.classify_id>0 `
+
+	sql := ` SELECT *,'' modify_date,'' STATUS FROM edbinfo AS a 
+            WHERE LEFT(a.TRADE_CODE,1)='W' AND a.REMARK='手动' AND a.classify_id>0
+             `
+	if classifyId > 0 {
+		sql += ` AND a.classify_id=` + strconv.Itoa(classifyId) + ``
+	}
+	sql += ` GROUP BY a.TRADE_CODE `
+
+	//if classifyId > 0 {
+	//	sql = ` SELECT *,'' modify_date,'' status FROM edbinfo AS a
+	//        WHERE a.classify_id=` + strconv.Itoa(classifyId) + ` AND LEFT(a.TRADE_CODE,1)='W' AND a.REMARK='手动' AND a.classify_id>0
+	//         GROUP BY a.TRADE_CODE `
+	//}
+
+	sql = sql + ` ORDER BY CONVERT(a.SEC_NAME USING gbk )  COLLATE gbk_chinese_ci ASC `
+	_, err = o.Raw(sql).QueryRows(&items)
+	if err != nil {
+		return
+	}
+	itemsLen := len(items)
+	nowWeek := time.Now().Weekday().String()
+
+	fmt.Println(nowWeek)
+	finishEdbInfo := SortEdbInfo{}
+	unFinishEdbInfo := SortEdbInfo{}
+
+	for i := 0; i < itemsLen; i++ {
+		noticeTime := items[i].NoticeTime
+		frequency := items[i].Frequency
+		tradeCode := items[i].TradeCode
+		if noticeTime != "" {
+			if frequency == "周度" {
+				noticeArr := strings.Split(noticeTime, " ")
+				noticeWeek := noticeArr[0]
+				fmt.Println(noticeWeek)
+				addDay := 0
+
+				if nowWeek == "Sunday" {
+					if noticeWeek == "周日" {
+						addDay = 0
+					} else if noticeWeek == "周一" {
+						addDay = 1
+					} else if noticeWeek == "周二" {
+						addDay = 2
+					} else if noticeWeek == "周三" {
+						addDay = 3
+					} else if noticeWeek == "周四" {
+						addDay = 4
+					} else if noticeWeek == "周五" {
+						addDay = 5
+					} else if noticeWeek == "周六" {
+						addDay = 6
+					} else {
+						addDay = 0
+					}
+				} else if nowWeek == "Monday" {
+					if noticeWeek == "周日" {
+						addDay = 6
+					} else if noticeWeek == "周一" {
+						addDay = 0
+					} else if noticeWeek == "周二" {
+						addDay = 1
+					} else if noticeWeek == "周三" {
+						addDay = 2
+					} else if noticeWeek == "周四" {
+						addDay = 3
+					} else if noticeWeek == "周五" {
+						addDay = 4
+					} else if noticeWeek == "周六" {
+						addDay = 5
+					} else {
+						addDay = 0
+					}
+				} else if nowWeek == "Tuesday" {
+					if noticeWeek == "周日" {
+						addDay = 5
+					} else if noticeWeek == "周一" {
+						addDay = 6
+					} else if noticeWeek == "周二" {
+						addDay = 0
+					} else if noticeWeek == "周三" {
+						addDay = 1
+					} else if noticeWeek == "周四" {
+						addDay = 2
+					} else if noticeWeek == "周五" {
+						addDay = 3
+					} else if noticeWeek == "周六" {
+						addDay = 4
+					} else {
+						addDay = 0
+					}
+				} else if nowWeek == "Wednesday" {
+					if noticeWeek == "周日" {
+						addDay = 4
+					} else if noticeWeek == "周一" {
+						addDay = 5
+					} else if noticeWeek == "周二" {
+						addDay = 6
+					} else if noticeWeek == "周三" {
+						addDay = 0
+					} else if noticeWeek == "周四" {
+						addDay = 1
+					} else if noticeWeek == "周五" {
+						addDay = 2
+					} else if noticeWeek == "周六" {
+						addDay = 3
+					} else {
+						addDay = 0
+					}
+				} else if nowWeek == "Thursday" {
+					if noticeWeek == "周日" {
+						addDay = 3
+					} else if noticeWeek == "周一" {
+						addDay = 4
+					} else if noticeWeek == "周二" {
+						addDay = 5
+					} else if noticeWeek == "周三" {
+						addDay = 6
+					} else if noticeWeek == "周四" {
+						addDay = 0
+					} else if noticeWeek == "周五" {
+						addDay = 1
+					} else if noticeWeek == "周六" {
+						addDay = 2
+					} else {
+						addDay = 0
+					}
+				} else if nowWeek == "Friday" {
+					if noticeWeek == "周日" {
+						addDay = 2
+					} else if noticeWeek == "周一" {
+						addDay = 3
+					} else if noticeWeek == "周二" {
+						addDay = 4
+					} else if noticeWeek == "周三" {
+						addDay = 5
+					} else if noticeWeek == "周四" {
+						addDay = 6
+					} else if noticeWeek == "周五" {
+						addDay = 0
+					} else if noticeWeek == "周六" {
+						addDay = 1
+					} else {
+						addDay = 0
+					}
+				} else if nowWeek == "Saturday" {
+					if noticeWeek == "周日" {
+						addDay = 1
+					} else if noticeWeek == "周一" {
+						addDay = 2
+					} else if noticeWeek == "周二" {
+						addDay = 3
+					} else if noticeWeek == "周三" {
+						addDay = 4
+					} else if noticeWeek == "周四" {
+						addDay = 5
+					} else if noticeWeek == "周五" {
+						addDay = 6
+					} else if noticeWeek == "周六" {
+						addDay = 0
+					} else {
+						addDay = 0
+					}
+				}
+
+				modifyDate := time.Now().AddDate(0, 0, addDay)
+				modifyDateStr := modifyDate.Format(utils.FormatDate)
+				items[i].ModifyDate = modifyDateStr
+
+				modifyDateEndStr := modifyDate.AddDate(0, 0, -7).Format(utils.FormatDate)
+
+				fmt.Println("addDay:", addDay)
+				fmt.Println("modifyDateEndStr:", modifyDateEndStr)
+
+				count := 0
+				sqlCount := ` SELECT COUNT(1) AS num FROM edbdata WHERE TRADE_CODE=? AND DT >= ? AND DT <= ? `
+				err = o.Raw(sqlCount, tradeCode, modifyDateEndStr, modifyDateStr).QueryRow(&count)
+				if err != nil {
+					return nil, err
+				}
+				if count > 0 {
+					items[i].Status = "完成"
+					finishEdbInfo = append(finishEdbInfo, *items[i])
+				} else {
+					items[i].Status = "未完成"
+					unFinishEdbInfo = append(unFinishEdbInfo, *items[i])
+				}
+			} else if frequency == "日度" {
+				items[i].Status = "完成"
+				finishEdbInfo = append(finishEdbInfo, *items[i])
+			} else if frequency == "月度" {
+				myYear := time.Now().Year()
+				myMonth := time.Now().Format("01")
+				startDate, endDate := utils.GetMonthStartAndEnd(strconv.Itoa(myYear), myMonth)
+				count := 0
+				sqlCount := ` SELECT COUNT(1) AS num FROM edbdata WHERE TRADE_CODE=? AND DT >= ? AND DT <= ? `
+				err = o.Raw(sqlCount, tradeCode, startDate, endDate).QueryRow(&count)
+				if err != nil {
+					return nil, err
+				}
+				if noticeTime != "" {
+					var modifyDateStr string
+					strArr := strings.Split(noticeTime, "日")
+					myYear := time.Now().Year()
+					myMonth := time.Now().Format("01")
+					modifyDateStr = strconv.Itoa(myYear) + "-" + myMonth + "-" + strArr[0]
+					items[i].ModifyDate = modifyDateStr
+				}
+				if count > 0 {
+					items[i].Status = "完成"
+					finishEdbInfo = append(finishEdbInfo, *items[i])
+				} else {
+					items[i].Status = "未完成"
+					unFinishEdbInfo = append(unFinishEdbInfo, *items[i])
+				}
+			} else {
+				items[i].Status = "完成"
+				finishEdbInfo = append(finishEdbInfo, *items[i])
+			}
+		} else {
+			if frequency == "月度" {
+				myYear := time.Now().Year()
+				myMonth := time.Now().Format("01")
+				startDate, endDate := utils.GetMonthStartAndEnd(strconv.Itoa(myYear), myMonth)
+				count := 0
+				sqlCount := ` SELECT COUNT(1) AS num FROM edbdata WHERE TRADE_CODE=? AND DT >= ? AND DT <= ? `
+				err = o.Raw(sqlCount, tradeCode, startDate, endDate).QueryRow(&count)
+				if err != nil {
+					return nil, err
+				}
+				if count > 0 {
+					items[i].Status = "完成"
+					finishEdbInfo = append(finishEdbInfo, *items[i])
+				} else {
+					items[i].Status = "未完成"
+					unFinishEdbInfo = append(unFinishEdbInfo, *items[i])
+				}
+			} else {
+				items[i].Status = "完成"
+				finishEdbInfo = append(finishEdbInfo, *items[i])
+			}
+		}
+	}
+	sort.Sort(SortByModifyDate{finishEdbInfo})
+	sort.Sort(SortByModifyDate{unFinishEdbInfo})
+	lastItems = append(lastItems, unFinishEdbInfo...)
+	lastItems = append(lastItems, finishEdbInfo...)
+	return
+}
+
+// 获取此 slice 的长度
+func (p SortEdbInfo) Len() int { return len(p) }
+
+// 根据元素的状态降序排序
+func (p SortEdbInfo) Less(i, j int) bool {
+	return p[i].Status > p[j].Status
+}
+
+// 交换数据
+func (p SortEdbInfo) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
+
+// 嵌套结构体  将继承 SortEdbInfo 的所有属性和方法
+// 所以相当于SortByName 也实现了 Len() 和 Swap() 方法
+type SortByStatus struct{ SortEdbInfo }
+
+// 根据元素的姓名长度降序排序 (此处按照自己的业务逻辑写)
+func (p SortByStatus) Less(i, j int) bool {
+	return len(p.SortEdbInfo[i].Status) > len(p.SortEdbInfo[j].Status)
+}
+
+type SortByModifyDate struct{ SortEdbInfo }
+
+// 根据元素的年龄降序排序 (此处按照自己的业务逻辑写)
+func (p SortByModifyDate) Less(i, j int) bool {
+	return p.SortEdbInfo[i].ModifyDate > p.SortEdbInfo[j].ModifyDate
+}
+
+type DataCheckResp struct {
+	Status int    `description:"状态:1:该日期已存在数据,是否确认修改?,0:数据不存在"`
+	Close  string `description:"值"`
+}
+
+type TargetCheckResp struct {
+	Status int `description:"状态:1:该指标有关联数据,请先删除数据,0:指标不存在关联数据,可直接删除"`
+}
+
+type EdbdataExportList struct {
+	TradeCode    string `orm:"column(TRADE_CODE);" description:"指标code"`
+	SecName      string `orm:"column(SEC_NAME);" description:"指标名称"`
+	Unit         string `orm:"column(UNIT);" description:"单位"`
+	Remark       string `orm:"column(REMARK);" description:"备注"`
+	Frequency    string `description:"频度"`
+	ClassifyId   int    `description:"分类id"`
+	ClassifyName string `description:"分类名称"`
+	CreateDate   string `description:"创建时间"`
+	Dt           string `orm:"column(Dt);" description:"最新一次录入时间"`
+}
+
+func GetEdbdataSecName(condition string, pars []interface{}) (items []*EdbdataExportList, err error) {
+	//sql := `SELECT a.TRADE_CODE,a.SEC_NAME,a.frequency,a.UNIT,MAX(c.DT) AS Dt
+	//	        FROM edbdata AS c
+	//	        INNER JOIN edbinfo AS a ON a.TRADE_CODE=c.TRADE_CODE
+	//	        INNER JOIN edbinfo_user AS d ON a.TRADE_CODE=d.TRADE_CODE
+	//	        LEFT JOIN edbdata_classify AS b ON a.classify_id=b.classify_id
+	//	        WHERE LEFT(a.TRADE_CODE,1)='W' AND a.REMARK='手动' AND a.classify_id>0`
+	sql := `SELECT a.TRADE_CODE,a.SEC_NAME,a.frequency,a.UNIT,MAX(c.DT) AS Dt,b.classify_name
+		        FROM edbdata AS c
+		        INNER JOIN edbinfo AS a ON a.TRADE_CODE=c.TRADE_CODE
+		        LEFT JOIN edbdata_classify AS b ON a.classify_id=b.classify_id
+		        WHERE LEFT(a.TRADE_CODE,1)='W' AND a.REMARK='手动' AND a.classify_id>0`
+	if condition != "" {
+		sql += condition
+	}
+	sql += " GROUP BY a.TRADE_CODE ORDER BY a.TRADE_CODE ASC "
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+func GetEdbDataFrequency(classifyId int) (items []*string, err error) {
+	sql := `SELECT DISTINCT frequency FROM edbinfo where classify_id=? AND frequency IS NOT NULL ORDER BY FIELD(frequency,'日度','周度','月度','季度','半年度','年度') `
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql, classifyId).QueryRows(&items)
+	return
+}
+
+func GetEdbDataFrequencyByKeyord(keyword string) (items []*string, err error) {
+	sql := `SELECT DISTINCT frequency FROM edbinfo where SEC_NAME=? ORDER BY FIELD(frequency,'日度','周度','月度','季度','半年度','年度') `
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql, keyword).QueryRows(&items)
+	return
+}
+
+type EdbdataList struct {
+	Dt string `orm:"column(DT);" description:"录入时间"`
+}
+
+func GetEdbdataList(tradeCode string) (items []*EdbdataList, err error) {
+	sql := ` SELECT  DT FROM edbdata WHERE TRADE_CODE IN(` + tradeCode + `)  GROUP BY DT ORDER BY DT DESC `
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+type EdbdataItem struct {
+	TradeCode string  `orm:"column(TRADE_CODE);" description:"指标code"`
+	Dt        string  `orm:"column(DT);" description:"最新一次录入时间"`
+	Close     float64 `orm:"column(CLOSE);" description:"值"`
+}
+
+func GetEdbdataValueByTradeCode(tradeCode, dt string) (item *EdbdataItem, err error) {
+	sql := ` SELECT  TRADE_CODE,DT,CLOSE FROM edbdata WHERE TRADE_CODE=? AND DT=? `
+	o := orm.NewOrmUsingDB("edb")
+	err = o.Raw(sql, tradeCode, dt).QueryRow(&item)
+	return
+}
+
+func GetEdbdataAllByTradeCode(tradeCode string) (items []*EdbdataItem, err error) {
+	sql := ` SELECT * FROM edbdata WHERE TRADE_CODE=? `
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql, tradeCode).QueryRows(&items)
+	return
+}
+
+func GetEdbdataClassifyByParentId(parentId int) (items []*EdbdataClassify, err error) {
+	sql := ` SELECT * FROM edbdata_classify WHERE parent_id=? `
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql, parentId).QueryRows(&items)
+	return
+}
+
+type LzPriceClassify struct {
+	ProductName string
+}
+
+func GetLzPriceClassify() (items []*LzPriceClassify, err error) {
+	sql := ` SELECT product_name  FROM longzhongpriceinfo GROUP BY product_name ORDER BY product_name DESC `
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+type Longzhongpriceinfo struct {
+	LongzhongpriceinfoId int `orm:"column(longzhongpriceinfo_id);pk"`
+	Standard             string
+	ModelName            string
+	Unit                 string
+	AreaName             string
+	PriceType            string
+	Memo                 string
+	PriceId              string
+	ProductName          string
+	InfoType             string
+	InfoTypeRemark       string
+	MarketName           string
+	ManufactureName      string
+}
+
+func GetLongzhongpriceinfoByClassifyName(productName string) (items []*Longzhongpriceinfo, err error) {
+	sql := `SELECT * FROM longzhongpriceinfo WHERE product_name=? ORDER BY longzhongpriceinfo_id ASC `
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql, productName).QueryRows(&items)
+	return
+}
+
+func GetLongzhongPriceDataMaxCount(productName string) (count int, err error) {
+	o := orm.NewOrmUsingDB("edb")
+	sql := `SELECT MAX(t.num) AS count FROM (
+				SELECT COUNT(1) AS num  FROM longzhongpriceinfo AS a
+				INNER JOIN longzhongpricedata AS b ON a.longzhongpriceinfo_id=b.longzhongpriceinfo_id
+				WHERE a.product_name=?
+				GROUP BY a.product_name
+			)AS t `
+	err = o.Raw(sql, productName).QueryRow(&count)
+	return
+}
+
+type LongzhongpricedataItems struct {
+	LongzhongpricedataId int `orm:"column(longzhongpricedata_id);pk"`
+	LongzhongpriceinfoId int
+	PriceDate            string
+	Memo                 string
+	Price                float64
+	CnyPrice             float64
+	ZsyPrice             float64
+	ZshPrice             float64
+	LowPrice             float64
+	HighPrice            float64
+	RisePrice            float64
+	TonPrice             float64
+	PriceType            string
+	UpdateDate           string
+}
+
+func GetLongzhongPriceDataById(lzPriceInfoId int) (items []*LongzhongpricedataItems, err error) {
+	o := orm.NewOrmUsingDB("edb")
+	sql := ` SELECT DISTINCT a.longzhongpriceinfo_id,a.price_date,a.memo,a.price,a.cny_price,a.zsy_price,a.zsh_price,a.low_price,a.high_price,a.rise_price,a.ton_price,a.price_type,a.update_date  
+			 FROM longzhongpricedata AS a
+			 WHERE longzhongpriceinfo_id=? ORDER BY price_date DESC `
+	_, err = o.Raw(sql, lzPriceInfoId).QueryRows(&items)
+	return
+}
+
+func GetLzSurveyClassify() (items []*LzPriceClassify, err error) {
+	sql := ` SELECT breed_name AS product_name  FROM longzhong_survey_product GROUP BY breed_name ORDER BY breed_name DESC `
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+type LongzhongSurveyProduct struct {
+	SurveyProductId      int `orm:"column(survey_product_id);pk"`
+	ProjectQuotaId       int64
+	BreedId              string
+	BreedName            string
+	QuotaId              string
+	QuotaName            string
+	UnitId               string
+	UnitName             string
+	SampleType           int64
+	SampleId             string
+	SampleName           string
+	DeviceId             string
+	Device               string
+	ProductCraftId       string
+	ProductCraft         string
+	ProductLine          string
+	InputMode            int64
+	Frequency            int64
+	InputValue           string
+	TaskShouldFinishTime int
+	CustomId             string
+	CustomType           int64
+	Custom               string
+	QuotaSampleId        int64
+	StartDate            string
+	EndDate              string
+	LzCode               string
+}
+
+func GetLongzhongSurveyProductByClassifyName(productName string) (items []*LongzhongSurveyProduct, err error) {
+	sql := `SELECT * FROM longzhong_survey_product WHERE breed_name=? ORDER BY survey_product_id ASC `
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql, productName).QueryRows(&items)
+	return
+}
+
+func GetLzSurveyProductByNameAndFrequency(productName string, frequency int) (items []*LongzhongSurveyProduct, err error) {
+
+	sql := `SELECT * FROM longzhong_survey_product WHERE breed_name=? AND frequency=? ORDER BY survey_product_id ASC `
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql, productName, frequency).QueryRows(&items)
+	return
+}
+
+func GetExportLzSurveyProductByBreedIds(breedIds []string) (items []*LongzhongSurveyProduct, err error) {
+	if len(breedIds) == 0 {
+		return
+	}
+	field := ` survey_product_id, breed_id, breed_name, sample_name, custom, quota_name, lz_code, frequency, unit_name, end_date, input_value `
+	sql := `SELECT ` + field + ` FROM longzhong_survey_product WHERE breed_id IN (` + utils.GetOrmInReplace(len(breedIds)) + `) ORDER BY breed_id ASC, frequency ASC, survey_product_id ASC `
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql, breedIds).QueryRows(&items)
+	return
+}
+
+func GetLzFrequency(productName string) (items []*int, err error) {
+	sql := `SELECT DISTINCT frequency FROM longzhong_survey_product WHERE breed_name=? ORDER BY frequency`
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql, productName).QueryRows(&items)
+	return
+}
+
+// EdbInfoItem
+type EdbInfoItem struct {
+	TradeCode    string     `orm:"column(TRADE_CODE);pk" description:"指标code"`
+	SecName      string     `orm:"column(SEC_NAME);" description:"指标名称"`
+	Unit         string     `orm:"column(UNIT);" description:"单位"`
+	Remark       string     `orm:"column(REMARK);" description:"备注"`
+	Frequency    string     `description:"频度"`
+	ClassifyId   int        `description:"分类id"`
+	ClassifyName string     `description:"分类名称"`
+	CreateDate   string     `description:"创建时间"`
+	UserId       int        `description:"录入用户id"`
+	NoticeTime   string     `description:"通知时间"`
+	Mobile       string     `description:"录入者手机号"`
+	ModifyDate   string     `description:"待更新日期"`
+	Status       string     `description:"状态:未完成/完成"`
+	DataList     []*Edbdata `description:"指标数据列表"`
+}
+
+// GetTargetItemList 获取指标列表数据
+func GetTargetItemList(classifyId, edbShowType int, frequency, keyword, tradeCode string, classifyIdStrList []string) (items []*EdbInfoItem, err error) {
+	o := orm.NewOrmUsingDB("edb")
+
+	sql := ` SELECT a.*,'' modify_date,'' STATUS FROM edbinfo AS a `
+	if edbShowType != 0 {
+		sql = ` SELECT a.*,b.DT,'' modify_date,'' STATUS FROM edbinfo AS a 
+left join edbdata b on a.TRADE_CODE=b.TRADE_CODE `
+	}
+	sql += ` WHERE LEFT(a.TRADE_CODE,1)='W' AND a.REMARK='手动' AND a.classify_id>0 `
+
+	//如果没有分类id集合列表,那么就没有数据了,不用往下执行了,直接返回好了
+	if len(classifyIdStrList) <= 0 {
+		return
+	}
+	if len(classifyIdStrList) > 0 {
+		sql += ` AND a.classify_id in (` + strings.Join(classifyIdStrList, ",") + `)  `
+	}
+	if classifyId > 0 {
+		sql += ` AND a.classify_id=` + strconv.Itoa(classifyId) + ` `
+	}
+	//频度
+	if frequency != "" {
+		sql += ` AND a.frequency="` + frequency + `" `
+	}
+	//关键字
+	if keyword != "" {
+		sql += ` AND (a.SEC_NAME like "%` + keyword + `%"  or a.TRADE_CODE like "%` + keyword + `%" )`
+	}
+	//指定指标
+	if tradeCode != "" {
+		sql += ` AND a.TRADE_CODE = "` + tradeCode + `" `
+	}
+	//指标里面是否有数据
+	switch edbShowType {
+	case 1:
+		sql += ` AND b.CLOSE is not null `
+	case 2:
+		sql += ` AND b.CLOSE is null `
+	}
+	sql += ` GROUP BY a.TRADE_CODE `
+
+	sql = sql + ` ORDER BY CONVERT(a.SEC_NAME USING gbk )  COLLATE gbk_chinese_ci ASC `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+
+}
+
+// GetLzItemList 模糊查询隆众数据库指标列表
+//func GetLzItemList(keyword string) (items []*data_manage.LongzhongSurveyProduct, err error) {
+//	o := orm.NewOrmUsingDB("edb")
+//
+//	sql := "SELECT * FROM longzhong_survey_product WHERE CONCAT(sample_name,breed_name,custom,quota_name,lz_code) LIKE '%" + keyword + "%'"
+//	_, err = o.Raw(sql).QueryRows(&items)
+//	return
+//
+//}
+
+type lzSurveyData struct {
+	DataTime   string `orm:"column(data_time)" description:"日期"`
+	InputValue string `orm:"column(input_value)" description:"值"`
+}
+
+// GetLzItemListByCode 根据code查询隆众数据列表
+func GetLzItemListByCode(lzCode string) (items []*lzSurveyData, err error) {
+	o := orm.NewOrmUsingDB("edb")
+
+	sql := "SELECT * FROM longzhong_survey_data WHERE survey_product_id=? GROUP BY data_time DESC"
+	_, err = o.Raw(sql, lzCode).QueryRows(&items)
+	return
+}
+
+// GetEdbDataListByCodes 通过指标ID获取所有数据
+func GetEdbDataListByCodes(tradeCode string) (items []*Edbdata, err error) {
+	sql := ` SELECT  TRADE_CODE,DT,round(CLOSE,4) CLOSE,modify_time  FROM edbdata WHERE TRADE_CODE IN(` + tradeCode + `)  GROUP BY TRADE_CODE,DT ORDER BY DT DESC `
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// TargetItemListResp 指标数据结构体
+type TargetItemListResp struct {
+	List          []*EdbInfoItem
+	FrequencyList []string
+}
+
+// BatchDataDeleteReq 批量删除某日的指标数据请求结构体
+type BatchDataDeleteReq struct {
+	CreateDate    string   `description:"创建日期"`
+	TradeCodeList []string `description:"指标唯一编码列表"`
+}
+
+// BatchDeleteEdbDataByDate 批量删除某日的指标数据
+func BatchDeleteEdbDataByDate(tradeCodes, dt string, opUserId int) (err error) {
+	o := orm.NewOrmUsingDB("edb")
+	var list []*Edbdata
+	sql := ` select * FROM edbdata WHERE TRADE_CODE in  (` + tradeCodes + `) AND DT = ? `
+	_, err = o.Raw(sql, dt).QueryRows(&list)
+	if err != nil {
+		return
+	}
+	deleteRecordList := make([]*EdbdataDeleteRecord, 0)
+	for _, edbDataInfo := range list {
+		deleteRecord := &EdbdataDeleteRecord{
+			TradeCode:  edbDataInfo.TradeCode,
+			Dt:         edbDataInfo.Dt,
+			Close:      edbDataInfo.Close,
+			ModifyTime: time.Now(),
+			CreateTime: time.Now(),
+			SysUserId:  opUserId,
+		}
+		deleteRecordList = append(deleteRecordList, deleteRecord)
+	}
+	if len(deleteRecordList) > 0 {
+		_, tmpErr := o.InsertMulti(len(deleteRecordList), deleteRecordList)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+	}
+	sql = ` DELETE FROM edbdata WHERE TRADE_CODE in  (` + tradeCodes + `) AND DT = ? `
+	_, err = o.Raw(sql, dt).Exec()
+	return
+}
+
+// BatchDeleteEdbData 批量删除指标数据
+func BatchDeleteEdbData(tradeCode string, opUserId int) (err error) {
+	o := orm.NewOrmUsingDB("edb")
+	var list []*Edbdata
+	sql := ` select * FROM edbdata WHERE TRADE_CODE =  ? `
+	_, err = o.Raw(sql, tradeCode).QueryRows(&list)
+	if err != nil {
+		return
+	}
+	deleteRecordList := make([]*EdbdataDeleteRecord, 0)
+	for _, edbDataInfo := range list {
+		deleteRecord := &EdbdataDeleteRecord{
+			TradeCode:  edbDataInfo.TradeCode,
+			Dt:         edbDataInfo.Dt,
+			Close:      edbDataInfo.Close,
+			ModifyTime: time.Now(),
+			CreateTime: time.Now(),
+			SysUserId:  opUserId,
+		}
+		deleteRecordList = append(deleteRecordList, deleteRecord)
+	}
+	_, err = o.InsertMulti(len(deleteRecordList), deleteRecordList)
+	if err != nil {
+		return
+	}
+	sql = ` DELETE FROM edbdata WHERE TRADE_CODE  = ? `
+	_, err = o.Raw(sql, tradeCode).Exec()
+	return
+}
+
+// GetEdbInfoCountByClassifyId 根据指标分类id获取当前分类下的指标数量
+func GetEdbInfoCountByClassifyId(classifyId int) (count int, err error) {
+	o := orm.NewOrmUsingDB("edb")
+	sql := `SELECT COUNT(1) AS count FROM ( SELECT a.*,b.CLOSE FROM edbinfo AS a 
+             INNER JOIN edbdata AS b ON a.TRADE_CODE=b.TRADE_CODE
+             WHERE LEFT(a.TRADE_CODE,1)='W' AND a.REMARK='手动' AND a.classify_id=? group by a.TRADE_CODE) d `
+	err = o.Raw(sql, classifyId).QueryRow(&count)
+	return
+}
+
+// EdbInfoGroupCount 指标分类id获取当前分类下的指标数量
+type EdbInfoGroupCount struct {
+	Count      int
+	ClassifyId int
+}
+
+// GetEdbInfoGroupCountByClassifyIds 根据指标分类id获取当前分类下的指标数量
+func GetEdbInfoGroupCountByClassifyIds(classifyIds string) (list []*EdbInfoGroupCount, err error) {
+	o := orm.NewOrmUsingDB("edb")
+	sql := `SELECT COUNT(1) AS count,classify_id FROM ( SELECT a.*,b.CLOSE FROM edbinfo AS a 
+             INNER JOIN edbdata AS b ON a.TRADE_CODE=b.TRADE_CODE
+             WHERE LEFT(a.TRADE_CODE,1)='W' AND a.REMARK='手动' and a.classify_id in (` + classifyIds + `) group by a.TRADE_CODE) d 
+						 GROUP BY classify_id `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+//// GetExcelData 获取excel样式数据
+//func GetExcelData() (list []*data_manage.ExcelStyle, err error) {
+//	o := orm.NewOrmUsingDB("edb")
+//	sql := `SELECT * FROM excel_style `
+//	_, err = o.Raw(sql).QueryRows(&list)
+//	return
+//}
+//
+//// AddExcelData 添加excel样式数据
+//func AddExcelData(item *data_manage.ExcelStyle) (id int64, err error) {
+//	o := orm.NewOrmUsingDB("edb")
+//	id, err = o.Insert(item)
+//	return
+//}
+
+type EdbdataFloat struct {
+	TradeCode  string    `orm:"column(TRADE_CODE);pk" description:"指标编码"`
+	Dt         string    `orm:"column(DT)" description:"日期"`
+	Close      float64   `orm:"column(CLOSE)" description:"值"`
+	ModifyTime time.Time `orm:"column(modify_time)" description:"修改时间"`
+}
+
+func GetTargetsDataFloat(tradeCode, dt string) (item *EdbdataFloat, err error) {
+	sql := `SELECT * FROM edbdata WHERE TRADE_CODE=? AND DT=? `
+	o := orm.NewOrmUsingDB("edb")
+	err = o.Raw(sql, tradeCode, dt).QueryRow(&item)
+	return
+}
+
+func ModifyEdbinfo(tradeCode, unit, frequency string, classifyId int) (err error) {
+	sql := `UPDATE edbinfo SET UNIT = ?,frequency=?, classify_id=?, create_date=NOW() WHERE TRADE_CODE=? `
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql, unit, frequency, classifyId, tradeCode).Exec()
+	return
+}
+
+func DeleteTargetsDataByImport(tradeCode, dt string) (err error) {
+	sql := `DELETE FROM edbdata WHERE TRADE_CODE=? AND DT=? `
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql, tradeCode, dt).Exec()
+	return
+}
+
+// GetEdbinfoListByCodeListGroupByUserId 根据指标code列表、用户分组获取指标信息
+func GetEdbinfoListByCodeListGroupByUserId(edbCodeList []string) (items []*Edbinfo, err error) {
+	num := len(edbCodeList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("edb")
+	sql := `SELECT * FROM edbinfo WHERE TRADE_CODE in (` + utils.GetOrmInReplace(num) + `) GROUP BY user_id `
+	_, err = o.Raw(sql, edbCodeList).QueryRows(&items)
+	return
+}
+
+// ModifyEdbinfoUserIdByCodeList 根据指标code列表修改创建人
+func ModifyEdbinfoUserIdByCodeList(edbCodeList []string, userId int) (err error) {
+	num := len(edbCodeList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("edb")
+	sql := `UPDATE edbinfo SET user_id=? WHERE TRADE_CODE in (` + utils.GetOrmInReplace(num) + `) `
+	_, err = o.Raw(sql, userId, edbCodeList).Exec()
+	return
+}
+
+func GetEdbInfoAdminList() (list []int, err error) {
+	sql := `SELECT user_id FROM edbinfo GROUP BY user_id `
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}

+ 288 - 0
routers/commentsRouter.go

@@ -349,6 +349,267 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:ChartInfoController"],
+        beego.ControllerComments{
+            Method: "EdbInfoData",
+            Router: `/edb_info/data`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:ChartInfoController"],
+        beego.ControllerComments{
+            Method: "EdbInfoDataSeasonal",
+            Router: `/edb_info/data/seasonal`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:ChartInfoController"],
+        beego.ControllerComments{
+            Method: "EdbInfoDataTb",
+            Router: `/edb_info/data/tb`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbClassifyController"],
+        beego.ControllerComments{
+            Method: "AddEdbClassify",
+            Router: `/classify/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbClassifyController"],
+        beego.ControllerComments{
+            Method: "DeleteEdbClassify",
+            Router: `/classify/delete`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbClassifyController"],
+        beego.ControllerComments{
+            Method: "DeleteEdbClassifyCheck",
+            Router: `/classify/delete/check`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbClassifyController"],
+        beego.ControllerComments{
+            Method: "EditEdbClassify",
+            Router: `/classify/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbClassifyController"],
+        beego.ControllerComments{
+            Method: "ItemsV3",
+            Router: `/classify/items/v3`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbClassifyController"],
+        beego.ControllerComments{
+            Method: "EdbClassifyMove",
+            Router: `/edb_classify/move`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "EdbInfoAdd",
+            Router: `/edb_info/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "EdbChartList",
+            Router: `/edb_info/chart/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "GetEdbDateData",
+            Router: `/edb_info/date_data`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "EdbInfoDetail",
+            Router: `/edb_info/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "EdbInfoEdit",
+            Router: `/edb_info/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "EdbEnInfoEdit",
+            Router: `/edb_info/en/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "EdbInfoFilterByEs",
+            Router: `/edb_info/filter_by_es`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "AllEdbInfoByEs",
+            Router: `/edb_info/filter_by_es/all`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "ChartImageSet",
+            Router: `/edb_info/image/set`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "SetEdbDataInsertConfig",
+            Router: `/edb_info/insert_config/set`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "EdbInfoList",
+            Router: `/edb_info/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "Modify",
+            Router: `/edb_info/modify`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "EdbInfoMove",
+            Router: `/edb_info/move`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "EdbInfoNewest",
+            Router: `/edb_info/newest`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "EdbInfoRefresh",
+            Router: `/edb_info/refresh`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "EdbInfoAllRefresh",
+            Router: `/edb_info/refresh/all`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "RelationChartList",
+            Router: `/edb_info/relation/chart_list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "RelationEdbList",
+            Router: `/edb_info/relation/edbinfo_list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "EdbInfoReplaceCheck",
+            Router: `/edb_info/replace/check`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "EdbInfoSearch",
+            Router: `/edb_info/search`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"],
         beego.ControllerComments{
             Method: "TraceEdbInfo",
@@ -358,6 +619,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "EdbSourceList",
+            Router: `/edb_source/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:ExcelInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:ExcelInfoController"],
         beego.ControllerComments{
             Method: "List",
@@ -556,6 +826,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:PredictEdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:PredictEdbInfoController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/predict_edb_info/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_mobile/controllers/english_report:EnPermissionController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/english_report:EnPermissionController"],
         beego.ControllerComments{
             Method: "List",
@@ -1672,6 +1951,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers:SysAdminController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers:SysAdminController"],
+        beego.ControllerComments{
+            Method: "ConfigLanguage",
+            Router: `/config/language`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_mobile/controllers:SysAdminController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers:SysAdminController"],
         beego.ControllerComments{
             Method: "SetConfig",

+ 3 - 1
routers/router.go

@@ -68,9 +68,11 @@ func init() {
 		web.NSNamespace("/datamanage",
 			web.NSInclude(
 				&data_manage.EdbInfoController{},
+				&data_manage.EdbClassifyController{},
+				&data_manage.ChartClassifyController{},
 				&data_manage.ChartInfoController{},
 				&data_manage.ExcelInfoController{},
-				&data_manage.ChartClassifyController{},
+				&data_manage.PredictEdbInfoController{},
 			),
 		),
 		web.NSNamespace("/resource",

+ 65 - 1
services/data/base_edb_lib.go

@@ -2,14 +2,78 @@ package data
 
 import (
 	"encoding/json"
-	"fmt"
 	"eta/eta_mobile/models"
 	"eta/eta_mobile/utils"
+	"fmt"
 	"io/ioutil"
 	"net/http"
 	"strings"
 )
 
+// AddEdbData 新增指标数据
+func AddEdbData(source int, edbCode string) (resp *models.BaseResponse, err error) {
+	param := make(map[string]interface{})
+	param["EdbCode"] = edbCode
+	urlStr := ``
+	switch source {
+	case utils.DATA_SOURCE_THS:
+		urlStr = "ths/add"
+	case utils.DATA_SOURCE_WIND:
+		urlStr = "wind/add"
+	case utils.DATA_SOURCE_PB:
+		urlStr = "pb/add"
+	case utils.DATA_SOURCE_PB_FINANCE:
+		urlStr = "pb_finance/add"
+	case utils.DATA_SOURCE_MANUAL:
+		urlStr = "manual/add"
+	case utils.DATA_SOURCE_LZ:
+		urlStr = "lz/add"
+	case utils.DATA_SOURCE_YS:
+		urlStr = "smm/add"
+	case utils.DATA_SOURCE_GL:
+		urlStr = "mysteel/add"
+	case utils.DATA_SOURCE_ZZ:
+		urlStr = "zz/add"
+	case utils.DATA_SOURCE_DL:
+		urlStr = "dl/add"
+	case utils.DATA_SOURCE_SH:
+		urlStr = "sh/add"
+	case utils.DATA_SOURCE_CFFEX:
+		urlStr = "cffex/add"
+	case utils.DATA_SOURCE_SHFE:
+		urlStr = "shfe/add"
+	case utils.DATA_SOURCE_GIE:
+		urlStr = "gie/add"
+	case utils.DATA_SOURCE_LT:
+		urlStr = "lt/add"
+	case utils.DATA_SOURCE_COAL:
+		urlStr = "coal/add"
+	case utils.DATA_SOURCE_GOOGLE_TRAVEL:
+		urlStr = "google_travel/add"
+	case utils.DATA_SOURCE_MYSTEEL_CHEMICAL:
+		urlStr = "mysteel_chemical/add"
+	case utils.DATA_SOURCE_EIA_STEO:
+		urlStr = "eia_steo/add"
+	case utils.DATA_SOURCE_COM_TRADE:
+		urlStr = "com_trade/add"
+	case utils.DATA_SOURCE_SCI:
+		urlStr = "sci/add"
+	case utils.DATA_SOURCE_BAIINFO:
+		urlStr = "baiinfo/add"
+	case utils.DATA_SOURCE_NATIONAL_STATISTICS:
+		urlStr = "national_statistics/add"
+	case utils.DATA_SOURCE_FUBAO:
+		urlStr = "fubao/add"
+	default:
+	}
+	if urlStr == "" {
+		err = fmt.Errorf("未实现该指标的刷新接口,请联系管理员")
+		return
+	}
+	resp, err = postRefreshEdbData(param, urlStr)
+	return
+}
+
 // RefreshEdbData 刷新指标数据
 func RefreshEdbData(edbInfoId, source int, edbCode, startDate string) (resp *models.BaseResponse, err error) {
 	param := make(map[string]interface{})

+ 4 - 4
services/data/chart_info.go

@@ -3,13 +3,13 @@ package data
 import (
 	"encoding/json"
 	"errors"
-	"fmt"
-	"github.com/shopspring/decimal"
 	"eta/eta_mobile/models/company"
 	"eta/eta_mobile/models/data_manage"
 	"eta/eta_mobile/models/system"
 	"eta/eta_mobile/services/alarm_msg"
 	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/shopspring/decimal"
 	"math"
 	"sort"
 	"strconv"
@@ -1035,7 +1035,7 @@ func ChartInfoRefreshV2(chartInfoId int) (err error) {
 	}
 
 	// 批量刷新
-	err = EdbInfoRefreshAllFromBaseV3(edbIdList, false)
+	err, _ = EdbInfoRefreshAllFromBaseV3(edbIdList, false, true)
 	if err != nil {
 		return
 	}
@@ -1076,7 +1076,7 @@ func BatchChartInfoRefreshV2(chartInfoList []*data_manage.ChartInfo) (err error)
 	}
 
 	// 批量刷新
-	err = EdbInfoRefreshAllFromBaseV3(edbIdList, false)
+	err, _ = EdbInfoRefreshAllFromBaseV3(edbIdList, false, true)
 	if err != nil {
 		return
 	}

+ 3 - 3
services/data/correlation/chart_info.go

@@ -3,13 +3,13 @@ package correlation
 import (
 	"encoding/json"
 	"errors"
-	"fmt"
-	"github.com/shopspring/decimal"
 	"eta/eta_mobile/models/data_manage"
 	"eta/eta_mobile/models/system"
 	"eta/eta_mobile/services/alarm_msg"
 	"eta/eta_mobile/services/data"
 	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/shopspring/decimal"
 	"math"
 	"sort"
 	"strconv"
@@ -603,7 +603,7 @@ func ChartInfoRefresh(chartInfoId int) (err error) {
 	}
 
 	// 批量刷新ETA指标
-	err = data.EdbInfoRefreshAllFromBaseV3([]int{correlationChart.EdbInfoIdFirst, correlationChart.EdbInfoIdSecond}, false)
+	err, _ = data.EdbInfoRefreshAllFromBaseV3([]int{correlationChart.EdbInfoIdFirst, correlationChart.EdbInfoIdSecond}, false, true)
 	if err != nil {
 		return
 	}

+ 650 - 0
services/data/edb_classify.go

@@ -0,0 +1,650 @@
+package data
+
+import (
+	"errors"
+	"eta/eta_mobile/models/data_manage"
+	"eta/eta_mobile/models/system"
+	"eta/eta_mobile/utils"
+	"strconv"
+	"time"
+)
+
+//func EdbClassifyListMakeTree(allNode []*data_manage.EdbClassifyItems, node *data_manage.EdbClassifyItems) {
+//	childs, _ := edbClassifyHaveChild(allNode, node) //判断节点是否有子节点并返回
+//	allEdbInfo, _ := GetEdbClassifyEdbInfo()
+//	if len(childs) > 0 {
+//		node.Children = append(node.Children, childs[0:]...) //添加子节点
+//		for _, v := range childs {                           //查询子节点的子节点,并添加到子节点
+//			_, has := edbClassifyHaveChild(allNode, v)
+//			if has {
+//				EdbClassifyListMakeTree(allNode, v) //递归添加节点
+//			} else {
+//				edbInfoList := allEdbInfo[v.ClassifyId]
+//				v.Children = edbInfoList
+//				if v.Children == nil {
+//					childrenArr := make([]*data_manage.EdbClassifyItems, 0)
+//					v.Children = childrenArr
+//				}
+//			}
+//		}
+//	} else {
+//		childrenArr := make([]*data_manage.EdbClassifyItems, 0)
+//		node.Children = childrenArr
+//	}
+//}
+
+func edbClassifyHaveChild(allNode []*data_manage.EdbClassifyItems, node *data_manage.EdbClassifyItems) (childs []*data_manage.EdbClassifyItems, yes bool) {
+	for _, v := range allNode {
+		if v.ParentId == node.ClassifyId {
+			childs = append(childs, v)
+		}
+	}
+
+	if len(childs) > 0 {
+		yes = true
+	}
+	return
+}
+
+//func GetEdbClassifyEdbInfo() (result map[int][]*data_manage.EdbClassifyItems, err error) {
+//	cMap := make(map[int][]*data_manage.EdbClassifyItems)
+//	items, err := data_manage.GetEdbInfoAll(0)
+//	if err != nil {
+//		return
+//	}
+//	for _, v := range items {
+//		childrenArr := make([]*data_manage.EdbClassifyItems, 0)
+//		v.Children = childrenArr
+//		if items, ok := cMap[v.ClassifyId]; ok {
+//			items = append(items, v)
+//			cMap[v.ClassifyId] = items
+//		} else {
+//			infoList := make([]*data_manage.EdbClassifyItems, 0)
+//			infoList = append(infoList, v)
+//			cMap[v.ClassifyId] = infoList
+//		}
+//	}
+//	result = cMap
+//	return
+//}
+
+//func EdbClassifyItemsMakeTree(allNode []*data_manage.EdbClassifyItems, node *data_manage.EdbClassifyItems) {
+//	childs, _ := edbClassifyHaveChild(allNode, node) //判断节点是否有子节点并返回
+//	if len(childs) > 0 {
+//		node.Children = append(node.Children, childs[0:]...) //添加子节点
+//		for _, v := range childs {                           //查询子节点的子节点,并添加到子节点
+//			_, has := edbClassifyHaveChild(allNode, v)
+//			if has {
+//				EdbClassifyItemsMakeTree(allNode, v) //递归添加节点
+//			} else {
+//				childrenArr := make([]*data_manage.EdbClassifyItems, 0)
+//				v.Children = childrenArr
+//			}
+//		}
+//	} else {
+//		childrenArr := make([]*data_manage.EdbClassifyItems, 0)
+//		node.Children = childrenArr
+//	}
+//}
+
+// GetEdbClassifyListByAdminId 根据账户类型获取分类id集合
+//func GetEdbClassifyListByAdminId(adminId int64) (classifyIdList []string, err error) {
+//	list, err := models.GetEdbdataClassify(adminId)
+//	if err != nil {
+//		return
+//	}
+//	for _, parent := range list {
+//		if parent.Child != nil {
+//			for _, classify := range parent.Child {
+//				classifyIdList = append(classifyIdList, fmt.Sprint(classify.ClassifyId))
+//			}
+//		}
+//	}
+//	return
+//}
+
+// GetEdbClassifyNameListByAdminId 根据账户类型获取分类名称集合
+//func GetEdbClassifyNameListByAdminId(adminId int64) (classifyNameList []string, edbDataClassifyMap map[string]*models.EdbdataClassify, err error) {
+//	list, err := models.GetEdbdataClassify(adminId)
+//	edbDataClassifyMap = make(map[string]*models.EdbdataClassify)
+//	if err != nil {
+//		return
+//	}
+//	for _, parent := range list {
+//		if parent.Child != nil {
+//			for _, classify := range parent.Child {
+//				classifyNameList = append(classifyNameList, classify.ClassifyName)
+//				edbDataClassifyMap[classify.ClassifyName] = classify
+//			}
+//		}
+//	}
+//	return
+//}
+
+// AddEdbClassify 添加指标分类
+func AddEdbClassify(classifyName string, parentId, level int, classifyType uint8, sysUserId int, sysUserName string) (classifyInfo *data_manage.EdbClassify, err error, errMsg string) {
+	count, err := data_manage.GetEdbClassifyCount(classifyName, parentId, classifyType)
+	if err != nil {
+		errMsg = `判断名称是否已存在失败`
+		return
+	}
+	if count > 0 {
+		errMsg = `分类名称已存在,请重新输入`
+		return
+	}
+	//获取该层级下最大的排序数
+	maxSort, err := data_manage.GetEdbClassifyMaxSort(parentId, classifyType)
+
+	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+	classifyInfo = &data_manage.EdbClassify{
+		//ClassifyId:      0,
+		ClassifyType:    classifyType,
+		ClassifyName:    classifyName,
+		ParentId:        parentId,
+		HasData:         0,
+		CreateTime:      time.Now(),
+		ModifyTime:      time.Now(),
+		SysUserId:       sysUserId,
+		SysUserRealName: sysUserName,
+		Level:           level + 1,
+		UniqueCode:      utils.MD5(utils.DATA_PREFIX + "_" + timestamp),
+		Sort:            maxSort,
+	}
+	_, err = data_manage.AddEdbClassify(classifyInfo)
+	if err != nil {
+		errMsg = "保存分类失败"
+	}
+	return
+}
+
+// EditEdbClassify 编辑指标分类
+func EditEdbClassify(classifyId int, classifyName string, sysUser *system.Admin) (err error, errMsg string) {
+	item, err := data_manage.GetEdbClassifyById(classifyId)
+	if err != nil {
+		errMsg = `保存失败`
+		return
+	}
+
+	// 权限校验
+	{
+		if item.ClassifyType == 0 { // 普通指标
+			button := GetEdbClassifyOpButton(sysUser, item.SysUserId)
+			if !button.OpButton {
+				errMsg = "无操作权限"
+				err = errors.New(errMsg)
+				return
+			}
+		} else if item.ClassifyType == 1 { // 预测指标
+			button := GetPredictEdbClassifyOpButton(sysUser, item.SysUserId)
+			if !button.OpButton {
+				errMsg = "无操作权限"
+				err = errors.New(errMsg)
+				return
+			}
+		}
+
+	}
+
+	// 名字相同,那么就直接返回
+	if item.ClassifyName == classifyName {
+		return
+	}
+
+	// 判断名称是否已存在
+	count, err := data_manage.GetEdbClassifyCount(classifyName, item.ParentId, item.ClassifyType)
+	if err != nil {
+		errMsg = "判断名称是否已存在失败"
+		return
+	}
+	if count > 0 {
+		errMsg = "分类名称已存在,请重新输入"
+		return
+	}
+
+	// 修改数据
+	err = data_manage.EditEdbClassify(classifyId, classifyName)
+	if err != nil {
+		errMsg = "保存失败"
+	}
+	return
+}
+
+// DeleteCheck 删除检测
+func DeleteCheck(classifyId, edbInfoId int, sysUser *system.Admin) (deleteStatus int, tipsMsg string, err error, errMsg string) {
+	//删除分类
+	if classifyId > 0 && edbInfoId == 0 {
+		// 查找分类
+		item, tmpErr := data_manage.GetEdbClassifyById(classifyId)
+		if tmpErr != nil {
+			errMsg = `查找分类失败`
+			err = tmpErr
+			return
+		}
+		// 权限校验
+		{
+			if item.ClassifyType == 0 { // 普通指标
+				button := GetEdbClassifyOpButton(sysUser, item.SysUserId)
+				if !button.DeleteButton {
+					errMsg = "无操作权限"
+					err = errors.New(errMsg)
+					return
+				}
+			} else if item.ClassifyType == 1 { // 预测指标
+				button := GetPredictEdbClassifyOpButton(sysUser, item.SysUserId)
+				if !button.DeleteButton {
+					errMsg = "无操作权限"
+					err = errors.New(errMsg)
+					return
+				}
+			}
+
+		}
+
+		//判断分类下,是否含有指标
+		count, tmpErr := data_manage.GetEdbInfoCountByClassifyId(classifyId)
+		if tmpErr != nil {
+			errMsg = "删除失败"
+			err = errors.New("分类下是否含有指标失败,Err:" + tmpErr.Error())
+			return
+		}
+
+		if count > 0 {
+			deleteStatus = 1
+			tipsMsg = "若目录关联指标不可删除"
+		}
+	}
+
+	if deleteStatus != 1 && edbInfoId == 0 {
+		classifyCount, tmpErr := data_manage.GetClassifyCountByClassifyId(classifyId)
+		if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+			errMsg = "删除失败"
+			err = errors.New("分类下是否含有指标失败,Err:" + tmpErr.Error())
+			return
+		}
+		if classifyCount > 0 {
+			deleteStatus = 2
+			tipsMsg = "确认删除当前目录及包含的子目录吗"
+		}
+	}
+
+	//删除指标
+	if edbInfoId > 0 {
+		//判断指标是否用于作图,如果用于作图,则不可删除
+		chartCount, tmpErr := data_manage.GetChartEdbMappingCount(edbInfoId)
+		if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+			errMsg = "删除失败"
+			err = errors.New("判断指标是否被用于作图失败,Err:" + tmpErr.Error())
+			return
+		}
+		if chartCount > 0 {
+			deleteStatus = 3
+			tipsMsg = "当前指标已用作画图,不可删除"
+		}
+		//判断指标是否用于计算
+		{
+			calculateCount, tmpErr := data_manage.GetEdbInfoCalculateMappingCount(edbInfoId)
+			if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+				errMsg = "删除失败"
+				err = errors.New("判断指标是否被用于计算失败,GetEdbInfoCalculateCount Err:" + tmpErr.Error())
+				return
+			}
+			if calculateCount > 0 {
+				deleteStatus = 4
+				tipsMsg = "当前指标已用作,指标运算,不可删除"
+			}
+		}
+	}
+	return
+}
+
+// Delete 删除分类/指标
+func Delete(classifyId, edbInfoId int, sysUser *system.Admin, requestBody, requestUrl string) (nextItem *data_manage.EdbInfo, err error, errMsg string) {
+	//删除分类
+	if classifyId > 0 && edbInfoId == 0 {
+		// 查找分类
+		item, tmpErr := data_manage.GetEdbClassifyById(classifyId)
+		if tmpErr != nil {
+			errMsg = `查找分类失败`
+			err = tmpErr
+			return
+		}
+		// 权限校验
+		{
+			if item.ClassifyType == 0 { // 普通指标
+				button := GetEdbClassifyOpButton(sysUser, item.SysUserId)
+				if !button.DeleteButton {
+					errMsg = "无操作权限"
+					err = errors.New(errMsg)
+					return
+				}
+			} else if item.ClassifyType == 1 { // 预测指标
+				button := GetPredictEdbClassifyOpButton(sysUser, item.SysUserId)
+				if !button.DeleteButton {
+					errMsg = "无操作权限"
+					err = errors.New(errMsg)
+					return
+				}
+			}
+
+		}
+
+		//判断是否含有指标
+		count, tmpErr := data_manage.GetEdbInfoCountByClassifyId(classifyId)
+		if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+			errMsg = "删除失败"
+			err = errors.New("分类下是否含有指标失败,Err:" + tmpErr.Error())
+			return
+		}
+
+		if count > 0 {
+			errMsg = "该目录下存在关联指标,不可删除"
+			return
+		}
+
+		tmpErr = data_manage.DeleteEdbClassify(classifyId)
+		if tmpErr != nil {
+			errMsg = "删除失败"
+			err = errors.New("删除失败,Err:" + tmpErr.Error())
+			return
+		}
+	}
+
+	//删除指标
+	if edbInfoId > 0 {
+		edbInfo, tmpErr := data_manage.GetEdbInfoById(edbInfoId)
+		if tmpErr != nil {
+			if tmpErr.Error() == utils.ErrNoRow() {
+				errMsg = "指标已删除,请刷新页面"
+				err = errors.New("指标不存在,Err:" + tmpErr.Error())
+				return
+			} else {
+				errMsg = "删除失败"
+				err = errors.New("删除失败,获取指标信息失败,Err:" + tmpErr.Error())
+				return
+			}
+		}
+		if edbInfo == nil {
+			errMsg = "指标已删除,请刷新页面"
+			return
+		}
+
+		//判断指标是否用于作图,如果用于作图,则不可删除
+		chartCount, tmpErr := data_manage.GetChartEdbMappingCount(edbInfoId)
+		if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+			errMsg = "删除失败"
+			err = errors.New("判断指标是否被用于作图失败,Err:" + tmpErr.Error())
+			return
+		}
+		if chartCount > 0 {
+			errMsg = "当前指标已用作画图,不可删除"
+			return
+		}
+
+		//如果是普通指标,那么还需要判断是否被预测指标作为源指标
+		if edbInfo.EdbInfoType == 0 {
+			predictEdbInfoCount, tmpErr := data_manage.GetPredictEdbConfCount(edbInfoId)
+			if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+				errMsg = "删除失败"
+				err = errors.New("判断指标是否被用于预测指标失败,Err:" + tmpErr.Error())
+				return
+			}
+			if predictEdbInfoCount > 0 {
+				errMsg = "当前指标已用作预测指标,不可删除"
+				return
+			}
+		}
+
+		//判断指标是否用作其他指标的计算
+		{
+			calculateCount, tmpErr := data_manage.GetEdbInfoCalculateMappingCount(edbInfoId)
+			if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+				errMsg = "删除失败"
+				err = errors.New("判断指标是否被用于计算失败,GetEdbInfoCalculateCount Err:" + tmpErr.Error())
+				return
+			}
+			if calculateCount > 0 {
+				errMsg = "当前指标已用作,指标运算,不可删除"
+				return
+			}
+		}
+
+		//真实删除
+		tmpErr = data_manage.DeleteEdbInfoAndData(edbInfo.EdbInfoId, edbInfo.Source)
+		if tmpErr != nil {
+			errMsg = "删除失败"
+			err = errors.New("删除失败,Err:" + tmpErr.Error())
+			return
+		}
+
+		// 返回下一个表格的信息
+		{
+			var condition string
+			var pars []interface{}
+			condition += " AND edb_info_type=? AND classify_id=? "
+			pars = append(pars, edbInfo.EdbInfoType, edbInfo.ClassifyId)
+
+			condition += " AND (sort>? OR (sort=? AND edb_info_id<?) ) "
+			pars = append(pars, edbInfo.Sort, edbInfo.Sort, edbInfo.EdbInfoId)
+			nextItem, tmpErr = data_manage.GetNextEdbInfoByCondition(condition, pars)
+			if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+				errMsg = "删除失败"
+				err = errors.New("获取下一级预测指标信息失败,Err:" + tmpErr.Error())
+				return
+			}
+
+			// 如果没找到,那么查找下一个分类的第一个表格
+			if nextItem == nil {
+				currClassifyInfo, tmpErr := data_manage.GetEdbClassifyById(edbInfo.ClassifyId)
+				if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+					errMsg = "删除失败"
+					err = errors.New("获取当前预测指标分类信息失败,Err:" + tmpErr.Error())
+					return
+				}
+
+				nextItem, err = data_manage.GetNextEdbInfo(edbInfo.ClassifyId, currClassifyInfo.Sort, int(currClassifyInfo.ClassifyType), edbInfo.EdbInfoType)
+				if err != nil && err.Error() != utils.ErrNoRow() {
+					errMsg = "删除失败"
+					err = errors.New("获取下一级预测指标信息失败,Err:" + tmpErr.Error())
+					return
+				}
+			}
+		}
+
+		//新增操作日志
+		{
+			edbLog := new(data_manage.EdbInfoLog)
+			edbLog.EdbInfoId = edbInfo.EdbInfoId
+			edbLog.SourceName = edbInfo.SourceName
+			edbLog.Source = edbInfo.Source
+			edbLog.EdbCode = edbInfo.EdbCode
+			edbLog.EdbName = edbInfo.EdbName
+			edbLog.ClassifyId = edbInfo.ClassifyId
+			edbLog.SysUserId = sysUser.AdminId
+			edbLog.SysUserRealName = sysUser.RealName
+			edbLog.CreateTime = time.Now()
+			edbLog.Content = requestBody
+			edbLog.Status = "删除指标"
+			edbLog.Method = requestUrl
+			go data_manage.AddEdbInfoLog(edbLog)
+		}
+
+		// 删除es中的数据
+		DeleteEdbInfoToEs(edbInfoId)
+	}
+	return
+}
+
+// MoveEdbClassify 移动指标分类
+func MoveEdbClassify(classifyId, parentClassifyId, prevClassifyId, nextClassifyId int, sysUser *system.Admin) (err error, errMsg string) {
+	//判断分类是否存在
+	edbClassifyInfo, err := data_manage.GetEdbClassifyById(classifyId)
+	if err != nil {
+		errMsg = "移动失败"
+		err = errors.New("获取分类信息失败,Err:" + err.Error())
+		return
+	}
+
+	// 权限校验
+	{
+		if edbClassifyInfo.ClassifyType == 0 { // 普通指标
+			button := GetEdbClassifyOpButton(sysUser, edbClassifyInfo.SysUserId)
+			if !button.MoveButton {
+				errMsg = "无操作权限"
+				err = errors.New(errMsg)
+				return
+			}
+		} else if edbClassifyInfo.ClassifyType == 1 { // 预测指标
+			button := GetPredictEdbClassifyOpButton(sysUser, edbClassifyInfo.SysUserId)
+			if !button.MoveButton {
+				errMsg = "无操作权限"
+				err = errors.New(errMsg)
+				return
+			}
+		}
+
+	}
+
+	updateCol := make([]string, 0)
+
+	//判断上级id是否一致,如果不一致的话,那么需要移动该分类层级
+	if edbClassifyInfo.ParentId != parentClassifyId && parentClassifyId != 0 {
+		parentEdbClassifyInfo, tmpErr := data_manage.GetEdbClassifyById(parentClassifyId)
+		if tmpErr != nil {
+			errMsg = "移动失败"
+			err = errors.New("获取上级分类信息失败,Err:" + tmpErr.Error())
+			return
+		}
+		edbClassifyInfo.ParentId = parentEdbClassifyInfo.ClassifyId
+		edbClassifyInfo.Level = parentEdbClassifyInfo.Level + 1
+		edbClassifyInfo.ModifyTime = time.Now()
+		updateCol = append(updateCol, "ParentId", "Level", "ModifyTime")
+	}
+
+	//如果有传入 上一个兄弟节点分类id
+	if prevClassifyId > 0 {
+		prevClassify, tmpErr := data_manage.GetEdbClassifyById(prevClassifyId)
+		if tmpErr != nil {
+			errMsg = "移动失败"
+			err = errors.New("获取上一个兄弟节点分类信息失败,Err:" + tmpErr.Error())
+			return
+		}
+
+		//如果是移动在两个兄弟节点之间
+		if nextClassifyId > 0 {
+			//下一个兄弟节点
+			nextClassify, tmpErr := data_manage.GetEdbClassifyById(nextClassifyId)
+			if tmpErr != nil {
+				errMsg = "移动失败"
+				err = errors.New("获取下一个兄弟节点分类信息失败,Err:" + tmpErr.Error())
+				return
+			}
+			//如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
+			if prevClassify.Sort == nextClassify.Sort || prevClassify.Sort == edbClassifyInfo.Sort {
+				//变更兄弟节点的排序
+				updateSortStr := `sort + 2`
+				_ = data_manage.UpdateEdbClassifySortByParentId(prevClassify.ParentId, prevClassify.ClassifyId, prevClassify.Sort, updateSortStr, edbClassifyInfo.ClassifyType)
+			} else {
+				//如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
+				if nextClassify.Sort-prevClassify.Sort == 1 {
+					//变更兄弟节点的排序
+					updateSortStr := `sort + 1`
+					_ = data_manage.UpdateEdbClassifySortByParentId(prevClassify.ParentId, 0, prevClassify.Sort, updateSortStr, edbClassifyInfo.ClassifyType)
+				}
+			}
+		}
+
+		edbClassifyInfo.Sort = prevClassify.Sort + 1
+		edbClassifyInfo.ModifyTime = time.Now()
+		updateCol = append(updateCol, "Sort", "ModifyTime")
+	} else {
+		firstClassify, tmpErr := data_manage.GetFirstEdbClassifyByParentId(edbClassifyInfo.ParentId)
+		if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+			errMsg = "移动失败"
+			err = errors.New("获取获取当前父级分类下的排序第一条的分类信息失败,Err:" + tmpErr.Error())
+			return
+		}
+
+		//如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
+		if firstClassify != nil && firstClassify.Sort == 0 {
+			updateSortStr := ` sort + 1 `
+			_ = data_manage.UpdateEdbClassifySortByParentId(firstClassify.ParentId, firstClassify.ClassifyId-1, 0, updateSortStr, edbClassifyInfo.ClassifyType)
+		}
+
+		edbClassifyInfo.Sort = 0 //那就是排在第一位
+		edbClassifyInfo.ModifyTime = time.Now()
+		updateCol = append(updateCol, "Sort", "ModifyTime")
+	}
+
+	//更新
+	if len(updateCol) > 0 {
+		err = edbClassifyInfo.Update(updateCol)
+		if err != nil {
+			errMsg = "移动失败"
+			err = errors.New("修改失败,Err:" + err.Error())
+			return
+		}
+	}
+	return
+}
+
+// GetEdbOpButton 获取ETA指标的操作权限
+func GetEdbOpButton(sysUser *system.Admin, belongUserId, edbType, edbInfoType int) (button data_manage.EdbClassifyItemsButton) {
+	//2、用户对于自己添加的分类,有权限编辑、移动和删除该分类;
+	//3、ficc管理员和超管对所有分类有编辑、移动和删除权限;
+	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN || sysUser.AdminId == belongUserId || sysUser.EdbPermission == 1 {
+		button.AddButton = true
+		button.OpButton = true
+		button.DeleteButton = true
+		button.MoveButton = true
+
+		// ETA指标的基础指标才允许插入值
+		if edbInfoType == 0 && edbType == 1 {
+			button.InsertNewDataButton = true
+		}
+	}
+	button.ShowEdbRelation = true
+	button.ShowChartRelation = true
+
+	return
+}
+
+// GetEdbClassifyOpButton 获取ETA指标分类的操作权限
+func GetEdbClassifyOpButton(sysUser *system.Admin, belongUserId int) (button data_manage.EdbClassifyItemsButton) {
+	//ficc管理员和超管和ficc研究员有权限创建和管理分类,可以编辑分类名称(分类名称不允许重复),可以拖动分类,改变分类顺序,可以拖动分类下模型,改变顺序,可以删除分类,若分类下有预测指标,则不允许删除;
+	//if utils.InArrayByStr([]string{utils.ROLE_TYPE_CODE_ADMIN, utils.ROLE_TYPE_CODE_FICC_ADMIN, utils.ROLE_TYPE_CODE_RESEARCHR, utils.ROLE_TYPE_CODE_FICC_RESEARCHR}, sysUser.RoleTypeCode) {
+	button.AddButton = true
+	button.OpButton = true
+	button.DeleteButton = true
+	button.MoveButton = true
+	//}
+
+	return
+}
+
+// GetPredictEdbOpButton 获取ETA预测指标的操作权限
+//func GetPredictEdbOpButton(sysUser *system.Admin, belongUserId int) (button data_manage.EdbClassifyItemsButton) {
+//	//预测指标的添加人对该预测指标有全部操作权限,ficc管理员、超管对所有预测指标有全部操作权限;
+//	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN || sysUser.AdminId == belongUserId || sysUser.PredictEdbPermission == 1 {
+//		button.AddButton = true
+//		button.OpButton = true
+//		button.DeleteButton = true
+//		button.MoveButton = true
+//	}
+//	button.ShowEdbRelation = true
+//	button.ShowChartRelation = true
+//
+//	return
+//}
+
+// GetPredictEdbClassifyOpButton 获取ETA预测指标分类的操作权限
+func GetPredictEdbClassifyOpButton(sysUser *system.Admin, belongUserId int) (button data_manage.EdbClassifyItemsButton) {
+	//ficc管理员和超管和ficc研究员有权限创建和管理分类,可以编辑分类名称(分类名称不允许重复),可以拖动分类,改变分类顺序,可以拖动分类下模型,改变顺序,可以删除分类,若分类下有预测指标,则不允许删除;
+	//if utils.InArrayByStr([]string{utils.ROLE_TYPE_CODE_ADMIN, utils.ROLE_TYPE_CODE_FICC_ADMIN, utils.ROLE_TYPE_CODE_RESEARCHR, utils.ROLE_TYPE_CODE_FICC_RESEARCHR}, sysUser.RoleTypeCode) {
+	button.AddButton = true
+	button.OpButton = true
+	button.DeleteButton = true
+	button.MoveButton = true
+	//}
+
+	return
+}

+ 407 - 0
services/data/edb_data.go

@@ -0,0 +1,407 @@
+package data
+
+import (
+	"errors"
+	"eta/eta_mobile/models"
+	"eta/eta_mobile/models/data_manage"
+	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/shopspring/decimal"
+	"time"
+)
+
+// EdbDataEdit 指标数据修改
+type EdbDataEdit struct {
+	OldCreateDate string `description:"旧的录入日期"`
+	CreateDate    string `description:"新的录入日期"`
+	TradeCode     string `description:"指标唯一编码"`
+	Close         string `description:"录入值"`
+}
+
+// BatchEdbData 批量修改指标数据
+func BatchEdbData(oldCreateDate, createDate string, list []EdbDataEdit, opUserId int) (failEdbDataList []EdbDataEdit, err error) {
+	if oldCreateDate == createDate { //修改
+		err = errors.New("开始日期与结束日期一致!")
+		return
+	}
+	for _, newEdbData := range list {
+		edbdata := new(models.Edbdata)
+		edbdata.TradeCode = newEdbData.TradeCode
+		edbdata.Dt = newEdbData.CreateDate
+		edbdata.Close = newEdbData.Close
+		edbdata.ModifyTime = time.Now()
+
+		item, err := models.GetDataInfo(newEdbData.TradeCode, createDate)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			failEdbDataList = append(failEdbDataList, newEdbData)
+			continue
+		}
+		if item == nil {
+			_, err = models.AddEdbdata(edbdata)
+			if err != nil {
+				failEdbDataList = append(failEdbDataList, newEdbData)
+				continue
+			}
+		} else {
+			err = models.EditEdbdata(edbdata)
+			if err != nil {
+				failEdbDataList = append(failEdbDataList, newEdbData)
+				continue
+			}
+		}
+		oldItem, err := models.GetDataInfo(newEdbData.TradeCode, oldCreateDate)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			failEdbDataList = append(failEdbDataList, newEdbData)
+			continue
+		}
+		if oldItem != nil {
+			record := new(models.EdbdataDeleteRecord)
+			record.TradeCode = oldItem.TradeCode
+			record.Dt = oldItem.Dt
+			record.Close = oldItem.Close
+			record.ModifyTime = oldItem.ModifyTime
+			record.CreateTime = time.Now()
+			record.SysUserId = opUserId
+			_, err = models.AddEdbdataDeleteRecord(record)
+			if err != nil {
+
+				failEdbDataList = append(failEdbDataList, newEdbData)
+				continue
+			}
+			//删除数据
+			models.DeleteEdbData(newEdbData.TradeCode, newEdbData.OldCreateDate)
+		}
+	}
+	return
+}
+
+// GetEdbDataTbz 获取指标的同比值数据
+func GetEdbDataTbz(edbInfo *data_manage.EdbInfo, tmpDataList []*data_manage.EdbDataList, startDateTime time.Time) (dataList []*data_manage.EdbDataList, minValue, maxValue float64, err error) {
+	dataList = make([]*data_manage.EdbDataList, 0)
+
+	// 数据处理
+	var dateArr []string
+	dataMap := make(map[string]*data_manage.EdbDataList)
+	for _, v := range tmpDataList {
+		dateArr = append(dateArr, v.DataTime)
+		dataMap[v.DataTime] = v
+	}
+	for _, av := range dateArr {
+		currentItem, ok := dataMap[av]
+		// 如果找不到当前日期的数据,那么终止当前循环,进入下一循环
+		if !ok {
+			continue
+		}
+		tmpItem := *currentItem
+		var isOk bool //是否计算出来结果
+
+		//当前日期
+		currentDate, tmpErr := time.ParseInLocation(utils.FormatDate, av, time.Local)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		// 如果存在开始日期,同时,当前日期早于开始日期,那么终止当前循环,进入下一循环
+		if !startDateTime.IsZero() && currentDate.Before(startDateTime) {
+			continue
+		}
+		//上一年的日期
+		preDate := currentDate.AddDate(-1, 0, 0)
+		preDateStr := preDate.Format(utils.FormatDate)
+		if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
+			tmpItem.Value = TbzDiv(currentItem.Value, findItem.Value)
+			isOk = true
+		} else {
+			if edbInfo.Frequency == "月度" { //向上和向下,各找一个月
+				for i := 0; i <= 35; i++ {
+					nextDateDay := preDate.AddDate(0, 0, i)
+					nextDateDayStr := nextDateDay.Format(utils.FormatDate)
+					if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
+						tmpItem.Value = TbzDiv(currentItem.Value, findItem.Value)
+						isOk = true
+						break
+					} else {
+						preDateDay := preDate.AddDate(0, 0, -i)
+						preDateDayStr := preDateDay.Format(utils.FormatDate)
+						if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
+							tmpItem.Value = TbzDiv(currentItem.Value, findItem.Value)
+							isOk = true
+							break
+						}
+					}
+				}
+			} else if edbInfo.Frequency == "季度" || edbInfo.Frequency == "年度" {
+				if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
+					tmpItem.Value = TbzDiv(currentItem.Value, findItem.Value)
+					isOk = true
+					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 { //上一年同期->下一个月找到
+						tmpItem.Value = TbzDiv(currentItem.Value, findItem.Value)
+						isOk = true
+						break
+					} else {
+						if i >= 1 {
+							preDateDay = preDate.AddDate(0, 0, -i)
+							preDateDayStr = nextDateDay.Format(utils.FormatDate)
+						}
+						if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
+							tmpItem.Value = TbzDiv(currentItem.Value, findItem.Value)
+							isOk = true
+							break
+						}
+					}
+				}
+			}
+		}
+
+		if isOk {
+			if tmpItem.Value > maxValue {
+				maxValue = tmpItem.Value
+			}
+			if tmpItem.Value < minValue {
+				minValue = tmpItem.Value
+			}
+			dataList = append(dataList, &tmpItem)
+		}
+	}
+
+	return
+}
+
+// GetChartEdbSeasonalData 获取指标的季节性数据
+func GetChartEdbSeasonalData(calendar, startDate, endDate string, edbInfo *data_manage.EdbInfo) (resultData interface{}, err error) {
+	var startDateReal string
+	startDateReal = startDate
+	calendarPreYear := 0
+	if calendar == "农历" {
+		newStartDateReal, tmpErr := time.Parse(utils.FormatDate, startDateReal)
+		if tmpErr != nil {
+			err = tmpErr
+			fmt.Println("time.Parse:" + err.Error())
+			return
+		}
+		calendarPreYear = newStartDateReal.Year() - 1
+		newStartDateReal = newStartDateReal.AddDate(-1, 0, 0)
+		startDateReal = newStartDateReal.Format(utils.FormatDate)
+	}
+	dataList := make([]*data_manage.EdbDataList, 0)
+
+	switch edbInfo.EdbInfoType {
+	case 0:
+		dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.EdbInfoId, startDateReal, endDate)
+	case 1:
+		_, dataList, _, _, err, _ = GetPredictDataListByPredictEdbInfoId(edbInfo.EdbInfoId, startDateReal, endDate, false)
+	default:
+		err = errors.New(fmt.Sprint("获取失败,指标类型异常", edbInfo.EdbInfoType))
+	}
+	if err != nil {
+		return
+	}
+
+	latestDateStr := edbInfo.LatestDate //实际数据的截止日期
+	latestDate, tmpErr := time.Parse(utils.FormatDate, edbInfo.LatestDate)
+	if tmpErr != nil {
+		err = errors.New(fmt.Sprint("获取最后实际数据的日期失败,Err:" + tmpErr.Error() + ";LatestDate:" + edbInfo.LatestDate))
+		return
+	}
+	latestDateYear := latestDate.Year() //实际数据截止年份
+
+	if calendar == "农历" {
+		if len(dataList) <= 0 {
+			resultData = new(data_manage.EdbDataResult)
+		} else {
+			result, tmpErr := data_manage.AddCalculateQuarterV4(dataList)
+			if tmpErr != nil {
+				err = errors.New("获取农历数据失败,Err:" + tmpErr.Error())
+				return
+			}
+
+			// 处理季节图的截止日期
+			for k, edbDataItems := range result.List {
+				var cuttingDataTimestamp int64
+
+				// 切割的日期时间字符串
+				cuttingDataTimeStr := latestDate.AddDate(0, 0, edbDataItems.BetweenDay).Format(utils.FormatDate)
+				//如果等于最后的实际日期,那么遍历找到该日期对应的时间戳,并将其赋值为 切割时间戳
+				if edbDataItems.Year >= latestDateYear {
+					for _, tmpData := range edbDataItems.Items {
+						if tmpData.DataTime == cuttingDataTimeStr {
+							cuttingDataTimestamp = tmpData.DataTimestamp
+							break
+						}
+					}
+				}
+				edbDataItems.CuttingDataTimestamp = cuttingDataTimestamp
+				result.List[k] = edbDataItems
+			}
+
+			if result.List[0].Year != calendarPreYear {
+				itemList := make([]*data_manage.EdbDataList, 0)
+				items := new(data_manage.EdbDataItems)
+				//items.Year = calendarPreYear
+				items.Items = itemList
+
+				newResult := new(data_manage.EdbDataResult)
+				newResult.List = append(newResult.List, items)
+				newResult.List = append(newResult.List, result.List...)
+				resultData = newResult
+			} else {
+				resultData = result
+			}
+		}
+
+	} else {
+		currentYear := time.Now().Year()
+
+		quarterDataList := make([]*data_manage.QuarterData, 0)
+		quarterMap := make(map[int][]*data_manage.EdbDataList)
+		var quarterArr []int
+
+		for _, v := range dataList {
+			itemDate, tmpErr := time.Parse(utils.FormatDate, v.DataTime)
+			if tmpErr != nil {
+				err = errors.New("季度指标日期转换,Err:" + tmpErr.Error() + ";DataTime:" + v.DataTime)
+				return
+			}
+			year := itemDate.Year()
+			newItemDate := itemDate.AddDate(currentYear-year, 0, 0)
+			timestamp := newItemDate.UnixNano() / 1e6
+			v.DataTimestamp = timestamp
+			if findVal, ok := quarterMap[year]; !ok {
+				quarterArr = append(quarterArr, year)
+				findVal = append(findVal, v)
+				quarterMap[year] = findVal
+			} else {
+				findVal = append(findVal, v)
+				quarterMap[year] = findVal
+			}
+		}
+		for _, v := range quarterArr {
+			itemList := quarterMap[v]
+			quarterItem := new(data_manage.QuarterData)
+			quarterItem.Year = v
+			quarterItem.DataList = itemList
+
+			//如果等于最后的实际日期,那么将切割时间戳记录
+			if v == latestDateYear {
+				var cuttingDataTimestamp int64
+				for _, tmpData := range itemList {
+					if tmpData.DataTime == latestDateStr {
+						cuttingDataTimestamp = tmpData.DataTimestamp
+						break
+					}
+				}
+				quarterItem.CuttingDataTimestamp = cuttingDataTimestamp
+			} else if v > latestDateYear {
+				//如果大于最后的实际日期,那么第一个点就是切割的时间戳
+				if len(itemList) > 0 {
+					quarterItem.CuttingDataTimestamp = itemList[0].DataTimestamp - 100
+				}
+			}
+			quarterDataList = append(quarterDataList, quarterItem)
+		}
+		resultData = quarterDataList
+	}
+	return
+}
+
+// TbzDiv 同比值计算
+func TbzDiv(a, b float64) float64 {
+	var valFloat float64
+	if b != 0 {
+		af := decimal.NewFromFloat(a)
+		bf := decimal.NewFromFloat(b)
+		val, _ := af.Div(bf).Float64()
+		val = val - 1
+		valFloat, _ = decimal.NewFromFloat(val).RoundCeil(4).Float64()
+	} else {
+		valFloat = 0
+	}
+	return valFloat
+}
+
+// GetDateData 获取指标的单个日期的值
+func GetDateData(edbInfo *data_manage.EdbInfo, startDate, endDate string) (item *data_manage.EdbDataList, err error) {
+	var dataList []*data_manage.EdbDataList
+	switch edbInfo.EdbInfoType {
+	case 0:
+		dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.EdbInfoId, startDate, endDate)
+	case 1:
+		_, dataList, _, _, err, _ = GetPredictDataListByPredictEdbInfoId(edbInfo.EdbInfoId, startDate, endDate, false)
+	default:
+		err = errors.New(fmt.Sprint("获取失败,指标类型异常", edbInfo.EdbInfoType))
+
+	}
+	if err != nil {
+		return
+	}
+
+	if len(dataList) <= 0 {
+		return
+	}
+
+	item = dataList[0]
+
+	return
+}
+
+// GetEdbBeforeAndAfterDateData 获取指标的单个日期的值
+func GetEdbBeforeAndAfterDateData(edbInfo *data_manage.EdbInfo, startDate, endDate string, dataType, num int) (list []*data_manage.EdbDataList, err error) {
+	var dataList []*data_manage.EdbDataList
+	switch edbInfo.EdbInfoType {
+	case 0:
+		dataList, err = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.EdbInfoId, startDate, endDate)
+	case 1:
+		_, dataList, _, _, err, _ = GetPredictDataListByPredictEdbInfoId(edbInfo.EdbInfoId, startDate, endDate, true)
+	default:
+		err = errors.New(fmt.Sprint("获取失败,指标类型异常", edbInfo.EdbInfoType))
+
+	}
+	if err != nil {
+		return
+	}
+
+	lenDataList := len(dataList)
+	if lenDataList <= 0 {
+		return
+	}
+
+	switch dataType {
+	case 1: // 取前面的数据
+		if lenDataList <= 1 { // 如果只有一个,那么也返回,因为自己不算
+			return
+		}
+		if lenDataList <= num {
+			num = lenDataList - 1
+		}
+
+		for i := num; i >= 0; i-- {
+			list = append(list, dataList[lenDataList-1-i])
+		}
+
+	case 2: // 取后面的数据
+		num = num + 1
+		if lenDataList < num {
+			num = lenDataList
+		}
+
+		for i := 0; i < num; i++ {
+			list = append(list, dataList[i])
+		}
+	}
+
+	return
+}

+ 656 - 2
services/data/edb_info.go

@@ -3,17 +3,213 @@ package data
 import (
 	"encoding/json"
 	"errors"
-	"fmt"
 	"eta/eta_mobile/models/data_manage"
 	"eta/eta_mobile/services/alarm_msg"
 	"eta/eta_mobile/services/elastic"
 	"eta/eta_mobile/utils"
+	"fmt"
 	"sort"
 	"strconv"
 	"strings"
 	"time"
 )
 
+// EdbInfoRefreshAllFromBaseV2 全部刷新指标(切换到edb_lib服务)
+func EdbInfoRefreshAllFromBaseV2(edbInfoId int, refreshAll bool) (err error, isAsync bool) {
+	var errmsg string
+	defer func() {
+		if err != nil {
+			fmt.Println("EdbInfoRefreshAllFromBaseV2 Err:" + err.Error() + ";errmsg:" + errmsg)
+			go alarm_msg.SendAlarmMsg("EdbInfoRefreshFromBaseV2,Err"+err.Error()+";errMsg:"+errmsg, 3)
+			//go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "EdbInfoRefreshFromBase:"+errmsg, utils.EmailSendToUsers)
+		}
+	}()
+
+	err, isAsync = EdbInfoRefreshAllFromBaseV3([]int{edbInfoId}, refreshAll, false)
+	return
+	//// 获取关联的基础指标
+	//newBaseEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr, err, errmsg := getRefreshEdbInfoList(edbInfoId)
+	//if err != nil {
+	//	return
+	//}
+	//
+	//var startDate string
+	//for _, bv := range newBaseEdbInfoArr {
+	//	//source := bv.Source
+	//	//edbInfoId := bv.EdbInfoId
+	//	//edbCode := bv.EdbCode
+	//	if bv.StartDate == "0000-00-00" {
+	//		continue
+	//	}
+	//	//开始时间
+	//	startDate = ``
+	//	if refreshAll { //刷新所有数据,用开始时间作为起始日期去刷新
+	//		sTime, err := time.Parse(utils.FormatDate, bv.StartDate)
+	//		if err != nil {
+	//			return err
+	//		}
+	//		startDate = sTime.Format(utils.FormatDate)
+	//	} else {
+	//		sTime, err := time.Parse(utils.FormatDate, bv.EndDate)
+	//		if err != nil {
+	//			return err
+	//		}
+	//		frequency := bv.Frequency
+	//		var limitDay int
+	//		switch frequency {
+	//		case "日度":
+	//			limitDay = utils.DATA_START_REFRESH_LIMIT
+	//		case "周度":
+	//			limitDay = utils.DATA_START_REFRESH_LIMIT * 7
+	//		case "月度":
+	//			limitDay = utils.DATA_START_REFRESH_LIMIT * 30
+	//		case "季度":
+	//			limitDay = utils.DATA_START_REFRESH_LIMIT * 90
+	//		case "年度":
+	//			limitDay = utils.DATA_START_REFRESH_LIMIT * 365
+	//		default:
+	//			limitDay = utils.DATA_START_REFRESH_LIMIT
+	//		}
+	//		startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
+	//	}
+	//	result, err := RefreshEdbData(bv.EdbInfoId, bv.Source, bv.EdbCode, startDate)
+	//	if err != nil {
+	//		fmt.Println(bv.EdbInfoId, "RefreshBaseEdbData err", time.Now())
+	//		errmsg = "RefreshBaseEdbData Err:" + err.Error()
+	//		return err
+	//	}
+	//	if result.Ret != 200 {
+	//		fmt.Println(bv.EdbInfoId, "RefreshBaseEdbData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+	//		errmsg = fmt.Sprint(bv.EdbInfoId, "RefreshBaseEdbData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+	//		return fmt.Errorf("刷新失败, err:", errmsg)
+	//	}
+	//
+	//	//maxAndMinItem, err := data_manage.GetEdbInfoMaxAndMinInfo(source, edbCode)
+	//	//if err != nil {
+	//	//	if err.Error() == utils.ErrNoRow() { //找不到数据,那么就进入到下一条数据做处理
+	//	//		continue
+	//	//	}
+	//	//	return err
+	//	//}
+	//	//if maxAndMinItem != nil {
+	//	//	err = data_manage.ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
+	//	//	if err != nil {
+	//	//		return err
+	//	//	}
+	//	//}
+	//	fmt.Println("end newBaseEdbInfoArr:", bv, time.Now())
+	//}
+	//
+	////刷新相关普通计算指标
+	//for _, v := range calculateArr {
+	//	edbInfo := newCalculateMap[v]
+	//	if edbInfo == nil {
+	//		return err
+	//	}
+	//	startDate = edbInfo.StartDate
+	//	source := edbInfo.Source
+	//	if startDate == "" || startDate == "0000-00-00" { //如果没有开始日期,说明还没有计算出来数据,那么就往前面推40年吧(也意味着重新计算了)
+	//		startDate = time.Now().AddDate(-40, 0, 0).Format(utils.FormatDate)
+	//	} else {
+	//		if source == utils.DATA_SOURCE_CALCULATE {
+	//			startDate = ``
+	//			if refreshAll { //刷新所有数据,用开始时间作为起始日期去刷新
+	//				startDate = edbInfo.StartDate
+	//			} else {
+	//				sTime, err := time.Parse(utils.FormatDate, edbInfo.EndDate)
+	//				if err != nil {
+	//					return err
+	//				}
+	//				frequency := edbInfo.Frequency
+	//				var limitDay int
+	//				switch frequency {
+	//				case "日度":
+	//					limitDay = utils.DATA_START_REFRESH_LIMIT
+	//				case "周度":
+	//					limitDay = utils.DATA_START_REFRESH_LIMIT * 7
+	//				case "月度":
+	//					limitDay = utils.DATA_START_REFRESH_LIMIT * 30
+	//				case "季度":
+	//					limitDay = utils.DATA_START_REFRESH_LIMIT * 90
+	//				case "年度":
+	//					limitDay = utils.DATA_START_REFRESH_LIMIT * 365
+	//				default:
+	//					limitDay = utils.DATA_START_REFRESH_LIMIT
+	//				}
+	//				startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
+	//			}
+	//		}
+	//	}
+	//
+	//	result, err := RefreshEdbCalculateData(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate)
+	//	if err != nil {
+	//		fmt.Println(v, "RefreshEdbCalculateData err", time.Now())
+	//		errmsg = "RefreshEdbCalculateData Err:" + err.Error()
+	//		return err
+	//	}
+	//	if result.Ret != 200 {
+	//		fmt.Println(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+	//		errmsg = fmt.Sprint(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+	//		return fmt.Errorf("刷新失败")
+	//	}
+	//}
+	//
+	////刷新相关预测计算指标
+	//for _, v := range predictCalculateArr {
+	//	edbInfo := newPredictCalculateMap[v]
+	//	if edbInfo == nil {
+	//		return err
+	//	}
+	//	startDate = edbInfo.StartDate
+	//	source := edbInfo.Source
+	//	if startDate == "" || startDate == "0000-00-00" { //如果没有开始日期,说明还没有计算出来数据,那么就往前面推40年吧(也意味着重新计算了)
+	//		startDate = time.Now().AddDate(-40, 0, 0).Format(utils.FormatDate)
+	//	} else {
+	//		if source == utils.DATA_SOURCE_PREDICT_CALCULATE {
+	//			startDate = ``
+	//			if refreshAll { //刷新所有数据,用开始时间作为起始日期去刷新
+	//				startDate = edbInfo.StartDate
+	//			} else {
+	//				sTime, err := time.Parse(utils.FormatDate, edbInfo.EndDate)
+	//				if err != nil {
+	//					return err
+	//				}
+	//				frequency := edbInfo.Frequency
+	//				var limitDay int
+	//				switch frequency {
+	//				case "日度":
+	//					limitDay = utils.DATA_START_REFRESH_LIMIT
+	//				case "周度":
+	//					limitDay = utils.DATA_START_REFRESH_LIMIT * 7
+	//				case "月度":
+	//					limitDay = utils.DATA_START_REFRESH_LIMIT * 30
+	//				case "季度":
+	//					limitDay = utils.DATA_START_REFRESH_LIMIT * 90
+	//				case "年度":
+	//					limitDay = utils.DATA_START_REFRESH_LIMIT * 365
+	//				default:
+	//					limitDay = utils.DATA_START_REFRESH_LIMIT
+	//				}
+	//				startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
+	//			}
+	//		}
+	//	}
+	//
+	//	result, err := RefreshPredictEdbCalculateData(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate)
+	//	if err != nil {
+	//		fmt.Println(v, "RefreshEdbCalculateData err", time.Now())
+	//		errmsg = "RefreshEdbCalculateData Err:" + err.Error()
+	//		return err
+	//	}
+	//	if result.Ret != 200 {
+	//		fmt.Println(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+	//		errmsg = fmt.Sprint(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+	//		return fmt.Errorf("刷新失败")
+	//	}
+	//}
+	//return err
+}
+
 // 获取频度的英文版
 func GetFrequencyEn(frequency string) (frequencyEn string) {
 	switch frequency {
@@ -64,7 +260,286 @@ func GetLeadUnitEn(unit string) (unitEn string) {
 // @author Roc
 // @datetime 2022-09-16 11:04:44
 // @description 将原有的单个指标刷新,调整为批量多个指标刷新
-func EdbInfoRefreshAllFromBaseV3(edbInfoIdList []int, refreshAll bool) (err error) {
+//func EdbInfoRefreshAllFromBaseV3(edbInfoIdList []int, refreshAll bool) (err error) {
+//	var errmsg string
+//	defer func() {
+//		if err != nil {
+//			fmt.Println("EdbInfoRefreshAllFromBaseV2 Err:" + err.Error() + ";errmsg:" + errmsg)
+//			go alarm_msg.SendAlarmMsg("EdbInfoRefreshFromBaseV2,Err"+err.Error()+";errMsg:"+errmsg, 3)
+//			//go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "EdbInfoRefreshFromBase:"+errmsg, utils.EmailSendToUsers)
+//		}
+//	}()
+//
+//	// 获取关联的基础指标
+//	newBaseEdbInfoArr, newBasePredictEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr, err, errmsg := getRefreshEdbInfoListByIds(edbInfoIdList)
+//	if err != nil {
+//		return
+//	}
+//	var startDate string
+//	for _, bv := range newBaseEdbInfoArr {
+//		//source := bv.Source
+//		//edbInfoId := bv.EdbInfoId
+//		//edbCode := bv.EdbCode
+//		if bv.StartDate == "0000-00-00" {
+//			continue
+//		}
+//		//开始时间
+//		startDate = ``
+//		if refreshAll { //刷新所有数据,用开始时间作为起始日期去刷新
+//			sTime, err := time.Parse(utils.FormatDate, bv.StartDate)
+//			if err != nil {
+//				return err
+//			}
+//			startDate = sTime.Format(utils.FormatDate)
+//		} else {
+//			sTime, err := time.Parse(utils.FormatDate, bv.EndDate)
+//			if err != nil {
+//				return err
+//			}
+//			frequency := bv.Frequency
+//			var limitDay int
+//			switch frequency {
+//			case "日度":
+//				limitDay = utils.DATA_START_REFRESH_LIMIT
+//			case "周度":
+//				limitDay = utils.DATA_START_REFRESH_LIMIT * 7
+//			case "月度":
+//				limitDay = utils.DATA_START_REFRESH_LIMIT * 30
+//			case "季度":
+//				limitDay = utils.DATA_START_REFRESH_LIMIT * 90
+//			case "年度":
+//				limitDay = utils.DATA_START_REFRESH_LIMIT * 365
+//			default:
+//				limitDay = utils.DATA_START_REFRESH_LIMIT
+//			}
+//			startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
+//		}
+//		result, err := RefreshEdbData(bv.EdbInfoId, bv.Source, bv.EdbCode, startDate)
+//		if err != nil {
+//			fmt.Println(bv.EdbInfoId, "RefreshBaseEdbData err", time.Now())
+//			errmsg = "RefreshBaseEdbData Err:" + err.Error()
+//			return err
+//		}
+//		if result.Ret != 200 {
+//			fmt.Println(bv.EdbInfoId, "RefreshBaseEdbData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+//			errmsg = fmt.Sprint(bv.EdbInfoId, "RefreshBaseEdbData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+//			return fmt.Errorf("刷新失败, err:", errmsg)
+//		}
+//
+//		//maxAndMinItem, err := data_manage.GetEdbInfoMaxAndMinInfo(source, edbCode)
+//		//if err != nil {
+//		//	if err.Error() == utils.ErrNoRow() { //找不到数据,那么就进入到下一条数据做处理
+//		//		continue
+//		//	}
+//		//	return err
+//		//}
+//		//if maxAndMinItem != nil {
+//		//	err = data_manage.ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
+//		//	if err != nil {
+//		//		return err
+//		//	}
+//		//}
+//		fmt.Println("end newBaseEdbInfoArr:", bv, time.Now())
+//	}
+//
+//	//刷新相关普通计算指标
+//	for _, v := range calculateArr {
+//		edbInfo := newCalculateMap[v]
+//		if edbInfo == nil {
+//			return err
+//		}
+//
+//		//计算指标就不用开始时间了吧,因为存在说开始时间变更的情况
+//		startDate = ``
+//		if !refreshAll { //如果不是全部更新,那么以指标的开始时间作为刷新
+//			startDate = edbInfo.StartDate
+//			source := edbInfo.Source
+//			if startDate == "" || startDate == "0000-00-00" { //如果没有开始日期,说明还没有计算出来数据,那么就往前面推40年吧(也意味着重新计算了)
+//				startDate = time.Now().AddDate(-40, 0, 0).Format(utils.FormatDate)
+//			} else {
+//				if source == utils.DATA_SOURCE_CALCULATE {
+//					sTime, err := time.Parse(utils.FormatDate, edbInfo.EndDate)
+//					if err != nil {
+//						return err
+//					}
+//					frequency := edbInfo.Frequency
+//					var limitDay int
+//					switch frequency {
+//					case "日度":
+//						limitDay = utils.DATA_START_REFRESH_LIMIT
+//					case "周度":
+//						limitDay = utils.DATA_START_REFRESH_LIMIT * 7
+//					case "月度":
+//						limitDay = utils.DATA_START_REFRESH_LIMIT * 30
+//					case "季度":
+//						limitDay = utils.DATA_START_REFRESH_LIMIT * 90
+//					case "年度":
+//						limitDay = utils.DATA_START_REFRESH_LIMIT * 365
+//					default:
+//						limitDay = utils.DATA_START_REFRESH_LIMIT
+//					}
+//					startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
+//				}
+//			}
+//		}
+//
+//		result, err := RefreshEdbCalculateData(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate)
+//		if err != nil {
+//			fmt.Println(v, "RefreshEdbCalculateData err", time.Now())
+//			errmsg = "RefreshEdbCalculateData Err:" + err.Error()
+//			return err
+//		}
+//		if result.Ret != 200 {
+//			fmt.Println(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+//			errmsg = fmt.Sprint(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+//			return fmt.Errorf("刷新失败")
+//		}
+//	}
+//
+//	//刷新相关预测计算指标
+//	for _, v := range predictCalculateArr {
+//		edbInfo := newPredictCalculateMap[v]
+//		if edbInfo == nil {
+//			return err
+//		}
+//		startDate = edbInfo.StartDate
+//		source := edbInfo.Source
+//		if startDate == "" || startDate == "0000-00-00" { //如果没有开始日期,说明还没有计算出来数据,那么就往前面推40年吧(也意味着重新计算了)
+//			startDate = time.Now().AddDate(-40, 0, 0).Format(utils.FormatDate)
+//		} else {
+//			if source == utils.DATA_SOURCE_PREDICT_CALCULATE {
+//				startDate = ``
+//				if refreshAll { //刷新所有数据,用开始时间作为起始日期去刷新
+//					startDate = edbInfo.StartDate
+//				} else {
+//					sTime, err := time.Parse(utils.FormatDate, edbInfo.EndDate)
+//					if err != nil {
+//						return err
+//					}
+//					frequency := edbInfo.Frequency
+//					var limitDay int
+//					switch frequency {
+//					case "日度":
+//						limitDay = utils.DATA_START_REFRESH_LIMIT
+//					case "周度":
+//						limitDay = utils.DATA_START_REFRESH_LIMIT * 7
+//					case "月度":
+//						limitDay = utils.DATA_START_REFRESH_LIMIT * 30
+//					case "季度":
+//						limitDay = utils.DATA_START_REFRESH_LIMIT * 90
+//					case "年度":
+//						limitDay = utils.DATA_START_REFRESH_LIMIT * 365
+//					default:
+//						limitDay = utils.DATA_START_REFRESH_LIMIT
+//					}
+//					startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
+//				}
+//			}
+//		}
+//
+//		result, err := RefreshPredictEdbCalculateData(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate)
+//		if err != nil {
+//			fmt.Println(v, "RefreshEdbCalculateData err", time.Now())
+//			errmsg = "RefreshEdbCalculateData Err:" + err.Error()
+//			return err
+//		}
+//		if result.Ret != 200 {
+//			fmt.Println(v, "RefreshPredictEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+//			errmsg = fmt.Sprint(v, "RefreshPredictEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+//			return fmt.Errorf("刷新失败")
+//		}
+//	}
+//
+//	// 4、更新动态环差值
+//	{
+//		predictEdbInfoIdList := make([]int, 0)
+//		for _, v := range newBasePredictEdbInfoArr {
+//			predictEdbInfoIdList = append(predictEdbInfoIdList, v.EdbInfoId)
+//		}
+//		fmt.Println("predictEdbConfCalculateMappingDetailList:", predictEdbInfoIdList)
+//		predictEdbConfCalculateMappingDetailList, err := data_manage.GetPredictEdbConfCalculateMappingDetailListByEdbInfoId(predictEdbInfoIdList)
+//		if err != nil {
+//			errmsg = fmt.Sprint("更新动态环差值时,获取数据失败:" + err.Error())
+//			return fmt.Errorf("刷新失败, err:", errmsg)
+//		}
+//		for _, bv := range predictEdbConfCalculateMappingDetailList {
+//			result, err := RefreshEdbData(bv.EdbInfoId, utils.DATA_SOURCE_PREDICT, bv.EdbCode, "")
+//			if err != nil {
+//				fmt.Println(bv.EdbInfoId, "RefreshBasePredictEdbData err", time.Now())
+//				errmsg = "RefreshBasePredictEdbData Err:" + err.Error()
+//				return err
+//			}
+//			if result.Ret != 200 {
+//				fmt.Println(bv.EdbInfoId, "RefreshBasePredictEdbData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+//				errmsg = fmt.Sprint(bv.EdbInfoId, "RefreshBasePredictEdbData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+//				return fmt.Errorf("刷新失败, err:%s", errmsg)
+//			}
+//			fmt.Println("end predictEdbConfCalculateMappingDetailList:", bv, time.Now())
+//		}
+//	}
+//
+//	//5、再次刷新相关预测计算指标
+//	for _, v := range predictCalculateArr {
+//		edbInfo := newPredictCalculateMap[v]
+//		if edbInfo == nil {
+//			return err
+//		}
+//		startDate = edbInfo.StartDate
+//		source := edbInfo.Source
+//		if startDate == "" || startDate == "0000-00-00" { //如果没有开始日期,说明还没有计算出来数据,那么就往前面推40年吧(也意味着重新计算了)
+//			startDate = time.Now().AddDate(-40, 0, 0).Format(utils.FormatDate)
+//		} else {
+//			if source == utils.DATA_SOURCE_PREDICT_CALCULATE {
+//				startDate = ``
+//				if refreshAll { //刷新所有数据,用开始时间作为起始日期去刷新
+//					startDate = edbInfo.StartDate
+//				} else {
+//					sTime, err := time.Parse(utils.FormatDate, edbInfo.EndDate)
+//					if err != nil {
+//						return err
+//					}
+//					frequency := edbInfo.Frequency
+//					var limitDay int
+//					switch frequency {
+//					case "日度":
+//						limitDay = utils.DATA_START_REFRESH_LIMIT
+//					case "周度":
+//						limitDay = utils.DATA_START_REFRESH_LIMIT * 7
+//					case "月度":
+//						limitDay = utils.DATA_START_REFRESH_LIMIT * 30
+//					case "季度":
+//						limitDay = utils.DATA_START_REFRESH_LIMIT * 90
+//					case "年度":
+//						limitDay = utils.DATA_START_REFRESH_LIMIT * 365
+//					default:
+//						limitDay = utils.DATA_START_REFRESH_LIMIT
+//					}
+//					startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
+//				}
+//			}
+//		}
+//
+//		result, err := RefreshPredictEdbCalculateData(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate)
+//		if err != nil {
+//			fmt.Println(v, "RefreshEdbCalculateData err", time.Now())
+//			errmsg = "RefreshEdbCalculateData Err:" + err.Error()
+//			return err
+//		}
+//		if result.Ret != 200 {
+//			fmt.Println(v, "RefreshPredictEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+//			errmsg = fmt.Sprint(v, "RefreshPredictEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+//			return fmt.Errorf("刷新失败")
+//		}
+//	}
+//
+//	return err
+//}
+
+// EdbInfoRefreshAllFromBaseV3 全部刷新指标(切换到edb_lib服务)
+// @author Roc
+// @datetime 2022-09-16 11:04:44
+// @description 将原有的单个指标刷新,调整为批量多个指标刷新
+func EdbInfoRefreshAllFromBaseV3(edbInfoIdList []int, refreshAll, isSync bool) (err error, isAsync bool) {
 	var errmsg string
 	defer func() {
 		if err != nil {
@@ -79,6 +554,30 @@ func EdbInfoRefreshAllFromBaseV3(edbInfoIdList []int, refreshAll bool) (err erro
 	if err != nil {
 		return
 	}
+
+	// 需要刷新的指标数量
+	totalEdbInfo := len(newBaseEdbInfoArr) + len(calculateArr) + len(predictCalculateArr)
+
+	if totalEdbInfo <= 20 || isSync {
+		err = edbInfoRefreshAll(refreshAll, newBaseEdbInfoArr, newBasePredictEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr)
+	} else {
+		isAsync = true
+		go edbInfoRefreshAll(refreshAll, newBaseEdbInfoArr, newBasePredictEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr)
+	}
+
+	return
+}
+
+func edbInfoRefreshAll(refreshAll bool, newBaseEdbInfoArr, newBasePredictEdbInfoArr []*data_manage.EdbInfo, newCalculateMap, newPredictCalculateMap map[int]*data_manage.EdbInfo, calculateArr, predictCalculateArr []int) (err error) {
+	var errmsg string
+	defer func() {
+		if err != nil {
+			fmt.Println("EdbInfoRefreshAllFromBaseV2 Err:" + err.Error() + ";errmsg:" + errmsg)
+			go alarm_msg.SendAlarmMsg("EdbInfoRefreshFromBaseV2,Err"+err.Error()+";errMsg:"+errmsg, 3)
+			//go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "EdbInfoRefreshFromBase:"+errmsg, utils.EmailSendToUsers)
+		}
+	}()
+
 	var startDate string
 	for _, bv := range newBaseEdbInfoArr {
 		//source := bv.Source
@@ -600,6 +1099,161 @@ func AddOrEditEdbInfoToEs(edbInfoId int) {
 	go elastic.EsAddOrEditEdbInfoData(utils.DATA_INDEX_NAME, strconv.Itoa(itemInfo.EdbInfoId), itemInfo)
 }
 
+// DeleteEdbInfoToEs 删除ES中的指标
+func DeleteEdbInfoToEs(edbInfoId int) {
+	//添加es
+	go elastic.EsDeleteEdbInfoData(utils.DATA_INDEX_NAME, strconv.Itoa(edbInfoId))
+}
+
+// EdbInfoAdd 添加指标到指标库
+func EdbInfoAdd(source, classifyId int, edbCode, edbName, frequency, unit, startDate, endDate string, sysUserId int, sysUserRealName string) (edbInfo *data_manage.EdbInfo, err error, errMsg string, isSendEmail bool) {
+	isSendEmail = true
+	//判断指标名称是否存在
+	var condition string
+	var pars []interface{}
+	//condition += " AND source=? "
+	//pars = append(pars, source)
+
+	condition += " AND edb_name=? "
+	pars = append(pars, edbName)
+
+	count, err := data_manage.GetEdbInfoCountByCondition(condition, pars)
+	if err != nil {
+		errMsg = "判断指标名称是否存在失败"
+		err = errors.New("判断指标名称是否存在失败,Err:" + err.Error())
+		return
+	}
+
+	if count > 0 {
+		errMsg = "指标名称已存在,请重新填写"
+		err = errors.New(errMsg)
+		isSendEmail = false
+		return
+	}
+
+	edbInfo = new(data_manage.EdbInfo)
+	edbInfo.Source = source
+	sourceNameMap := map[int]string{
+		utils.DATA_SOURCE_THS:                 "同花顺",
+		utils.DATA_SOURCE_WIND:                "wind",
+		utils.DATA_SOURCE_PB:                  "彭博",
+		utils.DATA_SOURCE_PB_FINANCE:          "彭博财务",
+		utils.DATA_SOURCE_MANUAL:              "手工数据",
+		utils.DATA_SOURCE_LZ:                  "隆众",
+		utils.DATA_SOURCE_YS:                  "SMM",
+		utils.DATA_SOURCE_GL:                  "钢联",
+		utils.DATA_SOURCE_ZZ:                  "郑商所",
+		utils.DATA_SOURCE_DL:                  "大商所",
+		utils.DATA_SOURCE_SH:                  "上期所",
+		utils.DATA_SOURCE_CFFEX:               "中金所",
+		utils.DATA_SOURCE_SHFE:                "上期能源",
+		utils.DATA_SOURCE_GIE:                 "欧洲天然气",
+		utils.DATA_SOURCE_LT:                  "路透",
+		utils.DATA_SOURCE_COAL:                "中国煤炭网",
+		utils.DATA_SOURCE_GOOGLE_TRAVEL:       "our world in data",
+		utils.DATA_SOURCE_MYSTEEL_CHEMICAL:    "钢联化工",
+		utils.DATA_SOURCE_EIA_STEO:            "EIA STEO报告",
+		utils.DATA_SOURCE_COM_TRADE:           "UN",
+		utils.DATA_SOURCE_SCI:                 "SCI",
+		utils.DATA_SOURCE_BAIINFO:             "BAIINFO",
+		utils.DATA_SOURCE_STOCK_PLANT:         "存量装置",
+		utils.DATA_SOURCE_NATIONAL_STATISTICS: "国家统计局",
+		utils.DATA_SOURCE_FUBAO:               "富宝数据",
+	}
+
+	sourceName, ok := sourceNameMap[source]
+	if !ok {
+		errMsg = "指标来源异常"
+		err = errors.New(errMsg)
+		return
+	}
+	edbInfo.SourceName = sourceName
+
+	edbType := 1 //基础指标
+	if source == utils.DATA_SOURCE_STOCK_PLANT {
+		edbType = 2 //计算指标
+	}
+	//从缓存中获取
+	serverUrl := ``
+	if edbInfo.Source == utils.DATA_SOURCE_WIND {
+		windCacheKey := utils.CACHE_WIND_URL + ":" + edbCode
+		serverUrl, _ = utils.Rc.RedisString(windCacheKey)
+		if serverUrl == `` {
+			if len(utils.Hz_Data_WIND_Url_List) >= 1 {
+				serverUrl = utils.Hz_Data_WIND_Url_List[len(utils.Hz_Data_WIND_Url_List)-1] //默认是最后一个服务器地址
+			}
+		}
+	}
+	edbInfo.EdbCode = edbCode
+	edbInfo.EdbName = edbName
+	edbInfo.EdbNameSource = edbName
+	edbInfo.Frequency = frequency
+	edbInfo.Unit = unit
+	edbInfo.StartDate = startDate
+	edbInfo.EndDate = endDate
+	edbInfo.ClassifyId = classifyId
+	edbInfo.SysUserId = sysUserId
+	edbInfo.SysUserRealName = sysUserRealName
+	edbInfo.CreateTime = time.Now()
+	edbInfo.ModifyTime = time.Now()
+	edbInfo.ServerUrl = serverUrl
+	edbInfo.DataDateType = `交易日`
+	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+	edbInfo.UniqueCode = utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
+	itemVal, err := data_manage.GetEdbInfoMaxAndMinInfo(source, edbCode)
+	if itemVal != nil && err == nil {
+		edbInfo.MaxValue = itemVal.MaxValue
+		edbInfo.MinValue = itemVal.MinValue
+	}
+	edbInfo.EdbType = edbType
+	edbInfoId, err := data_manage.AddEdbInfo(edbInfo)
+	if err != nil {
+		errMsg = "保存失败"
+		err = errors.New("保存失败,Err:" + err.Error())
+		return
+	}
+	edbInfo.EdbInfoId = int(edbInfoId)
+	//保存数据
+	data_manage.ModifyEdbInfoDataStatus(edbInfoId, source, edbCode)
+
+	//处理同名指标
+	//{
+	//	edbNameList, tmpErr := data_manage.GetEdbInfoByName(edbName)
+	//	if tmpErr != nil {
+	//		errMsg = "保存失败"
+	//		err = errors.New("获取指标信息失败,Err:" + tmpErr.Error())
+	//		return
+	//	}
+	//	if len(edbNameList) >= 2 {
+	//		for _, v := range edbNameList {
+	//			edbName := v.EdbName + "(" + v.SourceName + ")"
+	//			err = data_manage.ModifyEdbInfoNameSource(edbName, v.EdbInfoId)
+	//			if err != nil {
+	//				errMsg = "保存失败"
+	//				err = errors.New("修改指标名称失败,Err:" + err.Error())
+	//				return
+	//			}
+	//		}
+	//	}
+	//}
+
+	//上传到ES
+	//indexName := utils.DATA_INDEX_NAME
+	//docId := strconv.Itoa(int(edbInfoId))
+	//
+	//go data.EsAddOrEditEdbInfo(indexName, docId, edbInfo)
+
+	maxAndMinItem, _ := data_manage.GetEdbInfoMaxAndMinInfo(source, edbCode)
+	if maxAndMinItem != nil {
+		err = data_manage.ModifyEdbInfoMaxAndMinInfo(int(edbInfoId), maxAndMinItem)
+	}
+
+	//添加es
+	AddOrEditEdbInfoToEs(int(edbInfoId))
+
+	return
+}
+
 // TraceEdbInfoByEdbInfoId 指标追溯
 func TraceEdbInfoByEdbInfoId(edbInfoId int) (traceEdbInfo data_manage.TraceEdbInfoResp, err error) {
 	edbInfo, err := data_manage.GetEdbInfoById(edbInfoId)

+ 3 - 3
services/data/future_good/chart_info.go

@@ -2,13 +2,13 @@ package future_good
 
 import (
 	"errors"
-	"fmt"
-	"github.com/shopspring/decimal"
 	"eta/eta_mobile/models/data_manage"
 	future_good2 "eta/eta_mobile/models/data_manage/future_good"
 	"eta/eta_mobile/services/alarm_msg"
 	"eta/eta_mobile/services/data"
 	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/shopspring/decimal"
 	"sort"
 	"strconv"
 	"time"
@@ -910,7 +910,7 @@ func FutureGoodChartInfoRefresh(chartInfoId int) (err error) {
 	}
 
 	// 批量刷新ETA指标
-	err = data.EdbInfoRefreshAllFromBaseV3([]int{edbInfoMapping.EdbInfoId}, false)
+	err, _ = data.EdbInfoRefreshAllFromBaseV3([]int{edbInfoMapping.EdbInfoId}, false, true)
 	if err != nil {
 		return
 	}

+ 2 - 2
services/data/predict_edb_info.go

@@ -3,10 +3,10 @@ package data
 import (
 	"encoding/json"
 	"errors"
-	"fmt"
-	"github.com/shopspring/decimal"
 	"eta/eta_mobile/models/data_manage"
 	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/shopspring/decimal"
 	"strconv"
 	"time"
 )

+ 19 - 9
services/elastic/elastic.go

@@ -4,10 +4,10 @@ import (
 	"context"
 	"encoding/json"
 	"errors"
-	"fmt"
-	"github.com/olivere/elastic/v7"
 	"eta/eta_mobile/models/data_manage"
 	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/olivere/elastic/v7"
 	"strconv"
 )
 
@@ -154,7 +154,7 @@ func EsAddOrEditEdbInfoData(indexName, docId string, item *data_manage.EdbInfoLi
 }
 
 // SearchEdbInfoData 查询es中的指标数据
-func SearchEdbInfoData(indexName, keywordStr string, from, size, filterSource, source int, edbInfoType uint8, frequency string, noPermissionEdbInfoIdList []int) (total int64, list []*data_manage.EdbInfoList, err error) {
+func SearchEdbInfoData(indexName, keywordStr string, from, size, filterSource, source int, edbInfoType int8, frequency string, noPermissionEdbInfoIdList []int) (total int64, list []*data_manage.EdbInfoList, err error) {
 	list = make([]*data_manage.EdbInfoList, 0)
 	defer func() {
 		if err != nil {
@@ -276,6 +276,14 @@ func SearchEdbInfoData(indexName, keywordStr string, from, size, filterSource, s
 				},
 			},
 		}
+	case 6:
+		mustNotMap = []interface{}{
+			map[string]interface{}{
+				"match": map[string]interface{}{
+					"Frequency.keyword": "年度",
+				},
+			},
+		}
 	}
 
 	//指标来源
@@ -307,12 +315,14 @@ func SearchEdbInfoData(indexName, keywordStr string, from, size, filterSource, s
 		})
 	}
 
-	// 指标类型:普通指标、预算指标
-	mustMap = append(mustMap, map[string]interface{}{
-		"term": map[string]interface{}{
-			"EdbInfoType": edbInfoType,
-		},
-	})
+	// 指标类型:普通指标、预测指标(小于0 代表不区分指标是普通还是预测)
+	if edbInfoType >= 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"term": map[string]interface{}{
+				"EdbInfoType": edbInfoType,
+			},
+		})
+	}
 
 	//普通指标
 	//mustMap = append(mustMap, map[string]interface{}{

+ 6 - 0
utils/constants.go

@@ -167,6 +167,12 @@ const (
 	EXCEL_DATA_PREFIX = "hz_excel_data"
 )
 
+const (
+	EDB_DATA_LIMIT = 10
+)
+
+var Hz_Data_WIND_Url_List = []string{"http://datawind.hzinsights.com:8040/", "http://datawind2.hzinsights.com:8040/"}
+
 const (
 	HZ_CHART_LIB_DETAIL             = "HZ_CHART_LIB_DETAIL_"            //图表数据缓存
 	HZ_CHART_LIB_EXCEL_TABLE_DETAIL = "HZ_CHART_LIB_EXCEL_TABLE_DETAIL" //excel表格数据缓存

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików