Browse Source

Merge branch 'master' into feature/1.0.5_chartinfo

xyxie 1 year ago
parent
commit
61c9b4e1ed
40 changed files with 828 additions and 206 deletions
  1. 8 4
      controllers/base_auth.go
  2. 3 3
      controllers/classify.go
  3. 9 7
      controllers/commodity_trade_base_index.go
  4. 14 6
      controllers/data_manage/chart_info.go
  5. 269 2
      controllers/data_manage/edb_info.go
  6. 52 1
      controllers/data_manage/edb_info_calculate.go
  7. 4 1
      controllers/data_manage/line_equation/line_chart_info.go
  8. 4 1
      controllers/data_manage/line_feature/chart_info.go
  9. 0 8
      controllers/data_manage/mysteel_chemical_data.go
  10. 0 6
      controllers/data_manage/predict_edb_info.go
  11. 4 0
      controllers/english_report/report.go
  12. 38 3
      controllers/ppt_english.go
  13. 39 4
      controllers/ppt_v2.go
  14. 12 0
      controllers/report.go
  15. 1 2
      controllers/sandbox/sandbox.go
  16. 34 28
      controllers/sys_role.go
  17. 13 3
      controllers/user_login.go
  18. 1 1
      models/base.go
  19. 4 4
      models/data_manage/base_from_trade_index.go
  20. 5 1
      models/data_manage/edb_data_base.go
  21. 1 0
      models/data_manage/edb_info.go
  22. 26 0
      models/data_manage/edb_terminal.go
  23. 21 2
      models/data_manage/mysteel_chemical_index.go
  24. 8 0
      models/data_manage/request/edb_info.go
  25. 12 0
      models/data_manage/response/edb_info.go
  26. 1 0
      models/db.go
  27. 2 1
      models/english_report.go
  28. 8 0
      models/ppt_english/ppt_english.go
  29. 7 0
      models/ppt_v2.go
  30. 24 2
      models/report.go
  31. 26 34
      models/system/sys_menu.go
  32. 45 0
      routers/commentsRouter.go
  33. 1 1
      services/alarm_msg/alarm_msg.go
  34. 4 4
      services/data/chart_info.go
  35. 22 22
      services/data/correlation/chart_info.go
  36. 21 13
      services/data/edb_info.go
  37. 46 41
      services/data/mysteel_chemical.go
  38. 33 0
      services/report.go
  39. 1 0
      services/sandbox/sandbox.go
  40. 5 1
      utils/constants.go

+ 8 - 4
controllers/base_auth.go

@@ -185,10 +185,14 @@ func (this *BaseAuthController) Prepare() {
 					this.StopRun()
 					return
 				}
-				utils.Rc.Put(loginKey, "1", 30*time.Minute)
-				// 不信任名单也同步更新
-				noTrustLoginKey := fmt.Sprint(utils.CACHE_ACCESS_TOKEN_LOGIN_NO_TRUST, admin.AdminId)
-				utils.Rc.Put(noTrustLoginKey, session.Id, 30*time.Minute)
+
+				// 如果是ETA体验版-更新活跃时长/更新登录时长的接口请求, 则不更新Token时长
+				if uri != `/adminapi/eta_trial/user/login_duration` && uri != `/adminapi/eta_trial/user/active` {
+					utils.Rc.Put(loginKey, "1", utils.LoginCacheTime*time.Minute)
+					// 不信任名单也同步更新
+					noTrustLoginKey := fmt.Sprint(utils.CACHE_ACCESS_TOKEN_LOGIN_NO_TRUST, admin.AdminId)
+					utils.Rc.Put(noTrustLoginKey, session.Id, utils.LoginCacheTime*time.Minute)
+				}
 			}
 
 			admin.RoleTypeCode = GetSysUserRoleTypeCode(admin.RoleTypeCode)

+ 3 - 3
controllers/classify.go

@@ -2,11 +2,11 @@ package controllers
 
 import (
 	"encoding/json"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"eta/eta_api/models"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services"
 	"eta/eta_api/utils"
+	"github.com/rdlucklib/rdluck_tools/paging"
 	"time"
 )
 
@@ -35,7 +35,7 @@ func (this *ClassifyController) Add() {
 	}
 
 	// 获取系统菜单, 如果没有对应的字段的特殊处理项, 则忽略必填
-	menus, e := system.GetSysMenuItemsByCondition("", make([]interface{}, 0), []string{}, ``)
+	menus, e := system.GetSysMenuItemsByCondition(` AND hidden = 0`, make([]interface{}, 0), []string{}, ``)
 	if e != nil {
 		br.Msg = "保存失败"
 		br.ErrMsg = "获取菜单列表失败, Err: " + e.Error()
@@ -362,7 +362,7 @@ func (this *ClassifyController) Edit() {
 	}
 
 	// 获取系统菜单, 如果没有对应的字段的特殊处理项, 则忽略必填
-	menus, e := system.GetSysMenuItemsByCondition("", make([]interface{}, 0), []string{}, ``)
+	menus, e := system.GetSysMenuItemsByCondition(` AND hidden = 0`, make([]interface{}, 0), []string{}, ``)
 	if e != nil {
 		br.Msg = "保存失败"
 		br.ErrMsg = "获取菜单列表失败, Err: " + e.Error()

+ 9 - 7
controllers/commodity_trade_base_index.go

@@ -66,15 +66,17 @@ func (this *TradeCommonController) ExchangeClassify() {
 		this.ServeJSON()
 	}()
 	exchange := this.GetString("Exchange")
+	date := this.GetString("DataTime")
 
-	var respItem [][]*string
+	var respItem [][]string
 
 	latestData, err := data_manage.GetLatestDate(exchange)
 	if err != nil {
 		br.Msg = "获取失败"
 		return
 	}
-	if len(latestData) <= 0 {
+
+	if latestData == "" {
 		br.Ret = 200
 		br.Success = true
 		br.Msg = "获取成功"
@@ -82,18 +84,18 @@ func (this *TradeCommonController) ExchangeClassify() {
 		return
 	}
 
-	var dataTime []*string
-	if latestData != nil {
-		dataTime = append(dataTime, &latestData[0].DataTime)
+	if date == "" {
+		date = latestData
 	}
-	classifyName, err := data_manage.GetExchangeClassify(exchange, *dataTime[0])
+
+	classifyName, err := data_manage.GetExchangeClassify(exchange, date)
 	if err != nil {
 		br.Msg = "获取种类失败"
 		br.ErrMsg = "获取种类失败,Err:" + err.Error()
 		return
 	}
 	respItem = append(respItem, classifyName)
-	respItem = append(respItem, dataTime)
+	respItem = append(respItem, []string{latestData})
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"

+ 14 - 6
controllers/data_manage/chart_info.go

@@ -775,8 +775,9 @@ func (this *ChartInfoController) ChartInfoDetail() {
 		chartInfo, err = data_manage.GetChartInfoViewById(chartInfoId)
 		if err != nil {
 			if err.Error() == utils.ErrNoRow() {
-				br.Msg = "图被删除,请刷新页面"
-				br.ErrMsg = "图被删除,请刷新页面,Err:" + err.Error()
+				br.Msg = "该图表已删除,自动查看下一图表"
+				br.ErrMsg = "该图表已删除,自动查看下一图表,Err:" + err.Error()
+				br.Ret = 406
 				return
 			}
 			br.Msg = "获取失败"
@@ -1133,8 +1134,9 @@ func (this *ChartInfoController) ChartInfoDetailV2() {
 	chartInfo, err := data_manage.GetChartInfoViewById(chartInfoId)
 	if err != nil {
 		if err.Error() == utils.ErrNoRow() {
-			br.Msg = "图被删除,请刷新页面"
-			br.ErrMsg = "图被删除,请刷新页面,Err:" + err.Error()
+			br.Msg = "该图表已删除,自动查看下一图表"
+			br.ErrMsg = "该图表已删除,自动查看下一图表,Err:" + err.Error()
+			br.Ret = 406
 			return
 		}
 		br.Msg = "获取失败"
@@ -1819,7 +1821,7 @@ func (this *EdbInfoController) ChartInfoRefresh() {
 		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
 		return
 	}
-	err = data.ChartInfoRefreshV2(chartInfo.ChartInfoId)
+	err, isAsync := data.ChartInfoRefreshV2(chartInfo.ChartInfoId)
 	if err != nil {
 		br.Msg = "刷新失败"
 		br.ErrMsg = "刷新图表关联指标信息失败,Err:" + err.Error()
@@ -1843,6 +1845,9 @@ func (this *EdbInfoController) ChartInfoRefresh() {
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "刷新成功"
+	if isAsync {
+		br.Msg = "图表关联指标较多,请10分钟后刷新页面查看最新数据"
+	}
 }
 
 // @Title 设置图表图片
@@ -2276,7 +2281,7 @@ func (this *EdbInfoController) BatchChartInfoRefresh() {
 		return
 	}
 
-	err = data.BatchChartInfoRefreshV2(chartInfoList)
+	err, isAsync := data.BatchChartInfoRefreshV2(chartInfoList)
 	if err != nil {
 		br.Msg = "刷新失败"
 		br.ErrMsg = "刷新图表关联指标信息失败,Err:" + err.Error()
@@ -2291,6 +2296,9 @@ func (this *EdbInfoController) BatchChartInfoRefresh() {
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "刷新成功"
+	if isAsync {
+		br.Msg = "图表关联指标较多,请10分钟后刷新页面查看最新数据"
+	}
 }
 
 // CopyChartInfo

+ 269 - 2
controllers/data_manage/edb_info.go

@@ -6,6 +6,8 @@ import (
 	"eta/eta_api/models"
 	"eta/eta_api/models/company"
 	"eta/eta_api/models/data_manage"
+	"eta/eta_api/models/data_manage/request"
+	"eta/eta_api/models/data_manage/response"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/alarm_msg"
 	"eta/eta_api/services/data"
@@ -231,6 +233,8 @@ func (this *EdbInfoController) EdbInfoSearch() {
 				if respItem.Ret != 200 {
 					if respItem.Ret == 421 {
 						br.Msg = "该渠道已超过添加上限"
+					} else if respItem.Ret == 4052 {
+						br.Msg = "该指标已下架"
 					} else {
 						br.Msg = "未搜索到该指标"
 					}
@@ -2962,8 +2966,12 @@ func (this *ChartInfoController) EdbInfoData() {
 
 	edbInfo, err := data_manage.GetEdbInfoById(edbInfoId)
 	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Ret = 200
+			return
+		}
 		br.Msg = "获取失败"
-		br.Msg = "获取失败,Err:" + err.Error()
+		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
 	maxYear := 0
@@ -2976,7 +2984,7 @@ func (this *ChartInfoController) EdbInfoData() {
 	dataList, err := data_manage.GetEdbDataList(edbInfo.Source, edbInfoId, startDate, endDate)
 	if err != nil {
 		br.Msg = "获取失败"
-		br.Msg = "获取失败,Err:" + err.Error()
+		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
 	resp := new(data_manage.EdbInfoDataResp)
@@ -4440,3 +4448,262 @@ func (this *EdbInfoController) EdbSourceListByPython() {
 	br.Success = true
 	br.Msg = "获取成功"
 }
+
+// EdbChartList
+// @Title 指标缩略图列表接口
+// @Description 指标缩略图列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   ClassifyId   query   int  true       "分类id"
+// @Param   AdminId   query   int  false       "创建人id"
+// @Param   IsOnlyMe   query   bool  false       "是否只看我的"
+// @Success 200 {object} response.EdbInfoChartListResp
+// @router /edb_info/chart/list [get]
+func (this *EdbInfoController) EdbChartList() {
+	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
+	}
+
+	// 分页
+	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{}
+	condition += ` AND edb_info_type = ? `
+	pars = append(pars, 0)
+
+	// 分类筛选
+	classifyId, _ := this.GetInt("ClassifyId")
+	if classifyId > 0 {
+		strClassifyIds, e := data_manage.GetEdbClassify(classifyId)
+		if e != nil && e.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取分类信息失败, GetEdbClassify,Err:" + e.Error()
+			return
+		}
+		var classifyIds []int
+		classifyIdArr := strings.Split(strClassifyIds, ",")
+		for _, v := range classifyIdArr {
+			c, _ := strconv.Atoi(v)
+			if c > 0 {
+				classifyIds = append(classifyIds, c)
+			}
+		}
+		if len(classifyIds) > 0 {
+			condition += fmt.Sprintf(` AND classify_id IN (%s) `, utils.GetOrmInReplace(len(classifyIds)))
+			pars = append(pars, classifyIds)
+		} else {
+			condition += ` AND 1=2 `
+		}
+	}
+
+	// 创建人
+	adminId, _ := this.GetInt("AdminId")
+	if adminId > 0 {
+		condition += ` AND sys_user_id = ? `
+		pars = append(pars, adminId)
+	}
+
+	// 只看我的
+	isOnlyMe, _ := this.GetBool("IsOnlyMe")
+	if isOnlyMe {
+		condition += ` AND sys_user_id = ? `
+		pars = append(pars, sysUser.AdminId)
+	}
+
+	// 获取当前账号的不可见指标
+	obj := data_manage.EdbInfoNoPermissionAdmin{}
+	confList, e := obj.GetAllListByAdminId(this.SysUser.AdminId)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取不可见指标配置数据失败,Err:" + e.Error()
+		return
+	}
+	noPermissionEdbInfoIdList := make([]int, 0)
+	for _, v := range confList {
+		noPermissionEdbInfoIdList = append(noPermissionEdbInfoIdList, v.EdbInfoId)
+	}
+	noPermissionEdbInfoIdNum := len(noPermissionEdbInfoIdList)
+	if noPermissionEdbInfoIdNum > 0 {
+		condition += ` AND edb_info_id NOT IN (` + utils.GetOrmInReplace(noPermissionEdbInfoIdNum) + `) `
+		pars = append(pars, noPermissionEdbInfoIdList)
+	}
+
+	// 获取指标信息
+	dataCount, list, e := data_manage.GetEdbInfoFilterList(condition, pars, startSize, pageSize)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取普通指标列表失败, Err:" + e.Error()
+		return
+	}
+	if len(list) == 0 {
+		list = make([]*data_manage.EdbInfoList, 0)
+	} else {
+		for _, v := range list {
+			v.Button = data.GetEdbOpButton(sysUser, v.SysUserId, v.EdbType, v.EdbInfoType)
+		}
+		page = paging.GetPaging(currentIndex, pageSize, int(dataCount))
+	}
+
+	resp := response.EdbInfoChartListResp{
+		Paging: page,
+		List:   list,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// Modify
+// @Title 修改指标信息接口
+// @Description 编辑指标接口
+// @Success 200 string "操作成功"
+// @router /edb_info/modify [post]
+func (this *EdbInfoController) Modify() {
+	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
+	}
+
+	var req request.ModifyEdbInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	edbInfoId := req.EdbInfoId
+	if edbInfoId <= 0 {
+		br.Msg = "请选择指标"
+		br.IsSendEmail = false
+		return
+	}
+
+	edbInfo, e := data_manage.GetEdbInfoById(req.EdbInfoId)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取指标信息失败, Err:" + err.Error()
+		return
+	}
+	// 编辑权限校验
+	button := data.GetEdbOpButton(this.SysUser, edbInfo.SysUserId, edbInfo.EdbType, edbInfo.EdbInfoType)
+	if !button.OpButton {
+		br.Msg = "无权限操作"
+		return
+	}
+
+	edbInfo.MaxValue = req.MaxValue
+	edbInfo.MinValue = req.MinValue
+	edbInfo.ManualSave = 1
+	edbInfo.ModifyTime = time.Now()
+	err = edbInfo.Update([]string{"MaxValue", "MinValue", "ManualSave", "ModifyTime"})
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	//修改es
+	data.AddOrEditEdbInfoToEs(edbInfo.EdbInfoId)
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "修改成功"
+	br.IsAddLog = true
+}
+
+// ChartImageSet
+// @Title 设置指标的图表图片
+// @Description 设置指标的图表图片接口
+// @Param	request	body data_manage.SetChartInfoImageReq true "type json string"
+// @Success Ret=200 保存成功
+// @router /edb_info/image/set [post]
+func (this *EdbInfoController) ChartImageSet() {
+	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
+	}
+	var req data_manage.SetEdbInfoImageReq
+	if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+	if req.EdbInfoId <= 0 || req.ImageUrl == "" {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "保存成功"
+		return
+	}
+
+	edbInfo, e := data_manage.GetEdbInfoById(req.EdbInfoId)
+	if e != nil {
+		if e.Error() == utils.ErrNoRow() {
+			br.Msg = "找不到该指标"
+			return
+		}
+		br.Msg = "保存失败"
+		br.ErrMsg = "获取指标失败, Err:" + e.Error()
+		return
+	}
+	edbInfo.ChartImage = req.ImageUrl
+	if e = edbInfo.Update([]string{"ChartImage"}); e != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "更新指标缩略图失败, Err:" + e.Error()
+		return
+	}
+
+	// 修改es数据
+	go data.AddOrEditEdbInfoToEs(req.EdbInfoId)
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
+}

+ 52 - 1
controllers/data_manage/edb_info_calculate.go

@@ -403,6 +403,7 @@ func (this *ChartInfoController) CalculateEdit() {
 	br.Data = resp
 }
 
+// CalculateBatchSave
 // @Title 累计值转月-同比值-同差等计算新增
 // @Description 累计值转月-同比值-同差等计算新增接口
 // @Param	request	body data_manage.EdbInfoCalculateBatchSaveReq true "type json string"
@@ -411,10 +412,12 @@ func (this *ChartInfoController) CalculateEdit() {
 func (this *ChartInfoController) CalculateBatchSave() {
 	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 = "请登录"
@@ -503,6 +506,20 @@ func (this *ChartInfoController) CalculateBatchSave() {
 			br.Msg = "日期间隔不得少于两天"
 			return
 		}
+	case utils.DATA_SOURCE_CALCULATE_ZSXY: // 指数修匀
+		if req.Formula == "" {
+			br.Msg = "请填写alpha值"
+			return
+		}
+		alpha, e := strconv.ParseFloat(req.Formula, 64)
+		if e != nil {
+			br.Msg = "alpha值输入错误, 请重新输入"
+			return
+		}
+		if alpha <= 0 || alpha >= 1 {
+			br.Msg = "alpha值输入错误, 请重新输入"
+			return
+		}
 	}
 
 	notNeedFromEdbSourceList := []int{utils.DATA_SOURCE_CALCULATE_KSZS} // 不需要传入来源指标id的 指标类型
@@ -585,6 +602,9 @@ func (this *ChartInfoController) CalculateBatchSave() {
 func (this *ChartInfoController) CalculateBatchEdit() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
@@ -717,6 +737,20 @@ func (this *ChartInfoController) CalculateBatchEdit() {
 			br.Msg = "日期间隔不得少于两天"
 			return
 		}
+	case utils.DATA_SOURCE_CALCULATE_ZSXY: // 指数修匀
+		if req.Formula == "" {
+			br.Msg = "请填写alpha值"
+			return
+		}
+		alpha, e := strconv.ParseFloat(req.Formula, 64)
+		if e != nil {
+			br.Msg = "alpha值输入错误, 请重新输入"
+			return
+		}
+		if alpha <= 0 || alpha >= 1 {
+			br.Msg = "alpha值输入错误, 请重新输入"
+			return
+		}
 	}
 
 	// 构造请求
@@ -1469,6 +1503,9 @@ func (this *ChartInfoController) SaveAdjustEdbInfo() {
 func (this *ChartInfoController) BatchCalculateBatchSave() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
@@ -1610,6 +1647,20 @@ func (this *ChartInfoController) BatchCalculateBatchSave() {
 				})
 				continue
 			}
+		case utils.DATA_SOURCE_CALCULATE_ZSXY: // 指数修匀
+			if req.Formula == "" {
+				br.Msg = "请填写alpha值"
+				return
+			}
+			alpha, e := strconv.ParseFloat(req.Formula, 64)
+			if e != nil {
+				br.Msg = "alpha值输入错误, 请重新输入"
+				return
+			}
+			if alpha <= 0 || alpha >= 1 {
+				br.Msg = "alpha值输入错误, 请重新输入"
+				return
+			}
 		}
 
 		if fromEdbInfoId <= 0 {

+ 4 - 1
controllers/data_manage/line_equation/line_chart_info.go

@@ -1006,7 +1006,7 @@ func (this *LineEquationChartInfoController) Refresh() {
 	}
 
 	// 刷新图表的指标信息
-	err = data.ChartInfoRefreshV2(chartInfo.ChartInfoId)
+	err, isAsync := data.ChartInfoRefreshV2(chartInfo.ChartInfoId)
 
 	//清除图表缓存
 	{
@@ -1017,6 +1017,9 @@ func (this *LineEquationChartInfoController) Refresh() {
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "刷新成功"
+	if isAsync {
+		br.Msg = "图表关联指标较多,请10分钟后刷新页面查看最新数据"
+	}
 }
 
 // Copy

+ 4 - 1
controllers/data_manage/line_feature/chart_info.go

@@ -2097,7 +2097,7 @@ func (this *LineFeaturesChartInfoController) Refresh() {
 	}
 
 	// 刷新图表的指标信息
-	err = data.ChartInfoRefreshV2(chartInfo.ChartInfoId)
+	err, isAsync := data.ChartInfoRefreshV2(chartInfo.ChartInfoId)
 
 	//清除图表缓存
 	{
@@ -2108,6 +2108,9 @@ func (this *LineFeaturesChartInfoController) Refresh() {
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "刷新成功"
+	if isAsync {
+		br.Msg = "图表关联指标较多,请10分钟后刷新页面查看最新数据"
+	}
 }
 
 // Copy

+ 0 - 8
controllers/data_manage/mysteel_chemical_data.go

@@ -811,14 +811,6 @@ func (this *EdbClassifyController) AddMysteelChemical() {
 	req.IndexCode = utils.TrimStr(req.IndexCode)
 	req.IndexCode = strings.Replace(req.IndexCode, "\t", "", -1)
 
-	// 因为excel获取数据是界面化的,所以同一时间只能存在一个指标添加
-	key := `mysteel_chemical:add`
-	res := utils.Rc.SetNX(key, 1, 30*time.Second)
-	if !res {
-		br.Msg = "当前已存在添加中的指标,请在30秒后添加"
-		br.IsSendEmail = false
-		return
-	}
 	//添加指标
 	mysteelChemicalIndexInfo, err, errMsg := data.AddMysteelChemicalIndex(req.BaseFromMysteelChemicalClassifyId, strings.ToUpper(req.IndexCode), req.UpdateWeek, req.UpdateTime, this.SysUser.AdminId, this.SysUser.RealName)
 	if errMsg != `` {

+ 0 - 6
controllers/data_manage/predict_edb_info.go

@@ -29,7 +29,6 @@ type PredictEdbInfoController struct {
 // @Param   PageSize   query   int  true       "每页数据条数"
 // @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
 // @Param   ClassifyId   query   int  true       "分类id"
-// @Param   Keyword   query   string  true       "搜索关键词"
 // @Param   AdminId   query   int  false       "创建人id"
 // @Param   IsOnlyMe   query   bool  false       "是否只看我的"
 // @Success 200 {object} response.PredictEdbInfoListResp
@@ -52,7 +51,6 @@ func (this *PredictEdbInfoController) EdbChartList() {
 
 	pageSize, _ := this.GetInt("PageSize")
 	currentIndex, _ := this.GetInt("CurrentIndex")
-	keyword := this.GetString("Keyword")
 	adminId, _ := this.GetInt("AdminId")
 	isOnlyMe, _ := this.GetBool("IsOnlyMe")
 
@@ -86,10 +84,6 @@ func (this *PredictEdbInfoController) EdbChartList() {
 		condition += " AND classify_id IN(" + classifyIds + ") "
 
 	}
-	if keyword != "" {
-		condition += ` AND  ( excel_name LIKE ? )`
-		pars = append(pars, `%`+keyword+`%`)
-	}
 	if adminId > 0 {
 		condition += " AND sys_user_id = ? "
 		pars = append(pars, adminId)

+ 4 - 0
controllers/english_report/report.go

@@ -265,6 +265,10 @@ func (this *EnglishReportController) Detail() {
 	}
 	item, err := models.GetEnglishReportById(reportId)
 	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "报告已被删除"
+			return
+		}
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return

+ 38 - 3
controllers/ppt_english.go

@@ -133,7 +133,7 @@ func (this *PptEnglishController) AddPpt() {
 			br.Msg = "请输入目录ID"
 			return
 		}
-		item, err := ppt_english.GetPptEnglishByTitle(req.FirstPage.Title)
+		item, err := ppt_english.GetPptEnglishByTitleAndId(req.FirstPage.Title, this.SysUser.AdminId)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			br.Msg = "获取数据异常!"
 			br.ErrMsg = "获取数据异常,Err:" + err.Error()
@@ -223,7 +223,7 @@ func (this *PptEnglishController) EditPpt() {
 		br.Msg = "标题不能为空"
 		return
 	}
-	item, err := ppt_english.GetPptEnglishByTitle(req.FirstPage.Title)
+	item, err := ppt_english.GetPptEnglishByTitleAndId(req.FirstPage.Title, this.SysUser.AdminId)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取数据异常!"
 		br.ErrMsg = "获取数据异常,Err:" + err.Error()
@@ -579,7 +579,7 @@ func (this *PptEnglishController) SaveLog() {
 	}
 
 	// 获取ppt
-	item, err := ppt_english.GetPptEnglishByTitle(req.FirstPage.Title)
+	item, err := ppt_english.GetPptEnglishByTitleAndId(req.FirstPage.Title, this.SysUser.AdminId)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取数据异常!"
 		br.ErrMsg = "获取数据异常,Err:" + err.Error()
@@ -884,3 +884,38 @@ func (this *PptEnglishController) ToReport() {
 	br.IsAddLog = true
 	br.Data = resp
 }
+
+// TitleCheck
+// @Title 校验标题是否重复
+// @Description 校验标题是否重复接口
+// @Param   Title   query   int  true       "标题"
+// @Success 200 Ret=200 编辑成功
+// @router /titleCheck [get]
+func (this *PptEnglishController) TitleCheck() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	title := this.GetString("Title")
+	pptId, _ := this.GetInt("PptId")
+	if title == "" {
+		br.Msg = "标题不能为空"
+		return
+	}
+	item, err := ppt_english.GetPptEnglishByTitleAndId(title, this.SysUser.AdminId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据异常!"
+		br.ErrMsg = "获取数据异常,Err:" + err.Error()
+		return
+	}
+	if item != nil && item.PptId != pptId {
+		br.Msg = "标题已存在,不可重复添加"
+		br.IsSendEmail = false
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "校验成功"
+}

+ 39 - 4
controllers/ppt_v2.go

@@ -133,13 +133,13 @@ func (this *PptV2Controller) AddPpt() {
 			br.Msg = "请输入目录ID"
 			return
 		}
-		item, err := models.GetPptV2ByTitle(req.FirstPage.Title)
+		item, err := models.GetPptV2ByTitleAndId(req.FirstPage.Title, this.SysUser.AdminId)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			br.Msg = "获取数据异常!"
 			br.ErrMsg = "获取数据异常,Err:" + err.Error()
 			return
 		}
-		if item != nil {
+		if item != nil && item.PptId != int(req.PptId) {
 			br.Msg = "标题已存在,不可重复添加"
 			br.IsSendEmail = false
 			return
@@ -224,7 +224,7 @@ func (this *PptV2Controller) EditPpt() {
 		br.Msg = "标题不能为空"
 		return
 	}
-	item, err := models.GetPptV2ByTitle(req.FirstPage.Title)
+	item, err := models.GetPptV2ByTitleAndId(req.FirstPage.Title, this.SysUser.AdminId)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取数据异常!"
 		br.ErrMsg = "获取数据异常,Err:" + err.Error()
@@ -580,7 +580,7 @@ func (this *PptV2Controller) SaveLog() {
 	}
 
 	// 获取ppt
-	item, err := models.GetPptV2ByTitle(req.FirstPage.Title)
+	item, err := models.GetPptV2ByTitleAndId(req.FirstPage.Title, this.SysUser.AdminId)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取数据异常!"
 		br.ErrMsg = "获取数据异常,Err:" + err.Error()
@@ -1083,3 +1083,38 @@ func (this *PptV2Controller) BatchToEn() {
 	br.Success = true
 	br.Msg = "操作成功"
 }
+
+// TitleCheck
+// @Title 校验标题是否重复
+// @Description 校验标题是否重复接口
+// @Param   Title   query   int  true       "标题"
+// @Success 200 Ret=200 编辑成功
+// @router /titleCheck [get]
+func (this *PptV2Controller) TitleCheck() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	title := this.GetString("Title")
+	pptId, _ := this.GetInt("PptId")
+	if title == "" {
+		br.Msg = "标题不能为空"
+		return
+	}
+	item, err := models.GetPptV2ByTitleAndId(title, this.SysUser.AdminId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取数据异常!"
+		br.ErrMsg = "获取数据异常,Err:" + err.Error()
+		return
+	}
+	if item != nil && item.PptId != pptId {
+		br.Msg = "标题已存在,不可重复添加"
+		br.IsSendEmail = false
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "校验成功"
+}

+ 12 - 0
controllers/report.go

@@ -692,6 +692,10 @@ func (this *ReportController) Detail() {
 	}
 	item, err := models.GetReportById(reportId)
 	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "报告已被删除"
+			return
+		}
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
@@ -1880,6 +1884,9 @@ func (this *ReportController) AddDayWeekReport() {
 		go models.ModifyReportCode(reportId, reportCode)
 	}
 
+	// 备份关键数据
+	go services.SaveReportLogs(item, chapterList, sysUser.AdminId, sysUser.RealName)
+
 	resp := new(models.AddResp)
 	resp.ReportId = reportId
 	resp.ReportCode = reportCode
@@ -2303,6 +2310,11 @@ func (this *ReportController) EditDayWeekChapter() {
 		return
 	}
 
+	// 备份关键数据
+	chapters := make([]*models.ReportChapter, 0)
+	chapters = append(chapters, reportChapterInfo)
+	go services.SaveReportLogs(nil, chapters, sysUser.AdminId, sysUser.RealName)
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "保存成功"

+ 1 - 2
controllers/sandbox/sandbox.go

@@ -328,7 +328,7 @@ func (this *SandboxController) Save() {
 
 	var sandboxResp *sandbox.SandboxSaveResp
 	// 获取系统菜单, 如果没有对应的字段的特殊处理项, 则忽略必填
-	menus, e := system.GetSysMenuItemsByCondition("", make([]interface{}, 0), []string{}, ``)
+	menus, e := system.GetSysMenuItemsByCondition(` AND hidden = 0`, make([]interface{}, 0), []string{}, ``)
 	if e != nil {
 		br.Msg = "保存失败"
 		br.ErrMsg = "获取菜单列表失败, Err: " + e.Error()
@@ -343,7 +343,6 @@ func (this *SandboxController) Save() {
 	ignoreVariety := false
 	if !menuMap[system.MenuSpecialHandleSandboxVariety] {
 		ignoreVariety = true
-		return
 	}
 
 	var errMsg string

+ 34 - 28
controllers/sys_role.go

@@ -102,23 +102,32 @@ func (this *SysRoleController) Edit() {
 		br.Msg = "分组名称不能为空"
 		return
 	}
-	item, err := system.GetSysRoleByName(req.RoleName)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "获取数据失败"
-		br.ErrMsg = "获取数据失败,Err:" + err.Error()
-		return
-	}
-	if item != nil {
-		if item.RoleId != req.RoleId {
-			br.Msg = "名称已存在,请重新输入"
+
+	item, e := system.GetSysRoleById(req.RoleId)
+	if e != nil {
+		if e.Error() != utils.ErrNoRow() {
+			br.Msg = "操作失败"
+			br.ErrMsg = "获取角色失败, Err: " + e.Error()
 			return
 		}
+		br.Msg = "角色不存在, 请刷新页面"
+		return
+	}
+	exists, e := system.GetSysRoleByName(req.RoleName)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取重名角色失败, Err: " + e.Error()
+		return
+	}
+	if exists != nil && exists.RoleId != item.RoleId {
+		br.Msg = "名称已存在,请重新输入"
+		return
 	}
 	roleTypeCode := services.GetRoleTypeCode(req.RoleType)
-	err = system.ModifySysRole(req.RoleName, req.RoleType, roleTypeCode, req.RoleId)
-	if err != nil {
-		br.Msg = "修改失败"
-		br.ErrMsg = "修改失败,Err:" + err.Error()
+	e = system.ModifySysRole(req.RoleName, req.RoleType, roleTypeCode, req.RoleId)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "更新角色信息失败, Err: " + e.Error()
 		return
 	}
 
@@ -507,7 +516,7 @@ func (this *SysRoleController) SysRoleMenuAuthList() {
 	}
 
 	order := `sort ASC, create_time DESC, menu_id DESC`
-	list, e := system.GetSysMenuItemsByCondition("", make([]interface{}, 0), []string{}, order)
+	list, e := system.GetSysMenuItemsByCondition(` AND hidden = 0`, make([]interface{}, 0), []string{}, order)
 	if e != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取菜单列表失败, Err: " + e.Error()
@@ -517,20 +526,17 @@ func (this *SysRoleController) SysRoleMenuAuthList() {
 	items := make([]*system.SysMenuItem, 0)
 	for _, v := range list {
 		t := &system.SysMenuItem{
-			MenuId:       v.MenuId,
-			ParentId:     v.ParentId,
-			Name:         v.Name,
-			Sort:         v.Sort,
-			Path:         v.Path,
-			PathName:     v.PathName,
-			IconPath:     v.IconPath,
-			Component:    v.Component,
-			Hidden:       v.Hidden,
-			HiddenLayout: v.HiddenLayout,
-			Level:        v.Level,
-			MenuType:     v.MenuType,
-			ButtonCode:   v.ButtonCode,
-			Children:     make([]*system.SysMenuItem, 0),
+			MenuId:     v.MenuId,
+			ParentId:   v.ParentId,
+			Name:       v.Name,
+			Sort:       v.Sort,
+			Path:       v.Path,
+			IconPath:   v.IconPath,
+			Component:  v.Component,
+			Hidden:     v.Hidden,
+			MenuType:   v.MenuType,
+			ButtonCode: v.ButtonCode,
+			Children:   make([]*system.SysMenuItem, 0),
 		}
 		items = append(items, t)
 	}

+ 13 - 3
controllers/user_login.go

@@ -7,6 +7,7 @@ import (
 	"eta/eta_api/models/company"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services"
+	"eta/eta_api/services/eta_trial"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/mojocn/base64Captcha"
@@ -532,13 +533,13 @@ func (this *UserLoginController) Login() {
 		noTrustLoginId, _ := utils.Rc.RedisString(noTrustLoginKey)
 		if noTrustLoginId != `` { // 如果存在不可信设备,那么将其下架
 			oldNoTrustLoginKey := fmt.Sprint(utils.CACHE_ACCESS_TOKEN_LOGIN, noTrustLoginId)
-			_ = utils.Rc.Put(oldNoTrustLoginKey, "0", 30*time.Minute)
+			_ = utils.Rc.Put(oldNoTrustLoginKey, "0", utils.LoginCacheTime*time.Minute)
 		}
 
 		// 如果当前是不可信设备,那么将其加入到不可信名单
 		loginKey := fmt.Sprint(utils.CACHE_ACCESS_TOKEN_LOGIN, sysSession.Id)
-		_ = utils.Rc.Put(loginKey, "1", 30*time.Minute)
-		_ = utils.Rc.Put(noTrustLoginKey, sysSession.Id, 30*time.Minute)
+		_ = utils.Rc.Put(loginKey, "1", utils.LoginCacheTime*time.Minute)
+		_ = utils.Rc.Put(noTrustLoginKey, sysSession.Id, utils.LoginCacheTime*time.Minute)
 	}
 
 	// 新增登录记录
@@ -552,6 +553,15 @@ func (this *UserLoginController) Login() {
 		_ = system.AddSysUserLoginRecord(record)
 	}()
 
+	// ETA试用平台-请求中间服务更新用户最后登录时间和次数
+	if utils.BusinessCode == utils.BusinessCodeSandbox {
+		go func() {
+			var r eta_trial.EtaTrialUserReq
+			r.Mobile = sysUser.Mobile
+			_, _ = eta_trial.UpdateEtaTrialUserLogin(r)
+		}()
+	}
+
 	br.Data = resp
 	br.Ret = 200
 	br.Success = true

+ 1 - 1
models/base.go

@@ -25,7 +25,7 @@ type BaseResponseRef struct {
 }
 
 type BaseResponseResult struct {
-	Ret     int    `description:"状态:200 成功,408 重新登录,403:为失败"`
+	Ret     int    `description:"状态:200 成功,408 重新登录,403:为失败, 406:已被删除"`
 	Msg     string `description:"提示信息,对用户展示"`
 	ErrMsg  string `description:"错误信息,供开发定位问题"`
 	ErrCode string `description:"错误编码,预留"`

+ 4 - 4
models/data_manage/base_from_trade_index.go

@@ -131,17 +131,17 @@ func GetBaseFromTradeIndexByParam(exchange, date, classifyName, classifyType str
 	}
 }
 
-func GetExchangeClassify(exchange, dataTime string) (classifyName []*string, err error) {
+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) {
+func GetLatestDate(exchange string) (dataTime string, 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)
+	sql := "SELECT data_time FROM base_from_trade_" + exchange + "_index ORDER BY data_time desc limit 1"
+	err = o.Raw(sql).QueryRow(&dataTime)
 	return
 }
 

+ 5 - 1
models/data_manage/edb_data_base.go

@@ -1,9 +1,9 @@
 package data_manage
 
 import (
+	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
-	"eta/eta_api/utils"
 	"time"
 )
 
@@ -148,6 +148,10 @@ func GetEdbDataTableName(source int) (tableName string) {
 		tableName = "edb_data_predict_ccalculate_percentile"
 	case utils.DATA_SOURCE_FUBAO: //富宝-71
 		tableName = "edb_data_fubao"
+	case utils.DATA_SOURCE_CALCULATE_ZSXY:
+		tableName = "edb_data_calculate_zsxy" // 指数修匀->72
+	case utils.DATA_SOURCE_PREDICT_CALCULATE_ZSXY:
+		tableName = "edb_data_predict_calculate_zsxy" // 预测指数修匀->73
 	default:
 		tableName = ""
 	}

+ 1 - 0
models/data_manage/edb_info.go

@@ -45,6 +45,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) {

+ 26 - 0
models/data_manage/edb_terminal.go

@@ -0,0 +1,26 @@
+package data_manage
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// EdbTerminal 指标终端
+type EdbTerminal struct {
+	TerminalId   int       `orm:"column(terminal_id);pk"`
+	Source       int       `orm:"column(source)" description:"指标来源类型"`
+	Name         string    `description:"终端别名"`
+	TerminalCode string    `description:"终端编码,用于配置在机器上"`
+	ServerUrl    string    `description:"终端地址"`
+	Num          int       `description:"终端最大指标数"`
+	ModifyTime   time.Time `description:"修改时间"`
+	CreateTime   time.Time `description:"创建时间"`
+}
+
+// GetEdbTerminalListBySource 根据指标来源类型获取所有的终端列表
+func GetEdbTerminalListBySource(source int) (items []*EdbTerminal, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT *  FROM edb_terminal WHERE source = ? ORDER BY terminal_id ASC `
+	_, err = o.Raw(sql, source).QueryRows(&items)
+	return
+}

+ 21 - 2
models/data_manage/mysteel_chemical_index.go

@@ -1,10 +1,10 @@
 package data_manage
 
 import (
+	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
-	"eta/eta_api/utils"
 	"time"
 )
 
@@ -29,6 +29,7 @@ type BaseFromMysteelChemicalIndex struct {
 	CreateTime                        time.Time `description:"创建时间"`
 	Sort                              int       `description:"排序字段"`
 	MergeFilePath                     string    `description:"合并文件"`
+	TerminalCode                      string    `description:"终端编码"`
 }
 
 // Update 更新钢联化工指标基础信息
@@ -42,6 +43,11 @@ func (item *BaseFromMysteelChemicalIndex) Update(cols []string) (err error) {
 func AddBaseFromMysteelChemicalIndex(item *BaseFromMysteelChemicalIndex) (lastId int64, err error) {
 	o := orm.NewOrmUsingDB("data")
 	lastId, err = o.Insert(item)
+	if err != nil {
+		return
+	}
+	item.BaseFromMysteelChemicalIndexId = int(lastId)
+
 	return
 }
 
@@ -316,4 +322,17 @@ func GetMysteelChemicalIndexAdminList() (list []int, err error) {
 
 	_, err = o.Raw(sql).QueryRows(&list)
 	return
-}
+}
+
+type TerminalNum struct {
+	TerminalCode string `description:"terminal_code"`
+	Num          int    `description:"num"`
+}
+
+// GetMysteelChemicalGroupTerminalNum 获取钢联化工指标的终端分布
+func GetMysteelChemicalGroupTerminalNum() (items []*TerminalNum, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT terminal_code,count(1) num FROM base_from_mysteel_chemical_index GROUP BY terminal_code ORDER BY num ASC `
+	_, err = o.Raw(sql).QueryRows(&items)
+	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_api/models/data_manage"
+	"github.com/rdlucklib/rdluck_tools/paging"
+)
+
+// EdbInfoChartListResp ETA指标图列表返回数据
+type EdbInfoChartListResp struct {
+	Paging *paging.PagingItem
+	List   []*data_manage.EdbInfoList
+}

+ 1 - 0
models/db.go

@@ -286,6 +286,7 @@ func initEdbData() {
 		new(data_manage.BaseFromBaiinfoClassify),
 		new(data_manage.EdbDataInsertConfig),      // 指标数据插入配置表
 		new(data_manage.EdbInfoNoPermissionAdmin), //指标不可见用户配置表
+		new(data_manage.EdbTerminal),              //指标终端
 	)
 }
 

+ 2 - 1
models/english_report.go

@@ -2,10 +2,10 @@ package models
 
 import (
 	"errors"
+	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
-	"eta/eta_api/utils"
 	"strings"
 	"time"
 )
@@ -196,6 +196,7 @@ type EnglishReportDetail struct {
 	ModifyTime         string `description:"修改时间"`
 	State              int    `description:"1:未发布,2:已发布"`
 	PublishTime        string `description:"发布时间"`
+	PrePublishTime     string `description:"预发布时间"`
 	Stage              int    `description:"期数"`
 	MsgIsSend          int    `description:"消息是否已发送,0:否,1:是"`
 	ReportCode         string `description:"报告唯一编码"`

+ 8 - 0
models/ppt_english/ppt_english.go

@@ -343,3 +343,11 @@ type EnglishPPT2ReportReq struct {
 	Title            string `description:"标题"`
 	Abstract         string `description:"摘要"`
 }
+
+
+func GetPptEnglishByTitleAndId(title string,adminId int) (item *PptEnglish, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT * FROM ppt_english WHERE 1=1 AND title=? AND admin_id=? `
+	err = o.Raw(sql, title, adminId).QueryRow(&item)
+	return
+}

+ 7 - 0
models/ppt_v2.go

@@ -284,3 +284,10 @@ type BatchEnPPT2CnReq struct {
 	PptIds  string `description:"英文PPT主键s"`
 	GroupId int    `description:"目录ID"`
 }
+
+func GetPptV2ByTitleAndId(title string,adminId int) (item *PptV2, err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `SELECT * FROM ppt_v2 WHERE 1=1 AND title=? AND admin_id=? `
+	err = o.Raw(sql, title, adminId).QueryRow(&item)
+	return
+}

+ 24 - 2
models/report.go

@@ -1,9 +1,9 @@
 package models
 
 import (
+	"eta/eta_api/utils"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
-	"eta/eta_api/utils"
 	"strings"
 	"time"
 )
@@ -174,8 +174,10 @@ type ReportDetail struct {
 	ModifyTime         string `description:"修改时间"`
 	State              int    `description:"1:未发布,2:已发布"`
 	PublishTime        string `description:"发布时间"`
+	PrePublishTime     string `description:"预发布时间"`
 	Stage              int    `description:"期数"`
 	MsgIsSend          int    `description:"消息是否已发送,0:否,1:是"`
+	PreMsgSend         int    `description:"定时发布成功后是否立即推送模版消息:0否,1是"`
 	Content            string `description:"内容"`
 	VideoUrl           string `description:"音频文件URL"`
 	VideoName          string `description:"音频文件名称"`
@@ -423,6 +425,24 @@ func AddReportSaveLog(reportId, adminId int, content, contentSub, adminName stri
 	return
 }
 
+func MultiAddReportChaptersSaveLog(items []*ReportChapter, adminId int, adminRealName string) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	p, err := o.Raw(`INSERT INTO report_save_log(report_id, report_chapter_id, content, content_sub, admin_id, admin_name) VALUES (?,?,?,?,?,?)`).Prepare()
+	if err != nil {
+		return
+	}
+	defer func() {
+		_ = p.Close()
+	}()
+	for _, v := range items {
+		_, err = p.Exec(v.ReportId, v.ReportChapterId, v.Content, v.ContentSub, adminId, adminRealName)
+		if err != nil {
+			return
+		}
+	}
+	return
+}
+
 type SaveReportContentResp struct {
 	ReportId int `description:"报告id"`
 }
@@ -490,9 +510,11 @@ func AddReportAndChapter(reportItem *Report, chapterItemList []*ReportChapter) (
 	if len(chapterItemList) > 0 {
 		for _, chapterItem := range chapterItemList {
 			chapterItem.ReportId = int(reportId)
-			if _, tmpErr := to.Insert(chapterItem); tmpErr != nil {
+			cpId, tmpErr := to.Insert(chapterItem)
+			if tmpErr != nil {
 				return
 			}
+			chapterItem.ReportChapterId = int(cpId)
 		}
 	}
 

+ 26 - 34
models/system/sys_menu.go

@@ -16,24 +16,20 @@ const (
 )
 
 type SysMenu struct {
-	MenuId       int       `orm:"column(menu_id);pk"`
-	ParentId     int       `description:"父级菜单ID"`
-	Name         string    `description:"菜单名称或者按钮名称"`
-	RootId       int       `description:"顶层菜单ID"`
-	Sort         string    `description:"排序"`
-	Path         string    `description:"路由地址"`
-	PathName     string    `description:"路由名称"`
-	IconPath     string    `description:"菜单图标地址"`
-	Component    int       `description:"组件路径"`
-	Hidden       int       `description:"是否隐藏:1-隐藏 0-显示"`
-	HiddenLayout int       `description:"是否隐藏layout:1-隐藏 0-显示"`
-	Level        int       `description:"菜单等级:1-2-3"`
-	IsLevel      int       `description:"是否为多级菜单:1,只有一级;2,有多级"`
-	LevelPath    string    `description:"兼容以前menu表的字段"`
-	MenuType     int       `description:"菜单类型: 0-菜单; 1-按钮; 2-字段(需要特殊处理)"`
-	ButtonCode   string    `description:"按钮/菜单唯一标识"`
-	CreateTime   time.Time `description:"创建时间"`
-	ModifyTime   time.Time `description:"更新时间"`
+	MenuId     int       `orm:"column(menu_id);pk"`
+	ParentId   int       `description:"父级菜单ID"`
+	Name       string    `description:"菜单名称或者按钮名称"`
+	Sort       string    `description:"排序"`
+	Path       string    `description:"路由地址"`
+	IconPath   string    `description:"菜单图标地址"`
+	Component  int       `description:"组件路径"`
+	Hidden     int       `description:"是否隐藏:1-隐藏 0-显示"`
+	IsLevel    int       `description:"是否为多级菜单:1,只有一级;2,有多级"`
+	LevelPath  string    `description:"兼容以前menu表的字段"`
+	MenuType   int       `description:"菜单类型: 0-菜单; 1-按钮; 2-字段(需要特殊处理)"`
+	ButtonCode string    `description:"按钮/菜单唯一标识"`
+	CreateTime time.Time `description:"创建时间"`
+	ModifyTime time.Time `description:"更新时间"`
 }
 
 // GetSysMenuItemsByCondition 获取菜单列表
@@ -131,7 +127,7 @@ func GetMenuButtonsByRoleId(roleId int) (items []*SysMenu, err error) {
 				sys_menu AS r
 			JOIN sys_role_menu AS rm ON r.menu_id = rm.menu_id AND rm.type = 0
 			WHERE
-				rm.role_id = ? AND r.menu_type <> 0
+				rm.role_id = ? AND r.menu_type <> 0 AND r.hidden = 0
 			ORDER BY
 				r.sort ASC,
 				r.create_time DESC`
@@ -157,21 +153,17 @@ type SysMenuListResp struct {
 
 // SysMenuItem ETA商家菜单
 type SysMenuItem struct {
-	MenuId       int
-	ParentId     int            `description:"父级菜单ID"`
-	Name         string         `description:"菜单名称或者按钮名称"`
-	RootId       int            `description:"顶层菜单ID"`
-	Sort         string         `description:"排序"`
-	Path         string         `description:"路由地址"`
-	PathName     string         `description:"路由名称"`
-	IconPath     string         `description:"菜单图标地址"`
-	Component    int            `description:"组件路径"`
-	Hidden       int            `description:"是否隐藏:1-隐藏 0-显示"`
-	HiddenLayout int            `description:"是否隐藏layout:1-隐藏 0-显示"`
-	Level        int            `description:"菜单等级:1-2-3"`
-	MenuType     int            `description:"菜单类型: 0-菜单; 1-按钮; 2-字段(需要特殊处理)"`
-	ButtonCode   string         `description:"按钮/菜单唯一标识"`
-	Children     []*SysMenuItem `description:"子菜单"`
+	MenuId     int
+	ParentId   int            `description:"父级菜单ID"`
+	Name       string         `description:"菜单名称或者按钮名称"`
+	Sort       string         `description:"排序"`
+	Path       string         `description:"路由地址"`
+	IconPath   string         `description:"菜单图标地址"`
+	Component  int            `description:"组件路径"`
+	Hidden     int            `description:"是否隐藏:1-隐藏 0-显示"`
+	MenuType   int            `description:"菜单类型: 0-菜单; 1-按钮; 2-字段(需要特殊处理)"`
+	ButtonCode string         `description:"按钮/菜单唯一标识"`
+	Children   []*SysMenuItem `description:"子菜单"`
 }
 
 // BusinessConf 商户配置表

+ 45 - 0
routers/commentsRouter.go

@@ -1933,6 +1933,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/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_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
         beego.ControllerComments{
             Method: "GetEdbDateData",
@@ -2005,6 +2014,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/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_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
         beego.ControllerComments{
             Method: "SetEdbDataInsertConfig",
@@ -2023,6 +2041,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/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_api/controllers/data_manage:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbInfoController"],
         beego.ControllerComments{
             Method: "EdbInfoMove",
@@ -4849,6 +4876,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers:PptEnglishController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:PptEnglishController"],
+        beego.ControllerComments{
+            Method: "TitleCheck",
+            Router: `/titleCheck`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers:PptEnglishController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:PptEnglishController"],
         beego.ControllerComments{
             Method: "ToReport",
@@ -5128,6 +5164,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers:PptV2Controller"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:PptV2Controller"],
+        beego.ControllerComments{
+            Method: "TitleCheck",
+            Router: `/titleCheck`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers:PptV2Controller"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:PptV2Controller"],
         beego.ControllerComments{
             Method: "ToEn",

+ 1 - 1
services/alarm_msg/alarm_msg.go

@@ -25,5 +25,5 @@ func SendAlarmMsg(msgBody string, level int) {
 		utils.FileLog.Info("SendAlarmMsg json.Marshal Err:" + err.Error())
 		return
 	}
-	http.Post(utils.AlarmMsgUrl, string(param))
+	http.Post(utils.AlarmMsgUrl, string(param), "application/json")
 }

+ 4 - 4
services/data/chart_info.go

@@ -1429,7 +1429,7 @@ func BarChartData(mappingList []*data_manage.ChartEdbInfoMapping, edbDataListMap
 // @author Roc
 // @datetime 2022-09-16 10:15:38
 // @description 将原来自己写的一套获取所有关联指标,然后刷新指标逻辑 改成  只获取使用的指标id,然后遍历去调用“指标刷新服务”
-func ChartInfoRefreshV2(chartInfoId int) (err error) {
+func ChartInfoRefreshV2(chartInfoId int) (err error, isAsync bool) {
 	var errmsg string
 	defer func() {
 		if err != nil {
@@ -1450,7 +1450,7 @@ func ChartInfoRefreshV2(chartInfoId int) (err error) {
 	}
 
 	// 批量刷新
-	err, _ = EdbInfoRefreshAllFromBaseV3(edbIdList, false, true)
+	err, isAsync = EdbInfoRefreshAllFromBaseV3(edbIdList, false, false)
 	if err != nil {
 		return
 	}
@@ -1462,7 +1462,7 @@ func ChartInfoRefreshV2(chartInfoId int) (err error) {
 // @author Roc
 // @datetime 2022-09-16 10:15:38
 // @description 将原来自己写的一套获取所有关联指标,然后刷新指标逻辑 改成  只获取使用的指标id,然后遍历去调用“指标刷新服务”
-func BatchChartInfoRefreshV2(chartInfoList []*data_manage.ChartInfo) (err error) {
+func BatchChartInfoRefreshV2(chartInfoList []*data_manage.ChartInfo) (err error, isAsync bool) {
 	if len(chartInfoList) <= 0 {
 		return
 	}
@@ -1491,7 +1491,7 @@ func BatchChartInfoRefreshV2(chartInfoList []*data_manage.ChartInfo) (err error)
 	}
 
 	// 批量刷新
-	err, _ = EdbInfoRefreshAllFromBaseV3(edbIdList, false, true)
+	err, isAsync = EdbInfoRefreshAllFromBaseV3(edbIdList, false, false)
 	if err != nil {
 		return
 	}

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

@@ -320,24 +320,24 @@ func GetChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB *data_manage.ChartEd
 		baseCalculateData = append(baseCalculateData, baseDataList[i].Value)
 	}
 
-	zeroBaseData := make([]float64, 0)
-	zeroCalculateData := make([]float64, 0)
-	for i := range baseDataTimeArr {
-		tmpBaseVal, ok1 := baseDataMap[baseDataTimeArr[i]]
-		tmpCalculateVal, ok2 := changeDataMap[baseDataTimeArr[i]]
-		if ok1 && ok2 {
-			zeroBaseData = append(zeroBaseData, tmpBaseVal)
-			zeroCalculateData = append(zeroCalculateData, tmpCalculateVal)
-		}
-	}
-	if len(zeroBaseData) != len(zeroCalculateData) {
-		err = fmt.Errorf("相关系数两组序列元素数不一致, %d-%d", len(baseCalculateData), len(zeroCalculateData))
-		return
-	}
-	zeroRatio := utils.CalculateCorrelationByIntArr(zeroBaseData, zeroCalculateData)
-	if leadValue == 0 {
-		yData = append(yData, zeroRatio)
-	}
+	//zeroBaseData := make([]float64, 0)
+	//zeroCalculateData := make([]float64, 0)
+	//for i := range baseDataTimeArr {
+	//	tmpBaseVal, ok1 := baseDataMap[baseDataTimeArr[i]]
+	//	tmpCalculateVal, ok2 := changeDataMap[baseDataTimeArr[i]]
+	//	if ok1 && ok2 {
+	//		zeroBaseData = append(zeroBaseData, tmpBaseVal)
+	//		zeroCalculateData = append(zeroCalculateData, tmpCalculateVal)
+	//	}
+	//}
+	//if len(zeroBaseData) != len(zeroCalculateData) {
+	//	err = fmt.Errorf("相关系数两组序列元素数不一致, %d-%d", len(baseCalculateData), len(zeroCalculateData))
+	//	return
+	//}
+	//zeroRatio := utils.CalculateCorrelationByIntArr(zeroBaseData, zeroCalculateData)
+	//if leadValue == 0 {
+	//	yData = append(yData, zeroRatio)
+	//}
 
 	// 计算领先/滞后N期
 	if leadValue > 0 {
@@ -345,10 +345,10 @@ func GetChartDataByEdbInfo(edbInfoMappingA, edbInfoMappingB *data_manage.ChartEd
 		moveUnitDays := utils.FrequencyDaysMap[leadUnit]
 
 		for i := range xData {
-			if xData[i] == 0 {
-				yData = append(yData, zeroRatio)
-				continue
-			}
+			//if xData[i] == 0 {
+			//	yData = append(yData, zeroRatio)
+			//	continue
+			//}
 			xCalculateData := make([]float64, 0)
 			yCalculateData := make([]float64, 0)
 

+ 21 - 13
services/data/edb_info.go

@@ -3,13 +3,13 @@ package data
 import (
 	"encoding/json"
 	"errors"
-	"fmt"
 	"eta/eta_api/models"
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/alarm_msg"
 	"eta/eta_api/services/elastic"
 	"eta/eta_api/utils"
+	"fmt"
 	"sort"
 	"strconv"
 	"strings"
@@ -1738,6 +1738,10 @@ func getRefreshEdbInfoListByIds(edbInfoIdList []int) (newBaseEdbInfoArr, newBase
 	predictCalculateInfoArr := make([]*data_manage.EdbInfo, 0) //预测运算指标
 
 	for _, baseEdbInfo := range edbInfoList {
+		// 指标若停更, 则忽略掉
+		if baseEdbInfo.NoUpdate == 1 {
+			continue
+		}
 		if baseEdbInfo.EdbInfoType == 0 { //普通指标
 			switch baseEdbInfo.EdbType {
 			case 1: //基础指标
@@ -2886,17 +2890,19 @@ func getEdbRuleTitle(edbInfo, parentEdbInfo *data_manage.EdbInfo, childList []da
 			}
 
 		} else {
-			edbMappingList, ok := edbMappingMap[parentEdbInfo.EdbInfoId]
-			if !ok {
-				edbMappingList = []*data_manage.EdbInfoCalculateMappingInfo{}
-			}
-			tagMap := make(map[string]int)
-			for _, v := range edbMappingList {
-				tagMap[v.FromTag] = v.FromEdbInfoId
-			}
-			for _, v := range config.CheckList {
-				if tmpEdbInfoId, ok := tagMap[v]; ok {
-					childEdbInfoIdList = append(childEdbInfoIdList, tmpEdbInfoId)
+			if parentEdbInfo != nil {
+				edbMappingList, ok := edbMappingMap[parentEdbInfo.EdbInfoId]
+				if !ok {
+					edbMappingList = []*data_manage.EdbInfoCalculateMappingInfo{}
+				}
+				tagMap := make(map[string]int)
+				for _, v := range edbMappingList {
+					tagMap[v.FromTag] = v.FromEdbInfoId
+				}
+				for _, v := range config.CheckList {
+					if tmpEdbInfoId, ok := tagMap[v]; ok {
+						childEdbInfoIdList = append(childEdbInfoIdList, tmpEdbInfoId)
+					}
 				}
 			}
 		}
@@ -2958,6 +2964,8 @@ func getEdbRuleTitle(edbInfo, parentEdbInfo *data_manage.EdbInfo, childList []da
 			return
 		}
 		ruleTitle = fmt.Sprintf("百分位(时间长度%d%s)", cf.CalculateValue, cf.CalculateUnit)
+	case utils.DATA_SOURCE_CALCULATE_ZSXY, utils.DATA_SOURCE_PREDICT_CALCULATE_ZSXY:
+		ruleTitle = `指数修匀计算`
 	}
 
 	return
@@ -3000,4 +3008,4 @@ func GetEdbChartAdminList(source int) (list []int, err error) {
 	}
 
 	return
-}
+}

+ 46 - 41
services/data/mysteel_chemical.go

@@ -3,11 +3,11 @@ package data
 import (
 	"encoding/json"
 	"errors"
-	"fmt"
-	"github.com/rdlucklib/rdluck_tools/http"
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/system"
 	"eta/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/http"
 	"strings"
 	"time"
 )
@@ -282,6 +282,13 @@ func AddMysteelChemicalIndex(classifyId int, indexCode, updateWeek, updateTimeSt
 		}
 	}
 
+	edbTerminal := getEdbTerminal(utils.DATA_SOURCE_MYSTEEL_CHEMICAL)
+	if edbTerminal == nil {
+		errMsg = `钢联终端信息未配置`
+		err = errors.New(errMsg)
+		return
+	}
+
 	baseFromMysteelChemicalIndex = &data_manage.BaseFromMysteelChemicalIndex{
 		//BaseFromMysteelChemicalIndexId:    0,
 		BaseFromMysteelChemicalClassifyId: classifyId,
@@ -300,14 +307,13 @@ func AddMysteelChemicalIndex(classifyId int, indexCode, updateWeek, updateTimeSt
 		SysUserRealName:                   sysUserName,
 		ModifyTime:                        time.Now(),
 		CreateTime:                        time.Now(),
+		TerminalCode:                      edbTerminal.TerminalCode, // 终端编码
 	}
 	_, err = data_manage.AddBaseFromMysteelChemicalIndex(baseFromMysteelChemicalIndex)
 	if err != nil {
 		errMsg = "保存分类失败"
 	}
 
-	// 调用指标服务生成excel并拉取数据
-	go CurlAddMysteelChemicalData(indexCode, updateWeek)
 	return
 }
 
@@ -355,8 +361,6 @@ func EditMysteelChemicalIndex(indexId, classifyId int, updateWeek, updateTimeStr
 	go func(oldUpdateWeek string, indexInfo *data_manage.BaseFromMysteelChemicalIndex) {
 		// 先删除excel表
 		CurlDelMysteelChemicalData(indexInfo.IndexCode, oldUpdateWeek)
-		// 再创建excel表
-		CurlAddMysteelChemicalData(indexInfo.IndexCode, indexInfo.UpdateWeek)
 	}(oldUpdateWeek, baseFromMysteelChemicalIndex)
 
 	return
@@ -537,38 +541,6 @@ func GetMysteelChemicalOpButton(sysUser *system.Admin, belongUserId int) (button
 	return
 }
 
-// CurlAddMysteelChemicalData 请求钢联服务器添加指标
-func CurlAddMysteelChemicalData(indexCode, updateWeek string) {
-	postUrl := utils.MySteelPostUrl + `/api/index/create`
-	//type IndexAddReq struct {
-	//	IndexCode  string `json:"IndexCode" binding:"required"`    //指标编码
-	//	UpdateWeek string `json:"UpdateWeek"`                      //更新周期
-	//	RunMode    string `description:"运行环境:debug:测试(默认),release:生产" json:"UpdateWeek"` //更新周期
-	//}
-	paramsMap := make(map[string]interface{})
-
-	updateWeek = WeekMap[updateWeek]
-	paramsMap["IndexCode"] = indexCode
-	paramsMap["UpdateWeek"] = updateWeek
-	paramsMap["RunMode"] = utils.RunMode
-
-	paramJson, err := json.Marshal(paramsMap)
-	if err != nil {
-		fmt.Println("param json.Marshal Err:" + err.Error())
-		err = errors.New("param json.Marshal Err:" + err.Error())
-		return
-	}
-
-	utils.FileLog.Info(fmt.Sprintf("CurlAddMysteelChemicalData parms:%s", string(paramJson)))
-	result, err := http.Post(postUrl, string(paramJson), "application/json")
-	if err != nil {
-		fmt.Println("post err:" + err.Error())
-		err = errors.New("post Err:" + err.Error())
-		return
-	}
-	utils.FileLog.Info("CurlAddMysteelChemicalData Result:%s", string(result))
-}
-
 // CurlDelMysteelChemicalData 请求钢联服务器删除指标
 func CurlDelMysteelChemicalData(indexCode, updateWeek string) {
 	postUrl := utils.MySteelPostUrl + `/api/index/delete`
@@ -613,7 +585,7 @@ var WeekMap = map[string]string{
 	"周日": "sunday",
 }
 
-// CurlAddMysteelChemicalData 请求钢联服务器添加指标
+// CurlRefreshMysteelChemicalData 请求钢联服务器添加指标
 func CurlRefreshMysteelChemicalData(mergeFilePath string) {
 	postUrl := utils.MySteelPostUrl + `/api/index/refresh`
 	//type IndexAddReq struct {
@@ -630,12 +602,45 @@ func CurlRefreshMysteelChemicalData(mergeFilePath string) {
 		return
 	}
 
-	utils.FileLog.Info(fmt.Sprintf("CurlAddMysteelChemicalData parms:%s", string(paramJson)))
+	utils.FileLog.Info(fmt.Sprintf("CurlRefreshMysteelChemicalData parms:%s", string(paramJson)))
 	result, err := http.Post(postUrl, string(paramJson), "application/json")
 	if err != nil {
 		fmt.Println("post err:" + err.Error())
 		err = errors.New("post Err:" + err.Error())
 		return
 	}
-	utils.FileLog.Info("CurlAddMysteelChemicalData Result:%s", string(result))
+	utils.FileLog.Info("CurlRefreshMysteelChemicalData Result:%s", string(result))
+}
+
+// getEdbTerminal 根据指标来源获取可用指标终端信息
+func getEdbTerminal(source int) (edbTerminal *data_manage.EdbTerminal) {
+	terminalNumList, err := data_manage.GetMysteelChemicalGroupTerminalNum()
+	if err != nil {
+		return
+	}
+
+	terminalNumMap := make(map[string]int)
+	for _, v := range terminalNumList {
+		terminalNumMap[v.TerminalCode] = v.Num
+	}
+
+	terminalList, err := data_manage.GetEdbTerminalListBySource(source)
+	if err != nil {
+		return
+	}
+
+	num := 0
+	for _, v := range terminalList {
+		tmpNum := terminalNumMap[v.TerminalCode]
+
+		if edbTerminal == nil {
+			edbTerminal = v
+			num = tmpNum
+		} else if tmpNum < num {
+			edbTerminal = v
+			num = tmpNum
+		}
+	}
+
+	return
 }

+ 33 - 0
services/report.go

@@ -259,6 +259,9 @@ func PublishDayWeekReport(reportId int) (tips string, err error) {
 	go func() {
 		_ = UpdateReportEs(report.Id, 2)
 	}()
+
+	// 发布时备份内容
+	go SaveReportLogs(report, chapters, report.AdminId, report.AdminRealName)
 	return
 }
 
@@ -1223,3 +1226,33 @@ func HandleVideoDecibel(chapterInfo *models.ReportChapter) {
 
 	return
 }
+
+// SaveReportLogs 记录报告日志
+func SaveReportLogs(item *models.Report, chapters []*models.ReportChapter, adminId int, adminRealName string) {
+	if item == nil && len(chapters) == 0 {
+		return
+	}
+	var err error
+	defer func() {
+		if err != nil {
+			tips := fmt.Sprintf("报告日志记录, SaveReportLogs error: %s", err.Error())
+			go alarm_msg.SendAlarmMsg(tips, 2)
+		}
+	}()
+
+	if item != nil {
+		e := models.AddReportSaveLog(item.Id, item.AdminId, item.Content, item.ContentSub, item.AdminRealName)
+		if e != nil {
+			err = fmt.Errorf("AddReportSaveLog: %s", e.Error())
+			return
+		}
+	}
+	if len(chapters) > 0 {
+		e := models.MultiAddReportChaptersSaveLog(chapters, adminId, adminRealName)
+		if e != nil {
+			err = fmt.Errorf("MultiAddReportChaptersSaveLog: %s", e.Error())
+			return
+		}
+	}
+	return
+}

+ 1 - 0
services/sandbox/sandbox.go

@@ -16,6 +16,7 @@ import (
 
 // AddSandbox 新增沙盘
 func AddSandbox(req request.AddAndEditSandbox, opUserId int, opUserName string, ignoreVariety bool) (resp *sandbox.SandboxSaveResp, err error) {
+	resp = new(sandbox.SandboxSaveResp)
 	// 获取产品权限详情
 	var permissionName string
 	if !ignoreVariety {

+ 5 - 1
utils/constants.go

@@ -159,7 +159,9 @@ const (
 	DATA_SOURCE_CALCULATE_PERCENTILE                            //百分位图表->68
 	DATA_SOURCE_PREDICT_CALCULATE_STANDARD_DEVIATION            //预测标准差->69
 	DATA_SOURCE_PREDICT_CALCULATE_PERCENTILE                    //预测百分位->70
-	DATA_SOURCE_FUBAO                                = 71       //富宝->71
+	DATA_SOURCE_FUBAO                                           //富宝->71
+	DATA_SOURCE_CALCULATE_ZSXY                                  // 指数修匀->72
+	DATA_SOURCE_PREDICT_CALCULATE_ZSXY                          // 预测指数修匀->73
 )
 
 // 数据刷新频率
@@ -317,3 +319,5 @@ const (
 )
 
 const CrmEtaAuthorization = "NIi1RbEmH0C2rksXtPGDPBBgRgTZY87Q"
+
+const LoginCacheTime = 60 // 登录缓存时长, 分钟