Browse Source

Merge branch 'eta/2.0.0' into debug

# Conflicts:
#	models/data_manage/excel_style.go
#	models/target.go
Roc 7 months ago
parent
commit
3e8569b4de

+ 279 - 40
controllers/manual_edb.go

@@ -1,11 +1,16 @@
 package controllers
 
 import (
+	"encoding/json"
 	"eta/eta_api/models"
 	"eta/eta_api/models/data_manage"
-	"eta/eta_api/models/system"
 	"eta/eta_api/utils"
+	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/shopspring/decimal"
+	"strconv"
+	"strings"
+	"time"
 )
 
 // EdbDetail
@@ -79,20 +84,31 @@ func (this *TargetController) EdbDetail() {
 		}
 	}
 
-	// 录入的用户名称
-	adminInfo, err := system.GetSysAdminById(manualEdbInfo.UserId)
-	if err == nil {
-		manualEdbInfo.UserName = adminInfo.RealName
+	// 明细数据
+	{
+		dataList, err := models.GetEdbDataListByCode(manualEdbInfo.TradeCode)
+		if err != nil {
+			br.Msg = "获取明细数据失败"
+			br.ErrMsg = "获取明细数据失败,err:" + err.Error()
+			return
+		}
+
+		manualEdbInfo.DataList = dataList
 	}
 
-	dataList, err := models.GetEdbDataListByCode(manualEdbInfo.TradeCode)
-	if err != nil {
-		br.Msg = "获取明细数据失败"
-		br.ErrMsg = "获取明细数据失败,err:" + err.Error()
-		return
+	// 查找是否加入到指标库
+	{
+		edbInfo, err := data_manage.GetEdbInfoByEdbCode(utils.DATA_SOURCE_MANUAL, manualEdbInfo.TradeCode)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取失败,Err:" + err.Error()
+			return
+		}
+		if edbInfo != nil {
+			manualEdbInfo.EdbExist = 1
+		}
 	}
 
-	manualEdbInfo.DataList = dataList
 	resp := models.TargetDetailResp{
 		Detail:       manualEdbInfo,
 		ClassifyList: classifyList,
@@ -366,47 +382,270 @@ func (this *TargetController) EdbList() {
 		return
 	}
 
-	edbCodeMap := make(map[string]bool)
-	listNum := len(list)
-	if listNum > 0 {
-		tradeCodeList := make([]string, 0)
-		for _, v := range list {
-			v.UniqueCode = utils.MD5(v.TradeCode)
-			tradeCodeList = append(tradeCodeList, v.TradeCode)
+	resp := models.EdbListResp{
+		List:   list,
+		Paging: paging.GetPaging(currentIndex, pageSize, total),
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// EditExcelData
+// @Title 根据excel的样式去编辑指标
+// @Description 根据excel的样式去编辑指标
+// @Param  request	body models.ManualEdbExcelStyleEditReq true "type json string"
+// @Success 200
+// @router /target/edb/excel_style/edit [post]
+func (this *TargetController) EditExcelData() {
+	br := new(models.BaseResponse).Init()
+	var err error
+	errs := make([]string, 0)
+	defer func() {
+		if len(errs) > 0 {
+			utils.FileLog.Info("编辑EXCEL数据 新增或修改数据失败,Err:" + strings.Join(errs, "\n"))
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请重新登录"
+		return
+	}
+
+	var req data_manage.ManualEdbExcelStyleEditReq
+	err = json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.TradeCode == `` {
+		br.Msg = "指标编码异常!"
+		br.ErrMsg = "指标编码异常!"
+		return
+	}
+	if req.Unit == `` {
+		br.Msg = "单位填写异常!"
+		br.ErrMsg = "单位填写异常!"
+		return
+	}
+	if req.Frequency == `` {
+		br.Msg = "频度填写异常!"
+		br.ErrMsg = "频度填写异常!"
+		return
+	}
+	if req.ClassifyId <= 0 {
+		br.Msg = "品种填写异常!"
+		br.ErrMsg = "品种填写异常!"
+		return
+	}
+
+	// 获取指标信息
+	manualEdbInfo, err := models.GetEdbinfoByTradeCode(req.TradeCode)
+	if err != nil {
+		br.Msg = `找不到该指标`
+		br.Msg = `找不到该指标,ERR:` + err.Error()
+		return
+	}
+
+	// 如果不是超管账号,那么得校验下当前用户是否有该指标的权限
+	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
+		//获取账户所拥有权限的分类id集合
+		count, err := models.GetCountManualUserClassify(sysUser.AdminId, manualEdbInfo.ClassifyId)
+		if err != nil {
+			br.Msg = "获取分类数据失败"
+			br.ErrMsg = "获取分类数据失败,err:" + err.Error()
+			return
 		}
 
-		// 查找是否加入到指标库
+		if count <= 0 {
+			br.Msg = "无权访问"
+			br.ErrMsg = "无权访问"
+			br.IsSendEmail = false
+			return
+		}
+	}
+
+	dateValueMap := make(map[string]string)
+	//取到所有数据
+	for i := range req.Data {
+		// 过滤第一行
+		if i == 0 {
+			continue
+		}
+		if req.Data[i] == nil {
+			continue
+		}
+		tmpData := req.Data[i]
+		// 少于两列,说明数据是异常的,得过滤
+		if len(tmpData) < 2 {
+			continue
+		}
+
+		var tmpDate string
+		//先拿下日期列表
 		{
-			var edbCondition string
-			var edbPars []interface{}
-			edbCondition = ` AND source = ? AND edb_code in (` + utils.GetOrmInReplace(listNum) + `) `
-			edbPars = append(edbPars, utils.DATA_SOURCE_MANUAL, tradeCodeList)
+			dateMap := tmpData[0].(map[string]interface{})
+			_, ok := dateMap["m"]
+			if !ok {
+				continue
+			}
+			tmpDate = dateMap["m"].(string)
+		}
 
-			edbInfoList, err := data_manage.GetEdbInfoListByCond(edbCondition, edbPars)
-			if err != nil {
-				br.Msg = "获取失败"
-				br.ErrMsg = "获取失败,Err:" + err.Error()
-				return
+		// 数据处理
+		{
+			if tmpData[1] == nil {
+				continue
 			}
-			for _, v := range edbInfoList {
-				edbCodeMap[v.EdbCode] = true
+			valueMap := tmpData[1].(map[string]interface{})
+			value, _ := valueMap["m"]
+			if value == nil {
+				continue
+			}
+			dateValueMap[tmpDate] = valueMap["m"].(string)
+
+			// 09-27 千位分隔符时用 "m" 取字符串存数据库会把逗号当小数点,现在换用 "v" 直接取数字再转为字符串,看看会不会有问题
+			if ct, ok := valueMap["ct"].(map[string]interface{}); ok {
+				fa, _ := ct["fa"]
+				if fa == "#,##0.000" {
+					value = valueMap["v"]
+					floatValue := valueMap["v"].(float64)
+					dateValueMap[tmpDate] = strconv.FormatFloat(floatValue, 'f', -1, 64)
+				}
 			}
 		}
+	}
+
+	//操作指标,新增指标及数据等
+	{
+		secName := strings.TrimSpace(req.Name)
+		frequency := strings.TrimSpace(req.Frequency)
+		unit := strings.TrimSpace(req.Unit)
+
+		// 指标基础信息变更
+		{
+			updateCols := make([]string, 0)
+
+			if manualEdbInfo.SecName != secName {
+				updateCols = append(updateCols, "SecName")
+				manualEdbInfo.SecName = secName
+			}
 
-		for _, v := range list {
-			// 如果能通过指标编码下标找到,那么说明是加到指标库中
-			if _, ok := edbCodeMap[v.TradeCode]; ok {
-				v.EdbExist = 1
+			if manualEdbInfo.ClassifyId != req.ClassifyId {
+				updateCols = append(updateCols, "ClassifyId")
+				manualEdbInfo.ClassifyId = req.ClassifyId
+			}
+
+			if manualEdbInfo.Frequency != frequency {
+				updateCols = append(updateCols, "Frequency")
+				manualEdbInfo.Frequency = frequency
+			}
+
+			if manualEdbInfo.Unit != unit {
+				updateCols = append(updateCols, "Unit")
+				manualEdbInfo.Unit = unit
+			}
+
+			if len(updateCols) > 0 {
+				err = manualEdbInfo.Update(updateCols)
+				if err != nil {
+					br.Msg = `指标保存失败`
+					br.Msg = `指标保存失败,ERR:` + err.Error()
+					return
+				}
 			}
 		}
-	}
 
-	resp := models.EdbListResp{
-		List:   list,
-		Paging: paging.GetPaging(currentIndex, pageSize, total),
+		// 当前已经存在的指标明细数据
+		targetDataList, tmpErr := models.GetTargetsDataList(manualEdbInfo.TradeCode)
+		if tmpErr != nil {
+			err = tmpErr
+		}
+		existDataMap := make(map[string]string)
+		deleteDataMap := make(map[string]string)
+		for _, tmpData := range targetDataList {
+			existDataMap[tmpData.Dt] = tmpData.Close
+			deleteDataMap[tmpData.Dt] = tmpData.Dt
+		}
+
+		addDataList := make([]*models.Edbdata, 0)
+
+		for createDate, closeVal := range dateValueMap {
+			if createDate == "" || closeVal == "" {
+				continue
+			}
+			//判断数据是否已经存在
+			tmpVal, ok3 := existDataMap[createDate]
+			// 不存在,那么后面进行插入
+			if !ok3 {
+				addDataList = append(addDataList, &models.Edbdata{
+					TradeCode:  manualEdbInfo.TradeCode,
+					Dt:         createDate,
+					Close:      closeVal,
+					ModifyTime: time.Now(),
+				})
+				continue
+			}
+
+			delete(deleteDataMap, createDate)
+
+			// 库里面的数据
+			tmpValDecimal, tmpErr := decimal.NewFromString(tmpVal)
+			if tmpErr != nil {
+				fmt.Println("tmpVal Parse err:", tmpErr.Error())
+				err = tmpErr
+				continue
+			}
+			// 用户填写的数据
+			closeValDecimal, tmpErr := decimal.NewFromString(closeVal)
+			if tmpErr != nil {
+				fmt.Println("closeVal Parse err:", tmpErr.Error())
+				err = tmpErr
+				continue
+			}
+			if !tmpValDecimal.Equal(closeValDecimal) {
+				fmt.Println("更新数值")
+				err = models.ModifyTargetsDataByImport(manualEdbInfo.TradeCode, createDate, closeVal)
+				if err != nil {
+					fmt.Println("ModifyTargetsDataByImport err:", err.Error())
+					errs = append(errs, err.Error())
+					//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 修改数据失败:Err:"+err.Error(), utils.EmailSendToUsers)
+				}
+			}
+		}
+
+		// 新增指标
+		if len(addDataList) > 0 {
+			err = models.MultiAddEdbdata(addDataList)
+			if err != nil {
+				fmt.Println("MultiAddEdbdata err:", err.Error())
+				errs = append(errs, err.Error())
+			}
+		}
+
+		// 删除不需要的日期数据
+		num := len(deleteDataMap)
+		if num > 0 {
+			deleteDateList := make([]string, 0)
+			for date := range deleteDataMap {
+				deleteDateList = append(deleteDateList, date)
+			}
+
+			err = models.DelEdbdataByCodeAndDateList(manualEdbInfo.TradeCode, deleteDateList)
+			if err != nil {
+				fmt.Println("DelEdbdataByCodeAndDateList err:", err.Error())
+				errs = append(errs, err.Error())
+			}
+		}
 	}
+
 	br.Ret = 200
 	br.Success = true
-	br.Msg = "获取成功"
-	br.Data = resp
+	br.Msg = "保存成功"
 }

+ 3 - 3
controllers/target.go

@@ -470,7 +470,7 @@ func (this *TargetController) TargetList() {
 		return
 	}
 	total := 0
-	list := make([]*models.Edbinfo, 0)
+	list := make([]*models.EdbinfoItem, 0)
 
 	//有分类数据权限才查询
 	if len(classifyIdStrList) > 0 {
@@ -509,14 +509,14 @@ func (this *TargetController) TargetList() {
 			br.ErrMsg = "获取失败,Err:" + err.Error()
 			return
 		}
-		tmpList, err := models.GetEdbinfoList(condition, pars, startSize, pageSize, mobile, sysUser.RoleType)
+		tmpList, err := models.GetEdbinfoItemList(condition, pars, startSize, pageSize, mobile, sysUser.RoleType)
 		if err != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取失败,Err:" + err.Error()
 			return
 		}
 		if len(tmpList) <= 0 {
-			list = make([]*models.Edbinfo, 0)
+			list = make([]*models.EdbinfoItem, 0)
 		} else {
 			list = tmpList
 		}

+ 19 - 0
models/data_manage/excel_style.go

@@ -213,3 +213,22 @@ type Ct struct {
 	Fa string `json:"fa"`
 	T  string `json:"t"`
 }
+
+// ManualEdbExcelStyleEditReq
+// @Description: 手工数据录入编辑(Excel样式)
+type ManualEdbExcelStyleEditReq struct {
+	ExcelId          int
+	Name             string
+	Color            string
+	Row              int
+	Colum            int
+	DefaultRowHeight int
+	DefaultColWidth  int
+	CellData         []interface{}
+	Config           interface{}
+	Data             [][]interface{}
+	TradeCode        string `description:"指标编码"`
+	Unit             string `description:"单位"`
+	Frequency        string `description:"频度"`
+	ClassifyId       int    `description:"分类id"`
+}

+ 49 - 1
models/manual_edb.go

@@ -1,6 +1,7 @@
 package models
 
 import (
+	"eta/eta_api/utils"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
 )
@@ -78,7 +79,8 @@ type EdbInfoListItem struct {
 	ModifyDate   string `description:"待更新日期"`
 	Status       string `description:"状态:未完成/完成"`
 	UniqueCode   string
-	EdbExist     int `description:"指标库是否已添加:0-否;1-是"`
+	IsJoinEdb    int8   `description:"指标库是否已添加:0-否;1-是"`
+	UserName     string `description:"录入用户名称"`
 }
 
 // EdbListResp 指标数据结构体
@@ -133,3 +135,49 @@ func GetCountEdbInfoList(condition string, pars []interface{}) (total int, err e
 
 	return
 }
+
+// MultiAddEdbdata
+// @Description: 批量添加指标数据
+// @author: Roc
+// @datetime 2024-07-18 16:48:55
+// @param items []*Edbdata
+// @return err error
+func MultiAddEdbdata(items []*Edbdata) (err error) {
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.InsertMulti(500, items)
+	return
+}
+
+// DelEdbdataByCodeAndDateList
+// @Description: 根据指标编码和日期列表批量删除指标的明细数据
+// @author: Roc
+// @datetime 2024-07-18 16:54:27
+// @param tradeCode string
+// @param dateList []string
+// @return err error
+func DelEdbdataByCodeAndDateList(tradeCode string, dateList []string) (err error) {
+	num := len(dateList)
+	if num <= 0 {
+		return
+	}
+
+	o := orm.NewOrmUsingDB("edb")
+	sql := `delete from  edbdata AS a  WHERE a.TRADE_CODE=? and DT in (` + utils.GetOrmInReplace(num) + `) `
+	_, err = o.Raw(sql, tradeCode, dateList).Exec()
+
+	return
+}
+
+// UpdateManualIsJoinEdbStatus
+// @Description: 根据手工数据加入指标的状态
+// @author: Roc
+// @datetime 2024-07-22 11:29:13
+// @param edbCode string
+// @param isJoinEdb int 是否加入指标库
+// @return err error
+func UpdateManualIsJoinEdbStatus(edbCode string, isJoinEdb int8) (err error) {
+	o := orm.NewOrmUsingDB("edb")
+	sql := ` UPDATE edbinfo SET is_join_edb = ? WHERE TRADE_CODE =? `
+	_, err = o.Raw(sql, isJoinEdb, edbCode).Exec()
+	return
+}

+ 20 - 3
models/target.go

@@ -195,6 +195,7 @@ type Edbinfo struct {
 	Mobile       string `orm:"column(mobile)" description:"录入者手机号"`
 	Sort         int    `orm:"column(sort)" description:"排序"`
 	ModifyTime   string `description:"最近一次更新时间"`
+	IsJoinEdb  int8   `description:"指标库是否已添加:0-否;1-是"`
 }
 
 func DeleteEdbinfoByTraceCodeList(tradeCodeList []string) (err error) {
@@ -245,7 +246,23 @@ func GetEdbinfoListCount(condition string, pars []interface{}, mobile string, ro
 	return
 }
 
-func GetEdbinfoList(condition string, pars []interface{}, startSize, pageSize int, mobile string, roleType int) (items []*Edbinfo, err error) {
+type EdbinfoItem struct {
+	TradeCode    string `orm:"column(TRADE_CODE);pk" description:"指标code"`
+	SecName      string `orm:"column(SEC_NAME);" description:"指标名称"`
+	Unit         string `orm:"column(UNIT);" description:"单位"`
+	Remark       string `orm:"column(REMARK);" description:"备注"`
+	Frequency    string `description:"频度"`
+	ClassifyId   int    `description:"分类id"`
+	ClassifyName string `description:"分类名称"`
+	CreateDate   string `description:"创建时间"`
+	UserId       int    `description:"录入用户id"`
+	UserName     string `description:"录入用户名称"`
+	NoticeTime   string `description:"通知时间"`
+	Mobile       string `description:"录入者手机号"`
+	ModifyTime   string `description:"最近一次更新时间"`
+}
+
+func GetEdbinfoItemList(condition string, pars []interface{}, startSize, pageSize int, mobile string, roleType int) (items []*EdbinfoItem, err error) {
 	o := orm.NewOrmUsingDB("edb")
 	sql := ``
 	if mobile != "" && roleType == 1 {
@@ -300,7 +317,7 @@ join edbdata b on a.TRADE_CODE=b.TRADE_CODE
 }
 
 type TargetListResp struct {
-	List   []*Edbinfo
+	List   []*EdbinfoItem
 	Paging *paging.PagingItem `description:"分页数据"`
 }
 
@@ -1301,7 +1318,7 @@ type EdbInfoItem struct {
 	ModifyDate   string     `description:"待更新日期"`
 	ModifyTime   string     `description:"最近一次更新时间"`
 	Status       string     `description:"状态:未完成/完成"`
-	Sort         int        `description:"排序"`
+	EdbExist     int        `description:"指标库是否已添加:0-否;1-是"`
 	DataList     []*Edbdata `description:"指标数据列表"`
 }
 

+ 1 - 1
services/data/data_manage_permission/data_move.go

@@ -230,7 +230,7 @@ func GetMoveEdbChartList(source, subSource, userId int, keyword, classify string
 		if err != nil {
 			return
 		}
-		tmpList, tmpErr := models.GetEdbinfoList(condition, pars, startSize, pageSize, "", 0)
+		tmpList, tmpErr := models.GetEdbinfoItemList(condition, pars, startSize, pageSize, "", 0)
 		if tmpErr != nil {
 			err = tmpErr
 			return

+ 2 - 8
services/data/edb_classify.go

@@ -7,7 +7,6 @@ import (
 	"eta/eta_api/models/data_manage/cross_variety"
 	"eta/eta_api/models/data_manage/excel"
 	"eta/eta_api/models/system"
-	"eta/eta_api/services/alarm_msg"
 	"eta/eta_api/services/data/data_manage_permission"
 	"eta/eta_api/services/data_stat"
 	"eta/eta_api/utils"
@@ -919,13 +918,8 @@ func Delete(classifyId, edbInfoId int, sysUser *system.Admin, requestBody, reque
 
 		go data_stat.AddEdbDeleteLog(edbInfo, sysUser)
 
-		// 如果删除的指标是自定义分析的来源,那么还需要删除指标与excel的关系
-		if edbInfo.Source == utils.DATA_SOURCE_CALCULATE_ZDYFX {
-			tmpErr = excel.DeleteCustomAnalysisExcelEdbMappingByEdbInfoId(edbInfo.EdbInfoId)
-			if tmpErr != nil {
-				alarm_msg.SendAlarmMsg(fmt.Sprintf("删除指标时,需要删除与自定义分析的关系失败,指标ID:%d,Err:%s", edbInfo.EdbInfoId, tmpErr.Error()), 3)
-			}
-		}
+		// 删除指标后的操作
+		go handleByDelEdbInfo(edbInfo)
 
 		// 返回下一个表格的信息
 		{

+ 41 - 5
services/data/edb_info.go

@@ -6,6 +6,7 @@ import (
 	"eta/eta_api/cache"
 	"eta/eta_api/models"
 	"eta/eta_api/models/data_manage"
+	"eta/eta_api/models/data_manage/excel"
 	"eta/eta_api/services/alarm_msg"
 	"eta/eta_api/services/data/data_manage_permission"
 	"eta/eta_api/services/elastic"
@@ -1987,11 +1988,7 @@ func EdbInfoAdd(source, subSource, classifyId int, edbCode, edbName, frequency,
 	//添加es
 	AddOrEditEdbInfoToEs(int(edbInfoId))
 
-	// 更新钢联化工状态为启用
-	if edbInfo.Source == utils.DATA_SOURCE_MYSTEEL_CHEMICAL {
-		// 启动钢联的刷新
-		_ = data_manage.UpdateMysteelChemicalRefreshStatus(edbCode, 0)
-	}
+	go handleByAddEdbInfo(edbInfo)
 
 	return
 }
@@ -3003,3 +3000,42 @@ func GetEdbTerminalCodeBySource(source int, edbCode, stockCode string) (terminal
 	}
 	return
 }
+
+// handleByAddEdbInfo
+// @Description: 添加指标后的处理操作
+// @author: Roc
+// @datetime 2024-07-22 13:06:36
+// @param edbInfo *data_manage.EdbInfo
+func handleByAddEdbInfo(edbInfo *data_manage.EdbInfo) {
+	// 更新钢联化工状态为启用
+	if edbInfo.Source == utils.DATA_SOURCE_MYSTEEL_CHEMICAL {
+		// 启动钢联的刷新
+		_ = data_manage.UpdateMysteelChemicalRefreshStatus(edbInfo.EdbCode, 0)
+	}
+
+	// 如果是手工数据,那么需要标记手工数据为已加入指标库
+	if edbInfo.Source == utils.DATA_SOURCE_MANUAL {
+		_ = models.UpdateManualIsJoinEdbStatus(edbInfo.EdbCode, 1)
+	}
+
+}
+
+// handleByDelEdbInfo
+// @Description: 删除指标后的处理操作
+// @author: Roc
+// @datetime 2024-07-22 13:06:36
+// @param edbInfo *data_manage.EdbInfo
+func handleByDelEdbInfo(edbInfo *data_manage.EdbInfo) {
+	// 如果删除的指标是自定义分析的来源,那么还需要删除指标与excel的关系
+	if edbInfo.Source == utils.DATA_SOURCE_CALCULATE_ZDYFX {
+		err := excel.DeleteCustomAnalysisExcelEdbMappingByEdbInfoId(edbInfo.EdbInfoId)
+		if err != nil {
+			utils.FileLog.Error(fmt.Sprintf("删除指标时,需要删除与自定义分析的关系失败,指标ID:%d,Err:%s", edbInfo.EdbInfoId, err.Error()), 3)
+		}
+	}
+
+	// 如果是手工数据,那么需要标记手工数据为未加入指标库
+	if edbInfo.Source == utils.DATA_SOURCE_MANUAL {
+		_ = models.UpdateManualIsJoinEdbStatus(edbInfo.EdbCode, 0)
+	}
+}