Roc hace 7 meses
padre
commit
007c7f4e97

+ 287 - 6
controllers/manual_edb.go

@@ -1,11 +1,17 @@
 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
@@ -85,14 +91,31 @@ func (this *TargetController) EdbDetail() {
 		manualEdbInfo.UserName = adminInfo.RealName
 	}
 
-	dataList, err := models.GetEdbDataListByCode(manualEdbInfo.TradeCode)
-	if err != nil {
-		br.Msg = "获取明细数据失败"
-		br.ErrMsg = "获取明细数据失败,err:" + err.Error()
-		return
+	// 明细数据
+	{
+		dataList, err := models.GetEdbDataListByCode(manualEdbInfo.TradeCode)
+		if err != nil {
+			br.Msg = "获取明细数据失败"
+			br.ErrMsg = "获取明细数据失败,err:" + err.Error()
+			return
+		}
+
+		manualEdbInfo.DataList = dataList
+	}
+
+	// 查找是否加入到指标库
+	{
+		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,
@@ -410,3 +433,261 @@ func (this *TargetController) EdbList() {
 	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
+		//先拿下日期列表
+		{
+			dateMap := tmpData[0].(map[string]interface{})
+			_, ok := dateMap["m"]
+			if !ok {
+				continue
+			}
+			tmpDate = dateMap["m"].(string)
+		}
+
+		// 数据处理
+		{
+			if tmpData[1] == nil {
+				continue
+			}
+			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
+			}
+
+			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
+				}
+			}
+		}
+
+		// 当前已经存在的指标明细数据
+		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 = "保存成功"
+}

+ 3 - 3
controllers/target.go

@@ -443,7 +443,7 @@ func (this *TargetController) TargetList() {
 		return
 	}
 	total := 0
-	list := make([]*models.Edbinfo, 0)
+	list := make([]*models.EdbinfoItem, 0)
 
 	//有分类数据权限才查询
 	if len(classifyIdStrList) > 0 {
@@ -482,14 +482,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
 		}

+ 21 - 2
models/data_manage/excel_style.go

@@ -187,7 +187,7 @@ func GetExcelEdbdataMappingByTradeCode(classifyId int, frequency string) (excelI
 func GetExcelStyleById(excelId int) (item *ExcelStyle, err error) {
 	o := orm.NewOrmUsingDB("edb")
 	sql := `SELECT * FROM excel_style WHERE excel_id = ? `
-	err = o.Raw(sql,excelId).QueryRow(&item)
+	err = o.Raw(sql, excelId).QueryRow(&item)
 	return
 }
 
@@ -208,4 +208,23 @@ func GetExcelEdbdataMappingCount(classifyId int, tradeCode, frequency string) (c
 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"`
+}

+ 33 - 0
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"
 )
@@ -133,3 +134,35 @@ 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
+}

+ 31 - 15
models/target.go

@@ -138,19 +138,18 @@ func DeleteAllEdbData(tradeCode string) (err error) {
 }
 
 type Edbinfo 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:"最近一次更新时间"`
+	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"`
+	CreateDate string `description:"创建时间"`
+	UserId     int    `description:"录入用户id"`
+	UserName   string `description:"录入用户名称"`
+	NoticeTime string `description:"通知时间"`
+	Mobile     string `description:"录入者手机号"`
+	ModifyTime string `description:"最近一次更新时间"`
 }
 
 func GetEdbinfoListCount(condition string, pars []interface{}, mobile string, roleType int) (count int, err error) {
@@ -176,7 +175,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 {
@@ -231,7 +246,7 @@ join edbdata b on a.TRADE_CODE=b.TRADE_CODE
 }
 
 type TargetListResp struct {
-	List   []*Edbinfo
+	List   []*EdbinfoItem
 	Paging *paging.PagingItem `description:"分页数据"`
 }
 
@@ -1196,6 +1211,7 @@ type EdbInfoItem struct {
 	ModifyDate   string     `description:"待更新日期"`
 	ModifyTime   string     `description:"最近一次更新时间"`
 	Status       string     `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