Browse Source

商品利润曲线相关

hsun 1 year ago
parent
commit
3cd2e45452

+ 11 - 0
controllers/data_manage/chart_common.go

@@ -92,6 +92,17 @@ func (this *ChartInfoController) CommonChartInfoDetailFromUniqueCode() {
 		br.Success = true
 		br.Msg = "获取成功"
 		br.Data = resp
+	case utils.CHART_SOURCE_FUTURE_GOOD_PROFIT:
+		resp, isOk, msg, errMsg := future_good.GetFutureGoodProfitChartInfoDetailFromUniqueCode(chartInfo, isCache, sysUser)
+		if !isOk {
+			br.Msg = msg
+			br.ErrMsg = errMsg
+			return
+		}
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		br.Data = resp
 	case utils.CHART_SOURCE_CORRELATION, utils.CHART_SOURCE_ROLLING_CORRELATION:
 		resp, isOk, msg, errMsg := correlation.GetChartInfoDetailFromUniqueCode(chartInfo, isCache, sysUser)
 		if !isOk {

+ 177 - 0
controllers/data_manage/future_good/future_good_profit_chart_info.go

@@ -0,0 +1,177 @@
+package future_good
+
+import (
+	"encoding/json"
+	"fmt"
+	"hongze/hongze_ETA_mobile_api/models/data_manage"
+	"hongze/hongze_ETA_mobile_api/models/data_manage/future_good"
+	"hongze/hongze_ETA_mobile_api/models/data_manage/future_good/request"
+	"hongze/hongze_ETA_mobile_api/models/data_manage/future_good/response"
+	"hongze/hongze_ETA_mobile_api/models/system"
+	"hongze/hongze_ETA_mobile_api/services/data"
+	"hongze/hongze_ETA_mobile_api/utils"
+	"strings"
+	"time"
+)
+
+// GetFutureGoodProfitChartInfoDetailFromUniqueCode 根据编码获取图表详情
+func GetFutureGoodProfitChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCache bool, sysUser *system.Admin) (resp *data_manage.ChartInfoDetailFromUniqueCodeResp, isOk bool, msg, errMsg string) {
+	resp = new(data_manage.ChartInfoDetailFromUniqueCodeResp)
+
+	adminId := sysUser.AdminId
+
+	//判断是否存在缓存,如果存在缓存,那么直接从缓存中获取
+	key := data.GetChartInfoDataKey(chartInfo.ChartInfoId)
+	if utils.Re == nil && isCache {
+		if utils.Re == nil && utils.Rc.IsExist(key) {
+			if chartData, err1 := utils.Rc.RedisBytes(key); err1 == nil {
+				err := json.Unmarshal(chartData, &resp)
+				if err == nil && resp != nil {
+					// 这里跟当前用户相关的信息重新查询写入resp, 不使用缓存中的
+					var myCond string
+					var myPars []interface{}
+					myCond += ` AND a.admin_id=? `
+					myPars = append(myPars, adminId)
+					myCond += ` AND a.chart_info_id=? `
+					myPars = append(myPars, chartInfo.ChartInfoId)
+					myList, err := data_manage.GetMyChartByCondition(myCond, myPars)
+					if err != nil && err.Error() != utils.ErrNoRow() {
+						msg = "获取失败"
+						errMsg = "获取我的图表信息失败,GetMyChartByCondition,Err:" + err.Error()
+						return
+					}
+					resp.ChartInfo.IsAdd = false
+					resp.ChartInfo.MyChartId = 0
+					resp.ChartInfo.MyChartClassifyId = ""
+					if myList != nil && len(myList) > 0 {
+						resp.ChartInfo.IsAdd = true
+						resp.ChartInfo.MyChartId = myList[0].MyChartId
+						resp.ChartInfo.MyChartClassifyId = myList[0].MyChartClassifyId
+					}
+
+					isOk = true
+					fmt.Println("source redis")
+					return
+				}
+			}
+		}
+	}
+
+	chartInfoId := chartInfo.ChartInfoId
+
+	// 商品利润曲线图的一些配置
+	var extraConf request.ChartInfoReq
+	err := json.Unmarshal([]byte(chartInfo.ExtraConfig), &extraConf)
+	if err != nil {
+		msg = "商品利润曲线图配置异常"
+		errMsg = "商品利润曲线图配置异常,Err:" + err.Error()
+		return
+	}
+
+	edbList := make([]*data_manage.ChartEdbInfoMapping, 0)
+	edbInfoMapping, err := data_manage.GetEtaEdbChartEdbMapping(chartInfoId)
+	if err != nil {
+		msg = "获取失败"
+		errMsg = "获取商品利润图表,基础指标信息失败,Err:" + err.Error()
+		return
+	}
+	edbList = append(edbList, edbInfoMapping)
+	futureGoodEdbInfoMappingList, err := data_manage.GetFutureGoodEdbChartEdbMappingList(chartInfoId)
+	if err != nil {
+		msg = "获取失败"
+		errMsg = "获取商品利润图表,商品指标信息失败,Err:" + err.Error()
+		return
+	}
+	edbList = append(edbList, futureGoodEdbInfoMappingList...)
+	if len(edbList) <= 0 {
+		msg = "商品利润曲线图表指标异常"
+		errMsg = "商品利润曲线图表指标异常"
+		return
+	}
+
+	xDataList := make([]data_manage.XData, 0)
+	yDataList := make([]data_manage.YData, 0)
+
+	// 查找商品利润图表的扩展信息
+	chartInfoFutureGoodProfit := new(future_good.ChartInfoFutureGoodProfit)
+	if err = chartInfoFutureGoodProfit.GetItemById(chartInfo.ChartInfoId); err != nil {
+		msg = "获取失败"
+		errMsg = "获取基础相关性图表信息失败, Err: " + err.Error()
+		return
+	}
+
+	err = json.Unmarshal([]byte(chartInfoFutureGoodProfit.XValue), &xDataList)
+	if err != nil {
+		msg = "获取失败"
+		errMsg = "转换X轴数据失败, Err: " + err.Error()
+		return
+	}
+
+	err = json.Unmarshal([]byte(chartInfoFutureGoodProfit.YValue), &yDataList)
+	if err != nil {
+		msg = "获取失败"
+		errMsg = "转换Y轴数据失败, Err: " + err.Error()
+		return
+	}
+
+	warnEdbList := make([]string, 0)
+	baseEdbInfo := edbList[0] //现货指标
+
+	for _, v := range edbList {
+		if v.IsNullData {
+			warnEdbList = append(warnEdbList, v.EdbName+"("+v.EdbCode+")")
+		}
+	}
+	if len(warnEdbList) > 0 {
+		chartInfo.WarnMsg = `图表引用指标异常,异常指标:` + strings.Join(warnEdbList, ",")
+	}
+	if chartInfoId > 0 && chartInfo != nil {
+		//判断是否加入我的图库
+		{
+			var myChartCondition string
+			var myChartPars []interface{}
+			myChartCondition += ` AND a.admin_id=? `
+			myChartPars = append(myChartPars, sysUser.AdminId)
+			myChartCondition += ` AND a.chart_info_id=? `
+			myChartPars = append(myChartPars, chartInfo.ChartInfoId)
+
+			myChartList, err := data_manage.GetMyChartByCondition(myChartCondition, myChartPars)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				msg = "获取失败"
+				errMsg = "获取我的图表信息失败,GetMyChartByCondition,Err: " + err.Error()
+				return
+			}
+			if myChartList != nil && len(myChartList) > 0 {
+				chartInfo.IsAdd = true
+				chartInfo.MyChartId = myChartList[0].MyChartId
+				chartInfo.MyChartClassifyId = myChartList[0].MyChartClassifyId
+			}
+		}
+	}
+
+	//图表操作权限
+	chartInfo.IsEdit = data.CheckOpChartPermission(sysUser, chartInfo.SysUserId)
+	//判断是否需要展示英文标识
+	chartInfo.IsEnChart = data.CheckIsEnChart(chartInfo.ChartNameEn, edbList[0:1], chartInfo.Source, chartInfo.ChartType)
+	chartInfo.UnitEn = baseEdbInfo.UnitEn
+
+	resp.ChartInfo = chartInfo
+	resp.EdbInfoList = edbList
+	resp.DataResp = response.ProfitFutureGoodChartResp{
+		YDataList:    yDataList,
+		XDataList:    xDataList,
+		ProfitName:   chartInfoFutureGoodProfit.ProfitName,
+		ProfitNameEn: chartInfoFutureGoodProfit.ProfitNameEn,
+		Extra:        extraConf,
+	}
+	resp.Status = true
+
+	// 将数据加入缓存
+	if utils.Re == nil {
+		data, _ := json.Marshal(resp)
+		utils.Rc.Put(key, data, 2*time.Hour)
+	}
+	isOk = true
+
+	return
+}

+ 13 - 0
models/data_manage/chart_edb_mapping.go

@@ -156,6 +156,19 @@ func GetFutureGoodEdbChartEdbMapping(chartInfoId int) (item *ChartEdbInfoMapping
 	return
 }
 
+// GetFutureGoodEdbChartEdbMappingList       商品曲线图查询对应的商品指标
+func GetFutureGoodEdbChartEdbMappingList(chartInfoId int) (items []*ChartEdbInfoMapping, err error) {
+	o := orm.NewOrmUsingDB("data")
+	aField := `a.chart_edb_mapping_id,a.chart_info_id,a.edb_info_id,a.create_time,a.modify_time,a.unique_code,a.max_data,a.min_data,a.is_order,a.is_axis,a.edb_info_type,a.lead_value,a.lead_unit,a.chart_style,a.chart_color,a.predict_chart_color,a.chart_width,a.source as mapping_source`
+	sql := ` SELECT ` + aField + `,b.future_good_edb_info_id,b.future_good_edb_code as edb_code,b.future_good_edb_name as edb_name,b.start_date,b.end_date,b.modify_time,b.latest_date,b.latest_value
+             FROM chart_edb_mapping AS a
+			 INNER JOIN future_good_edb_info AS b ON a.edb_info_id=b.future_good_edb_info_id
+			 WHERE a.chart_info_id=? AND a.source = ?
+             ORDER BY chart_edb_mapping_id ASC `
+	_, err = o.Raw(sql, chartInfoId, utils.CHART_SOURCE_FUTURE_GOOD).QueryRows(&items)
+	return
+}
+
 // GetChartEdbMappingListV2 根据图表id获取指标信息,不连表查询指标表
 func GetChartEdbMappingListV2(chartInfoId int) (list []*ChartEdbInfoMapping, err error) {
 	o := orm.NewOrmUsingDB("data")

+ 206 - 0
models/data_manage/future_good/chart_info_future_good_profit.go

@@ -0,0 +1,206 @@
+package future_good
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"hongze/hongze_ETA_mobile_api/models/data_manage"
+	"hongze/hongze_ETA_mobile_api/utils"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// ChartInfoFutureGoodProfit 商品利润图表-扩展信息
+type ChartInfoFutureGoodProfit struct {
+	ChartInfoId  int       `orm:"column(chart_info_id);pk" description:"商品利润图表ID(chart_info表source=5的)"`
+	ProfitName   string    `description:"利润名称"`
+	ProfitNameEn string    `description:"利润英文名称"`
+	XValue       string    `description:"X轴数据值"`
+	YValue       string    `description:"Y轴数据值"`
+	CreateTime   time.Time `description:"创建时间"`
+	ModifyTime   time.Time `description:"更新时间"`
+}
+
+type CorrelationInfo struct {
+	LeadValue       int    `description:"领先值"`
+	LeadUnit        string `description:"领先单位"`
+	CalculateValue  int    `description:"计算窗口"`
+	CalculateUnit   string `description:"计算频度"`
+	StartDate       string `description:"开始日期"`
+	EndDate         string `description:"结束日期"`
+	EdbInfoIdFirst  int    `description:"A指标ID"`
+	EdbInfoIdSecond int    `description:"B指标ID"`
+	PeriodData      string `description:"X轴-期数数据"`
+	CorrelationData string `description:"Y轴-商品利润系数"`
+}
+
+func (m *ChartInfoFutureGoodProfit) TableName() string {
+	return "chart_info_future_good_profit"
+}
+
+func (m *ChartInfoFutureGoodProfit) Create() (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Insert(m)
+	if err != nil {
+		return
+	}
+	//m.CorrelationChartInfoId = int(id)
+	return
+}
+
+func (m *ChartInfoFutureGoodProfit) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Update(m, cols...)
+	return
+}
+
+func (m *ChartInfoFutureGoodProfit) Delete() (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE chart_info_id = ? LIMIT 1`, m.TableName())
+	_, err = o.Raw(sql, m.ChartInfoId).Exec()
+	return
+}
+
+func (m *ChartInfoFutureGoodProfit) GetItemById(id int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE chart_info_id = ? LIMIT 1`, m.TableName())
+	err = o.Raw(sql, id).QueryRow(&m)
+	return
+}
+
+func (m *ChartInfoFutureGoodProfit) GetItemByCondition(condition string, pars []interface{}) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s LIMIT 1`, m.TableName(), condition)
+	err = o.Raw(sql, pars).QueryRow(&m)
+	return
+}
+
+func (m *ChartInfoFutureGoodProfit) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*ChartInfoFutureGoodProfit, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := ``
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// CreateChartInfoFutureGoodProfitAndEdb 新增商品利润图表
+func CreateChartInfoFutureGoodProfitAndEdb(chartInfo *data_manage.ChartInfo, edbMappingList []*data_manage.ChartEdbMapping, chartInfoFutureGoodProfit *ChartInfoFutureGoodProfit) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	tx, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+		} else {
+			_ = tx.Commit()
+		}
+	}()
+
+	// 新增图表信息
+	newId, err := tx.Insert(chartInfo)
+	if err != nil {
+		return
+	}
+	// 指标mapping
+	chartInfo.ChartInfoId = int(newId)
+	chartInfoId := int(newId)
+	if len(edbMappingList) > 0 {
+		for i := range edbMappingList {
+			edbMappingList[i].ChartInfoId = chartInfoId
+		}
+		_, err = tx.InsertMulti(len(edbMappingList), edbMappingList)
+		if err != nil {
+			return
+		}
+	}
+	// 商品利润信息
+	chartInfoFutureGoodProfit.ChartInfoId = chartInfoId
+	if _, err = tx.Insert(chartInfoFutureGoodProfit); err != nil {
+		return
+	}
+	return
+}
+
+// EditFutureGoodChartInfoAndMapping 修改商品利润图表
+func EditFutureGoodChartInfoAndMapping(chartInfo *data_manage.ChartInfo, newEdbMappingList []*data_manage.ChartEdbMapping, chartInfoFutureGoodProfit *ChartInfoFutureGoodProfit, chartItemUpdateCol, extraUpdateCol []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	// 更改表信息
+	_, err = to.Update(chartInfo, chartItemUpdateCol...)
+	if err != nil {
+		fmt.Println("UPDATE  chart_info Err:", err.Error())
+		return err
+	}
+
+	// 更改扩展图表信息
+	_, err = to.Update(chartInfoFutureGoodProfit, extraUpdateCol...)
+	if err != nil {
+		fmt.Println("UPDATE  chart_info_future_good_profit Err:", err.Error())
+		return err
+	}
+
+	// 更改指标关联信息
+	chartEdbMappingIdList := make([]string, 0)
+	for _, v := range newEdbMappingList {
+		// 查询该指标是否存在,如果存在的话,那么就去修改,否则新增
+		var tmpChartEdbMapping *data_manage.ChartEdbMapping
+		csql := `SELECT *  FROM chart_edb_mapping WHERE chart_info_id=? AND edb_info_id=? AND source = ? `
+		err = to.Raw(csql, chartInfo.ChartInfoId, v.EdbInfoId, v.Source).QueryRow(&tmpChartEdbMapping)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			fmt.Println("QueryRow Err:", err.Error())
+			return err
+		}
+		if tmpChartEdbMapping != nil {
+			chartEdbMappingIdList = append(chartEdbMappingIdList, strconv.Itoa(tmpChartEdbMapping.ChartEdbMappingId))
+		} else {
+			mapItem := new(data_manage.ChartEdbMapping)
+			mapItem.ChartInfoId = chartInfo.ChartInfoId
+			mapItem.EdbInfoId = v.EdbInfoId
+			mapItem.CreateTime = time.Now()
+			mapItem.ModifyTime = time.Now()
+			timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+			mapItem.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp + "_" + strconv.Itoa(v.EdbInfoId))
+			mapItem.IsOrder = true
+			mapItem.IsAxis = 1
+			mapItem.EdbInfoType = 1
+			mapItem.Source = v.Source
+			tmpId, err := to.Insert(mapItem)
+			if err != nil {
+				fmt.Println("AddChartEdbMapping Err:" + err.Error())
+				return err
+			}
+			mapItem.ChartEdbMappingId = int(tmpId)
+			chartEdbMappingIdList = append(chartEdbMappingIdList, strconv.Itoa(mapItem.ChartEdbMappingId))
+		}
+	}
+	if len(chartEdbMappingIdList) > 0 {
+		chartEdbMappingIdStr := strings.Join(chartEdbMappingIdList, ",")
+		dsql := `DELETE FROM chart_edb_mapping WHERE chart_info_id=? AND chart_edb_mapping_id NOT IN(` + chartEdbMappingIdStr + `)`
+		_, err = to.Raw(dsql, chartInfo.ChartInfoId).Exec()
+		if err != nil {
+			fmt.Println("delete err:" + err.Error())
+			return err
+		}
+	}
+	return
+}

+ 20 - 0
models/data_manage/future_good/request/future_good_chart.go

@@ -1,8 +1,28 @@
 package request
 
+import "hongze/hongze_ETA_mobile_api/models/data_manage"
+
 type EditChartEnInfoReq struct {
 	ChartInfoId int    `description:"图表ID"`
 	ChartNameEn string `description:"英文图表名称"`
 	EdbNameEn   string `description:"指标英文名称"`
 	UnitEn      string `description:"指标英文单位"`
 }
+
+// ChartInfoReq 图表预览请求数据
+type ChartInfoReq struct {
+	FutureGoodEdbInfoIdList []data_manage.EdbInfoFromTag `description:"指标信息"`
+	CalculateFormula        string                       `description:"计算公式"`
+	BaseEdbInfoId           int                          `description:"基础的指标id"`
+	DateList                []ChartInfoDateReq           `description:"日期配置"`
+	ProfitNameEn            string                       `description:"利润英文名称"`
+}
+
+// ChartInfoDateReq 图表的日期数据(日期相关)
+type ChartInfoDateReq struct {
+	Type  int    `description:"配置类型"`
+	Date  string `description:"固定日期"`
+	Value int    `description:"N天的值"`
+	Color string `description:"颜色"`
+	Name  string `description:"别名"`
+}

+ 15 - 0
models/data_manage/future_good/response/future_good_chart_profit.go

@@ -0,0 +1,15 @@
+package response
+
+import (
+	"hongze/hongze_ETA_mobile_api/models/data_manage"
+	"hongze/hongze_ETA_mobile_api/models/data_manage/future_good/request"
+)
+
+// ProfitFutureGoodChartResp 商品利润图
+type ProfitFutureGoodChartResp struct {
+	XDataList    []data_manage.XData
+	YDataList    []data_manage.YData
+	ProfitName   string               `description:"利润的名称"`
+	ProfitNameEn string               `description:"利润的英文名称"`
+	Extra        request.ChartInfoReq `description:"柱方图的配置"`
+}

+ 1 - 0
utils/constants.go

@@ -405,6 +405,7 @@ const (
 	CHART_SOURCE_FUTURE_GOOD         = 2
 	CHART_SOURCE_CORRELATION         = 3 // 相关性图表
 	CHART_SOURCE_ROLLING_CORRELATION = 4 // 滚动相关性图表
+	CHART_SOURCE_FUTURE_GOOD_PROFIT  = 5 // 商品利润曲线
 )
 
 // 图表样式类型