Forráskód Böngészése

feat:新增普通计算公式接口

Roc 1 éve
szülő
commit
e3679b5fb7

+ 0 - 49
controllers/data_manage/excel/excel_info.go

@@ -2029,55 +2029,6 @@ func (c *ExcelInfoController) Copy() {
 	br.IsAddLog = true
 }
 
-// GetSystemDate
-// @Title 获取系统日期(包含计算日期)
-// @Description 获取系统日期(包含计算日期)
-// @Param	request	body request.MixedTableCellDataReq true "type json string"
-// @router /excel_info/get_system_date [post]
-func (c *ExcelInfoController) GetSystemDate() {
-	br := new(models.BaseResponse).Init()
-	defer func() {
-		c.Data["json"] = br
-		c.ServeJSON()
-	}()
-
-	sysUser := c.SysUser
-	if sysUser == nil {
-		br.Msg = "请登录"
-		br.ErrMsg = "请登录,SysUser Is Empty"
-		br.Ret = 408
-		return
-	}
-
-	var req request.MixedTableCellDataReq
-	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
-	if err != nil {
-		br.Msg = "参数解析异常!"
-		br.ErrMsg = "参数解析失败,Err:" + err.Error()
-		return
-	}
-
-	date, err, errMsg := excel2.HandleDate(req.DataTimeType, req.Value)
-	if err != nil {
-		br.Msg = "获取系统日期失败"
-		if errMsg != `` {
-			br.Msg = errMsg
-		}
-		br.ErrMsg = "获取系统日期失败,Err:" + err.Error()
-		return
-	}
-
-	type resp struct {
-		Date string
-	}
-	br.Ret = 200
-	br.Success = true
-	br.Msg = "获取系统日期成功"
-	br.Data = resp{
-		Date: date,
-	}
-}
-
 //func init() {
 //	//list, err := data.GetFirstEdbDataList(102739, 12)
 //	list, err := data.GetFirstEdbDataList(101323, 12)

+ 155 - 0
controllers/data_manage/excel/mixed_table.go

@@ -0,0 +1,155 @@
+package excel
+
+import (
+	"encoding/json"
+	"eta/eta_api/models"
+	"eta/eta_api/models/data_manage"
+	"eta/eta_api/models/data_manage/excel/request"
+	"eta/eta_api/services/data"
+	excel2 "eta/eta_api/services/data/excel"
+	"strconv"
+)
+
+// GetSystemDate
+// @Title 获取系统日期(包含计算日期)
+// @Description 获取系统日期(包含计算日期)
+// @Param	request	body request.MixedTableCellDataReq true "type json string"
+// @router /excel_info/get_system_date [post]
+func (c *ExcelInfoController) GetSystemDate() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req request.MixedTableCellDataReq
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	date, err, errMsg := excel2.HandleDate(req.DataTimeType, req.Value)
+	if err != nil {
+		br.Msg = "获取系统日期失败"
+		if errMsg != `` {
+			br.Msg = errMsg
+		}
+		br.ErrMsg = "获取系统日期失败,Err:" + err.Error()
+		return
+	}
+
+	type resp struct {
+		Date string
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取系统日期成功"
+	br.Data = resp{
+		Date: date,
+	}
+}
+
+// CalculateData
+// @Title 公式计算(混合表格)
+// @Description 公式计算(混合表格)
+// @Param	request	body request.CalculateConf true "type json string"
+// @router /excel_info/mixed/calculate [post]
+func (c *ExcelInfoController) CalculateData() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req request.CalculateConf
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	edbInfo, err := data_manage.GetEdbInfoById(req.EdbInfoId)
+	if err != nil {
+		br.Msg = "获取指标信息失败!"
+		br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
+		return
+	}
+
+	dataList := make([]*data_manage.EdbDataList, 0)
+	switch edbInfo.EdbInfoType {
+	case 0:
+		dataList, _ = data_manage.GetEdbDataList(edbInfo.Source, edbInfo.EdbInfoId, ``, ``)
+	case 1:
+		_, dataList, _, _, _, _ = data.GetPredictDataListByPredictEdbInfoId(edbInfo.EdbInfoId, ``, ``, false)
+	default:
+		br.Msg = "指标类型异常!"
+		br.ErrMsg = "指标类型异常,Err:" + strconv.Itoa(edbInfo.EdbInfoType)
+		return
+	}
+
+	//获取所有数据,计算所有数据
+	//获取部分数据,计算部分数据
+	// BaseCalculate 数据计算的结构体
+	type BaseCalculate struct {
+		DataList      []*data_manage.EdbDataList
+		Frequency     string `description:"需要转换的频度"`
+		Formula       interface{}
+		Calendar      string `description:"公历/农历"`
+		MoveType      int    `description:"移动方式:1:领先(默认),2:滞后"`
+		MoveFrequency string `description:"移动频度"`
+		FromFrequency string `description:"来源的频度"`
+		Source        int    `description:"1:累计值转月;2:累计值转季;3:同比值;4:同差值;5:N数值移动平均数计算;6:环比值;7:环差值;8:升频;9:降频;10:时间移位;11:超季节性;12:年化;13:累计值;14:累计值年初至今;15:指数修匀;16:日均值"`
+	}
+
+	req2 := &BaseCalculate{
+		DataList:      dataList,
+		Frequency:     req.Frequency,
+		Formula:       req.Formula,
+		Calendar:      req.Calendar,
+		MoveType:      req.MoveType,
+		MoveFrequency: req.MoveFrequency,
+		FromFrequency: edbInfo.Frequency,
+		Source:        req.Source,
+	}
+
+	// 调用指标库去更新
+	reqJson, tmpErr := json.Marshal(req2)
+	if tmpErr != nil {
+		err = tmpErr
+		return
+	}
+	respItem, tmpErr := data.BaseCalculate(string(reqJson))
+	if tmpErr != nil {
+		err = tmpErr
+		return
+	}
+	if respItem.Ret != 200 {
+		br.Msg = respItem.Msg
+		br.ErrMsg = respItem.ErrMsg
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取系统日期成功"
+	br.Data = respItem.Data
+}

+ 20 - 5
models/data_manage/excel/request/mixed_table.go

@@ -2,11 +2,12 @@ package request
 
 // 单元格的数据类型
 const (
-	DateDT          = iota + 1 //日期
-	EdbDT                      // 指标类型
-	CustomTextDT               // 自定义文本
-	InsertDataDT               // 插值
-	PopInsertDataDT            // 弹框插值
+	DateDT                   = iota + 1 //日期
+	EdbDT                               // 指标类型
+	CustomTextDT                        // 自定义文本
+	InsertDataDT                        // 插值(插入指标值,表格上,自动判断日期和指标的交集位置,插入值)
+	PopInsertDataDT                     // 弹框插值(在表格上选择日期,然后空白单元格选择弹框并选择指标,插入该指标与该日期的值)
+	InsertEdbCalculateDataDT            // 插入指标计算公式生成的值
 )
 
 // 单元格的日期类型类型
@@ -72,3 +73,17 @@ type SystemDateConf struct {
 type EdbDateConf struct {
 	EdbInfoId int `description:"指标id"`
 }
+
+// CalculateConf
+// @Description: 计算公式
+type CalculateConf struct {
+	EdbInfoId int `description:"指标id"`
+	//DataList      []*EdbInfoSearchData
+	DataTime      string `description:"所属日期"`
+	Frequency     string `description:"需要转换的频度"`
+	Formula       string `description:"计算公式,默认是string,实际上还需要转成其他样式"`
+	Calendar      string `description:"公历/农历"`
+	MoveType      int    `description:"移动方式:1:领先(默认),2:滞后"`
+	MoveFrequency string `description:"移动频度"`
+	Source        int    `description:"1:累计值转月;2:累计值转季;3:同比值;4:同差值;5:N数值移动平均数计算;6:环比值;7:环差值;8:升频;9:降频;10:时间移位;11:超季节性;12:年化;13:累计值;14:累计值年初至今;15:指数修匀;16:日均值"`
+}

+ 28 - 0
services/data/base_edb_lib.go

@@ -329,6 +329,34 @@ func PredictCalculateComputeCorrelation(edbInfoCalculateBatchSaveReqStr string)
 	return
 }
 
+// BaseCalculateResp 拟合残差计算相关性的值返回
+type BaseCalculateResp struct {
+	Ret         int
+	Msg         string
+	ErrMsg      string
+	ErrCode     string
+	Data        BaseCalculateDataResp
+	Success     bool `description:"true 执行成功,false 执行失败"`
+	IsSendEmail bool `json:"-" description:"true 发送邮件,false 不发送邮件"`
+	IsAddLog    bool `json:"-" description:"true 新增操作日志,false 不新增操作日志" `
+}
+
+type BaseCalculateDataResp struct {
+	DataMap  map[string]float64
+	DateList []string
+}
+
+// BaseCalculate 基础计算
+func BaseCalculate(param string) (resp *BaseCalculateResp, err error) {
+	urlStr := "calculate/base"
+	_, resultByte, err := postAddEdbData(param, urlStr)
+	err = json.Unmarshal(resultByte, &resp)
+	if err != nil {
+		return
+	}
+	return
+}
+
 // postRefreshEdbData 刷新指标数据
 func postRefreshEdbData(param map[string]interface{}, urlStr string) (resp *models.BaseResponse, err error) {
 	postUrl := utils.EDB_LIB_URL + urlStr

+ 9 - 0
services/data/excel/mixed_table.go

@@ -149,6 +149,15 @@ func handleConfig(configList [][]request.MixedTableCellDataReq) (newConfig [][]r
 				edbInfoIdList = append(edbInfoIdList, cell.EdbInfoId)
 			case request.InsertDataDT, request.PopInsertDataDT: // 插值、弹框插值
 				dataEdbInfoIdList = append(dataEdbInfoIdList, cell.EdbInfoId)
+			case request.InsertEdbCalculateDataDT: // 插入指标计算公式生成的值
+				var config request.CalculateConf
+				err = json.Unmarshal([]byte(cell.Value), &config)
+				if err != nil {
+					return
+				}
+				edbInfoIdList = append(edbInfoIdList, config.EdbInfoId)
+				dataEdbInfoIdList = append(dataEdbInfoIdList, cell.EdbInfoId)
+
 			case request.DateDT: // 日期类型
 				if cell.DataTimeType == request.EdbDateDT {
 					var config request.EdbDateConf