Browse Source

Merge remote-tracking branch 'origin/master'

Roc 1 year ago
parent
commit
3bc95cc51b

+ 6 - 0
controllers/data_manage/edb_info.go

@@ -11,6 +11,7 @@ import (
 	"eta/eta_api/models/system"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/alarm_msg"
 	"eta/eta_api/services/alarm_msg"
 	"eta/eta_api/services/data"
 	"eta/eta_api/services/data"
+	"eta/eta_api/services/data_stat"
 	"eta/eta_api/services/elastic"
 	"eta/eta_api/services/elastic"
 	etaTrialService "eta/eta_api/services/eta_trial"
 	etaTrialService "eta/eta_api/services/eta_trial"
 	"eta/eta_api/utils"
 	"eta/eta_api/utils"
@@ -2182,6 +2183,11 @@ func (this *EdbInfoController) EdbInfoEdit() {
 	// 修改关联的预测指标基础信息
 	// 修改关联的预测指标基础信息
 	go data.ModifyPredictEdbBaseInfoBySourceEdb(edbInfo)
 	go data.ModifyPredictEdbBaseInfoBySourceEdb(edbInfo)
 
 
+	// 添加钢联指标更新日志
+	if edbInfo.Source == utils.DATA_SOURCE_MYSTEEL_CHEMICAL {
+		go data_stat.AddEdbInfoUpdateLog(req.EdbInfoId, 1, "", sysUser)
+	}
+
 	br.Ret = 200
 	br.Ret = 200
 	br.Success = true
 	br.Success = true
 	br.Msg = "保存成功"
 	br.Msg = "保存成功"

+ 21 - 3
controllers/data_manage/my_chart.go

@@ -1141,6 +1141,7 @@ func (this *MyChartController) MyChartEdit() {
 // @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
 // @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
 // @Param   MyChartClassifyId   query   int  true       "我的图表分类id"
 // @Param   MyChartClassifyId   query   int  true       "我的图表分类id"
 // @Param   MyChartId   query   int  true       "我的图表id"
 // @Param   MyChartId   query   int  true       "我的图表id"
+// @Param   IsShared   query   bool  false       "是否可分享(如从图库框架请求的属于可分享的)"
 // @Success 200 {object} data_manage.MyChartListResp
 // @Success 200 {object} data_manage.MyChartListResp
 // @router /list [get]
 // @router /list [get]
 func (this *MyChartController) MyChartList() {
 func (this *MyChartController) MyChartList() {
@@ -1164,6 +1165,7 @@ func (this *MyChartController) MyChartList() {
 	currentIndex, _ := this.GetInt("CurrentIndex")
 	currentIndex, _ := this.GetInt("CurrentIndex")
 
 
 	myChartId, _ := this.GetInt("MyChartId")
 	myChartId, _ := this.GetInt("MyChartId")
+	isShared, _ := this.GetBool("IsShared")
 
 
 	var total int
 	var total int
 	page := paging.GetPaging(currentIndex, pageSize, total)
 	page := paging.GetPaging(currentIndex, pageSize, total)
@@ -1180,14 +1182,30 @@ func (this *MyChartController) MyChartList() {
 	var condition string
 	var condition string
 	var pars []interface{}
 	var pars []interface{}
 
 
-	condition += " AND (a.admin_id=?  or  d.is_public=1)"
-	pars = append(pars, sysUser.AdminId)
-
+	chartAdminId := sysUser.AdminId
 	if myChartClassifyId > 0 {
 	if myChartClassifyId > 0 {
 		condition += " AND c.my_chart_classify_id=? "
 		condition += " AND c.my_chart_classify_id=? "
 		pars = append(pars, myChartClassifyId)
 		pars = append(pars, myChartClassifyId)
+
+		// 可共享
+		if isShared {
+			myClassify, e := data_manage.GetMyChartClassifyByClassifyId(myChartClassifyId)
+			if e != nil {
+				if e.Error() == utils.ErrNoRow() {
+					br.Msg = "分类已被删除, 请刷新页面"
+					return
+				}
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取分类失败, Err: " + e.Error()
+				return
+			}
+			chartAdminId = myClassify.AdminId
+		}
 	}
 	}
 
 
+	condition += " AND (a.admin_id = ? OR d.is_public = 1)"
+	pars = append(pars, chartAdminId)
+
 	if myChartId > 0 {
 	if myChartId > 0 {
 		condition += " AND a.my_chart_id=? "
 		condition += " AND a.my_chart_id=? "
 		pars = append(pars, myChartId)
 		pars = append(pars, myChartId)

+ 842 - 0
controllers/data_stat/edb_source_stat.go

@@ -0,0 +1,842 @@
+package data_stat
+
+import (
+	"encoding/json"
+	"eta/eta_api/controllers"
+	"eta/eta_api/models"
+	"eta/eta_api/models/data_manage"
+	"eta/eta_api/models/data_stat"
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"strings"
+	"time"
+)
+
+// EdbSourceStatController 数据源统计表管理模块
+type EdbSourceStatController struct {
+	controllers.BaseAuthController
+}
+
+// Column
+// @Title 数据源统计表自定义列列表
+// @Description 查询 数据源统计表自定义列列表
+// @Success 200 {object} data_stat.StatColumnList
+// @router /source_column [get]
+func (this *EdbSourceStatController) Column() {
+	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
+	}
+	columnType, _ := this.GetInt("ColumnType")
+	if columnType <= 0 {
+		br.Msg = "请选择表类型"
+		return
+	}
+	tmpList, err := data_stat.GetStatColumn(columnType)
+	if err != nil {
+		br.Msg = "获取自定义列失败"
+		br.ErrMsg = "获取自定义列失败,Err:" + err.Error()
+		return
+	}
+	var list []*data_stat.EdbInfoStatColumnListItem
+	for _, v := range tmpList {
+		tmp := new(data_stat.EdbInfoStatColumnListItem)
+		tmp.ColumnKey = v.ColumnKey
+		tmp.IsShow = v.IsShow
+		tmp.ColumnName = v.ColumnName
+		tmp.Id = v.Id
+		tmp.IsMust = v.IsMust
+		tmp.IsSort = v.IsSort
+		tmp.Type = v.Type
+		list = append(list, tmp)
+	}
+	var statColumnList data_stat.StatColumnList
+	statColumnList.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = statColumnList
+}
+
+// EditColumn
+// @Title 编辑数据源统计表自定义列
+// @Description 编辑 数据源统计表自定义列列表
+// @Success 200 {object} data_stat.StatColumnList
+// @router /source_column/edit [post]
+func (this *EdbSourceStatController) EditColumn() {
+	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_stat.EditStatColumnReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if len(req.List) <= 0 {
+		br.Msg = "请选择要修改的列"
+		br.IsSendEmail = false
+		return
+	}
+
+	tmpList, err := data_stat.GetAllStatColumn()
+	if err != nil {
+		br.Msg = "获取自定义列失败"
+		br.ErrMsg = "获取自定义列失败,Err:" + err.Error()
+		return
+	}
+	isMustMap := make(map[int]data_stat.EdbInfoStatColumn)
+	if len(tmpList) > 0 {
+		for _, v := range tmpList {
+			if v.IsMust == 1 {
+				isMustMap[v.Id] = v
+			}
+		}
+	}
+
+	var list []*data_stat.EdbInfoStatColumn
+	for k, v := range req.List {
+		if v.Id == 0 {
+			br.Msg = "列序号不能为空"
+			return
+		}
+
+		if v.IsShow == 0 {
+			if exist, ok := isMustMap[v.Id]; ok {
+				br.Msg = exist.ColumnName + "为必选列!"
+				return
+			}
+		}
+		tmp := new(data_stat.EdbInfoStatColumn)
+		tmp.Id = v.Id
+		tmp.Sort = k + 1
+		tmp.IsShow = v.IsShow
+		list = append(list, tmp)
+	}
+
+	err = data_stat.UpdateStatColumn(list)
+	if err != nil {
+		br.Msg = "更新自定义列操作失败!"
+		br.ErrMsg = "更新自定义列操作失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	return
+}
+
+// EdbDeleteLog
+// @Title 查询删除指标列表
+// @Description 查询删除指标列表接口
+// @Success 200 {object} data_stat.GetEdbDeleteLogResp
+// @router /edb_delete_log [get]
+func (this *EdbSourceStatController) EdbDeleteLog() {
+	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
+	}
+
+	sortParamReq := this.GetString("SortParam", "")
+	sortType := this.GetString("SortType", "desc")
+	createTime := this.GetString("CreateTime", "")
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	condition := " and source = ?"
+	var pars []interface{}
+	pars = append(pars, utils.DATA_SOURCE_MYSTEEL_CHEMICAL)
+
+	if createTime != "" {
+		startT, err := time.ParseInLocation(utils.FormatDate, createTime, time.Local)
+		if err != nil {
+			br.Msg = "请求时间格式错误"
+			return
+		}
+		endT := startT.AddDate(0, 0, 1)
+		condition += " AND create_time >= ? AND create_time < ?"
+		pars = append(pars, createTime, endT.Format(utils.FormatDate))
+	}
+
+	sortStr := ``
+	sortParam := ``
+	if sortParamReq != `` {
+		switch sortParamReq {
+		case "CreateTime":
+			sortParam = "create_time"
+		case "DataUpdateTime":
+			sortParam = "data_update_time"
+		case "ErDataUpdateDate":
+			sortParam = "er_data_update_date"
+		case "LatestDate":
+			sortParam = "latest_date"
+		case "StartDate":
+			sortParam = "start_date"
+		}
+		if sortParam == "" {
+			br.Msg = "请输入正确的排序字段"
+			return
+		}
+		if strings.ToLower(sortType) != "asc" && strings.ToLower(sortType) != "desc" {
+			br.Msg = "请输入正确的排序类型"
+			return
+		}
+		sortStr = fmt.Sprintf(" order by %s %s, id desc ", sortParam, sortType)
+	}
+	total, err := data_stat.GetEdbDeleteLogCount(condition, pars)
+	if err != nil {
+		if err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取指标删除列表总数失败"
+			br.ErrMsg = "获取指标删除列表总数失败,Err:" + err.Error()
+			return
+		} else {
+			err = nil
+		}
+	}
+	list := make([]*data_stat.EdbInfoDeleteLogItem, 0)
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	if total == 0 {
+		resp := data_stat.GetEdbDeleteLogResp{
+			Paging: page,
+			List:   list,
+		}
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		br.Data = resp
+		return
+	}
+	tmpList, err := data_stat.GetEdbDeleteLogByCondition(condition, pars, sortStr, pageSize, startSize)
+	if err != nil {
+		br.Msg = "获取指标删除列表失败"
+		br.ErrMsg = "获取指标删除列表失败,Err:" + err.Error()
+		return
+	}
+
+	for _, v := range tmpList {
+		tmp := new(data_stat.EdbInfoDeleteLogItem)
+		tmp.EdbCode = v.EdbCode
+		tmp.EdbInfoId = v.EdbInfoId
+		tmp.Id = v.Id
+		tmp.StartDate = v.StartDate
+		tmp.EndDate = v.EndDate
+		tmp.Unit = v.Unit
+		tmp.TerminalCode = v.TerminalCode
+		tmp.CreateTime = v.CreateTime
+		tmp.EdbCreateTime = v.EdbCreateTime
+		tmp.Frequency = v.Frequency
+		tmp.Source = v.Source
+		tmp.SourceName = v.SourceName
+		tmp.EdbName = v.EdbName
+		tmp.EdbNameEn = v.EdbNameEn
+		tmp.EdbNameSource = v.EdbNameSource
+		tmp.LatestDate = v.LatestDate
+
+		tmp.DelSysUserId = v.DelSysUserId
+		tmp.DelSysUserRealName = v.DelSysUserRealName
+		tmp.SysUserId = v.SysUserId
+		tmp.SysUserRealName = v.SysUserRealName
+		tmp.LatestValue = v.LatestValue
+		if v.DataUpdateTime != utils.EmptyDateTimeStr {
+			tmp.DataUpdateTime = v.DataUpdateTime
+		}
+		if v.ErDataUpdateDate != utils.EmptyDateStr {
+			tmp.ErDataUpdateDate = v.ErDataUpdateDate
+		}
+		list = append(list, tmp)
+	}
+
+	resp := data_stat.GetEdbDeleteLogResp{
+		Paging: page,
+		List:   list,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// EdbUpdateLog
+// @Title 查询指标信息变更列表
+// @Description 查询指标信息变更列表接口
+// @Success 200 {object} data_stat.GetEdbUpdateLogResp
+// @router /edb_update_log [get]
+func (this *EdbSourceStatController) EdbUpdateLog() {
+	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
+	}
+
+	sortParamReq := this.GetString("SortParam", "")
+	sortType := this.GetString("SortType", "desc")
+	createTime := this.GetString("CreateTime", "")
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	condition := " and source = ? and (data_update_result=1 or data_update_result=0)"
+	var pars []interface{}
+	pars = append(pars, utils.DATA_SOURCE_MYSTEEL_CHEMICAL)
+
+	if createTime != "" {
+		startT, err := time.ParseInLocation(utils.FormatDate, createTime, time.Local)
+		if err != nil {
+			br.Msg = "请求时间格式错误"
+			return
+		}
+		endT := startT.AddDate(0, 0, 1)
+		condition += " AND create_time >= ? AND create_time < ?"
+		pars = append(pars, createTime, endT.Format(utils.FormatDate))
+	}
+
+	sortStr := ``
+	sortParam := ``
+	if sortParamReq != `` {
+		switch sortParamReq {
+		case "CreateTime":
+			sortParam = "create_time"
+		case "DataUpdateTime":
+			sortParam = "data_update_time"
+		case "ErDataUpdateDate":
+			sortParam = "er_data_update_date"
+		case "LatestDate":
+			sortParam = "latest_date"
+		case "StartDate":
+			sortParam = "start_date"
+		}
+		if sortParam == "" {
+			br.Msg = "请输入正确的排序字段"
+			return
+		}
+		if strings.ToLower(sortType) != "asc" && strings.ToLower(sortType) != "desc" {
+			br.Msg = "请输入正确的排序类型"
+			return
+		}
+		sortStr = fmt.Sprintf(" order by %s %s, id desc ", sortParam, sortType)
+	}
+	total, err := data_stat.GetEdbUpdateLogCount(condition, pars)
+	if err != nil {
+		if err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取指标删除列表总数失败"
+			br.ErrMsg = "获取指标删除列表总数失败,Err:" + err.Error()
+			return
+		} else {
+			err = nil
+		}
+	}
+	list := make([]*data_stat.EdbInfoUpdateLogItem, 0)
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	if total == 0 {
+		resp := data_stat.GetEdbUpdateLogResp{
+			Paging: page,
+			List:   list,
+		}
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		br.Data = resp
+		return
+	}
+	tmpList, err := data_stat.GetEdbUpdateLogByCondition(condition, pars, sortStr, pageSize, startSize)
+	if err != nil {
+		br.Msg = "获取指标更新列表失败"
+		br.ErrMsg = "获取指标更新列表失败,Err:" + err.Error()
+		return
+	}
+
+	for _, v := range tmpList {
+		tmp := new(data_stat.EdbInfoUpdateLogItem)
+		tmp.Id = v.Id
+		tmp.EdbInfoId = v.EdbInfoId
+		tmp.SourceName = v.SourceName
+		tmp.Source = v.Source
+		tmp.EdbCode = v.EdbCode
+		tmp.EdbName = v.EdbName
+		tmp.EdbNameSource = v.EdbNameSource
+		tmp.Frequency = v.Frequency
+		tmp.Unit = v.Unit
+		tmp.StartDate = v.StartDate
+		tmp.EndDate = v.EndDate
+		tmp.SysUserId = v.SysUserId
+		tmp.SysUserRealName = v.SysUserRealName
+		tmp.UpdateSysUserRealName = v.UpdateSysUserRealName
+		tmp.UpdateSysUserId = v.UpdateSysUserId
+		tmp.UniqueCode = v.UniqueCode
+		tmp.CreateTime = v.CreateTime.Format(utils.FormatDateTime)
+		tmp.LatestDate = v.LatestDate
+		tmp.LatestValue = v.LatestValue
+		tmp.TerminalCode = v.TerminalCode
+		if v.DataUpdateTime != utils.EmptyDateTimeStr {
+			tmp.DataUpdateTime = v.DataUpdateTime
+		}
+		if v.ErDataUpdateDate != utils.EmptyDateStr {
+			tmp.ErDataUpdateDate = v.ErDataUpdateDate
+		}
+		list = append(list, tmp)
+	}
+
+	resp := data_stat.GetEdbUpdateLogResp{
+		Paging: page,
+		List:   list,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// EdbUpdateStat
+// @Title 查询数据源明细列表
+// @Description 查询数据源明细列表接口
+// @Success 200 {object} data_stat.GetEdbUpdateStatResp
+// @router /edb_update_stat [get]
+func (this *EdbSourceStatController) EdbUpdateStat() {
+	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
+	}
+
+	sortParamReq := this.GetString("SortParam", "")
+	sortType := this.GetString("SortType", "desc")
+	terminalCode := this.GetString("TerminalCode", "")
+	sysUserId := this.GetString("SysUserId", "")
+	frequency := this.GetString("Frequency", "")
+	keyWord := this.GetString("KeyWord", "") //指标编码/指标名称
+
+	createTime := this.GetString("CreateTime", "")
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	condition := " and source = ?"
+	var pars []interface{}
+	pars = append(pars, utils.DATA_SOURCE_MYSTEEL_CHEMICAL)
+	if createTime != "" {
+		startT, err := time.ParseInLocation(utils.FormatDate, createTime, time.Local)
+		if err != nil {
+			br.Msg = "请求时间格式错误"
+			return
+		}
+		endT := startT.AddDate(0, 0, 1)
+		condition += " AND create_time >= ? AND create_time < ?"
+		pars = append(pars, createTime, endT.Format(utils.FormatDate))
+	}
+
+	if terminalCode != "" {
+		codeSlice := strings.Split(terminalCode, ",")
+		condition += ` AND terminal_code IN (` + utils.GetOrmInReplace(len(codeSlice)) + `)`
+		pars = append(pars, codeSlice)
+	}
+
+	if sysUserId != "" {
+		sysUserIdSlice := strings.Split(sysUserId, ",")
+		condition += ` AND sys_user_id IN (` + utils.GetOrmInReplace(len(sysUserIdSlice)) + `)`
+		pars = append(pars, sysUserIdSlice)
+	}
+
+	if frequency != "" {
+		frequencySlice := strings.Split(frequency, ",")
+		condition += ` AND frequency IN (` + utils.GetOrmInReplace(len(frequencySlice)) + `)`
+		pars = append(pars, frequencySlice)
+	}
+
+	if keyWord != "" {
+		condition += ` AND (edb_name LIKE ? OR edb_code LIKE ? ) `
+		pars = append(pars, "%"+keyWord+"%", "%"+keyWord+"%")
+	}
+
+	sortStr := ``
+	sortParam := ``
+	if sortParamReq != `` {
+		switch sortParamReq {
+		case "CreateTime":
+			sortParam = "create_time"
+		case "UpdateTime":
+			sortParam = "update_time"
+		case "DataUpdateTime":
+			sortParam = "data_update_time"
+		case "ErDataUpdateDate":
+			sortParam = "er_data_update_date"
+		case "LatestDate":
+			sortParam = "latest_date"
+		case "StartDate":
+			sortParam = "start_date"
+		}
+		if sortParam == "" {
+			br.Msg = "请输入正确的排序字段"
+			return
+		}
+		if strings.ToLower(sortType) != "asc" && strings.ToLower(sortType) != "desc" {
+			br.Msg = "请输入正确的排序类型"
+			return
+		}
+		sortStr = fmt.Sprintf(" order by %s %s, id desc ", sortParam, sortType)
+	}
+	total, err := data_stat.GetEdbUpdateStatCount(condition, pars)
+	if err != nil {
+		if err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取指标删除列表总数失败"
+			br.ErrMsg = "获取指标删除列表总数失败,Err:" + err.Error()
+			return
+		} else {
+			err = nil
+		}
+	}
+	list := make([]*data_stat.EdbInfoUpdateStatItem, 0)
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	if total == 0 {
+		resp := data_stat.GetEdbUpdateStatResp{
+			Paging: page,
+			List:   list,
+		}
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		br.Data = resp
+		return
+	}
+	tmpList, err := data_stat.GetEdbUpdateStatByCondition(condition, pars, sortStr, pageSize, startSize)
+	if err != nil {
+		br.Msg = "获取指标更新列表失败"
+		br.ErrMsg = "获取指标更新列表失败,Err:" + err.Error()
+		return
+	}
+
+	for _, v := range tmpList {
+		tmp := new(data_stat.EdbInfoUpdateStatItem)
+		tmp.Id = v.Id
+		tmp.EdbInfoId = v.EdbInfoId
+		tmp.SourceName = v.SourceName
+		tmp.Source = v.Source
+		tmp.EdbCode = v.EdbCode
+		tmp.EdbName = v.EdbName
+		tmp.EdbNameSource = v.EdbNameSource
+		tmp.Frequency = v.Frequency
+		tmp.Unit = v.Unit
+		tmp.StartDate = v.StartDate
+		tmp.SysUserId = v.SysUserId
+		tmp.SysUserRealName = v.SysUserRealName
+		tmp.LatestDate = v.LatestDate
+		tmp.LatestValue = v.LatestValue
+		tmp.TerminalCode = v.TerminalCode
+		if v.DataUpdateTime != utils.EmptyDateTimeStr {
+			tmp.DataUpdateTime = v.DataUpdateTime
+		}
+		if v.ErDataUpdateDate != utils.EmptyDateStr {
+			tmp.ErDataUpdateDate = v.ErDataUpdateDate
+		}
+		tmp.DataUpdateResult = v.DataUpdateResult
+		tmp.DataUpdateFailedReason = v.DataUpdateFailedReason
+		if v.UpdateTime != utils.EmptyDateTimeStr {
+			tmp.UpdateTime = v.UpdateTime
+		}
+		tmp.IsAdd = v.IsAdd
+		tmp.NeedRefresh = v.NeedRefresh
+		tmp.HasRefresh = v.HasRefresh
+		list = append(list, tmp)
+	}
+
+	resp := data_stat.GetEdbUpdateStatResp{
+		Paging: page,
+		List:   list,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// EdbSourceStat
+// @Title 查询数据源统计列表
+// @Description 查询数据源统计列表接口
+// @Success 200 {object} data_stat.GetEdbUpdateLogResp
+// @router /source_stat [get]
+func (this *EdbSourceStatController) EdbSourceStat() {
+	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
+	}
+
+	sortParamReq := this.GetString("SortParam", "")
+	sortType := this.GetString("SortType", "desc")
+	createTime := this.GetString("CreateTime", "")
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	condition := " and source = ?"
+	var pars []interface{}
+	pars = append(pars, utils.DATA_SOURCE_MYSTEEL_CHEMICAL)
+
+	if createTime != "" {
+		startT, err := time.ParseInLocation(utils.FormatDate, createTime, time.Local)
+		if err != nil {
+			br.Msg = "请求时间格式错误"
+			return
+		}
+		endT := startT.AddDate(0, 0, 1)
+		condition += " AND create_time >= ? AND create_time < ?"
+		pars = append(pars, createTime, endT.Format(utils.FormatDate))
+	}
+
+	sortStr := ``
+	sortParam := ``
+	if sortParamReq != `` {
+		switch sortParamReq {
+		case "EdbNum":
+			sortParam = "edb_num"
+		case "NeedRefreshNum":
+			sortParam = "need_refresh_num"
+		case "hasRefreshNum":
+			sortParam = "has_refresh_num"
+		case "UpdateSuccessNum":
+			sortParam = "update_success_num"
+		case "UpdateFailedNum":
+			sortParam = "update_failed_num"
+		}
+
+		if sortParam == "" {
+			br.Msg = "请输入正确的排序字段"
+			return
+		}
+		if strings.ToLower(sortType) != "asc" && strings.ToLower(sortType) != "desc" {
+			br.Msg = "请输入正确的排序类型"
+			return
+		}
+		sortStr = fmt.Sprintf(" order by %s %s, id desc ", sortParam, sortType)
+	}
+	total, err := data_stat.GetEdbSourceStatCount(condition, pars)
+	if err != nil {
+		if err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取数据源统计列表总数失败"
+			br.ErrMsg = "获取数据源统计列表总数失败,Err:" + err.Error()
+			return
+		} else {
+			err = nil
+		}
+	}
+	list := make([]*data_stat.EdbInfoSourceStatItem, 0)
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	if total == 0 {
+		resp := data_stat.GetEdbSourceStatResp{
+			Paging: page,
+			List:   list,
+		}
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		br.Data = resp
+		return
+	}
+	tmpList, err := data_stat.GetEdbSourceStatByCondition(condition, pars, sortStr, pageSize, startSize)
+	if err != nil {
+		br.Msg = "获取指标删除列表失败"
+		br.ErrMsg = "获取指标删除列表失败,Err:" + err.Error()
+		return
+	}
+
+	for _, v := range tmpList {
+		tmp := new(data_stat.EdbInfoSourceStatItem)
+		tmp.Id = v.Id
+		tmp.SourceName = v.SourceName
+		tmp.Source = v.Source
+		tmp.TerminalCode = v.TerminalCode
+		tmp.EdbNum = v.EdbNum
+		tmp.EdbNewNum = v.EdbNewNum
+		tmp.EdbDelNum = v.EdbDelNum
+		tmp.NeedRefreshNum = v.NeedRefreshNum
+		tmp.HasRefreshNum = v.HasRefreshNum
+		tmp.UpdateSuccessNum = v.UpdateSuccessNum
+		tmp.UpdateFailedNum = v.UpdateFailedNum
+		tmp.RefreshSuccessNum = v.RefreshSuccessNum
+		tmp.RefreshFailedNum = v.RefreshFailedNum
+		list = append(list, tmp)
+	}
+
+	resp := data_stat.GetEdbSourceStatResp{
+		Paging: page,
+		List:   list,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// EdbUpdateFailedList
+// @Title 查询指标更新失败详情列表
+// @Description 查询指标更新失败详情列表
+// @Success 200 {object} data_stat.GetEdbUpdateLogResp
+// @router /edb_update_stat/failed [get]
+func (this *EdbSourceStatController) EdbUpdateFailedList() {
+	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
+	}
+
+	terminalCode := this.GetString("TerminalCode", "")
+	createTime := this.GetString("CreateTime", "")
+
+	if terminalCode == "" {
+		br.Msg = "请选择对应的终端信息"
+		return
+	}
+	terminalInfo, err := data_manage.GetEdbTerminalByTerminalCode(terminalCode)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "终端不存在"
+			return
+		}
+		br.Msg = "查询终端信息出错"
+		br.ErrMsg = "查询终端信息出错 Err:" + err.Error()
+		return
+	}
+	condition := " and source = ? and terminal_code = ?"
+	var pars []interface{}
+	pars = append(pars, utils.DATA_SOURCE_MYSTEEL_CHEMICAL, terminalCode)
+
+	if createTime != "" {
+		startT, err := time.ParseInLocation(utils.FormatDate, createTime, time.Local)
+		if err != nil {
+			br.Msg = "请求时间格式错误"
+			return
+		}
+		endT := startT.AddDate(0, 0, 1)
+		condition += " AND create_time >= ? AND create_time < ?"
+		pars = append(pars, createTime, endT.Format(utils.FormatDate))
+	}
+
+	tmpList, err := data_stat.GetEdbUpdateStatFailedGroupByCondition(condition, pars)
+	if err != nil {
+		br.Msg = "获取指标更新失败详情列表 失败"
+		br.ErrMsg = "获取指标更新失败详情列表 失败,Err:" + err.Error()
+		return
+	}
+
+	list := make([]*data_stat.EdbUpdateFailedList, 0)
+	successNum := 0
+	failedNum := 0
+	if len(tmpList) > 0 {
+		for _, v := range tmpList {
+			if v.SourceUpdateResult == 1 {
+				successNum += v.Num
+			} else {
+				failedNum += v.Num
+				list = append(list, v)
+			}
+		}
+	}
+	resp := data_stat.GetEdbUpdateFailedResp{
+		List:             list,
+		Name:             terminalInfo.Name,
+		TerminalCode:     terminalCode,
+		DirPath:          terminalInfo.DirPath,
+		UpdateSuccessNum: successNum,
+		UpdateFailedNum:  failedNum,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 200 - 0
controllers/data_stat/edb_terminal.go

@@ -0,0 +1,200 @@
+package data_stat
+
+import (
+	"encoding/json"
+	"eta/eta_api/controllers"
+	"eta/eta_api/models"
+	"eta/eta_api/models/data_manage"
+	"eta/eta_api/services/data_stat"
+	"eta/eta_api/utils"
+)
+
+// EdbTerminalController 数据源终端管理
+type EdbTerminalController struct {
+	controllers.BaseAuthController
+}
+
+// Save
+// @Title 保存数据源终端
+// @Description 保存数据源终端接口
+// @Param	request  body  true data_manage.AddEdbTerminalListReq  "type json string"
+// @Success 200 string "操作成功"
+// @router /terminal/save [post]
+func (this *EdbTerminalController) Save() {
+	br := new(models.BaseResponse).Init()
+	br.IsSendEmail = false
+	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.AddEdbTerminalListReq
+	if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.Name == "" {
+		br.Msg = "请输入终端名称"
+		return
+	}
+	/*if req.ServerUrl == "" && req.Value == "" {
+		br.Msg = "请输入终端地址或者token"
+		return
+	}*/
+	if req.Num <= 0 {
+		br.Msg = "请输入指标数据量"
+		return
+	}
+	if req.Source == 0 {
+		br.Msg = "请输入终端类型"
+		return
+	}
+
+	// todo 校验终端数据
+
+	errMsg, err := data_stat.SaveEdbTerminal(req)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = "SaveEnglishVideoCover ErrMsg:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+	return
+}
+
+// SetStatus
+// @Title 启用/禁用数据源终端
+// @Description 启用/禁用数据源终端
+// @Param	request  body  true data_manage.SetEdbTerminalStatusReq  "type json string"
+// @Success 200 string "操作成功"
+// @router /terminal/status/set [post]
+func (this *EdbTerminalController) SetStatus() {
+	br := new(models.BaseResponse).Init()
+	br.IsSendEmail = false
+	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.SetEdbTerminalStatusReq
+	if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.TerminalId <= 0 {
+		br.Msg = "请选择要操作的终端"
+		return
+	}
+
+	if req.Status != 1 && req.Status != 2 {
+		br.Msg = "请选择正确的终端状态"
+		return
+	}
+
+	errMsg, err := data_stat.SetEdbTerminalStatus(req.TerminalId, req.Status)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = "SetEdbTerminalStatus ErrMsg:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+	return
+}
+
+// List
+// @Title 数据源终端列表
+// @Description 数据源终端列表接口
+// @Success 200 {object} data_manage.EdbTerminalLisResp
+// @router /terminal/list [get]
+func (this *EdbTerminalController) List() {
+	br := new(models.BaseResponse).Init()
+	br.IsSendEmail = false
+	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
+	}
+
+	list, err := data_manage.GetEdbTerminalList()
+	if err != nil {
+		br.Msg = "获取终端列表失败"
+		br.ErrMsg = "获取终端列表失败 ErrMsg:" + err.Error()
+		return
+	}
+	resp := &data_manage.EdbTerminalListResp{
+		List: list,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// TerminalCodeList
+// @Title 数据源终端列表
+// @Description 数据源终端列表接口
+// @Success 200 {object} data_manage.EdbTerminalCodeResp
+// @router /terminal/code [get]
+func (this *EdbTerminalController) TerminalCodeList() {
+	br := new(models.BaseResponse).Init()
+	br.IsSendEmail = false
+	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
+	}
+	source, _ := this.GetInt("Source", utils.DATA_SOURCE_MYSTEEL_CHEMICAL)
+	list, err := data_manage.GetEdbTerminalBySource(source)
+	if err != nil {
+		br.Msg = "获取终端列表失败"
+		br.ErrMsg = "获取终端列表失败 ErrMsg:" + err.Error()
+		return
+	}
+	codeList := make([]*data_manage.EdbTerminalCode, 0)
+	if len(list) > 0 {
+		for _, v := range list {
+			tmp := new(data_manage.EdbTerminalCode)
+			tmp.TerminalCode = v.TerminalCode
+			tmp.Source = v.Source
+			tmp.Name = v.Name
+			codeList = append(codeList, tmp)
+		}
+	}
+	resp := &data_manage.EdbTerminalCodeResp{
+		List: codeList,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 1 - 1
controllers/target.go

@@ -3475,7 +3475,7 @@ func (this *TargetController) ExcelDataAdd() {
 			if i > 4 {
 			if i > 4 {
 				for index := 1; index < len(req.Data[i]); index++ {
 				for index := 1; index < len(req.Data[i]); index++ {
 					if req.Data[i][index] == nil {
 					if req.Data[i][index] == nil {
-						break
+						continue
 					}
 					}
 					valueMap := req.Data[i][index].(map[string]interface{})
 					valueMap := req.Data[i][index].(map[string]interface{})
 					value, _ := valueMap["m"]
 					value, _ := valueMap["m"]

+ 5 - 0
models/data_manage/edb_info.go

@@ -46,7 +46,12 @@ type EdbInfo struct {
 	Calendar         string  `description:"公历/农历" orm:"default(公历);"`
 	Calendar         string  `description:"公历/农历" orm:"default(公历);"`
 	DataDateType     string  `orm:"column(data_date_type);size(255);null;default(交易日)"`
 	DataDateType     string  `orm:"column(data_date_type);size(255);null;default(交易日)"`
 	ManualSave       int     `description:"是否有手动保存过上下限: 0-否; 1-是"`
 	ManualSave       int     `description:"是否有手动保存过上下限: 0-否; 1-是"`
+	TerminalCode     string  `description:"终端编码,用于配置在机器上"`
+	DataUpdateTime   string  `description:"最近一次数据发生变化的时间"`
+	ErDataUpdateDate string  `description:"本次更新,数据发生变化的最早日期"`
+	SourceIndexName  string  `description:"数据源中的指标名称"`
 }
 }
+
 type EdbInfoFullClassify struct {
 type EdbInfoFullClassify struct {
 	*EdbInfo
 	*EdbInfo
 	CorrelationStr string `description:"相关性系数字符串"`
 	CorrelationStr string `description:"相关性系数字符串"`

+ 105 - 2
models/data_manage/edb_terminal.go

@@ -1,6 +1,7 @@
 package data_manage
 package data_manage
 
 
 import (
 import (
+	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/beego/beego/v2/client/orm"
 	"time"
 	"time"
 )
 )
@@ -9,18 +10,120 @@ import (
 type EdbTerminal struct {
 type EdbTerminal struct {
 	TerminalId   int       `orm:"column(terminal_id);pk"`
 	TerminalId   int       `orm:"column(terminal_id);pk"`
 	Source       int       `orm:"column(source)" description:"指标来源类型"`
 	Source       int       `orm:"column(source)" description:"指标来源类型"`
-	Name         string    `description:"终端名"`
+	Name         string    `description:"终端名"`
 	TerminalCode string    `description:"终端编码,用于配置在机器上"`
 	TerminalCode string    `description:"终端编码,用于配置在机器上"`
 	ServerUrl    string    `description:"终端地址"`
 	ServerUrl    string    `description:"终端地址"`
+	DirPath      string    `description:"终端存放的文件夹路径"`
 	Num          int       `description:"终端最大指标数"`
 	Num          int       `description:"终端最大指标数"`
+	Status       int       `description:"状态,1启用,2禁用"`
+	Value        string    `description:"终端相关的token"`
 	ModifyTime   time.Time `description:"修改时间"`
 	ModifyTime   time.Time `description:"修改时间"`
 	CreateTime   time.Time `description:"创建时间"`
 	CreateTime   time.Time `description:"创建时间"`
 }
 }
 
 
+type EdbTerminalItem struct {
+	TerminalId   int    `orm:"column(terminal_id);pk"`
+	Source       int    `description:"指标来源类型"`
+	Name         string `description:"终端别名"`
+	TerminalCode string `description:"终端编码,用于配置在机器上"`
+	ServerUrl    string `description:"终端地址"`
+	DirPath      string `description:"终端存放的文件夹路径"`
+	Num          int    `description:"终端最大指标数"`
+	Status       int    `description:"状态,1启用,2禁用"`
+	Value        string `description:"终端相关的token"`
+	ModifyTime   string `description:"修改时间"`
+	CreateTime   string `description:"创建时间"`
+}
+
+type EdbTerminalCode struct {
+	TerminalCode string `description:"终端编码,用于配置在机器上"`
+	Source       int    `description:"指标来源类型"`
+	Name         string `description:"终端别名"`
+}
+
 // GetEdbTerminalListBySource 根据指标来源类型获取所有的终端列表
 // GetEdbTerminalListBySource 根据指标来源类型获取所有的终端列表
 func GetEdbTerminalListBySource(source int) (items []*EdbTerminal, err error) {
 func GetEdbTerminalListBySource(source int) (items []*EdbTerminal, err error) {
 	o := orm.NewOrmUsingDB("data")
 	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT *  FROM edb_terminal WHERE source = ? ORDER BY terminal_id ASC `
+	sql := ` SELECT *  FROM edb_terminal WHERE source = ? and status=1 ORDER BY terminal_id ASC `
 	_, err = o.Raw(sql, source).QueryRows(&items)
 	_, err = o.Raw(sql, source).QueryRows(&items)
 	return
 	return
 }
 }
+
+type BaseIndexTerminalCode struct {
+	TerminalCode string `description:"终端编码,用于配置在机器上"`
+	IndexName    string
+}
+
+type EdbTerminalListResp struct {
+	List []*EdbTerminalItem `description:"列表数据"`
+}
+
+type EdbTerminalCodeResp struct {
+	List []*EdbTerminalCode `description:"终端编码列表"`
+}
+
+type AddEdbTerminalListReq struct {
+	TerminalId int    `description:"终端id"`
+	Source     int    `description:"指标来源类型"`
+	Name       string `description:"终端别名"`
+	//TerminalCode string `description:"终端编码,用于配置在机器上"`
+	ServerUrl string `description:"终端地址"`
+	DirPath   string `description:"终端存放的文件夹路径"`
+	Num       int    `description:"终端最大指标数"`
+	//Status    int    `description:"状态,1启用,2禁用"`
+	Value string `description:"终端相关的token"`
+}
+
+type SetEdbTerminalStatusReq struct {
+	TerminalId int `description:"终端id"`
+	Status     int `description:"状态,1启用,2禁用"`
+}
+
+// GetBaseIndexTerminalCode 获取数据源的终端code
+func GetBaseIndexTerminalCode(edbCode, tableName string) (item BaseIndexTerminalCode, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`select terminal_code, index_name from %s where index_code = ? `, tableName)
+	err = o.Raw(sql, edbCode).QueryRow(&item)
+	return
+}
+
+// GetEdbTerminalById 主键获取终端
+func GetEdbTerminalById(id int) (item *EdbTerminal, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM edb_terminal WHERE terminal_id = ? LIMIT 1`
+	err = o.Raw(sql, id).QueryRow(&item)
+	return
+}
+
+func GetEdbTerminalByTerminalCode(terminalCode string) (item *EdbTerminal, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM edb_terminal WHERE terminal_code = ? LIMIT 1`
+	err = o.Raw(sql, terminalCode).QueryRow(&item)
+	return
+}
+
+func GetEdbTerminalList() (item []*EdbTerminalItem, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_terminal ORDER BY terminal_id ASC`
+	_, err = o.Raw(sql).QueryRows(&item)
+	return
+}
+
+func GetEdbTerminalBySource(source int) (item []*EdbTerminalItem, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_terminal where source=? ORDER BY terminal_id ASC`
+	_, err = o.Raw(sql, source).QueryRows(&item)
+	return
+}
+
+func (item *EdbTerminal) Add() (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Insert(item)
+	return
+}
+
+func (item *EdbTerminal) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Update(item, cols...)
+	return
+}

+ 8 - 0
models/data_manage/my_chart.go

@@ -893,3 +893,11 @@ func GetChartInfoByIdList(chartInfoIdList []int) (items []*ChartInfo, err error)
 	_, err = o.Raw(sql, chartInfoIdList).QueryRows(&items)
 	_, err = o.Raw(sql, chartInfoIdList).QueryRows(&items)
 	return
 	return
 }
 }
+
+// GetMyChartClassifyByClassifyId 主键获取分类
+func GetMyChartClassifyByClassifyId(classifyId int) (item *MyChartClassify, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM my_chart_classify WHERE my_chart_classify_id = ? `
+	err = o.Raw(sql, classifyId).QueryRow(&item)
+	return
+}

+ 114 - 0
models/data_stat/edb_info_delete_log.go

@@ -0,0 +1,114 @@
+package data_stat
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+)
+
+// EdbInfoDeleteLog 指标删除日志表
+type EdbInfoDeleteLog struct {
+	Id                 uint64  `orm:"column(id);pk"`
+	EdbInfoId          int     `description:"指标ID"`
+	EdbInfoType        int     `description:"指标类型,0:普通指标,1:预测指标"`
+	SourceName         string  `description:"来源名称"`
+	Source             int     `description:"来源id"`
+	EdbCode            string  `description:"指标编码"`
+	EdbName            string  `description:"指标名称"`
+	EdbNameEn          string  `description:"英文指标名称"`
+	EdbNameSource      string  `description:"指标名称来源"`
+	Frequency          string  `description:"频率"`
+	Unit               string  `description:"单位"`
+	UnitEn             string  `description:"英文单位"`
+	StartDate          string  `description:"起始日期"`
+	EndDate            string  `description:"终止日期"`
+	SysUserId          int     `description:"创建人ID"`
+	SysUserRealName    string  `description:"创建人姓名"`
+	UniqueCode         string  `description:"指标唯一编码"`
+	EdbCreateTime      string  `description:"指标创建时间"`
+	EdbModifyTime      string  `description:"指标修改时间"`
+	CreateTime         string  `description:"创建时间即删除时间"`
+	MinValue           float64 `description:"指标最小值"`
+	MaxValue           float64 `description:"指标最大值"`
+	CalculateFormula   string  `description:"计算公式"`
+	EdbType            int     `description:"指标类型:1:基础指标,2:计算指标"`
+	LatestDate         string  `description:"数据最新日期"`
+	LatestValue        float64 `description:"数据最新值"`
+	MoveType           int     `description:"移动方式:1:领先(默认),2:滞后"`
+	MoveFrequency      string  `description:"移动频度"`
+	NoUpdate           int8    `description:"是否停止更新,0:继续更新;1:停止更新"`
+	ChartImage         string  `description:"图表图片"`
+	Calendar           string  `description:"公历/农历" orm:"default(公历);"`
+	DataDateType       string  `orm:"column(data_date_type);size(255);null;default(交易日)"`
+	ManualSave         int     `description:"是否有手动保存过上下限: 0-否; 1-是"`
+	TerminalCode       string  `description:"终端编码,用于配置在机器上"`
+	DelSysUserId       int     `description:"删除人ID"`
+	DelSysUserRealName string  `description:"删除人姓名"`
+	DataUpdateTime     string  `description:"最近一次数据发生变化的时间"`
+	ErDataUpdateDate   string  `description:"本次更新,数据发生变化的最早日期"`
+}
+
+type EdbInfoDeleteLogItem struct {
+	Id                 uint64  `orm:"column(id);"`
+	EdbInfoId          int     `description:"指标ID"`
+	EdbInfoType        int     `description:"指标类型,0:普通指标,1:预测指标"`
+	SourceName         string  `description:"来源名称"`
+	Source             int     `description:"来源id"`
+	EdbCode            string  `description:"指标编码"`
+	EdbName            string  `description:"指标名称"`
+	EdbNameEn          string  `description:"英文指标名称"`
+	EdbNameSource      string  `description:"指标名称来源"`
+	Frequency          string  `description:"频率"`
+	Unit               string  `description:"单位"`
+	StartDate          string  `description:"起始日期"`
+	EndDate            string  `description:"终止日期"`
+	SysUserId          int     `description:"创建人ID"`
+	SysUserRealName    string  `description:"创建人姓名"`
+	EdbCreateTime      string  `description:"指标创建时间"`
+	CreateTime         string  `description:"创建时间即删除时间"`
+	LatestDate         string  `description:"数据最新日期"`
+	LatestValue        float64 `description:"数据最新值"`
+	TerminalCode       string  `description:"终端编码,用于配置在机器上"`
+	DelSysUserId       int     `description:"删除人ID"`
+	DelSysUserRealName string  `description:"删除人姓名"`
+	DataUpdateTime     string  `description:"最近一次数据发生变化的时间"`
+	ErDataUpdateDate   string  `description:"本次更新,数据发生变化的最早日期"`
+}
+
+func AddEdbDeleteLog(item *EdbInfoDeleteLog) (lastId int64, err error) {
+	o := orm.NewOrmUsingDB("data")
+	lastId, err = o.Insert(item)
+	return
+}
+
+type GetEdbDeleteLogResp struct {
+	List   []*EdbInfoDeleteLogItem
+	Paging *paging.PagingItem
+}
+
+func GetEdbDeleteLogByCondition(condition string, pars []interface{}, orderStr string, pageSize, startSize int) (item []*EdbInfoDeleteLog, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_info_delete_log WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	if orderStr != "" {
+		sql += orderStr
+	} else {
+		sql += ` ORDER BY create_time DESC, id DESC `
+	}
+
+	sql += ` LIMIT ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&item)
+	return
+}
+
+// GetEdbDeleteLogCount
+func GetEdbDeleteLogCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT count(*) FROM edb_info_delete_log WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}

+ 74 - 0
models/data_stat/edb_info_stat_column.go

@@ -0,0 +1,74 @@
+package data_stat
+
+import "github.com/beego/beego/v2/client/orm"
+
+// EdbInfoStatColumn 数据源统计表自定义列
+type EdbInfoStatColumn struct {
+	Id         int    `orm:"column(id);pk" description:"自增id"`
+	ColumnName string `description:"字段名称"`
+	ColumnKey  string `description:"字段"`
+	CreateTime string `description:" 创建时间"`
+	ModifyTime string `description:"修改时间"`
+	Type       int    `description:"列表类型:1数据源明细表,2数据源统计表,3删除指标列表,4指标信息变更表"`
+	Sort       int    `description:"列排序"`
+	IsMust     int    `description:"是否必选列: 0非必选 1必须"`
+	IsSort     int    `description:"是否是允许排序的列,0否,1是"`
+	IsShow     int    `description:"是否展示:1展示,0不展示"`
+}
+
+type EdbInfoStatColumnListItem struct {
+	Id         int    `description:"自增id"`
+	ColumnName string `description:"字段名称"`
+	ColumnKey  string `description:"字段"`
+	Type       int    `description:"列表类型:1数据源明细表,2数据源统计表,3删除指标列表,4指标信息变更表"`
+	IsMust     int    `description:"是否必选列: 0非必选 1必须"`
+	IsSort     int    `description:"是否是允许排序的列,0否,1是"`
+	IsShow     int    `description:"是否展示:1展示,0不展示"`
+}
+
+type StatColumnList struct {
+	List []*EdbInfoStatColumnListItem
+}
+
+type EditStatColumnReq struct {
+	List []*EdbInfoStatColumnListReq
+}
+type EdbInfoStatColumnListReq struct {
+	Id     int `description:"自增id"`
+	IsShow int `description:"是否展示:1展示,0不展示"`
+}
+
+// GetStatColumn 获取自定义列
+func GetStatColumn(columnType int) (list []EdbInfoStatColumn, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM edb_info_stat_column WHERE type=? ORDER BY sort asc, id asc `
+	_, err = o.Raw(sql, columnType).QueryRows(&list)
+	return
+}
+
+// GetAllStatColumn 获取所有自定义列
+func GetAllStatColumn() (list []EdbInfoStatColumn, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM edb_info_stat_column ORDER BY sort asc, id asc  `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+// UpdateStatColumn 批量更新自定义列
+func UpdateStatColumn(list []*EdbInfoStatColumn) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	p, err := o.Raw("UPDATE edb_info_stat_column SET is_show = ?, sort=? WHERE id = ?").Prepare()
+	if err != nil {
+		return
+	}
+	defer func() {
+		_ = p.Close() // 别忘记关闭 statement
+	}()
+	for _, v := range list {
+		_, err = p.Exec(v.IsShow, v.Sort, v.Id)
+		if err != nil {
+			return
+		}
+	}
+	return
+}

+ 104 - 0
models/data_stat/edb_info_update_log.go

@@ -0,0 +1,104 @@
+package data_stat
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+// EdbInfoUpdateLog 指标更新/刷新日志列表
+type EdbInfoUpdateLog struct {
+	Id                     uint64    `orm:"column(id);pk"`
+	EdbInfoId              int       `description:"指标ID"`
+	SourceName             string    `description:"来源名称"`
+	Source                 int       `description:"来源id"`
+	EdbCode                string    `description:"指标编码"`
+	EdbName                string    `description:"指标名称"`
+	EdbNameSource          string    `description:"指标名称来源"`
+	Frequency              string    `description:"频率"`
+	Unit                   string    `description:"单位"`
+	StartDate              string    `description:"起始日期"`
+	EndDate                string    `description:"终止日期"`
+	SysUserId              int       `description:"创建人ID"`
+	SysUserRealName        string    `description:"创建人姓名"`
+	UniqueCode             string    `description:"指标唯一编码"`
+	EdbCreateTime          time.Time `description:"指标创建时间"`
+	EdbModifyTime          time.Time `description:"指标修改时间"`
+	CreateTime             time.Time `description:"创建时间"`
+	UpdateSysUserId        int       `description:"变更人ID"`
+	UpdateSysUserRealName  string    `description:"变更人姓名"`
+	LatestDate             string    `description:"数据最新日期"`
+	LatestValue            float64   `description:"数据最新值"`
+	TerminalCode           string    `description:"终端编码,用于配置在机器上"`
+	ErDataUpdateDate       string    `description:"本次更新,数据发生变化的最早日期"`
+	UpdateResult           int       `description:"本次刷新操作结果:1成功,2失败"`
+	UpdateFailedReason     string    `description:"刷新失败原因"`
+	DataUpdateResult       int       `description:"数据更新结果:1成功,2失败"`
+	DataUpdateFailedReason string    `description:"数据未正常更新原因"`
+	DataUpdateTime         string    `description:"数据更新时间"`
+	IsSourceRefresh        int       `description:"是否为终端刷新到数据源的刷新操作:0否,1是"`
+}
+
+type EdbInfoUpdateLogItem struct {
+	Id                    uint64 `orm:"column(id);pk"`
+	EdbInfoId             int    `description:"指标ID"`
+	SourceName            string `description:"来源名称"`
+	Source                int    `description:"来源id"`
+	EdbCode               string `description:"指标编码"`
+	EdbName               string `description:"指标名称"`
+	EdbNameSource         string `description:"指标名称来源"`
+	Frequency             string `description:"频率"`
+	Unit                  string `description:"单位"`
+	StartDate             string `description:"起始日期"`
+	EndDate               string `description:"终止日期"`
+	SysUserId             int    `description:"创建人ID"`
+	SysUserRealName       string `description:"创建人姓名"`
+	UpdateSysUserId       int    `description:"变更人ID"`
+	UpdateSysUserRealName string `description:"变更人姓名"`
+	CreateTime            string
+	UniqueCode            string  `description:"指标唯一编码"`
+	LatestDate            string  `description:"数据最新日期"`
+	LatestValue           float64 `description:"数据最新值"`
+	TerminalCode          string  `description:"终端编码,用于配置在机器上"`
+	DataUpdateTime        string  `description:"最近一次数据发生变化的时间"`
+	ErDataUpdateDate      string  `description:"本次更新,数据发生变化的最早日期"`
+}
+
+func AddEdbUpdateLog(item *EdbInfoUpdateLog) (lastId int64, err error) {
+	o := orm.NewOrmUsingDB("data")
+	lastId, err = o.Insert(item)
+	return
+}
+
+type GetEdbUpdateLogResp struct {
+	List   []*EdbInfoUpdateLogItem
+	Paging *paging.PagingItem
+}
+
+func GetEdbUpdateLogByCondition(condition string, pars []interface{}, orderStr string, pageSize, startSize int) (item []*EdbInfoUpdateLog, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_info_update_log WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	if orderStr != "" {
+		sql += orderStr
+	} else {
+		sql += ` ORDER BY create_time DESC, id DESC `
+	}
+
+	sql += ` LIMIT ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&item)
+	return
+}
+
+// GetEdbUpdateLogCount
+func GetEdbUpdateLogCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT count(*) FROM edb_info_update_log WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}

+ 145 - 0
models/data_stat/edb_info_update_stat.go

@@ -0,0 +1,145 @@
+package data_stat
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+// EdbInfoUpdateStat 指标更新/刷新 汇总表(数据源明细表)
+type EdbInfoUpdateStat struct {
+	Id                     uint64    `orm:"column(id);pk"`
+	EdbInfoId              int       `description:"指标ID"`
+	SourceName             string    `description:"来源名称"`
+	Source                 int       `description:"来源id"`
+	EdbCode                string    `description:"指标编码"`
+	EdbName                string    `description:"指标名称"`
+	EdbNameSource          string    `description:"指标名称来源"`
+	Frequency              string    `description:"频率"`
+	Unit                   string    `description:"单位"`
+	StartDate              string    `description:"起始日期"`
+	EndDate                string    `description:"终止日期"`
+	SysUserId              int       `description:"创建人ID"`
+	SysUserRealName        string    `description:"创建人姓名"`
+	UniqueCode             string    `description:"指标唯一编码"`
+	EdbCreateTime          time.Time `description:"指标创建时间"`
+	EdbModifyTime          time.Time `description:"指标修改时间"`
+	CreateTime             time.Time
+	UpdateTime             string  `description:"刷新时间"`
+	LatestDate             string  `description:"数据最新日期"`
+	LatestValue            float64 `description:"数据最新值"`
+	TerminalCode           string  `description:"终端编码,用于配置在机器上"`
+	ErDataUpdateDate       string  `description:"本次更新,数据发生变化的最早日期"`
+	DataUpdateResult       int     `description:"数据更新结果:1成功,2失败"`
+	DataUpdateFailedReason string  `description:"数据未正常更新原因"`
+	DataUpdateTime         string  `description:"数据更新时间"`
+	UpdateResult           int     `description:"本次刷新操作结果:1成功,2失败"`
+	UpdateFailedReason     string  `description:"刷新失败原因"`
+	ModifyTime             string  `description:"修改时间"`
+	IsAdd                  int8    `description:"是否是当日新增的指标:1是,2否"`
+	NeedRefresh            int8    `description:"今日是否需要定时刷新,1需要,0不需要"` //todo 确认该字段
+	HasRefresh             int8    `description:"今日是否已刷新,1是,0否"`
+}
+
+type EdbInfoUpdateStatItem struct {
+	Id                     uint64  `orm:"column(id);pk"`
+	EdbInfoId              int     `description:"指标ID"`
+	SourceName             string  `description:"来源名称"`
+	Source                 int     `description:"来源id"`
+	EdbCode                string  `description:"指标编码"`
+	EdbName                string  `description:"指标名称"`
+	EdbNameSource          string  `description:"指标名称来源"`
+	Frequency              string  `description:"频率"`
+	Unit                   string  `description:"单位"`
+	StartDate              string  `description:"起始日期"`
+	SysUserId              int     `description:"创建人ID"`
+	SysUserRealName        string  `description:"创建人姓名"`
+	LatestDate             string  `description:"数据最新日期"`
+	CreateTime             string  `description:"创建时间"`
+	LatestValue            float64 `description:"数据最新值"`
+	TerminalCode           string  `description:"终端编码,用于配置在机器上"`
+	ErDataUpdateDate       string  `description:"本次更新,数据发生变化的最早日期"`
+	DataUpdateResult       int     `description:"数据更新结果:1成功,2失败"`
+	DataUpdateFailedReason string  `description:"数据未正常更新原因"`
+	DataUpdateTime         string  `description:"数据更新时间"`
+	UpdateResult           int     `description:"本次刷新操作结果:1成功,2失败"`
+	UpdateFailedReason     string  `description:"刷新失败原因"`
+	UpdateTime             string  `description:"刷新时间"`
+	IsAdd                  int8    `description:"是否是当日新增的指标:1是,2否"`
+	NeedRefresh            int8    `description:"今日是否需要定时刷新,1需要,0不需要"`
+	HasRefresh             int8    `description:"今日是否已刷新,1是,0否"`
+}
+
+type GetEdbUpdateStatResp struct {
+	List   []*EdbInfoUpdateStatItem
+	Paging *paging.PagingItem
+}
+
+func GetEdbUpdateStatByCondition(condition string, pars []interface{}, orderStr string, pageSize, startSize int) (item []*EdbInfoUpdateStat, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_info_update_stat WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	if orderStr != "" {
+		sql += orderStr
+	} else {
+		sql += ` ORDER BY create_time DESC, id DESC `
+	}
+
+	sql += ` LIMIT ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&item)
+	return
+}
+
+// GetEdbUpdateStatCount
+func GetEdbUpdateStatCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT count(*) FROM edb_info_update_stat WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+type EdbUpdateFailedList struct {
+	TerminalCode             string `description:"终端编码,用于配置在机器上"`
+	SourceUpdateFailedReason string `description:"从终端刷新到数据源的数据未正常刷新原因"`
+	Frequency                string `description:"频率"`
+	SourceUpdateResult       int    `description:"从终端刷新到数据源的刷新结果:1成功,2失败"`
+	Num                      int
+}
+
+type GetEdbUpdateFailedResp struct {
+	List             []*EdbUpdateFailedList
+	Name             string `description:"终端名称"`
+	TerminalCode     string `description:"终端编码,用于配置在机器上"`
+	DirPath          string `description:"终端存放的文件夹路径"`
+	UpdateSuccessNum int    `description:"今日已更新成功指标数"`
+	UpdateFailedNum  int    `description:"今日已更新失败指标数"`
+}
+
+func GetEdbUpdateStatFailedGroupByCondition(condition string, pars []interface{}) (item []*EdbUpdateFailedList, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT
+	terminal_code,
+	data_update_result as source_update_result,
+	frequency,
+	data_update_failed_reason as source_update_failed_reason,
+	count(*) as num
+FROM
+	edb_info_update_stat 
+WHERE
+	data_update_result != 0`
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` GROUP BY
+	data_update_result,
+	frequency,
+	data_update_failed_reason
+	ORDER BY count(*) desc`
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}

+ 75 - 0
models/data_stat/edb_source_stat.go

@@ -0,0 +1,75 @@
+package data_stat
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+// EdbSourceStat 数据源统计表
+type EdbSourceStat struct {
+	Id                uint64    `orm:"column(id);pk"`
+	SourceName        string    `description:"来源名称"`
+	Source            int       `description:"来源id"`
+	TerminalCode      string    `description:"终端编码,用于配置在机器上"`
+	EdbNum            int32     `description:"指标总数"`
+	EdbNewNum         int32     `description:"今日新增指标数"`
+	EdbDelNum         int32     `description:"今日删除指标数"`
+	NeedRefreshNum    int       `description:"今日需刷新指标"`
+	HasRefreshNum     int       `description:"今日发起刷新任务指标数"`
+	UpdateSuccessNum  int       `description:"今日已更新成功指标数"`
+	UpdateFailedNum   int       `description:"今日已更新失败指标数"`
+	RefreshSuccessNum int       `description:"今日已刷新成功指标数"`
+	RefreshFailedNum  int       `description:"今日已刷新失败指标数"`
+	CreateTime        time.Time `description:"创建时间"`
+	ModifyTime        time.Time `description:"修改时间"`
+}
+
+type EdbInfoSourceStatItem struct {
+	Id                uint64 `orm:"column(id);pk"`
+	SourceName        string `description:"来源名称"`
+	Source            int    `description:"来源id"`
+	TerminalCode      string `description:"终端编码,用于配置在机器上"`
+	EdbNum            int32  `description:"指标总数"`
+	EdbNewNum         int32  `description:"今日新增指标数"`
+	EdbDelNum         int32  `description:"今日删除指标数"`
+	NeedRefreshNum    int    `description:"今日需刷新指标"`
+	HasRefreshNum     int    `description:"今日发起刷新任务指标数"`
+	UpdateSuccessNum  int    `description:"今日已更新成功指标数"`
+	UpdateFailedNum   int    `description:"今日已更新失败指标数"`
+	RefreshSuccessNum int    `description:"今日已刷新成功指标数"`
+	RefreshFailedNum  int    `description:"今日已刷新失败指标数"`
+}
+
+type GetEdbSourceStatResp struct {
+	List   []*EdbInfoSourceStatItem
+	Paging *paging.PagingItem
+}
+
+func GetEdbSourceStatByCondition(condition string, pars []interface{}, orderStr string, pageSize, startSize int) (item []*EdbSourceStat, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_source_stat WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	if orderStr != "" {
+		sql += orderStr
+	} else {
+		sql += ` ORDER BY create_time DESC, id DESC `
+	}
+
+	sql += ` LIMIT ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&item)
+	return
+}
+
+// GetEdbSourceStatCount
+func GetEdbSourceStatCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT count(*) FROM edb_source_stat WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}

+ 14 - 0
models/db.go

@@ -6,6 +6,7 @@ import (
 	"eta/eta_api/models/data_manage/excel"
 	"eta/eta_api/models/data_manage/excel"
 	future_good2 "eta/eta_api/models/data_manage/future_good"
 	future_good2 "eta/eta_api/models/data_manage/future_good"
 	"eta/eta_api/models/data_manage/supply_analysis"
 	"eta/eta_api/models/data_manage/supply_analysis"
+	"eta/eta_api/models/data_stat"
 	"eta/eta_api/models/eta_trial"
 	"eta/eta_api/models/eta_trial"
 	"eta/eta_api/models/ppt_english"
 	"eta/eta_api/models/ppt_english"
 	"eta/eta_api/models/sandbox"
 	"eta/eta_api/models/sandbox"
@@ -150,6 +151,9 @@ func init() {
 		initEtaTrial()
 		initEtaTrial()
 	}
 	}
 
 
+	// initDataStat 数据源统计管理相关表
+	initDataStat()
+
 	// 初始化EXCEL的表
 	// 初始化EXCEL的表
 	initExcel()
 	initExcel()
 
 
@@ -429,6 +433,16 @@ func initEtaTrial() {
 	)
 	)
 }
 }
 
 
+// initDataStat 数据源统计管理相关表
+func initDataStat() {
+	orm.RegisterModel(
+		new(data_stat.EdbInfoDeleteLog),  // 指标删除日志表
+		new(data_stat.EdbInfoUpdateStat), // 指标更新/刷新 汇总表(数据源明细表)
+		new(data_stat.EdbInfoUpdateLog),  // 指标更新/刷新日志列表
+		new(data_stat.EdbSourceStat),     // 数据源统计表
+	)
+}
+
 // initChartFramework 图库框架相关表
 // initChartFramework 图库框架相关表
 func initChartFramework() {
 func initChartFramework() {
 	orm.RegisterModel(
 	orm.RegisterModel(

+ 99 - 0
routers/commentsRouter.go

@@ -3697,6 +3697,105 @@ func init() {
             Filters: nil,
             Filters: nil,
             Params: nil})
             Params: nil})
 
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"],
+        beego.ControllerComments{
+            Method: "EdbDeleteLog",
+            Router: `/edb_delete_log`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"],
+        beego.ControllerComments{
+            Method: "EdbUpdateLog",
+            Router: `/edb_update_log`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"],
+        beego.ControllerComments{
+            Method: "EdbUpdateStat",
+            Router: `/edb_update_stat`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"],
+        beego.ControllerComments{
+            Method: "EdbUpdateFailedList",
+            Router: `/edb_update_stat/failed`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"],
+        beego.ControllerComments{
+            Method: "Column",
+            Router: `/source_column`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"],
+        beego.ControllerComments{
+            Method: "EditColumn",
+            Router: `/source_column/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbSourceStatController"],
+        beego.ControllerComments{
+            Method: "EdbSourceStat",
+            Router: `/source_stat`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbTerminalController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbTerminalController"],
+        beego.ControllerComments{
+            Method: "TerminalCodeList",
+            Router: `/terminal/code`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbTerminalController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbTerminalController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/terminal/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbTerminalController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbTerminalController"],
+        beego.ControllerComments{
+            Method: "Save",
+            Router: `/terminal/save`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbTerminalController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_stat:EdbTerminalController"],
+        beego.ControllerComments{
+            Method: "SetStatus",
+            Router: `/terminal/status/set`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/english_report:EnPermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/english_report:EnPermissionController"],
     beego.GlobalControllerRouter["eta/eta_api/controllers/english_report:EnPermissionController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/english_report:EnPermissionController"],
         beego.ControllerComments{
         beego.ControllerComments{
             Method: "Add",
             Method: "Add",

+ 7 - 0
routers/router.go

@@ -16,6 +16,7 @@ import (
 	"eta/eta_api/controllers/data_manage/line_equation"
 	"eta/eta_api/controllers/data_manage/line_equation"
 	"eta/eta_api/controllers/data_manage/line_feature"
 	"eta/eta_api/controllers/data_manage/line_feature"
 	"eta/eta_api/controllers/data_manage/supply_analysis"
 	"eta/eta_api/controllers/data_manage/supply_analysis"
+	"eta/eta_api/controllers/data_stat"
 	"eta/eta_api/controllers/english_report"
 	"eta/eta_api/controllers/english_report"
 	"eta/eta_api/controllers/eta_trial"
 	"eta/eta_api/controllers/eta_trial"
 	"eta/eta_api/controllers/roadshow"
 	"eta/eta_api/controllers/roadshow"
@@ -295,6 +296,12 @@ func init() {
 				&controllers.MeetingProbabilitiesController{},
 				&controllers.MeetingProbabilitiesController{},
 			),
 			),
 		),
 		),
+		web.NSNamespace("/data_stat/",
+			web.NSInclude(
+				&data_stat.EdbSourceStatController{},
+				&data_stat.EdbTerminalController{},
+			),
+		),
 		web.NSNamespace("/chart_framework",
 		web.NSNamespace("/chart_framework",
 			web.NSInclude(
 			web.NSInclude(
 				&data_manage.ChartFrameworkController{},
 				&data_manage.ChartFrameworkController{},

+ 17 - 7
services/data/chart_info.go

@@ -1025,6 +1025,7 @@ func GetSeasonEdbInfoDataListByXDateNong(result *data_manage.EdbDataResult, late
 	itemLength := len(result.List[length-1].Items)
 	itemLength := len(result.List[length-1].Items)
 	//获取数据的最新日期
 	//获取数据的最新日期
 	lastDate := result.List[length-1].Items[itemLength-1].DataTime
 	lastDate := result.List[length-1].Items[itemLength-1].DataTime
+	maxY := result.List[length-1].Year
 	lastDateT, tmpErr := time.Parse(utils.FormatDate, lastDate)
 	lastDateT, tmpErr := time.Parse(utils.FormatDate, lastDate)
 	if tmpErr != nil {
 	if tmpErr != nil {
 		err = tmpErr
 		err = tmpErr
@@ -1039,6 +1040,7 @@ func GetSeasonEdbInfoDataListByXDateNong(result *data_manage.EdbDataResult, late
 	quarterMap := make(map[string][]*data_manage.EdbDataList, 0)
 	quarterMap := make(map[string][]*data_manage.EdbDataList, 0)
 
 
 	//整理出日期
 	//整理出日期
+	var startTmpT, endTmpT time.Time
 	idx := 1
 	idx := 1
 	chartLegendMap := make(map[string]int, 0)
 	chartLegendMap := make(map[string]int, 0)
 	for currentStartYear := startYear; currentStartYear <= endYear; currentStartYear++ {
 	for currentStartYear := startYear; currentStartYear <= endYear; currentStartYear++ {
@@ -1077,6 +1079,8 @@ func GetSeasonEdbInfoDataListByXDateNong(result *data_manage.EdbDataResult, late
 		}
 		}
 		dataMap[showName] = item
 		dataMap[showName] = item
 		fmt.Println("年份" + showName + "日期" + startStr + " " + endStr)
 		fmt.Println("年份" + showName + "日期" + startStr + " " + endStr)
+		startTmpT = startT
+		endTmpT = endT
 		chartLegendMap[showName] = idx
 		chartLegendMap[showName] = idx
 		idx++
 		idx++
 		if lastDateT.Before(endT) {
 		if lastDateT.Before(endT) {
@@ -1099,7 +1103,7 @@ func GetSeasonEdbInfoDataListByXDateNong(result *data_manage.EdbDataResult, late
 	}
 	}
 
 
 	//判断哪些点应该落在同一条时间线上
 	//判断哪些点应该落在同一条时间线上
-	maxY := lastDateT.Year()
+	/*maxY := lastDateT.Year()
 	changeFlag := false
 	changeFlag := false
 	if lastDateT.Month() >= 11 {
 	if lastDateT.Month() >= 11 {
 		maxY = maxY + 1
 		maxY = maxY + 1
@@ -1107,22 +1111,28 @@ func GetSeasonEdbInfoDataListByXDateNong(result *data_manage.EdbDataResult, late
 	if maxY < nowYear {
 	if maxY < nowYear {
 		changeFlag = true
 		changeFlag = true
 		maxY = nowYear
 		maxY = nowYear
-	}
-	endTmp := fmt.Sprintf("%d-%s", maxY, xEndDate)
+	}*/
+	/*endTmp := fmt.Sprintf("%d-%s", maxY, xEndDate)
 	endTmpT, _ := time.Parse(utils.FormatDate, endTmp)
 	endTmpT, _ := time.Parse(utils.FormatDate, endTmp)
 	minY := maxY
 	minY := maxY
 	if jumpYear == 1 {
 	if jumpYear == 1 {
 		minY = maxY - 1
 		minY = maxY - 1
 	}
 	}
 	startTmp := fmt.Sprintf("%d-%s", minY, xStartDate)
 	startTmp := fmt.Sprintf("%d-%s", minY, xStartDate)
-	startTmpT, _ := time.Parse(utils.FormatDate, startTmp)
+	startTmpT, _ := time.Parse(utils.FormatDate, startTmp)*/
 
 
 	fmt.Println("横轴截取日" + startTmpT.Format(utils.FormatDate) + " " + endTmpT.Format(utils.FormatDate))
 	fmt.Println("横轴截取日" + startTmpT.Format(utils.FormatDate) + " " + endTmpT.Format(utils.FormatDate))
+	fmt.Printf("lastDateT.Year() 为%d \n", lastDateT.Year())
+	fmt.Printf("maxY 为%d \n", maxY)
 	for name, dateItem := range dataMap {
 	for name, dateItem := range dataMap {
-		lv, ok1 := yearDataListMap[dateItem.EndDate.Year()]
-		if changeFlag {
-			lv, ok1 = yearDataListMap[dateItem.StartDate.Year()]
+		tY := dateItem.EndDate.Year()
+		if lastDateT.Month() >= 11 {
+			if maxY > endTmpT.Year() {
+				tY = tY + 1
+			}
 		}
 		}
+		lv, ok1 := yearDataListMap[tY]
+		fmt.Printf("name %s yearDataListMap[%d]\n", name, tY)
 		if !ok1 {
 		if !ok1 {
 			continue
 			continue
 		}
 		}

+ 7 - 5
services/data/edb_classify.go

@@ -7,6 +7,7 @@ import (
 	"eta/eta_api/models/data_manage/excel"
 	"eta/eta_api/models/data_manage/excel"
 	"eta/eta_api/models/system"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/alarm_msg"
 	"eta/eta_api/services/alarm_msg"
+	"eta/eta_api/services/data_stat"
 	"eta/eta_api/utils"
 	"eta/eta_api/utils"
 	"fmt"
 	"fmt"
 	"strconv"
 	"strconv"
@@ -590,6 +591,8 @@ func Delete(classifyId, edbInfoId int, sysUser *system.Admin, requestBody, reque
 			return
 			return
 		}
 		}
 
 
+		go data_stat.AddEdbDeleteLog(edbInfo, sysUser)
+
 		// 如果删除的指标是自定义分析的来源,那么还需要删除指标与excel的关系
 		// 如果删除的指标是自定义分析的来源,那么还需要删除指标与excel的关系
 		if edbInfo.Source == utils.DATA_SOURCE_CALCULATE_ZDYFX {
 		if edbInfo.Source == utils.DATA_SOURCE_CALCULATE_ZDYFX {
 			tmpErr = excel.DeleteCustomAnalysisExcelEdbMappingByEdbInfoId(edbInfo.EdbInfoId)
 			tmpErr = excel.DeleteCustomAnalysisExcelEdbMappingByEdbInfoId(edbInfo.EdbInfoId)
@@ -1097,11 +1100,10 @@ func GetEdbOpButton(sysUser *system.Admin, belongUserId, edbType, edbInfoType in
 		button.OpButton = true
 		button.OpButton = true
 		button.DeleteButton = true
 		button.DeleteButton = true
 		button.MoveButton = true
 		button.MoveButton = true
-
-		// ETA指标的基础指标才允许插入值
-		if edbInfoType == 0 && edbType == 1 {
-			button.InsertNewDataButton = true
-		}
+	}
+	// ETA指标的基础指标才允许插入值
+	if edbInfoType == 0 && edbType == 1 {
+		button.InsertNewDataButton = true
 	}
 	}
 	button.ShowEdbRelation = true
 	button.ShowEdbRelation = true
 	button.ShowChartRelation = true
 	button.ShowChartRelation = true

+ 46 - 1
services/data/edb_info.go

@@ -2312,7 +2312,7 @@ func EdbInfoAdd(source, classifyId int, edbCode, edbName, frequency, unit, start
 	if source == utils.DATA_SOURCE_STOCK_PLANT {
 	if source == utils.DATA_SOURCE_STOCK_PLANT {
 		edbType = 2 //计算指标
 		edbType = 2 //计算指标
 	}
 	}
-	//从缓存中获取
+	// todo 如果缓存中的终端信息丢了是否需要调整 从缓存中获取
 	serverUrl := ``
 	serverUrl := ``
 	if edbInfo.Source == utils.DATA_SOURCE_WIND {
 	if edbInfo.Source == utils.DATA_SOURCE_WIND {
 		windCacheKey := utils.CACHE_WIND_URL + ":" + edbCode
 		windCacheKey := utils.CACHE_WIND_URL + ":" + edbCode
@@ -2323,6 +2323,19 @@ func EdbInfoAdd(source, classifyId int, edbCode, edbName, frequency, unit, start
 			}
 			}
 		}
 		}
 	}
 	}
+	// 获取终端信息
+	terminalCodeCacheKey := utils.CACHE_EDB_TERMINAL_CODE_URL + edbCode
+	terminalCode, tE := utils.Rc.RedisString(terminalCodeCacheKey)
+	if tE != nil {
+		utils.FileLog.Info(fmt.Sprintf("从缓存中获取数据源终端信息失败, Err: %s", tE))
+	}
+	var sourceIndexName string
+	if terminalCode == "" {
+		terminalCode, sourceIndexName, tE = GetTerminalFromBaseIndex(source, edbCode)
+		if tE != nil {
+			utils.FileLog.Info(fmt.Sprintf("获取数据源终端信息失败, Err: %s", tE))
+		}
+	}
 	//获取该层级下最大的排序数
 	//获取该层级下最大的排序数
 	maxSort, err := GetEdbClassifyMaxSort(classifyId, 0)
 	maxSort, err := GetEdbClassifyMaxSort(classifyId, 0)
 	if err != nil {
 	if err != nil {
@@ -2346,6 +2359,8 @@ func EdbInfoAdd(source, classifyId int, edbCode, edbName, frequency, unit, start
 	edbInfo.ServerUrl = serverUrl
 	edbInfo.ServerUrl = serverUrl
 	edbInfo.Sort = maxSort + 1
 	edbInfo.Sort = maxSort + 1
 	edbInfo.DataDateType = `交易日`
 	edbInfo.DataDateType = `交易日`
+	edbInfo.TerminalCode = terminalCode
+	edbInfo.SourceIndexName = sourceIndexName
 	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
 	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
 	edbInfo.UniqueCode = utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
 	edbInfo.UniqueCode = utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
 	itemVal, err := data_manage.GetEdbInfoMaxAndMinInfo(source, edbCode)
 	itemVal, err := data_manage.GetEdbInfoMaxAndMinInfo(source, edbCode)
@@ -2888,3 +2903,33 @@ func GetChartMenuTreeRecursive(list []*data_manage.ChartClassifyItems, parentId
 	}
 	}
 	return res
 	return res
 }
 }
+
+func GetTerminalFromBaseIndex(source int, edbCode string) (terminalCode string, sourceIndexName string, err error) {
+	tbName := GetBaseIndexTableName(source)
+	if tbName != "" {
+		var item data_manage.BaseIndexTerminalCode
+		item, err = data_manage.GetBaseIndexTerminalCode(edbCode, tbName)
+		if err != nil {
+			err = fmt.Errorf("查询数据源指标信息失败, Err: %s", err)
+			return
+		}
+		terminalCode = item.TerminalCode
+		sourceIndexName = item.IndexName
+	}
+	return
+}
+
+func GetBaseIndexTableName(source int) (tableName string) {
+	switch source {
+	case utils.DATA_SOURCE_YS:
+		tableName = "base_from_smm_index"
+	case utils.DATA_SOURCE_MYSTEEL_CHEMICAL:
+		tableName = "base_from_mysteel_chemical_index"
+	case utils.DATA_SOURCE_SCI:
+		tableName = "base_from_sci_index"
+	case utils.DATA_SOURCE_BAIINFO:
+		tableName = "base_from_baiinfo_index"
+	default:
+	}
+	return
+}

+ 61 - 0
services/data_stat/edb_delete_log.go

@@ -0,0 +1,61 @@
+package data_stat
+
+import (
+	"eta/eta_api/models/data_manage"
+	"eta/eta_api/models/data_stat"
+	"eta/eta_api/models/system"
+	"eta/eta_api/utils"
+	"fmt"
+	"time"
+)
+
+func AddEdbDeleteLog(edbInfo *data_manage.EdbInfo, sysUser *system.Admin) (err error) {
+	if edbInfo != nil {
+		log := new(data_stat.EdbInfoDeleteLog)
+		log.EdbInfoId = edbInfo.EdbInfoId
+		log.EdbInfoType = edbInfo.EdbInfoType
+		log.SourceName = edbInfo.SourceName
+		log.Source = edbInfo.Source
+		log.EdbCode = edbInfo.EdbCode
+		log.EdbName = edbInfo.EdbName
+		log.EdbNameEn = edbInfo.EdbNameEn
+		log.EdbNameSource = edbInfo.SourceIndexName
+		log.Frequency = edbInfo.Frequency
+		log.Unit = edbInfo.Unit
+		log.UnitEn = edbInfo.UnitEn
+		log.StartDate = edbInfo.StartDate
+		log.EndDate = edbInfo.EndDate
+		log.SysUserId = edbInfo.SysUserId
+		log.SysUserRealName = edbInfo.SysUserRealName
+		log.UniqueCode = edbInfo.UniqueCode
+		log.EdbCreateTime = edbInfo.CreateTime.Format(utils.FormatDateTime)
+		log.EdbModifyTime = edbInfo.ModifyTime.Format(utils.FormatDateTime)
+		log.CreateTime = time.Now().Format(utils.FormatDateTime)
+		log.MinValue = edbInfo.MinValue
+		log.MaxValue = edbInfo.MaxValue
+		log.CalculateFormula = edbInfo.CalculateFormula
+		log.EdbType = edbInfo.EdbType
+		log.LatestDate = edbInfo.LatestDate
+		log.LatestValue = edbInfo.LatestValue
+		log.MoveType = edbInfo.MoveType
+		log.MoveFrequency = edbInfo.MoveFrequency
+		log.NoUpdate = edbInfo.NoUpdate
+		log.ChartImage = edbInfo.ChartImage
+		log.Calendar = edbInfo.Calendar
+		log.DataDateType = edbInfo.DataDateType
+		log.ManualSave = edbInfo.ManualSave
+		log.TerminalCode = edbInfo.TerminalCode
+
+		log.DelSysUserId = sysUser.AdminId
+		log.DelSysUserRealName = sysUser.RealName
+		log.DataUpdateTime = edbInfo.DataUpdateTime
+		log.ErDataUpdateDate = edbInfo.ErDataUpdateDate
+
+		_, err = data_stat.AddEdbDeleteLog(log)
+		if err != nil {
+			err = fmt.Errorf("新增指标删除日志失败,Err: %s", err)
+			return
+		}
+	}
+	return
+}

+ 55 - 0
services/data_stat/edb_info_stat.go

@@ -0,0 +1,55 @@
+package data_stat
+
+import (
+	"eta/eta_api/models/data_manage"
+	"eta/eta_api/models/data_stat"
+	"eta/eta_api/models/system"
+	"fmt"
+	"time"
+)
+
+// AddEdbInfoUpdateLog 添加指标编辑/刷新日志
+func AddEdbInfoUpdateLog(edbInfoId int, updateResult int, updateFailedReason string, sysUser *system.Admin) (err error) {
+	var edbInfo *data_manage.EdbInfo
+	if edbInfoId > 0 {
+		// 获取指标详情
+		edbInfo, err = data_manage.GetEdbInfoById(edbInfoId)
+		if err != nil {
+			err = fmt.Errorf("指标不存在")
+			return
+		}
+		nowTime := time.Now()
+		log := new(data_stat.EdbInfoUpdateLog)
+		log.EdbInfoId = edbInfo.EdbInfoId
+		log.SourceName = edbInfo.SourceName
+		log.Source = edbInfo.Source
+		log.EdbCode = edbInfo.EdbCode
+		log.EdbName = edbInfo.EdbName
+		log.EdbNameSource = edbInfo.SourceIndexName
+		log.Frequency = edbInfo.Frequency
+		log.Unit = edbInfo.Unit
+		log.StartDate = edbInfo.StartDate
+		log.EndDate = edbInfo.EndDate
+		log.SysUserId = edbInfo.SysUserId
+		log.SysUserRealName = edbInfo.SysUserRealName
+		log.UpdateSysUserId = sysUser.AdminId
+		log.UpdateSysUserRealName = sysUser.RealName
+		log.UniqueCode = edbInfo.UniqueCode
+		log.EdbCreateTime = edbInfo.CreateTime
+		log.EdbModifyTime = edbInfo.ModifyTime
+		log.CreateTime = nowTime
+		log.LatestDate = edbInfo.LatestDate
+		log.LatestValue = edbInfo.LatestValue
+		log.TerminalCode = edbInfo.TerminalCode
+		log.UpdateResult = updateResult
+		log.UpdateFailedReason = updateFailedReason
+		log.DataUpdateTime = edbInfo.DataUpdateTime
+		log.ErDataUpdateDate = edbInfo.ErDataUpdateDate
+		_, err = data_stat.AddEdbUpdateLog(log)
+		if err != nil {
+			err = fmt.Errorf("新增指标更新日志失败,Err: %s", err)
+			return
+		}
+	}
+	return
+}

+ 96 - 0
services/data_stat/edb_terminal.go

@@ -0,0 +1,96 @@
+package data_stat
+
+import (
+	"errors"
+	"eta/eta_api/models/data_manage"
+	"eta/eta_api/utils"
+	"fmt"
+	"time"
+)
+
+// SaveEdbTerminal 保存数据源终端信息
+func SaveEdbTerminal(req *data_manage.AddEdbTerminalListReq) (errMsg string, err error) {
+	nowTime := time.Now().Local()
+	// 更新
+	if req.TerminalId > 0 {
+		item, e := data_manage.GetEdbTerminalById(req.TerminalId)
+		if e != nil {
+			if e.Error() == utils.ErrNoRow() {
+				errMsg = "终端不存在"
+				err = errors.New(errMsg)
+				return
+			}
+			errMsg = "获取终端信息失败"
+			err = errors.New("获取终端信息失败, Err:" + e.Error())
+			return
+		}
+		updateCols := make([]string, 0)
+		updateCols = append(updateCols, "Source", "Name", "ServerUrl", "DirPath", "Num", "Value", "ModifyTime")
+		item.Source = req.Source
+		item.Name = req.Name
+		item.ServerUrl = req.ServerUrl
+		item.DirPath = req.DirPath
+		item.Num = req.Num
+		item.Value = req.Value
+		// todo 状态是否可修改
+		//item.Status = 1
+		item.ModifyTime = nowTime
+		if e := item.Update(updateCols); e != nil {
+			errMsg = "更新失败"
+			err = errors.New("更新终端失败, Err:" + e.Error())
+		}
+		return
+	}
+	terminalCode := createTerminalCode(req.Source, req.Name)
+	//item.TerminalCode = req.TerminalCode
+	// 新增
+	newTerminal := &data_manage.EdbTerminal{
+		Source:       req.Source,
+		Name:         req.Name,
+		TerminalCode: terminalCode,
+		ServerUrl:    req.ServerUrl,
+		DirPath:      req.DirPath,
+		Num:          req.Num,
+		Status:       1,
+		Value:        req.Value,
+		CreateTime:   nowTime,
+		ModifyTime:   nowTime,
+	}
+	if e := newTerminal.Add(); e != nil {
+		errMsg = "新增失败"
+		err = errors.New("新增终端失败, Err:" + e.Error())
+	}
+	return
+}
+
+// SetEdbTerminalStatus 启用/禁用 终端
+func SetEdbTerminalStatus(id int, status int) (errMsg string, err error) {
+	nowTime := time.Now().Local()
+	// 更新
+	item, e := data_manage.GetEdbTerminalById(id)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			errMsg = "终端不存在"
+			err = errors.New(errMsg)
+			return
+		}
+		errMsg = "获取终端信息失败"
+		err = errors.New("获取终端信息失败, Err:" + e.Error())
+		return
+	}
+	updateCols := make([]string, 0)
+	updateCols = append(updateCols, "Status", "ModifyTime")
+	item.Status = status
+	item.ModifyTime = nowTime
+	if e := item.Update(updateCols); e != nil {
+		errMsg = "更新失败"
+		err = errors.New("更新终端失败, Err:" + e.Error())
+	}
+	return
+}
+
+func createTerminalCode(source int, sourceName string) (terminalCode string) {
+	randInt := utils.GetRandNumber(1000)
+	terminalCode = utils.MD5(fmt.Sprintf("%d_%s_%s_%d", source, sourceName, time.Now(), randInt))
+	return
+}

+ 1 - 0
utils/constants.go

@@ -224,6 +224,7 @@ const (
 	CACHE_SMART_REPORT_SEND_MSG = "eta:smart_report:sending:" // 智能研报用户报告推送
 	CACHE_SMART_REPORT_SEND_MSG = "eta:smart_report:sending:" // 智能研报用户报告推送
 
 
 	CACHE_CREATE_REPORT_IMGPDF_QUEUE = "eta_report:report_img_pdf_queue" // 生成报告长图PDF队列
 	CACHE_CREATE_REPORT_IMGPDF_QUEUE = "eta_report:report_img_pdf_queue" // 生成报告长图PDF队列
+	CACHE_EDB_TERMINAL_CODE_URL      = "edb:terminal_code:edb_code:"     // 指标与终端关系的缓存
 )
 )
 
 
 // 模板消息推送类型
 // 模板消息推送类型