Browse Source

Merge branch 'eta/2.0.0' into debug

# Conflicts:
#	models/target.go
Roc 8 months ago
parent
commit
12c9cb8c03

+ 1850 - 0
controllers/data_manage/manual_edb.go

@@ -0,0 +1,1850 @@
+package data_manage
+
+import (
+	"encoding/json"
+	"eta/eta_api/controllers"
+	"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/data"
+	etaTrialService "eta/eta_api/services/eta_trial"
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/shopspring/decimal"
+	"github.com/tealeg/xlsx"
+	"os"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// ManualEdbController 手工指标服务(鉴权)
+type ManualEdbController struct {
+	controllers.BaseAuthController
+}
+
+// EdbDetail
+// @Title 指标列表
+// @Description 指标列表
+// @Param   TradeCode   query   string  true       "指标编码"
+// @Success 200 {object} models.TargetDetailResp
+// @router /target/edb/detail [get]
+func (c *ManualEdbController) EdbDetail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请重新登录"
+		return
+	}
+
+	// 指标编码
+	tradeCode := c.GetString("TradeCode")
+	if tradeCode == `` {
+		br.Msg = "请输入指标编码"
+		br.IsSendEmail = false
+		return
+	}
+
+	manualEdbInfo, err := models.GetTargetByTradeCode(tradeCode)
+	if err != nil {
+		br.Msg = "获取指标失败"
+		br.ErrMsg = "获取指标失败,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
+		}
+	}
+
+	classifyList := make([]*models.EdbdataClassify, 0)
+	{
+		classify, err := models.GetManualClassifyByClassifyId(manualEdbInfo.ClassifyId)
+		if err != nil {
+			br.Msg = "获取分类信息失败"
+			br.ErrMsg = "获取分类信息失败,err:" + err.Error()
+			return
+		}
+		parentClassify, err := models.GetManualClassifyByClassifyId(classify.ParentId)
+		if err != nil {
+			br.Msg = "获取分类信息失败"
+			br.ErrMsg = "获取父级分类信息失败,err:" + err.Error()
+			return
+		}
+		classifyList = []*models.EdbdataClassify{
+			parentClassify, classify,
+		}
+	}
+
+	// 明细数据
+	{
+		dataList, err := models.GetEdbDataListByCode(manualEdbInfo.TradeCode)
+		if err != nil {
+			br.Msg = "获取明细数据失败"
+			br.ErrMsg = "获取明细数据失败,err:" + err.Error()
+			return
+		}
+
+		manualEdbInfo.DataList = dataList
+	}
+
+	resp := models.TargetDetailResp{
+		Detail:       manualEdbInfo,
+		ClassifyList: classifyList,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	//br.Data = resp
+	br.Data = resp
+}
+
+// ClassifyEdbList
+// @Title 分类指标列表
+// @Description 指标列表
+// @Param   ClassifyId   query   string  true       "分类id"
+// @Success 200 {object} models.TargetDetailResp
+// @router /target/classify/edb/list [get]
+func (c *ManualEdbController) ClassifyEdbList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.Ret = 408
+		return
+	}
+	resp := new(models.EdbdataClassifyResp)
+
+	classifyId, _ := c.GetInt("ClassifyId") //分类
+	if classifyId <= 0 {
+		br.Msg = "请传入分类"
+		br.ErrMsg = "请传入分类"
+		br.IsSendEmail = false
+	}
+
+	var condition string
+	var pars []interface{}
+
+	// 如果不是超管账号,那么得校验下当前用户是否有该指标的权限
+	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
+		//获取账户所拥有权限的分类id集合
+		count, err := models.GetCountManualUserClassify(sysUser.AdminId, classifyId)
+		if err != nil {
+			br.Msg = "获取分类数据失败"
+			br.ErrMsg = "获取分类数据失败,err:" + err.Error()
+			return
+		}
+
+		if count <= 0 {
+			br.Msg = "无权访问"
+			br.ErrMsg = "无权访问"
+			br.IsSendEmail = false
+			return
+		}
+	}
+
+	list := make([]*models.EdbdataClassifyList, 0)
+
+	condition += ` AND a.classify_id = ? `
+	pars = append(pars, classifyId)
+
+	tmpList, err := models.GetEdbInfoList(condition, pars, 0, 0)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	for _, v := range tmpList {
+		list = append(list, &models.EdbdataClassifyList{
+			ClassifyId:   0,
+			ClassifyName: v.SecName,
+			ParentId:     v.ClassifyId,
+			Child:        nil,
+			TradeCode:    v.TradeCode,
+			UniqueCode:   utils.MD5(v.TradeCode),
+		})
+	}
+
+	resp.List = list
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// EdbSearch
+// @Title 指标搜索
+// @Description 指标搜索
+// @Param   Keyword   query   string  false       "关键字搜索"
+// @Success 200 {object} models.TargetItemListResp
+// @router /target/edb/search [get]
+func (c *ManualEdbController) EdbSearch() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请重新登录"
+		return
+	}
+
+	pageSize, _ := c.GetInt("PageSize")
+	currentIndex, _ := c.GetInt("CurrentIndex")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+
+	//关键字
+	keyword := c.GetString("Keyword")
+
+	var condition string
+	var pars []interface{}
+
+	userId := sysUser.AdminId
+	//超管账号可以查看分类下的所有频度数据
+	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
+		classifyList, err := models.GetEdbdataClassify(int64(userId))
+		if err != nil {
+			br.Msg = "获取分类数据失败"
+			br.Msg = "获取拥有的分类数据失败,Err:" + err.Error()
+			return
+		}
+
+		num := len(classifyList)
+		if num > 0 {
+			classifyIdList := make([]int, 0)
+			for _, v := range classifyList {
+				classifyIdList = append(classifyIdList, v.ClassifyId)
+			}
+			condition += ` AND a.classify_id in (` + utils.GetOrmInReplace(num) + `) `
+			pars = append(pars, classifyIdList)
+		}
+
+	}
+
+	if keyword != "" {
+		condition += ` AND (a.SEC_NAME like ?  or a.TRADE_CODE like ? )`
+		pars = utils.GetLikeKeywordPars(pars, keyword, 2)
+	}
+
+	total, err := models.GetCountEdbInfoList(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	list, err := models.GetEdbInfoList(condition, pars, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	for _, v := range list {
+		v.UniqueCode = utils.MD5(v.TradeCode)
+	}
+
+	resp := models.EdbListResp{
+		List:   list,
+		Paging: paging.GetPaging(currentIndex, pageSize, total),
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// EdbList
+// @Title 获取研究员指标
+// @Description 获取研究员指标
+// @Param   Frequency   query   string  false       "频度;枚举值:日度、周度、月度、季度、半年度、年度"
+// @Param   Keyword   query   string  false       "关键字搜索"
+// @Param   TradeCode   query   string  false       "指标唯一编码"
+// @Param   ClassifyId   query   int  false       "分类id"
+// @Param   UserId   query   int  false       "用户id"
+// @Param   EdbShowType   query   string  true       "指标展示类型:0,1,2; 0:不管有没有数据,指标都展示出来, 1:只展示有数据的指标, 2:只展示没有数据的指标"
+// @Success 200 {object} models.TargetItemListResp
+// @router /target/edb/list [get]
+func (c *ManualEdbController) EdbList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请重新登录"
+		return
+	}
+
+	pageSize, _ := c.GetInt("PageSize")
+	currentIndex, _ := c.GetInt("CurrentIndex")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+
+	// 频度
+	frequency := c.GetString("Frequency")
+	//关键字
+	keyword := c.GetString("Keyword")
+	//关键字
+	classifyId, _ := c.GetInt("ClassifyId", 0)
+	//用户ID
+	userId, _ := c.GetInt("UserId", 0)
+
+	var condition string
+	var pars []interface{}
+
+	//超管账号可以查看分类下的所有频度数据
+	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
+		classifyList, err := models.GetEdbdataClassify(int64(sysUser.AdminId))
+		if err != nil {
+			br.Msg = "获取分类数据失败"
+			br.Msg = "获取拥有的分类数据失败,Err:" + err.Error()
+			return
+		}
+
+		num := len(classifyList)
+		if num > 0 {
+			classifyIdList := make([]int, 0)
+			for _, v := range classifyList {
+				classifyIdList = append(classifyIdList, v.ClassifyId)
+			}
+			condition += ` AND a.classify_id in (` + utils.GetOrmInReplace(num) + `) `
+			pars = append(pars, classifyIdList)
+		}
+
+	}
+
+	// 关键词
+	if keyword != "" {
+		condition += ` AND (a.SEC_NAME like ?  or a.TRADE_CODE like ? )`
+		pars = utils.GetLikeKeywordPars(pars, keyword, 2)
+	}
+	if frequency != "" {
+		condition += ` AND a.frequency = ?`
+		pars = append(pars, frequency)
+	}
+
+	// 所属分类
+	if classifyId > 0 {
+		condition += ` AND a.classify_id = ? `
+		pars = append(pars, classifyId)
+	}
+
+	// 所属用户
+	if userId > 0 {
+		condition += ` AND a.user_id = ? `
+		pars = append(pars, userId)
+	}
+
+	total, err := models.GetCountEdbInfoList(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	list, err := models.GetEdbInfoList(condition, pars, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	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 (c *ManualEdbController) 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"))
+		}
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请重新登录"
+		return
+	}
+
+	var req data_manage.ManualEdbExcelStyleEditReq
+	err = json.Unmarshal(c.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.OnlyMultiAddEdbdata(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 = "保存成功"
+}
+
+// BatchEdbList
+// @Title 获取研究员指标
+// @Description 获取研究员指标
+// @Param	request	body models.BatchAddEdbReq true "type json string"
+// @Success 200 {object} models.TargetItemListResp
+// @router /target/edb/batch/list [post]
+func (c *ManualEdbController) BatchEdbList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请重新登录"
+		return
+	}
+
+	var req models.BatchManualEdbReq
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+
+	pageSize := req.PageSize
+	currentIndex := req.CurrentIndex
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+
+	req.Keyword = strings.TrimSpace(req.Keyword)
+
+	var condition string
+	var pars []interface{}
+
+	// 是否加到指标库
+	condition += ` AND a.is_join_edb = ? `
+	pars = append(pars, 0)
+
+	//超管账号可以查看分类下的所有频度数据
+	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
+		classifyList, err := models.GetEdbdataClassify(int64(sysUser.AdminId))
+		if err != nil {
+			br.Msg = "获取分类数据失败"
+			br.Msg = "获取拥有的分类数据失败,Err:" + err.Error()
+			return
+		}
+
+		num := len(classifyList)
+		if num > 0 {
+			classifyIdList := make([]int, 0)
+			for _, v := range classifyList {
+				classifyIdList = append(classifyIdList, v.ClassifyId)
+			}
+			condition += ` AND a.classify_id in (` + utils.GetOrmInReplace(num) + `) `
+			pars = append(pars, classifyIdList)
+		}
+
+	}
+
+	// 关键词
+	if req.Keyword != "" {
+		condition += ` AND (a.SEC_NAME like ?  or a.TRADE_CODE like ? )`
+		pars = utils.GetLikeKeywordPars(pars, req.Keyword, 2)
+	}
+
+	// 所属分类
+	lenFrequency := len(req.FrequencyList)
+	if lenFrequency > 0 {
+		condition += ` AND a.frequency in (` + utils.GetOrmInReplace(lenFrequency) + `) `
+		pars = append(pars, req.FrequencyList)
+	}
+
+	// 所属分类
+	lenClassify := len(req.ClassifyIdList)
+	if lenClassify > 0 {
+		condition += ` AND a.classify_id in (` + utils.GetOrmInReplace(lenClassify) + `) `
+		pars = append(pars, req.ClassifyIdList)
+	}
+
+	// 所属用户
+	lenUser := len(req.UserIdList)
+	if lenUser > 0 {
+		condition += ` AND a.user_id in (` + utils.GetOrmInReplace(lenUser) + `) `
+		pars = append(pars, req.UserIdList)
+	}
+
+	total, err := models.GetCountEdbInfoList(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	list, err := models.GetEdbInfoList(condition, pars, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	resp := models.EdbListResp{
+		List:   list,
+		Paging: paging.GetPaging(currentIndex, pageSize, total),
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+	br.IsAddLog = false
+}
+
+// BatchAddEdbCheck
+// @Title 新增校验
+// @Description 新增校验
+// @Param	request	body data_manage.BatchManualEdbReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /target/edb/batch/add/check [post]
+func (c *ManualEdbController) BatchAddEdbCheck() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	// 最大批量添加的数量
+	codeMax := 30
+
+	var req models.BatchManualEdbReq
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+
+	req.Keyword = strings.TrimSpace(req.Keyword)
+
+	var condition string
+	var pars []interface{}
+
+	//
+	condition += ` AND a.is_join_edb = 0 `
+
+	//超管账号可以查看分类下的所有频度数据
+	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
+		classifyList, err := models.GetEdbdataClassify(int64(sysUser.AdminId))
+		if err != nil {
+			br.Msg = "获取分类数据失败"
+			br.Msg = "获取拥有的分类数据失败,Err:" + err.Error()
+			return
+		}
+
+		num := len(classifyList)
+		if num > 0 {
+			classifyIdList := make([]int, 0)
+			for _, v := range classifyList {
+				classifyIdList = append(classifyIdList, v.ClassifyId)
+			}
+			condition += ` AND a.classify_id in (` + utils.GetOrmInReplace(num) + `) `
+			pars = append(pars, classifyIdList)
+		}
+
+	}
+
+	if req.ListAll {
+		// 关键词
+		if req.Keyword != "" {
+			condition += ` AND (a.SEC_NAME like ?  or a.TRADE_CODE like ? )`
+			pars = utils.GetLikeKeywordPars(pars, req.Keyword, 2)
+		}
+
+		// 所属分类
+		lenFrequency := len(req.FrequencyList)
+		if lenFrequency > 0 {
+			condition += ` AND a.frequency in (` + utils.GetOrmInReplace(lenFrequency) + `) `
+			pars = append(pars, req.FrequencyList)
+		}
+
+		// 所属分类
+		lenClassify := len(req.ClassifyIdList)
+		if lenClassify > 0 {
+			condition += ` AND a.classify_id in (` + utils.GetOrmInReplace(lenClassify) + `) `
+			pars = append(pars, req.ClassifyIdList)
+		}
+
+		// 所属用户
+		lenUser := len(req.UserIdList)
+		if lenUser > 0 {
+			condition += ` AND a.user_id in (` + utils.GetOrmInReplace(lenUser) + `) `
+			pars = append(pars, req.UserIdList)
+		}
+
+		lenTradeList := len(req.TradeCodeList)
+		// 指标
+		if lenTradeList > 0 {
+			condition += ` AND a.TRADE_CODE not in (` + utils.GetOrmInReplace(lenTradeList) + `) `
+			pars = append(pars, req.TradeCodeList)
+		}
+	} else {
+		lenTradeList := len(req.TradeCodeList)
+		if lenTradeList <= 0 {
+			br.Msg = "请选择指标"
+			br.ErrMsg = "请选择指标"
+			return
+		}
+		// 指标
+		if lenTradeList > 0 {
+			condition += ` AND a.TRADE_CODE in (` + utils.GetOrmInReplace(lenTradeList) + `) `
+			pars = append(pars, req.TradeCodeList)
+		}
+	}
+
+	list, err := models.GetEdbInfoList(condition, pars, 0, 0)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	if len(list) > codeMax {
+		br.Msg = fmt.Sprintf("最多只能选择%d个指标", codeMax)
+		return
+	}
+
+	br.Data = list
+	br.Msg = "校验成功"
+	br.Ret = 200
+	br.Success = true
+}
+
+// NameCheck
+// @Title 重名校验
+// @Description 批量新增
+// @Param	request	body data_manage.AddEdbInfoReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /target/edb/batch/add/name_check [post]
+func (c *ManualEdbController) NameCheck() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		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 []*data_manage.AddEdbInfoReq
+	if e := json.Unmarshal(c.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+	if len(req) == 0 {
+		br.Msg = "请选择指标"
+		return
+	}
+
+	type NameCheckResult struct {
+		EdbCode string
+		EdbName string
+		Exist   bool
+	}
+	indexNames := make([]string, 0)
+	resp := make([]*NameCheckResult, 0)
+	for _, v := range req {
+		v.EdbCode = strings.TrimSpace(v.EdbCode)
+		if v.EdbCode == "" {
+			br.Msg = "指标ID不可为空"
+			return
+		}
+		v.EdbName = strings.TrimSpace(v.EdbName)
+		if v.EdbName == "" {
+			br.Msg = "请输入指标名称"
+			return
+		}
+		indexNames = append(indexNames, v.EdbName)
+		resp = append(resp, &NameCheckResult{
+			EdbCode: v.EdbCode,
+			EdbName: v.EdbName,
+		})
+	}
+
+	// 重名校验
+	edbList, e := data_manage.GetEdbInfoByNameArr(indexNames, utils.EDB_INFO_TYPE)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取重名指标失败, Err: " + e.Error()
+		return
+	}
+	nameExists := make(map[string]bool)
+	for _, v := range edbList {
+		nameExists[v.EdbName] = true
+	}
+	if len(nameExists) > 0 {
+		for _, v := range resp {
+			v.Exist = nameExists[v.EdbName]
+		}
+	}
+
+	br.Data = resp
+	br.Msg = "操作成功"
+	br.Ret = 200
+	br.Success = true
+}
+
+// BatchAdd
+// @Title 批量新增
+// @Description 批量新增
+// @Param	request	body data_manage.AddEdbInfoReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /target/edb/batch/add [post]
+func (c *ManualEdbController) BatchAdd() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	// 最大批量添加的数量
+	codeMax := 30
+
+	deleteCache := true
+	cacheKey := "CACHE_EDB_INFO_BATCH_ADD_MANUAL_" + strconv.Itoa(sysUser.AdminId)
+	defer func() {
+		if deleteCache {
+			_ = utils.Rc.Delete(cacheKey)
+		}
+	}()
+	if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
+		deleteCache = false
+		br.Msg = "系统处理中,请稍后重试!"
+		br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(c.Ctx.Input.RequestBody)
+		return
+	}
+	var req []*data_manage.AddEdbInfoReq
+	if e := json.Unmarshal(c.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+	if len(req) == 0 {
+		br.Msg = "请选择指标"
+		return
+	}
+	if len(req) > codeMax {
+		br.Msg = "批量添加指标数量不得超过30个"
+		return
+	}
+	indexNames := make([]string, 0)
+	for _, v := range req {
+		v.EdbCode = strings.TrimSpace(v.EdbCode)
+		if v.EdbCode == "" {
+			br.Msg = "指标ID不可为空"
+			return
+		}
+		v.EdbName = strings.TrimSpace(v.EdbName)
+		if v.EdbName == "" {
+			br.Msg = "请输入指标名称"
+			return
+		}
+		indexNames = append(indexNames, v.EdbName)
+		v.Frequency = strings.TrimSpace(v.Frequency)
+		if v.Frequency == "" {
+			br.Msg = "请选择频度"
+			return
+		}
+		v.Unit = strings.TrimSpace(v.Unit)
+		if v.Unit == "" {
+			br.Msg = "请输入单位"
+			return
+		}
+		if v.ClassifyId <= 0 {
+			br.Msg = "请选择分类"
+			return
+		}
+	}
+
+	// 限定同一时间最多批量新增30个指标
+	for _, v := range req {
+		var r data.ManualIndexSource2EdbReq
+		r.EdbCode = v.EdbCode
+		r.EdbName = v.EdbName
+		r.Frequency = v.Frequency
+		r.Unit = v.Unit
+		r.ClassifyId = v.ClassifyId
+		r.AdminId = sysUser.AdminId
+		r.AdminRealName = sysUser.RealName
+
+		edbInfo, e, errMsg, skip := data.ManualIndexSource2Edb(r, c.Lang)
+		if e != nil {
+			br.Msg = "操作失败"
+			if errMsg != "" {
+				br.Msg = errMsg
+			}
+			br.ErrMsg = e.Error()
+			return
+		}
+		if skip {
+			continue
+		}
+
+		// 试用平台更新用户累计新增指标数
+		if utils.BusinessCode == utils.BusinessCodeSandbox {
+			go func() {
+				adminItem, e := system.GetSysAdminById(sysUser.AdminId)
+				if e != nil {
+					tips := fmt.Sprintf("试用平台更新用户累计新增指标数-获取用户失败, Err: " + e.Error())
+					utils.FileLog.Info(tips)
+					return
+				}
+				if adminItem.DepartmentName != "ETA试用客户" {
+					return
+				}
+				var ur etaTrialService.EtaTrialUserReq
+				ur.Mobile = adminItem.Mobile
+				_, _ = etaTrialService.UpdateUserIndexNum(ur)
+			}()
+		}
+
+		// 新增操作日志
+		{
+			edbLog := new(data_manage.EdbInfoLog)
+			edbLog.EdbInfoId = edbInfo.EdbInfoId
+			edbLog.SourceName = edbInfo.SourceName
+			edbLog.Source = edbInfo.Source
+			edbLog.EdbCode = edbInfo.EdbCode
+			edbLog.EdbName = edbInfo.EdbName
+			edbLog.ClassifyId = edbInfo.ClassifyId
+			edbLog.SysUserId = sysUser.AdminId
+			edbLog.SysUserRealName = sysUser.RealName
+			edbLog.CreateTime = time.Now()
+			edbLog.Content = string(c.Ctx.Input.RequestBody)
+			edbLog.Status = "新增指标"
+			edbLog.Method = c.Ctx.Input.URI()
+			go data_manage.AddEdbInfoLog(edbLog)
+		}
+	}
+
+	br.Msg = "操作成功"
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+}
+
+// BatchDelEdbCheck
+// @Title 新增校验
+// @Description 新增校验
+// @Param	request	body data_manage.BatchManualEdbReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /target/edb/batch/del/check [post]
+func (c *ManualEdbController) BatchDelEdbCheck() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		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 models.BatchManualEdbReq
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+
+	req.Keyword = strings.TrimSpace(req.Keyword)
+
+	var condition string
+	var pars []interface{}
+
+	// 就是为了找出已经加入指标库的指标
+	condition += ` AND a.is_join_edb = ? `
+	pars = append(pars, 1)
+
+	//超管账号可以查看分类下的所有频度数据
+	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
+		classifyList, err := models.GetEdbdataClassify(int64(sysUser.AdminId))
+		if err != nil {
+			br.Msg = "获取分类数据失败"
+			br.Msg = "获取拥有的分类数据失败,Err:" + err.Error()
+			return
+		}
+
+		num := len(classifyList)
+		if num > 0 {
+			classifyIdList := make([]int, 0)
+			for _, v := range classifyList {
+				classifyIdList = append(classifyIdList, v.ClassifyId)
+			}
+			condition += ` AND a.classify_id in (` + utils.GetOrmInReplace(num) + `) `
+			pars = append(pars, classifyIdList)
+		}
+
+	}
+
+	if req.ListAll {
+		// 关键词
+		if req.Keyword != "" {
+			condition += ` AND (a.SEC_NAME like ?  or a.TRADE_CODE like ? )`
+			pars = utils.GetLikeKeywordPars(pars, req.Keyword, 2)
+		}
+
+		// 所属分类
+		lenFrequency := len(req.FrequencyList)
+		if lenFrequency > 0 {
+			condition += ` AND a.frequency in (` + utils.GetOrmInReplace(lenFrequency) + `) `
+			pars = append(pars, req.FrequencyList)
+		}
+
+		// 所属分类
+		lenClassify := len(req.ClassifyIdList)
+		if lenClassify > 0 {
+			condition += ` AND a.classify_id in (` + utils.GetOrmInReplace(lenClassify) + `) `
+			pars = append(pars, req.ClassifyIdList)
+		}
+
+		// 所属用户
+		lenUser := len(req.UserIdList)
+		if lenUser > 0 {
+			condition += ` AND a.user_id in (` + utils.GetOrmInReplace(lenUser) + `) `
+			pars = append(pars, req.UserIdList)
+		}
+
+		lenTradeList := len(req.TradeCodeList)
+		// 指标
+		if lenTradeList > 0 {
+			condition += ` AND a.TRADE_CODE not in (` + utils.GetOrmInReplace(lenTradeList) + `) `
+			pars = append(pars, req.TradeCodeList)
+		}
+	} else {
+		lenTradeList := len(req.TradeCodeList)
+		if lenTradeList <= 0 {
+			br.Msg = "请选择指标"
+			br.ErrMsg = "请选择指标"
+			return
+		}
+		// 指标
+		if lenTradeList > 0 {
+			condition += ` AND a.TRADE_CODE in (` + utils.GetOrmInReplace(lenTradeList) + `) `
+			pars = append(pars, req.TradeCodeList)
+		}
+	}
+
+	list, err := models.GetEdbInfoList(condition, pars, 0, 0)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	br.Data = list
+	br.Msg = "校验成功"
+	br.Ret = 200
+	br.Success = true
+}
+
+// BatchDel
+// @Title 批量删除
+// @Description 批量新增
+// @Param	request	body data_manage.AddEdbInfoReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /target/edb/batch/del [post]
+func (c *ManualEdbController) BatchDel() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	deleteCache := true
+	cacheKey := "CACHE_EDB_INFO_BATCH_ADD_MANUAL_" + strconv.Itoa(sysUser.AdminId)
+	defer func() {
+		if deleteCache {
+			_ = utils.Rc.Delete(cacheKey)
+		}
+	}()
+	if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
+		deleteCache = false
+		br.Msg = "系统处理中,请稍后重试!"
+		br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(c.Ctx.Input.RequestBody)
+		return
+	}
+	var req models.BatchManualEdbReq
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
+
+	req.Keyword = strings.TrimSpace(req.Keyword)
+
+	var condition string
+	var pars []interface{}
+
+	// 就是为了找出已经加入指标库的指标
+	condition += ` AND a.is_join_edb = ? `
+	pars = append(pars, 0)
+
+	//超管账号可以查看分类下的所有频度数据
+	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
+		classifyList, err := models.GetEdbdataClassify(int64(sysUser.AdminId))
+		if err != nil {
+			br.Msg = "获取分类数据失败"
+			br.Msg = "获取拥有的分类数据失败,Err:" + err.Error()
+			return
+		}
+
+		num := len(classifyList)
+		if num > 0 {
+			classifyIdList := make([]int, 0)
+			for _, v := range classifyList {
+				classifyIdList = append(classifyIdList, v.ClassifyId)
+			}
+			condition += ` AND a.classify_id in (` + utils.GetOrmInReplace(num) + `) `
+			pars = append(pars, classifyIdList)
+		}
+
+	}
+
+	if req.ListAll {
+		// 关键词
+		if req.Keyword != "" {
+			condition += ` AND (a.SEC_NAME like ?  or a.TRADE_CODE like ? )`
+			pars = utils.GetLikeKeywordPars(pars, req.Keyword, 2)
+		}
+
+		// 所属分类
+		lenFrequency := len(req.FrequencyList)
+		if lenFrequency > 0 {
+			condition += ` AND a.frequency in (` + utils.GetOrmInReplace(lenFrequency) + `) `
+			pars = append(pars, req.FrequencyList)
+		}
+
+		// 所属分类
+		lenClassify := len(req.ClassifyIdList)
+		if lenClassify > 0 {
+			condition += ` AND a.classify_id in (` + utils.GetOrmInReplace(lenClassify) + `) `
+			pars = append(pars, req.ClassifyIdList)
+		}
+
+		// 所属用户
+		lenUser := len(req.UserIdList)
+		if lenUser > 0 {
+			condition += ` AND a.user_id in (` + utils.GetOrmInReplace(lenUser) + `) `
+			pars = append(pars, req.UserIdList)
+		}
+
+		lenTradeList := len(req.TradeCodeList)
+		// 指标
+		if lenTradeList > 0 {
+			condition += ` AND a.TRADE_CODE not in (` + utils.GetOrmInReplace(lenTradeList) + `) `
+			pars = append(pars, req.TradeCodeList)
+		}
+	} else {
+		lenTradeList := len(req.TradeCodeList)
+		if lenTradeList <= 0 {
+			br.Msg = "请选择指标"
+			br.ErrMsg = "请选择指标"
+			return
+		}
+		// 指标
+		if lenTradeList > 0 {
+			condition += ` AND a.TRADE_CODE in (` + utils.GetOrmInReplace(lenTradeList) + `) `
+			pars = append(pars, req.TradeCodeList)
+		}
+	}
+
+	list, err := models.GetEdbInfoList(condition, pars, 0, 0)
+	if err != nil {
+		br.Msg = "删除失败"
+		br.ErrMsg = "删除失败,Err:" + err.Error()
+		return
+	}
+
+	// TODO 二次校验指标是否已经加到指标库
+	{
+		codeList := make([]string, 0)
+		// 限定同一时间最多批量新增30个指标
+		for _, v := range list {
+			codeList = append(codeList, v.TradeCode)
+		}
+		err = models.DelManualIndexByCodeList(codeList)
+		if err != nil {
+			br.Msg = "删除失败"
+			br.ErrMsg = "删除失败,Err:" + err.Error()
+			return
+		}
+	}
+
+	br.Msg = "删除成功"
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+}
+
+// ImportData
+// @Title 导入数据
+// @Description 导入数据
+// @Param   EntryFile   query   file  true       "文件"
+// @Success 200 Ret=200 录入成功
+// @router /import/data [post]
+func (c *ManualEdbController) ImportData() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请重新登录"
+		return
+	}
+	file, _, err := c.GetFile("EntryFile")
+	if err != nil {
+		br.Msg = "获取文件失败"
+		br.ErrMsg = "获取文件失败,Err:" + err.Error()
+		return
+	}
+	path := "./static/数据导入_" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
+	defer file.Close()
+	err = c.SaveToFile("EntryFile", path)
+	if err != nil {
+		br.Msg = "文件保存失败"
+		br.ErrMsg = "文件保存失败,Err:" + err.Error()
+		return
+	}
+	if utils.RunMode == "debug" {
+		defer os.Remove(path)
+	}
+	xlFile, err := xlsx.OpenFile(path)
+	if err != nil {
+		fmt.Println(err.Error())
+		return
+	}
+
+	//超管账号可以查看分类下的所有频度数据
+	userId := sysUser.AdminId
+	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
+		userId = 0
+	}
+	//获取账户所拥有权限的分类id集合
+	classifyNameStrList, edbDataClassifyMap, err := data.GetEdbClassifyNameListByAdminId(int64(userId))
+	if err != nil {
+		br.Msg = "获取分类数据失败"
+		return
+	}
+
+	//导入成功数量
+	successCount := 0
+	//导入失败数据
+	failDatas := make([]*models.EdbdataImportFail, 0)
+
+	//指标map
+	targetMap := make(map[string]*models.Edbinfo)
+	defer func() {
+		for _, target := range targetMap {
+			//结束后,清除掉对应的缓存
+			key := "import:edbinfo:data:" + target.TradeCode
+			utils.Rc.Delete(key)
+
+			//将该指标的code加入到 “手工数据导入后刷新” 缓存
+			if utils.Re == nil {
+				err := utils.Rc.LPush(utils.CACHE_IMPORT_MANUAL_DATA, target.TradeCode)
+				if err != nil {
+					fmt.Println("CACHE_IMPORT_MANUAL_DATA LPush Err:" + err.Error())
+				}
+			}
+		}
+	}()
+
+	// 所有的指标数据map
+	edbCodeDataMap := make(map[string]map[string]string)
+
+	// 遍历sheet页读取
+	for _, sheet := range xlFile.Sheets {
+		fmt.Println("sheet name: ", sheet.Name)
+		//遍历行读取
+		maxRow := sheet.MaxRow
+		fmt.Println("maxRow:", maxRow)
+		fmt.Println("maxRow")
+		for i := 0; i < maxRow; i++ {
+			if i == 1 {
+				row := sheet.Row(i)
+				cells := row.Cells
+				if len(cells) < 6 {
+					br.ErrMsg = "导入文件异常,请下载最新导入模板文件"
+					br.Msg = "导入文件异常,请下载最新导入模板文件"
+					return
+				}
+				templateFail := false
+				if cells[0].Value != "品种分类" && cells[0].Value != "Species Category" {
+					templateFail = true
+				}
+				if cells[1].Value != "录入日期" && cells[1].Value != "Input Date" {
+					templateFail = true
+				}
+				if cells[2].Value != "指标名称" && cells[2].Value != "Indicator Name Indicator Name" {
+					templateFail = true
+				}
+				if cells[3].Value != "值" && cells[3].Value != "Value" {
+					templateFail = true
+				}
+				if cells[4].Value != "频度" && cells[4].Value != "Frequency" {
+					templateFail = true
+				}
+				if cells[5].Value != "单位" && cells[5].Value != "Unit" {
+					templateFail = true
+				}
+				if templateFail {
+					br.ErrMsg = "导入文件异常,请下载最新导入模板文件"
+					br.Msg = "导入文件异常,请下载最新导入模板文件"
+					return
+				}
+			}
+			if i > 1 {
+				row := sheet.Row(i)
+				cells := row.Cells
+				if len(cells) >= 6 {
+					classifyName := cells[0].Value //分类
+					if classifyName == "" {        //过滤空白行
+						continue
+					}
+					cell1 := cells[1].Value
+					//createDate := utils.ConvertToFormatDay(cell1) //录入日期
+					createDate := cell1
+					cell2 := cells[2].Value //指标名称
+					secName := utils.TrimStr(cell2)
+					frequency := cells[4].Value //频度
+					unit := cells[5].Value      //单位
+
+					closeVal := cells[3].Value //值
+					if strings.Contains(closeVal, "#N/A") {
+						continue
+					}
+
+					//校验表格中的日期格式
+					if strings.Contains(createDate, "-") {
+						//如果是带有 - 的普通日期格式文本
+						_, timeErr := time.Parse("2006-1-2", createDate)
+						if timeErr != nil {
+							failItem := new(models.EdbdataImportFail)
+							failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+							failItem.ClassifyName = classifyName
+							failItem.CreateDate = createDate
+							failItem.SecName = secName
+							failItem.Close = closeVal
+							failItem.Remark = "日期格式异常"
+							failItem.Frequency = frequency
+							failItem.Unit = unit
+							failDatas = append(failDatas, failItem)
+							//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
+							continue
+						}
+					} else if strings.Contains(createDate, "/") {
+						//如果是带有 / 的普通日期格式文本
+						createDateTime, timeErr := time.Parse("2006/1/2", createDate)
+						if timeErr != nil {
+							failItem := new(models.EdbdataImportFail)
+							failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+							failItem.ClassifyName = classifyName
+							failItem.CreateDate = createDate
+							failItem.SecName = secName
+							failItem.Close = closeVal
+							failItem.Remark = "日期格式异常"
+							failItem.Frequency = frequency
+							failItem.Unit = unit
+							failDatas = append(failDatas, failItem)
+							//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
+							continue
+						}
+						createDate = createDateTime.Format("2006-01-02")
+					} else {
+						//可能是excel的日期格式
+						_, tmpErr := strconv.Atoi(createDate)
+						if tmpErr != nil {
+							failItem := new(models.EdbdataImportFail)
+							failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+							failItem.ClassifyName = classifyName
+							failItem.CreateDate = createDate
+							failItem.SecName = secName
+							failItem.Close = closeVal
+							failItem.Remark = "日期格式异常"
+							failItem.Frequency = frequency
+							failItem.Unit = unit
+							failDatas = append(failDatas, failItem)
+							//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
+							continue
+						}
+						createDate = utils.ConvertToFormatDay(createDate) //录入日期
+					}
+
+					closeValFloat, err := cells[3].Float() //值
+
+					if err != nil {
+						failItem := new(models.EdbdataImportFail)
+						failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+						failItem.ClassifyName = classifyName
+						failItem.CreateDate = createDate
+						failItem.SecName = secName
+						failItem.Close = cells[3].Value
+						failItem.Remark = "值类型异常"
+						failItem.Frequency = frequency
+						failItem.Unit = unit
+						failDatas = append(failDatas, failItem)
+						continue
+					}
+					newDecimal := decimal.NewFromFloat(closeValFloat)
+					newDecimal.Round(4)
+					closeVal = newDecimal.String()
+					if strings.Contains(closeVal, "#N/A") {
+						continue
+					}
+					//closeVal := closeValFloat.
+
+					//判断指标,类型,等数据是否正常
+					classifyName = strings.Trim(classifyName, " ")
+					frequency = utils.TrimStr(frequency)
+					unit = utils.TrimStr(unit)
+
+					// 成功数量超过20个指标,那就不导入了
+					if len(targetMap) >= 150 {
+						failItem := new(models.EdbdataImportFail)
+						failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+						failItem.ClassifyName = classifyName
+						failItem.CreateDate = createDate
+						failItem.SecName = secName
+						failItem.Close = closeVal
+						failItem.Remark = "导入指标数量过多"
+						failItem.Frequency = frequency
+						failItem.Unit = unit
+						failDatas = append(failDatas, failItem)
+						//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
+						continue
+					}
+
+					if !strings.Contains(strings.Join(classifyNameStrList, ","), classifyName) {
+						failItem := new(models.EdbdataImportFail)
+						failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+						failItem.ClassifyName = classifyName
+						failItem.CreateDate = createDate
+						failItem.SecName = secName
+						failItem.Close = closeVal
+						failItem.Remark = "没有该品种分类权限"
+						failItem.Frequency = frequency
+						failItem.Unit = unit
+						failDatas = append(failDatas, failItem)
+						continue
+					}
+					//fmt.Println(classifyName, createDate, secName, closeVal)
+
+					//获取指标分类信息
+					classify, ok := edbDataClassifyMap[classifyName]
+					if !ok {
+						failItem := new(models.EdbdataImportFail)
+						failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+						failItem.ClassifyName = classifyName
+						failItem.CreateDate = createDate
+						failItem.SecName = secName
+						failItem.Close = closeVal
+						failItem.Remark = "指标分类不存在"
+						failItem.Frequency = frequency
+						failItem.Unit = unit
+						failDatas = append(failDatas, failItem)
+						//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
+						continue
+					}
+
+					//判断指标是否存在
+					target, ok := targetMap[secName]
+					if !ok {
+						tmpTarget, err := models.GetTargetBySecName(secName)
+						if err != nil {
+							//如果是找不到该指标,那么新增指标
+							if err.Error() == utils.ErrNoRow() {
+								if frequency == "" {
+									failItem := new(models.EdbdataImportFail)
+									failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+									failItem.ClassifyName = classifyName
+									failItem.CreateDate = createDate
+									failItem.SecName = secName
+									failItem.Close = closeVal
+									failItem.Remark = "新增指标失败,频度字段为空"
+									failItem.Frequency = frequency
+									failItem.Unit = unit
+									failDatas = append(failDatas, failItem)
+									continue
+								}
+								if unit == "" {
+									failItem := new(models.EdbdataImportFail)
+									failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+									failItem.ClassifyName = classifyName
+									failItem.CreateDate = createDate
+									failItem.SecName = secName
+									failItem.Close = closeVal
+									failItem.Remark = "新增指标失败,单位字段为空"
+									failItem.Frequency = frequency
+									failItem.Unit = unit
+									failDatas = append(failDatas, failItem)
+									continue
+								}
+								tmpErr := data.AddEdbInfo(secName, unit, frequency, "", sysUser.Mobile, classify.ClassifyId, sysUser.AdminId)
+								if tmpErr != nil {
+									fmt.Println("line 158")
+									failItem := new(models.EdbdataImportFail)
+									failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+									failItem.ClassifyName = classifyName
+									failItem.CreateDate = createDate
+									failItem.SecName = secName
+									failItem.Close = closeVal
+									failItem.Remark = "新增指标失败"
+									failItem.Frequency = frequency
+									failItem.Unit = unit
+									failDatas = append(failDatas, failItem)
+									continue
+								}
+								tmpTarget, tmpErr := models.GetTargetBySecName(secName)
+								target = tmpTarget
+								targetMap[secName] = target
+							} else {
+								fmt.Println("导入数据 获取指标:Err:" + err.Error())
+							}
+						} else {
+							target = tmpTarget
+							targetMap[secName] = target
+						}
+
+						//设置10分钟缓存,不允许其他地方删除
+						key := "import:edbinfo:data:" + target.TradeCode
+						utils.Rc.SetNX(key, 1, time.Second*600)
+					}
+
+					if target == nil {
+						fmt.Println("指标不存在")
+						failItem := new(models.EdbdataImportFail)
+						failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+						failItem.ClassifyName = classifyName
+						failItem.CreateDate = createDate
+						failItem.SecName = secName
+						failItem.Close = closeVal
+						failItem.Remark = "指标不存在"
+						failItem.Frequency = frequency
+						failItem.Unit = unit
+						failDatas = append(failDatas, failItem)
+						continue
+					}
+
+					//更新指标信息
+					updateCols := make([]string, 0)
+					//更新指标分类
+					if target.ClassifyId <= 0 && classify.ClassifyId > 0 {
+						target.ClassifyId = classify.ClassifyId
+						updateCols = append(updateCols, "ClassifyId")
+					}
+					if target.Frequency != frequency {
+						target.Frequency = frequency
+						target.NoticeTime = ""
+						updateCols = append(updateCols, "Frequency", "NoticeTime")
+					}
+					if target.Unit != unit {
+						target.Unit = unit
+						updateCols = append(updateCols, "Unit")
+					}
+					if len(updateCols) > 0 {
+						_ = target.Update(updateCols)
+					}
+
+					// 判断指标数据列表是否已经存在
+					tmpDataMap, ok := edbCodeDataMap[target.TradeCode]
+					if !ok {
+						tmpDataMap = make(map[string]string)
+						dataList, tmpErr := models.GetTargetsDataList(target.TradeCode)
+						if tmpErr != nil {
+							go alarm_msg.SendAlarmMsg("导入数据"+target.TradeCode+" 获取指标的数据失败,Err:"+err.Error(), 3)
+						}
+						for _, tmpData := range dataList {
+							tmpDataMap[tmpData.Dt] = tmpData.Close
+						}
+						edbCodeDataMap[target.TradeCode] = tmpDataMap
+					}
+
+					//判断数据是否已经存在
+					tmpVal, ok := tmpDataMap[createDate]
+					//数据已存在,进行更新操作
+					if ok {
+						if tmpVal != closeVal {
+							err = models.ModifyTargetsDataByImport(target.TradeCode, createDate, closeVal)
+							if err != nil {
+								go alarm_msg.SendAlarmMsg("导入数据 修改数据失败,Err:"+err.Error(), 3)
+								//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 修改数据失败:Err:"+err.Error(), utils.EmailSendToUsers)
+							}
+						}
+					} else { //数据不存在,进行新增操作
+						if target.TradeCode != "" && createDate != "" && closeVal != "" {
+							models.AddTargetsDataByImport(target.TradeCode, createDate, closeVal)
+							if err != nil {
+								go alarm_msg.SendAlarmMsg("导入数据 新增数据失败,Err:"+err.Error(), 3)
+								//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 新增数据失败:Err:"+err.Error(), utils.EmailSendToUsers)
+							}
+							tmpDataMap[createDate] = closeVal
+							edbCodeDataMap[target.TradeCode] = tmpDataMap
+						}
+					}
+					successCount++
+				} else {
+					//br.ErrMsg = "请填写导入内容"
+					//br.Msg = "请填写导入内容"
+					//return
+				}
+			}
+		}
+	}
+	resp := models.EdbdataImportResp{
+		SuccessCount: successCount,
+		FailCount:    len(failDatas),
+	}
+	fmt.Println("failDatas:", len(failDatas))
+	if len(failDatas) > 0 {
+		//先删除导入失败记录
+		_ = models.DelEdbDataImportFail(sysUser.AdminId)
+		//错误信息字符串切片,最后作为发送邮件通知使用
+		failContents := make([]string, 0)
+		for _, v := range failDatas {
+			failContents = append(failContents, fmt.Sprint(v.SecName, "导入失败:", v.Remark))
+			err = models.AddEdbdataImportFail(v)
+			if err != nil {
+				go alarm_msg.SendAlarmMsg("导入数据 新增失败记录失败,Err:"+err.Error(), 3)
+				//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 新增失败记录失败:Err:"+err.Error(), utils.EmailSendToUsers)
+			}
+		}
+		//导入失败的话,最后统一邮件提醒就好啦,不需要每次都去提醒
+		go alarm_msg.SendAlarmMsg("导入数据 存在部分数据导入失败:"+strings.Join(failContents, ";"), 3)
+		//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 存在部分数据导入失败:"+strings.Join(failContents, ";"), utils.EmailSendToUsers)
+
+		if successCount == 0 {
+			resp.Status = -1
+			resp.Msg = "导入失败"
+		} else {
+			resp.Status = 1
+			resp.Msg = "存在部分导入失败"
+		}
+	} else {
+		resp.Status = 0
+	}
+	br.Msg = "导入成功"
+	br.Ret = 200
+	br.Success = true
+	br.Data = resp
+}

+ 0 - 638
controllers/manual_edb.go

@@ -1,638 +0,0 @@
-package controllers
-
-import (
-	"encoding/json"
-	"eta/eta_api/models"
-	"eta/eta_api/models/data_manage"
-	"eta/eta_api/utils"
-	"fmt"
-	"github.com/rdlucklib/rdluck_tools/paging"
-	"github.com/shopspring/decimal"
-	"strconv"
-	"strings"
-	"time"
-)
-
-// EdbDetail
-// @Title 指标列表
-// @Description 指标列表
-// @Param   TradeCode   query   string  true       "指标编码"
-// @Success 200 {object} models.TargetDetailResp
-// @router /target/edb/detail [get]
-func (this *TargetController) EdbDetail() {
-	br := new(models.BaseResponse).Init()
-	defer func() {
-		this.Data["json"] = br
-		this.ServeJSON()
-	}()
-
-	sysUser := this.SysUser
-	if sysUser == nil {
-		br.Msg = "请重新登录"
-		return
-	}
-
-	// 指标编码
-	tradeCode := this.GetString("TradeCode")
-	if tradeCode == `` {
-		br.Msg = "请输入指标编码"
-		br.IsSendEmail = false
-		return
-	}
-
-	manualEdbInfo, err := models.GetTargetByTradeCode(tradeCode)
-	if err != nil {
-		br.Msg = "获取指标失败"
-		br.ErrMsg = "获取指标失败,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
-		}
-	}
-
-	classifyList := make([]*models.EdbdataClassify, 0)
-	{
-		classify, err := models.GetManualClassifyByClassifyId(manualEdbInfo.ClassifyId)
-		if err != nil {
-			br.Msg = "获取分类信息失败"
-			br.ErrMsg = "获取分类信息失败,err:" + err.Error()
-			return
-		}
-		parentClassify, err := models.GetManualClassifyByClassifyId(classify.ParentId)
-		if err != nil {
-			br.Msg = "获取分类信息失败"
-			br.ErrMsg = "获取父级分类信息失败,err:" + err.Error()
-			return
-		}
-		classifyList = []*models.EdbdataClassify{
-			parentClassify, classify,
-		}
-	}
-
-	// 明细数据
-	{
-		dataList, err := models.GetEdbDataListByCode(manualEdbInfo.TradeCode)
-		if err != nil {
-			br.Msg = "获取明细数据失败"
-			br.ErrMsg = "获取明细数据失败,err:" + err.Error()
-			return
-		}
-
-		manualEdbInfo.DataList = dataList
-	}
-
-	resp := models.TargetDetailResp{
-		Detail:       manualEdbInfo,
-		ClassifyList: classifyList,
-	}
-	br.Ret = 200
-	br.Success = true
-	br.Msg = "获取成功"
-	//br.Data = resp
-	br.Data = resp
-}
-
-// ClassifyEdbList
-// @Title 分类指标列表
-// @Description 指标列表
-// @Param   ClassifyId   query   string  true       "分类id"
-// @Success 200 {object} models.TargetDetailResp
-// @router /target/classify/edb/list [get]
-func (this *TargetController) ClassifyEdbList() {
-	br := new(models.BaseResponse).Init()
-	defer func() {
-		this.Data["json"] = br
-		this.ServeJSON()
-	}()
-	sysUser := this.SysUser
-	if sysUser == nil {
-		br.Msg = "请登录"
-		br.Ret = 408
-		return
-	}
-	resp := new(models.EdbdataClassifyResp)
-
-	classifyId, _ := this.GetInt("ClassifyId") //分类
-	if classifyId <= 0 {
-		br.Msg = "请传入分类"
-		br.ErrMsg = "请传入分类"
-		br.IsSendEmail = false
-	}
-
-	var condition string
-	var pars []interface{}
-
-	// 如果不是超管账号,那么得校验下当前用户是否有该指标的权限
-	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
-		//获取账户所拥有权限的分类id集合
-		count, err := models.GetCountManualUserClassify(sysUser.AdminId, classifyId)
-		if err != nil {
-			br.Msg = "获取分类数据失败"
-			br.ErrMsg = "获取分类数据失败,err:" + err.Error()
-			return
-		}
-
-		if count <= 0 {
-			br.Msg = "无权访问"
-			br.ErrMsg = "无权访问"
-			br.IsSendEmail = false
-			return
-		}
-	}
-
-	list := make([]*models.EdbdataClassifyList, 0)
-
-	condition += ` AND a.classify_id = ? `
-	pars = append(pars, classifyId)
-
-	tmpList, err := models.GetEdbInfoList(condition, pars, 0, 0)
-	if err != nil {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取失败,Err:" + err.Error()
-		return
-	}
-
-	for _, v := range tmpList {
-		list = append(list, &models.EdbdataClassifyList{
-			ClassifyId:   0,
-			ClassifyName: v.SecName,
-			ParentId:     v.ClassifyId,
-			Child:        nil,
-			TradeCode:    v.TradeCode,
-			UniqueCode:   utils.MD5(v.TradeCode),
-		})
-	}
-
-	resp.List = list
-
-	br.Ret = 200
-	br.Success = true
-	br.Msg = "获取成功"
-	br.Data = resp
-}
-
-// EdbSearch
-// @Title 指标搜索
-// @Description 指标搜索
-// @Param   Keyword   query   string  false       "关键字搜索"
-// @Success 200 {object} models.TargetItemListResp
-// @router /target/edb/search [get]
-func (this *TargetController) EdbSearch() {
-	br := new(models.BaseResponse).Init()
-	defer func() {
-		this.Data["json"] = br
-		this.ServeJSON()
-	}()
-
-	sysUser := this.SysUser
-	if sysUser == nil {
-		br.Msg = "请重新登录"
-		return
-	}
-
-	pageSize, _ := this.GetInt("PageSize")
-	currentIndex, _ := this.GetInt("CurrentIndex")
-
-	var startSize int
-	if pageSize <= 0 {
-		pageSize = utils.PageSize20
-	}
-	if currentIndex <= 0 {
-		currentIndex = 1
-	}
-	startSize = utils.StartIndex(currentIndex, pageSize)
-
-	//关键字
-	keyword := this.GetString("Keyword")
-
-	var condition string
-	var pars []interface{}
-
-	userId := sysUser.AdminId
-	//超管账号可以查看分类下的所有频度数据
-	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
-		classifyList, err := models.GetEdbdataClassify(int64(userId))
-		if err != nil {
-			br.Msg = "获取分类数据失败"
-			br.Msg = "获取拥有的分类数据失败,Err:" + err.Error()
-			return
-		}
-
-		num := len(classifyList)
-		if num > 0 {
-			classifyIdList := make([]int, 0)
-			for _, v := range classifyList {
-				classifyIdList = append(classifyIdList, v.ClassifyId)
-			}
-			condition += ` AND a.classify_id in (` + utils.GetOrmInReplace(num) + `) `
-			pars = append(pars, classifyIdList)
-		}
-
-	}
-
-	if keyword != "" {
-		condition += ` AND (a.SEC_NAME like ?  or a.TRADE_CODE like ? )`
-		pars = utils.GetLikeKeywordPars(pars, keyword, 2)
-	}
-
-	total, err := models.GetCountEdbInfoList(condition, pars)
-	if err != nil {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取失败,Err:" + err.Error()
-		return
-	}
-
-	list, err := models.GetEdbInfoList(condition, pars, startSize, pageSize)
-	if err != nil {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取失败,Err:" + err.Error()
-		return
-	}
-
-	for _, v := range list {
-		v.UniqueCode = utils.MD5(v.TradeCode)
-	}
-
-	resp := models.EdbListResp{
-		List:   list,
-		Paging: paging.GetPaging(currentIndex, pageSize, total),
-	}
-	br.Ret = 200
-	br.Success = true
-	br.Msg = "获取成功"
-	br.Data = resp
-}
-
-// EdbList
-// @Title 获取研究员指标
-// @Description 获取研究员指标
-// @Param   Frequency   query   string  false       "频度;枚举值:日度、周度、月度、季度、半年度、年度"
-// @Param   Keyword   query   string  false       "关键字搜索"
-// @Param   TradeCode   query   string  false       "指标唯一编码"
-// @Param   ClassifyId   query   int  false       "分类id"
-// @Param   EdbShowType   query   string  true       "指标展示类型:0,1,2; 0:不管有没有数据,指标都展示出来, 1:只展示有数据的指标, 2:只展示没有数据的指标"
-// @Success 200 {object} models.TargetItemListResp
-// @router /target/edb/list [get]
-func (this *TargetController) EdbList() {
-	br := new(models.BaseResponse).Init()
-	defer func() {
-		this.Data["json"] = br
-		this.ServeJSON()
-	}()
-
-	sysUser := this.SysUser
-	if sysUser == nil {
-		br.Msg = "请重新登录"
-		return
-	}
-
-	pageSize, _ := this.GetInt("PageSize")
-	currentIndex, _ := this.GetInt("CurrentIndex")
-
-	var startSize int
-	if pageSize <= 0 {
-		pageSize = utils.PageSize20
-	}
-	if currentIndex <= 0 {
-		currentIndex = 1
-	}
-	startSize = utils.StartIndex(currentIndex, pageSize)
-
-	//关键字
-	keyword := this.GetString("Keyword")
-	//关键字
-	classifyId, _ := this.GetInt("ClassifyId", 0)
-
-	var condition string
-	var pars []interface{}
-
-	userId := sysUser.AdminId
-	//超管账号可以查看分类下的所有频度数据
-	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
-		classifyList, err := models.GetEdbdataClassify(int64(userId))
-		if err != nil {
-			br.Msg = "获取分类数据失败"
-			br.Msg = "获取拥有的分类数据失败,Err:" + err.Error()
-			return
-		}
-
-		num := len(classifyList)
-		if num > 0 {
-			classifyIdList := make([]int, 0)
-			for _, v := range classifyList {
-				classifyIdList = append(classifyIdList, v.ClassifyId)
-			}
-			condition += ` AND a.classify_id in (` + utils.GetOrmInReplace(num) + `) `
-			pars = append(pars, classifyIdList)
-		}
-
-	}
-
-	// 关键词
-	if keyword != "" {
-		condition += ` AND (a.SEC_NAME like ?  or a.TRADE_CODE like ? )`
-		pars = utils.GetLikeKeywordPars(pars, keyword, 2)
-	}
-
-	// 所属分类
-	if classifyId > 0 {
-		condition += ` AND a.classify_id = ? `
-		pars = append(pars, classifyId)
-	}
-
-	total, err := models.GetCountEdbInfoList(condition, pars)
-	if err != nil {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取失败,Err:" + err.Error()
-		return
-	}
-
-	list, err := models.GetEdbInfoList(condition, pars, startSize, pageSize)
-	if err != nil {
-		br.Msg = "获取失败"
-		br.ErrMsg = "获取失败,Err:" + err.Error()
-		return
-	}
-
-	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
-		//先拿下日期列表
-		{
-			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.OnlyMultiAddEdbdata(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 = "保存成功"
-}

+ 0 - 454
controllers/target.go

@@ -833,460 +833,6 @@ func (this *TargetCommonController) TemplateDownloadEn() {
 	br.Msg = "下载成功"
 }
 
-// ImportData
-// @Title 导入数据
-// @Description 导入数据
-// @Param   EntryFile   query   file  true       "文件"
-// @Success 200 Ret=200 录入成功
-// @router /import/data [post]
-func (this *TargetController) ImportData() {
-	br := new(models.BaseResponse).Init()
-	defer func() {
-		this.Data["json"] = br
-		this.ServeJSON()
-	}()
-	sysUser := this.SysUser
-	if sysUser == nil {
-		br.Msg = "请重新登录"
-		return
-	}
-	file, _, err := this.GetFile("EntryFile")
-	if err != nil {
-		br.Msg = "获取文件失败"
-		br.ErrMsg = "获取文件失败,Err:" + err.Error()
-		return
-	}
-	path := "./static/数据导入_" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
-	defer file.Close()
-	err = this.SaveToFile("EntryFile", path)
-	if err != nil {
-		br.Msg = "文件保存失败"
-		br.ErrMsg = "文件保存失败,Err:" + err.Error()
-		return
-	}
-	if utils.RunMode == "debug" {
-		defer os.Remove(path)
-	}
-	xlFile, err := xlsx.OpenFile(path)
-	if err != nil {
-		fmt.Println(err.Error())
-		return
-	}
-
-	//超管账号可以查看分类下的所有频度数据
-	userId := sysUser.AdminId
-	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
-		userId = 0
-	}
-	//获取账户所拥有权限的分类id集合
-	classifyNameStrList, edbDataClassifyMap, err := data.GetEdbClassifyNameListByAdminId(int64(userId))
-	if err != nil {
-		br.Msg = "获取分类数据失败"
-		return
-	}
-
-	//导入成功数量
-	successCount := 0
-	//导入失败数据
-	failDatas := make([]*models.EdbdataImportFail, 0)
-
-	//指标map
-	targetMap := make(map[string]*models.Edbinfo)
-	defer func() {
-		for _, target := range targetMap {
-			//结束后,清除掉对应的缓存
-			key := "import:edbinfo:data:" + target.TradeCode
-			utils.Rc.Delete(key)
-
-			//将该指标的code加入到 “手工数据导入后刷新” 缓存
-			if utils.Re == nil {
-				err := utils.Rc.LPush(utils.CACHE_IMPORT_MANUAL_DATA, target.TradeCode)
-				if err != nil {
-					fmt.Println("CACHE_IMPORT_MANUAL_DATA LPush Err:" + err.Error())
-				}
-			}
-		}
-	}()
-
-	// 所有的指标数据map
-	edbCodeDataMap := make(map[string]map[string]string)
-
-	// 遍历sheet页读取
-	for _, sheet := range xlFile.Sheets {
-		fmt.Println("sheet name: ", sheet.Name)
-		//遍历行读取
-		maxRow := sheet.MaxRow
-		fmt.Println("maxRow:", maxRow)
-		fmt.Println("maxRow")
-		for i := 0; i < maxRow; i++ {
-			if i == 1 {
-				row := sheet.Row(i)
-				cells := row.Cells
-				if len(cells) < 6 {
-					br.ErrMsg = "导入文件异常,请下载最新导入模板文件"
-					br.Msg = "导入文件异常,请下载最新导入模板文件"
-					return
-				}
-				templateFail := false
-				if cells[0].Value != "品种分类" && cells[0].Value != "Species Category" {
-					templateFail = true
-				}
-				if cells[1].Value != "录入日期" && cells[1].Value != "Input Date" {
-					templateFail = true
-				}
-				if cells[2].Value != "指标名称" && cells[2].Value != "Indicator Name Indicator Name" {
-					templateFail = true
-				}
-				if cells[3].Value != "值" && cells[3].Value != "Value" {
-					templateFail = true
-				}
-				if cells[4].Value != "频度" && cells[4].Value != "Frequency" {
-					templateFail = true
-				}
-				if cells[5].Value != "单位" && cells[5].Value != "Unit" {
-					templateFail = true
-				}
-				if templateFail {
-					br.ErrMsg = "导入文件异常,请下载最新导入模板文件"
-					br.Msg = "导入文件异常,请下载最新导入模板文件"
-					return
-				}
-			}
-			if i > 1 {
-				row := sheet.Row(i)
-				cells := row.Cells
-				if len(cells) >= 6 {
-					classifyName := cells[0].Value //分类
-					if classifyName == "" {        //过滤空白行
-						continue
-					}
-					cell1 := cells[1].Value
-					//createDate := utils.ConvertToFormatDay(cell1) //录入日期
-					createDate := cell1
-					cell2 := cells[2].Value //指标名称
-					secName := utils.TrimStr(cell2)
-					frequency := cells[4].Value //频度
-					unit := cells[5].Value      //单位
-
-					closeVal := cells[3].Value //值
-					if strings.Contains(closeVal, "#N/A") {
-						continue
-					}
-
-					//校验表格中的日期格式
-					if strings.Contains(createDate, "-") {
-						//如果是带有 - 的普通日期格式文本
-						_, timeErr := time.Parse("2006-1-2", createDate)
-						if timeErr != nil {
-							failItem := new(models.EdbdataImportFail)
-							failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
-							failItem.ClassifyName = classifyName
-							failItem.CreateDate = createDate
-							failItem.SecName = secName
-							failItem.Close = closeVal
-							failItem.Remark = "日期格式异常"
-							failItem.Frequency = frequency
-							failItem.Unit = unit
-							failDatas = append(failDatas, failItem)
-							//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
-							continue
-						}
-					} else if strings.Contains(createDate, "/") {
-						//如果是带有 / 的普通日期格式文本
-						createDateTime, timeErr := time.Parse("2006/1/2", createDate)
-						if timeErr != nil {
-							failItem := new(models.EdbdataImportFail)
-							failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
-							failItem.ClassifyName = classifyName
-							failItem.CreateDate = createDate
-							failItem.SecName = secName
-							failItem.Close = closeVal
-							failItem.Remark = "日期格式异常"
-							failItem.Frequency = frequency
-							failItem.Unit = unit
-							failDatas = append(failDatas, failItem)
-							//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
-							continue
-						}
-						createDate = createDateTime.Format("2006-01-02")
-					} else {
-						//可能是excel的日期格式
-						_, tmpErr := strconv.Atoi(createDate)
-						if tmpErr != nil {
-							failItem := new(models.EdbdataImportFail)
-							failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
-							failItem.ClassifyName = classifyName
-							failItem.CreateDate = createDate
-							failItem.SecName = secName
-							failItem.Close = closeVal
-							failItem.Remark = "日期格式异常"
-							failItem.Frequency = frequency
-							failItem.Unit = unit
-							failDatas = append(failDatas, failItem)
-							//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
-							continue
-						}
-						createDate = utils.ConvertToFormatDay(createDate) //录入日期
-					}
-
-					closeValFloat, err := cells[3].Float() //值
-
-					if err != nil {
-						failItem := new(models.EdbdataImportFail)
-						failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
-						failItem.ClassifyName = classifyName
-						failItem.CreateDate = createDate
-						failItem.SecName = secName
-						failItem.Close = cells[3].Value
-						failItem.Remark = "值类型异常"
-						failItem.Frequency = frequency
-						failItem.Unit = unit
-						failDatas = append(failDatas, failItem)
-						continue
-					}
-					newDecimal := decimal.NewFromFloat(closeValFloat)
-					newDecimal.Round(4)
-					closeVal = newDecimal.String()
-					if strings.Contains(closeVal, "#N/A") {
-						continue
-					}
-					//closeVal := closeValFloat.
-
-					//判断指标,类型,等数据是否正常
-					classifyName = strings.Trim(classifyName, " ")
-					frequency = utils.TrimStr(frequency)
-					unit = utils.TrimStr(unit)
-
-					// 成功数量超过20个指标,那就不导入了
-					if len(targetMap) >= 150 {
-						failItem := new(models.EdbdataImportFail)
-						failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
-						failItem.ClassifyName = classifyName
-						failItem.CreateDate = createDate
-						failItem.SecName = secName
-						failItem.Close = closeVal
-						failItem.Remark = "导入指标数量过多"
-						failItem.Frequency = frequency
-						failItem.Unit = unit
-						failDatas = append(failDatas, failItem)
-						//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
-						continue
-					}
-
-					if !strings.Contains(strings.Join(classifyNameStrList, ","), classifyName) {
-						failItem := new(models.EdbdataImportFail)
-						failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
-						failItem.ClassifyName = classifyName
-						failItem.CreateDate = createDate
-						failItem.SecName = secName
-						failItem.Close = closeVal
-						failItem.Remark = "没有该品种分类权限"
-						failItem.Frequency = frequency
-						failItem.Unit = unit
-						failDatas = append(failDatas, failItem)
-						continue
-					}
-					//fmt.Println(classifyName, createDate, secName, closeVal)
-
-					//获取指标分类信息
-					classify, ok := edbDataClassifyMap[classifyName]
-					if !ok {
-						failItem := new(models.EdbdataImportFail)
-						failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
-						failItem.ClassifyName = classifyName
-						failItem.CreateDate = createDate
-						failItem.SecName = secName
-						failItem.Close = closeVal
-						failItem.Remark = "指标分类不存在"
-						failItem.Frequency = frequency
-						failItem.Unit = unit
-						failDatas = append(failDatas, failItem)
-						//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
-						continue
-					}
-
-					//判断指标是否存在
-					target, ok := targetMap[secName]
-					if !ok {
-						tmpTarget, err := models.GetTargetBySecName(secName)
-						if err != nil {
-							//如果是找不到该指标,那么新增指标
-							if err.Error() == utils.ErrNoRow() {
-								if frequency == "" {
-									failItem := new(models.EdbdataImportFail)
-									failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
-									failItem.ClassifyName = classifyName
-									failItem.CreateDate = createDate
-									failItem.SecName = secName
-									failItem.Close = closeVal
-									failItem.Remark = "新增指标失败,频度字段为空"
-									failItem.Frequency = frequency
-									failItem.Unit = unit
-									failDatas = append(failDatas, failItem)
-									continue
-								}
-								if unit == "" {
-									failItem := new(models.EdbdataImportFail)
-									failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
-									failItem.ClassifyName = classifyName
-									failItem.CreateDate = createDate
-									failItem.SecName = secName
-									failItem.Close = closeVal
-									failItem.Remark = "新增指标失败,单位字段为空"
-									failItem.Frequency = frequency
-									failItem.Unit = unit
-									failDatas = append(failDatas, failItem)
-									continue
-								}
-								tmpErr := data.AddEdbInfo(secName, unit, frequency, "", sysUser.Mobile, classify.ClassifyId, sysUser.AdminId)
-								if tmpErr != nil {
-									fmt.Println("line 158")
-									failItem := new(models.EdbdataImportFail)
-									failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
-									failItem.ClassifyName = classifyName
-									failItem.CreateDate = createDate
-									failItem.SecName = secName
-									failItem.Close = closeVal
-									failItem.Remark = "新增指标失败"
-									failItem.Frequency = frequency
-									failItem.Unit = unit
-									failDatas = append(failDatas, failItem)
-									continue
-								}
-								tmpTarget, tmpErr := models.GetTargetBySecName(secName)
-								target = tmpTarget
-								targetMap[secName] = target
-							} else {
-								fmt.Println("导入数据 获取指标:Err:" + err.Error())
-							}
-						} else {
-							target = tmpTarget
-							targetMap[secName] = target
-						}
-
-						//设置10分钟缓存,不允许其他地方删除
-						key := "import:edbinfo:data:" + target.TradeCode
-						utils.Rc.SetNX(key, 1, time.Second*600)
-					}
-
-					if target == nil {
-						fmt.Println("指标不存在")
-						failItem := new(models.EdbdataImportFail)
-						failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
-						failItem.ClassifyName = classifyName
-						failItem.CreateDate = createDate
-						failItem.SecName = secName
-						failItem.Close = closeVal
-						failItem.Remark = "指标不存在"
-						failItem.Frequency = frequency
-						failItem.Unit = unit
-						failDatas = append(failDatas, failItem)
-						continue
-					}
-
-					//更新指标信息
-					updateCols := make([]string, 0)
-					//更新指标分类
-					if target.ClassifyId <= 0 && classify.ClassifyId > 0 {
-						target.ClassifyId = classify.ClassifyId
-						updateCols = append(updateCols, "ClassifyId")
-					}
-					if target.Frequency != frequency {
-						target.Frequency = frequency
-						target.NoticeTime = ""
-						updateCols = append(updateCols, "Frequency", "NoticeTime")
-					}
-					if target.Unit != unit {
-						target.Unit = unit
-						updateCols = append(updateCols, "Unit")
-					}
-					if len(updateCols) > 0 {
-						_ = target.Update(updateCols)
-					}
-
-					// 判断指标数据列表是否已经存在
-					tmpDataMap, ok := edbCodeDataMap[target.TradeCode]
-					if !ok {
-						tmpDataMap = make(map[string]string)
-						dataList, tmpErr := models.GetTargetsDataList(target.TradeCode)
-						if tmpErr != nil {
-							go alarm_msg.SendAlarmMsg("导入数据"+target.TradeCode+" 获取指标的数据失败,Err:"+err.Error(), 3)
-						}
-						for _, tmpData := range dataList {
-							tmpDataMap[tmpData.Dt] = tmpData.Close
-						}
-						edbCodeDataMap[target.TradeCode] = tmpDataMap
-					}
-
-					//判断数据是否已经存在
-					tmpVal, ok := tmpDataMap[createDate]
-					//数据已存在,进行更新操作
-					if ok {
-						if tmpVal != closeVal {
-							err = models.ModifyTargetsDataByImport(target.TradeCode, createDate, closeVal)
-							if err != nil {
-								go alarm_msg.SendAlarmMsg("导入数据 修改数据失败,Err:"+err.Error(), 3)
-								//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 修改数据失败:Err:"+err.Error(), utils.EmailSendToUsers)
-							}
-						}
-					} else { //数据不存在,进行新增操作
-						if target.TradeCode != "" && createDate != "" && closeVal != "" {
-							models.AddTargetsDataByImport(target.TradeCode, createDate, closeVal)
-							if err != nil {
-								go alarm_msg.SendAlarmMsg("导入数据 新增数据失败,Err:"+err.Error(), 3)
-								//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 新增数据失败:Err:"+err.Error(), utils.EmailSendToUsers)
-							}
-							tmpDataMap[createDate] = closeVal
-							edbCodeDataMap[target.TradeCode] = tmpDataMap
-						}
-					}
-					successCount++
-				} else {
-					//br.ErrMsg = "请填写导入内容"
-					//br.Msg = "请填写导入内容"
-					//return
-				}
-			}
-		}
-	}
-	resp := models.EdbdataImportResp{
-		SuccessCount: successCount,
-		FailCount:    len(failDatas),
-	}
-	fmt.Println("failDatas:", len(failDatas))
-	if len(failDatas) > 0 {
-		//先删除导入失败记录
-		_ = models.DelEdbDataImportFail(sysUser.AdminId)
-		//错误信息字符串切片,最后作为发送邮件通知使用
-		failContents := make([]string, 0)
-		for _, v := range failDatas {
-			failContents = append(failContents, fmt.Sprint(v.SecName, "导入失败:", v.Remark))
-			err = models.AddEdbdataImportFail(v)
-			if err != nil {
-				go alarm_msg.SendAlarmMsg("导入数据 新增失败记录失败,Err:"+err.Error(), 3)
-				//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 新增失败记录失败:Err:"+err.Error(), utils.EmailSendToUsers)
-			}
-		}
-		//导入失败的话,最后统一邮件提醒就好啦,不需要每次都去提醒
-		go alarm_msg.SendAlarmMsg("导入数据 存在部分数据导入失败:"+strings.Join(failContents, ";"), 3)
-		//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 存在部分数据导入失败:"+strings.Join(failContents, ";"), utils.EmailSendToUsers)
-
-		if successCount == 0 {
-			resp.Status = -1
-			resp.Msg = "导入失败"
-		} else {
-			resp.Status = 1
-			resp.Msg = "存在部分导入失败"
-		}
-	} else {
-		resp.Status = 0
-	}
-	br.Msg = "导入成功"
-	br.Ret = 200
-	br.Success = true
-	br.Data = resp
-}
-
 // ImportFailListDownload
 // @Title 下载失败列表
 // @Description 下载失败列表

+ 52 - 0
models/manual_edb.go

@@ -181,3 +181,55 @@ func UpdateManualIsJoinEdbStatus(edbCode string, isJoinEdb int8) (err error) {
 	_, err = o.Raw(sql, isJoinEdb, edbCode).Exec()
 	return
 }
+
+// BatchManualEdbReq 指标数据结构体
+type BatchManualEdbReq struct {
+	//IsJoinEdb      int      `form:"IsJoinEdb" description:"是否加到指标库,0:未加到指标库"`
+	FrequencyList  []string `description:"频度;枚举值:日度、周度、月度、季度、半年度、年度"`
+	Keyword        string   `description:"关键字"`
+	ClassifyIdList []int    `description:"所选品种id列表"`
+	UserIdList     []int    `description:"所选用户id列表"`
+	ListAll        bool     `form:"ListAll" json:"ListAll" description:"列表全选"`
+	TradeCodeList  []string `form:"TradeCodeList" json:"TradeCodeList" description:"全选为false时, 该数组为选中; 全选为true时, 该数组为不选的指标"`
+	PageSize       int      `form:"PageSize" json:"PageSize"`
+	CurrentIndex   int      `form:"CurrentIndex" form:"CurrentIndex"`
+}
+
+// DelManualIndexByCodeList
+// @Description: 根据指标编码列表删除指标
+// @author: Roc
+// @datetime 2024-07-30 14:10:12
+// @param codeList []string
+// @return err error
+func DelManualIndexByCodeList(codeList []string) (err error) {
+	num := len(codeList)
+	if num <= 0 {
+		return
+	}
+	to, err := orm.NewOrmUsingDB("edb").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	// 删除指标
+	sql := `DELETE FROM edbinfo WHERE TRADE_CODE  in (` + utils.GetOrmInReplace(num) + `) `
+	_, err = to.Raw(sql, codeList).Exec()
+	if err != nil {
+
+	}
+
+	// 删除指标数据
+	sql = `DELETE FROM edbdata WHERE TRADE_CODE  in (` + utils.GetOrmInReplace(num) + `) `
+	_, err = to.Raw(sql, codeList).Exec()
+	if err != nil {
+
+	}
+
+	return
+}

+ 1 - 0
models/target.go

@@ -1319,6 +1319,7 @@ type EdbInfoItem struct {
 	ModifyTime   string     `description:"最近一次更新时间"`
 	Status       string     `description:"状态:未完成/完成"`
 	Sort         int        `orm:"column(sort)" description:"排序"`
+	IsJoinEdb    int8       `description:"指标库是否已添加:0-否;1-是"`
 	DataList     []*Edbdata `description:"指标数据列表"`
 }
 

+ 108 - 45
routers/commentsRouter.go

@@ -5182,6 +5182,114 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ManualEdbController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ManualEdbController"],
+        beego.ControllerComments{
+            Method: "ImportData",
+            Router: `/import/data`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ManualEdbController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ManualEdbController"],
+        beego.ControllerComments{
+            Method: "ClassifyEdbList",
+            Router: `/target/classify/edb/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ManualEdbController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ManualEdbController"],
+        beego.ControllerComments{
+            Method: "BatchAdd",
+            Router: `/target/edb/batch/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ManualEdbController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ManualEdbController"],
+        beego.ControllerComments{
+            Method: "BatchAddEdbCheck",
+            Router: `/target/edb/batch/add/check`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ManualEdbController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ManualEdbController"],
+        beego.ControllerComments{
+            Method: "NameCheck",
+            Router: `/target/edb/batch/add/name_check`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ManualEdbController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ManualEdbController"],
+        beego.ControllerComments{
+            Method: "BatchDel",
+            Router: `/target/edb/batch/del`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ManualEdbController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ManualEdbController"],
+        beego.ControllerComments{
+            Method: "BatchDelEdbCheck",
+            Router: `/target/edb/batch/del/check`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ManualEdbController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ManualEdbController"],
+        beego.ControllerComments{
+            Method: "BatchEdbList",
+            Router: `/target/edb/batch/list`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ManualEdbController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ManualEdbController"],
+        beego.ControllerComments{
+            Method: "EdbDetail",
+            Router: `/target/edb/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ManualEdbController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ManualEdbController"],
+        beego.ControllerComments{
+            Method: "EditExcelData",
+            Router: `/target/edb/excel_style/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ManualEdbController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ManualEdbController"],
+        beego.ControllerComments{
+            Method: "EdbList",
+            Router: `/target/edb/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ManualEdbController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ManualEdbController"],
+        beego.ControllerComments{
+            Method: "EdbSearch",
+            Router: `/target/edb/search`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:MyChartController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:MyChartController"],
         beego.ControllerComments{
             Method: "MyChartAdd",
@@ -9889,15 +9997,6 @@ func init() {
             Filters: nil,
             Params: nil})
 
-    beego.GlobalControllerRouter["eta/eta_api/controllers:TargetController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:TargetController"],
-        beego.ControllerComments{
-            Method: "ImportData",
-            Router: `/import/data`,
-            AllowHTTPMethods: []string{"post"},
-            MethodParams: param.Make(),
-            Filters: nil,
-            Params: nil})
-
     beego.GlobalControllerRouter["eta/eta_api/controllers:TargetController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:TargetController"],
         beego.ControllerComments{
             Method: "ImportFailListDownload",
@@ -9934,15 +10033,6 @@ func init() {
             Filters: nil,
             Params: nil})
 
-    beego.GlobalControllerRouter["eta/eta_api/controllers:TargetController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:TargetController"],
-        beego.ControllerComments{
-            Method: "ClassifyEdbList",
-            Router: `/target/classify/edb/list`,
-            AllowHTTPMethods: []string{"get"},
-            MethodParams: param.Make(),
-            Filters: nil,
-            Params: nil})
-
     beego.GlobalControllerRouter["eta/eta_api/controllers:TargetController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:TargetController"],
         beego.ControllerComments{
             Method: "TargetDelete",
@@ -9952,33 +10042,6 @@ func init() {
             Filters: nil,
             Params: nil})
 
-    beego.GlobalControllerRouter["eta/eta_api/controllers:TargetController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:TargetController"],
-        beego.ControllerComments{
-            Method: "EdbDetail",
-            Router: `/target/edb/detail`,
-            AllowHTTPMethods: []string{"get"},
-            MethodParams: param.Make(),
-            Filters: nil,
-            Params: nil})
-
-    beego.GlobalControllerRouter["eta/eta_api/controllers:TargetController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:TargetController"],
-        beego.ControllerComments{
-            Method: "EdbList",
-            Router: `/target/edb/list`,
-            AllowHTTPMethods: []string{"get"},
-            MethodParams: param.Make(),
-            Filters: nil,
-            Params: nil})
-
-    beego.GlobalControllerRouter["eta/eta_api/controllers:TargetController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:TargetController"],
-        beego.ControllerComments{
-            Method: "EdbSearch",
-            Router: `/target/edb/search`,
-            AllowHTTPMethods: []string{"get"},
-            MethodParams: param.Make(),
-            Filters: nil,
-            Params: nil})
-
     beego.GlobalControllerRouter["eta/eta_api/controllers:TargetController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:TargetController"],
         beego.ControllerComments{
             Method: "TargetEdit",

+ 1 - 0
routers/router.go

@@ -105,6 +105,7 @@ func init() {
 		web.NSNamespace("/entry",
 			web.NSInclude(
 				&controllers.TargetController{},
+				&data_manage.ManualEdbController{},
 			),
 			web.NSInclude(
 				&controllers.TargetCommonController{},

+ 953 - 0
services/data/manual.go

@@ -1,11 +1,17 @@
 package data
 
 import (
+	"errors"
 	"eta/eta_api/models"
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/system"
 	"eta/eta_api/utils"
 	"fmt"
+	"github.com/shopspring/decimal"
+	"github.com/tealeg/xlsx"
+	"strconv"
+	"strings"
+	"time"
 )
 
 func GetManualSysUser(keyWord string) (list []*data_manage.ManualSysUser, err error) {
@@ -112,3 +118,950 @@ func GetManualEdbClassifyListByAdminId(adminId int64) (classifyIdList []int, err
 
 	return
 }
+
+type ManualIndexSource2EdbReq struct {
+	EdbCode       string
+	EdbName       string
+	Frequency     string
+	Unit          string
+	ClassifyId    int
+	AdminId       int
+	AdminRealName string
+}
+
+// ManualIndexSource2Edb
+// @Description: 新增手工数据源到指标库
+// @author: Roc
+// @datetime 2024-07-26 13:23:19
+// @param req ManualIndexSource2EdbReq
+// @param lang string
+// @return edb *data_manage.EdbInfo
+// @return err error
+// @return errMsg string
+// @return skip bool
+func ManualIndexSource2Edb(req ManualIndexSource2EdbReq, lang string) (edb *data_manage.EdbInfo, err error, errMsg string, skip bool) {
+	if req.EdbCode == "" {
+		err = fmt.Errorf("指标ID为空")
+		return
+	}
+	defer func() {
+		if err != nil {
+			tips := fmt.Sprintf("ManualIndexSource2Edb新增失败, Err: %s", err.Error())
+			fmt.Println(tips)
+			utils.FileLog.Info(tips)
+		}
+	}()
+	source := utils.DATA_SOURCE_MANUAL
+
+	// 是否已有指标数据
+	dataList, e := data_manage.GetEdbDataAllByEdbCode(req.EdbCode, source, utils.DATA_SUB_SOURCE_EDB, utils.EDB_DATA_LIMIT)
+	if e != nil {
+		err = fmt.Errorf("获取指标数据失败, Err: %s", e.Error())
+		return
+	}
+
+	// 新增指标数据
+	if len(dataList) == 0 {
+		res, e := AddEdbData(source, req.EdbCode, req.Frequency)
+		if e != nil {
+			err = fmt.Errorf("index_lib: 新增指标数据失败, Err: %s", e.Error())
+			return
+		}
+		if res == nil {
+			err = fmt.Errorf("index_lib: 新增指标数据失败, res nil")
+			return
+		}
+		if res.Ret != 200 {
+			err = fmt.Errorf("index_lib: 新增指标数据失败, Ret: %d", res.Ret)
+			return
+		}
+	}
+
+	// 是否新增过指标
+	exist, e := data_manage.GetEdbInfoByEdbCode(source, req.EdbCode)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = fmt.Errorf("获取指标是否存在失败, err: %s", e.Error())
+		return
+	}
+	if exist != nil {
+		skip = true
+		return
+	}
+
+	// 开始结束时间
+	var startDate, endDate string
+	minMax, e := data_manage.GetEdbInfoMaxAndMinInfo(source, utils.DATA_SUB_SOURCE_EDB, req.EdbCode)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = fmt.Errorf("MinMax: 获取指标极值失败, err: %s", e.Error())
+		return
+	}
+	if minMax != nil {
+		startDate = minMax.MinDate
+		endDate = minMax.MaxDate
+	}
+
+	// 新增指标库
+	edbInfo, e, msg, _ := EdbInfoAdd(source, utils.DATA_SUB_SOURCE_EDB, req.ClassifyId, req.EdbCode, req.EdbName, req.Frequency, req.Unit, startDate, endDate, req.AdminId, req.AdminRealName, lang)
+	if e != nil {
+		errMsg = msg
+		err = fmt.Errorf("EdbInfo: 新增指标失败, err: %s", e.Error())
+		return
+	}
+	edb = edbInfo
+
+	// 新增es
+	go AddOrEditEdbInfoToEs(edbInfo.EdbInfoId)
+
+	return
+}
+
+//func ImportManualData(path string, sysUser *system.Admin) (err error, errMsg string) {
+//	errMsg = `导入失败`
+//	xlFile, err := xlsx.OpenFile(path)
+//	if err != nil {
+//		fmt.Println(err.Error())
+//		return
+//	}
+//	if len(xlFile.Sheets) <= 0 {
+//		errMsg = "导入模板异常"
+//		err = errors.New(errMsg)
+//		return
+//	}
+//
+//	//导入成功数量
+//	successCount := 0
+//	//导入失败数据
+//	failDataList := make([]*models.EdbdataImportFail, 0)
+//	var indexDataList []ImportManualIndexData
+//
+//	// 模板校验,然后处理成标准化格式
+//	for _, sheet := range xlFile.Sheets {
+//		var tmpIndexDataList []ImportManualIndexData
+//		var tmpFailDataList []*models.EdbdataImportFail
+//		rowList := sheet.Rows
+//		if len(rowList) <= 0 {
+//			errMsg = sheet.Name + "页异常"
+//			err = errors.New(errMsg)
+//			return
+//		}
+//		headerCell := rowList[0].Cells
+//		if len(headerCell) < 7 {
+//			errMsg = sheet.Name + "页模板异常"
+//			err = errors.New(errMsg)
+//			return
+//		}
+//
+//		templateName := headerCell[6].String()
+//		switch templateName {
+//		case "导入模板2/Import Template 2":
+//			// 模板2需要走对应的取数逻辑
+//			tmpIndexDataList, tmpFailDataList, err, errMsg = getDataByTemplate2(sheet, sysUser.AdminId)
+//		default:
+//			// 模板1需要走对应的取数逻辑
+//			tmpIndexDataList, tmpFailDataList, err, errMsg = getDataByTemplate1(sheet, sysUser.AdminId)
+//		}
+//		indexDataList = append(indexDataList, tmpIndexDataList...)
+//		failDataList = append(failDataList, tmpFailDataList...)
+//	}
+//
+//	var indexDataListMap map[string]ImportManualIndexData
+//	for _, v := range indexDataList {
+//		indexData, ok := indexDataListMap[v.IndexName]
+//		if !ok {
+//			// 没有就赋值
+//			indexDataListMap[v.IndexName] = v
+//			continue
+//		}
+//
+//		indexData.Unit = v.Unit
+//		indexData.ClassName = v.ClassName
+//		indexData.Frequency = v.Frequency
+//
+//		indexData.DataMap = v.DataMap
+//	}
+//
+//	//超管账号可以查看分类下的所有频度数据
+//	userId := sysUser.AdminId
+//	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
+//		userId = 0
+//	}
+//	//获取账户所拥有权限的分类id集合
+//	classifyNameStrList, edbDataClassifyMap, err := GetEdbClassifyNameListByAdminId(int64(userId))
+//	if err != nil {
+//		errMsg = "获取分类数据失败"
+//		return
+//	}
+//
+//	////指标map
+//	//targetMap := make(map[string]*models.Edbinfo)
+//	//defer func() {
+//	//	for _, target := range targetMap {
+//	//		//结束后,清除掉对应的缓存
+//	//		key := "import:edbinfo:data:" + target.TradeCode
+//	//		utils.Rc.Delete(key)
+//	//
+//	//		//将该指标的code加入到 “手工数据导入后刷新” 缓存
+//	//		if utils.Re == nil {
+//	//			err := utils.Rc.LPush(utils.CACHE_IMPORT_MANUAL_DATA, target.TradeCode)
+//	//			if err != nil {
+//	//				fmt.Println("CACHE_IMPORT_MANUAL_DATA LPush Err:" + err.Error())
+//	//			}
+//	//		}
+//	//	}
+//	//}()
+//	//
+//	//// 所有的指标数据map
+//	//edbCodeDataMap := make(map[string]map[string]string)
+//
+//	// 遍历sheet页读取
+//	//for _, sheet := range xlFile.Sheets {
+//	//	fmt.Println("sheet name: ", sheet.Name)
+//	//	//遍历行读取
+//	//	maxRow := sheet.MaxRow
+//	//	fmt.Println("maxRow:", maxRow)
+//	//	fmt.Println("maxRow")
+//	//	for i := 0; i < maxRow; i++ {
+//	//		if i == 1 {
+//	//			row := sheet.Row(i)
+//	//			cells := row.Cells
+//	//			if len(cells) < 6 {
+//	//				br.ErrMsg = "导入文件异常,请下载最新导入模板文件"
+//	//				br.Msg = "导入文件异常,请下载最新导入模板文件"
+//	//				return
+//	//			}
+//	//			templateFail := false
+//	//			if cells[0].Value != "品种分类" && cells[0].Value != "Species Category" {
+//	//				templateFail = true
+//	//			}
+//	//			if cells[1].Value != "录入日期" && cells[1].Value != "Input Date" {
+//	//				templateFail = true
+//	//			}
+//	//			if cells[2].Value != "指标名称" && cells[2].Value != "Indicator Name Indicator Name" {
+//	//				templateFail = true
+//	//			}
+//	//			if cells[3].Value != "值" && cells[3].Value != "Value" {
+//	//				templateFail = true
+//	//			}
+//	//			if cells[4].Value != "频度" && cells[4].Value != "Frequency" {
+//	//				templateFail = true
+//	//			}
+//	//			if cells[5].Value != "单位" && cells[5].Value != "Unit" {
+//	//				templateFail = true
+//	//			}
+//	//			if templateFail {
+//	//				br.ErrMsg = "导入文件异常,请下载最新导入模板文件"
+//	//				br.Msg = "导入文件异常,请下载最新导入模板文件"
+//	//				return
+//	//			}
+//	//		}
+//	//		if i > 1 {
+//	//			row := sheet.Row(i)
+//	//			cells := row.Cells
+//	//			if len(cells) >= 6 {
+//	//				classifyName := cells[0].Value //分类
+//	//				if classifyName == "" {        //过滤空白行
+//	//					continue
+//	//				}
+//	//				cell1 := cells[1].Value
+//	//				//createDate := utils.ConvertToFormatDay(cell1) //录入日期
+//	//				createDate := cell1
+//	//				cell2 := cells[2].Value //指标名称
+//	//				secName := utils.TrimStr(cell2)
+//	//				frequency := cells[4].Value //频度
+//	//				unit := cells[5].Value      //单位
+//	//
+//	//				closeVal := cells[3].Value //值
+//	//				if strings.Contains(closeVal, "#N/A") {
+//	//					continue
+//	//				}
+//	//
+//	//				//校验表格中的日期格式
+//	//				if strings.Contains(createDate, "-") {
+//	//					//如果是带有 - 的普通日期格式文本
+//	//					_, timeErr := time.Parse("2006-1-2", createDate)
+//	//					if timeErr != nil {
+//	//						failItem := new(models.EdbdataImportFail)
+//	//						failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+//	//						failItem.ClassifyName = classifyName
+//	//						failItem.CreateDate = createDate
+//	//						failItem.SecName = secName
+//	//						failItem.Close = closeVal
+//	//						failItem.Remark = "日期格式异常"
+//	//						failItem.Frequency = frequency
+//	//						failItem.Unit = unit
+//	//						failDataList = append(failDataList, failItem)
+//	//						//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
+//	//						continue
+//	//					}
+//	//				} else if strings.Contains(createDate, "/") {
+//	//					//如果是带有 / 的普通日期格式文本
+//	//					createDateTime, timeErr := time.Parse("2006/1/2", createDate)
+//	//					if timeErr != nil {
+//	//						failItem := new(models.EdbdataImportFail)
+//	//						failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+//	//						failItem.ClassifyName = classifyName
+//	//						failItem.CreateDate = createDate
+//	//						failItem.SecName = secName
+//	//						failItem.Close = closeVal
+//	//						failItem.Remark = "日期格式异常"
+//	//						failItem.Frequency = frequency
+//	//						failItem.Unit = unit
+//	//						failDataList = append(failDataList, failItem)
+//	//						//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
+//	//						continue
+//	//					}
+//	//					createDate = createDateTime.Format("2006-01-02")
+//	//				} else {
+//	//					//可能是excel的日期格式
+//	//					_, tmpErr := strconv.Atoi(createDate)
+//	//					if tmpErr != nil {
+//	//						failItem := new(models.EdbdataImportFail)
+//	//						failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+//	//						failItem.ClassifyName = classifyName
+//	//						failItem.CreateDate = createDate
+//	//						failItem.SecName = secName
+//	//						failItem.Close = closeVal
+//	//						failItem.Remark = "日期格式异常"
+//	//						failItem.Frequency = frequency
+//	//						failItem.Unit = unit
+//	//						failDataList = append(failDataList, failItem)
+//	//						//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
+//	//						continue
+//	//					}
+//	//					createDate = utils.ConvertToFormatDay(createDate) //录入日期
+//	//				}
+//	//
+//	//				closeValFloat, err := cells[3].Float() //值
+//	//
+//	//				if err != nil {
+//	//					failItem := new(models.EdbdataImportFail)
+//	//					failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+//	//					failItem.ClassifyName = classifyName
+//	//					failItem.CreateDate = createDate
+//	//					failItem.SecName = secName
+//	//					failItem.Close = cells[3].Value
+//	//					failItem.Remark = "值类型异常"
+//	//					failItem.Frequency = frequency
+//	//					failItem.Unit = unit
+//	//					failDataList = append(failDataList, failItem)
+//	//					continue
+//	//				}
+//	//				newDecimal := decimal.NewFromFloat(closeValFloat)
+//	//				newDecimal.Round(4)
+//	//				closeVal = newDecimal.String()
+//	//				if strings.Contains(closeVal, "#N/A") {
+//	//					continue
+//	//				}
+//	//				//closeVal := closeValFloat.
+//	//
+//	//				//判断指标,类型,等数据是否正常
+//	//				classifyName = strings.Trim(classifyName, " ")
+//	//				frequency = utils.TrimStr(frequency)
+//	//				unit = utils.TrimStr(unit)
+//	//
+//	//				// 成功数量超过20个指标,那就不导入了
+//	//				if len(targetMap) >= 150 {
+//	//					failItem := new(models.EdbdataImportFail)
+//	//					failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+//	//					failItem.ClassifyName = classifyName
+//	//					failItem.CreateDate = createDate
+//	//					failItem.SecName = secName
+//	//					failItem.Close = closeVal
+//	//					failItem.Remark = "导入指标数量过多"
+//	//					failItem.Frequency = frequency
+//	//					failItem.Unit = unit
+//	//					failDataList = append(failDataList, failItem)
+//	//					//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
+//	//					continue
+//	//				}
+//	//
+//	//				if !strings.Contains(strings.Join(classifyNameStrList, ","), classifyName) {
+//	//					failItem := new(models.EdbdataImportFail)
+//	//					failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+//	//					failItem.ClassifyName = classifyName
+//	//					failItem.CreateDate = createDate
+//	//					failItem.SecName = secName
+//	//					failItem.Close = closeVal
+//	//					failItem.Remark = "没有该品种分类权限"
+//	//					failItem.Frequency = frequency
+//	//					failItem.Unit = unit
+//	//					failDataList = append(failDataList, failItem)
+//	//					continue
+//	//				}
+//	//				//fmt.Println(classifyName, createDate, secName, closeVal)
+//	//
+//	//				//获取指标分类信息
+//	//				classify, ok := edbDataClassifyMap[classifyName]
+//	//				if !ok {
+//	//					failItem := new(models.EdbdataImportFail)
+//	//					failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+//	//					failItem.ClassifyName = classifyName
+//	//					failItem.CreateDate = createDate
+//	//					failItem.SecName = secName
+//	//					failItem.Close = closeVal
+//	//					failItem.Remark = "指标分类不存在"
+//	//					failItem.Frequency = frequency
+//	//					failItem.Unit = unit
+//	//					failDataList = append(failDataList, failItem)
+//	//					//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
+//	//					continue
+//	//				}
+//	//
+//	//				//判断指标是否存在
+//	//				target, ok := targetMap[secName]
+//	//				if !ok {
+//	//					tmpTarget, err := models.GetTargetBySecName(secName)
+//	//					if err != nil {
+//	//						//如果是找不到该指标,那么新增指标
+//	//						if err.Error() == utils.ErrNoRow() {
+//	//							if frequency == "" {
+//	//								failItem := new(models.EdbdataImportFail)
+//	//								failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+//	//								failItem.ClassifyName = classifyName
+//	//								failItem.CreateDate = createDate
+//	//								failItem.SecName = secName
+//	//								failItem.Close = closeVal
+//	//								failItem.Remark = "新增指标失败,频度字段为空"
+//	//								failItem.Frequency = frequency
+//	//								failItem.Unit = unit
+//	//								failDataList = append(failDataList, failItem)
+//	//								continue
+//	//							}
+//	//							if unit == "" {
+//	//								failItem := new(models.EdbdataImportFail)
+//	//								failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+//	//								failItem.ClassifyName = classifyName
+//	//								failItem.CreateDate = createDate
+//	//								failItem.SecName = secName
+//	//								failItem.Close = closeVal
+//	//								failItem.Remark = "新增指标失败,单位字段为空"
+//	//								failItem.Frequency = frequency
+//	//								failItem.Unit = unit
+//	//								failDataList = append(failDataList, failItem)
+//	//								continue
+//	//							}
+//	//							tmpErr := data.AddEdbInfo(secName, unit, frequency, "", sysUser.Mobile, classify.ClassifyId, sysUser.AdminId)
+//	//							if tmpErr != nil {
+//	//								fmt.Println("line 158")
+//	//								failItem := new(models.EdbdataImportFail)
+//	//								failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+//	//								failItem.ClassifyName = classifyName
+//	//								failItem.CreateDate = createDate
+//	//								failItem.SecName = secName
+//	//								failItem.Close = closeVal
+//	//								failItem.Remark = "新增指标失败"
+//	//								failItem.Frequency = frequency
+//	//								failItem.Unit = unit
+//	//								failDataList = append(failDataList, failItem)
+//	//								continue
+//	//							}
+//	//							tmpTarget, tmpErr := models.GetTargetBySecName(secName)
+//	//							target = tmpTarget
+//	//							targetMap[secName] = target
+//	//						} else {
+//	//							fmt.Println("导入数据 获取指标:Err:" + err.Error())
+//	//						}
+//	//					} else {
+//	//						target = tmpTarget
+//	//						targetMap[secName] = target
+//	//					}
+//	//
+//	//					//设置10分钟缓存,不允许其他地方删除
+//	//					key := "import:edbinfo:data:" + target.TradeCode
+//	//					utils.Rc.SetNX(key, 1, time.Second*600)
+//	//				}
+//	//
+//	//				if target == nil {
+//	//					fmt.Println("指标不存在")
+//	//					failItem := new(models.EdbdataImportFail)
+//	//					failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+//	//					failItem.ClassifyName = classifyName
+//	//					failItem.CreateDate = createDate
+//	//					failItem.SecName = secName
+//	//					failItem.Close = closeVal
+//	//					failItem.Remark = "指标不存在"
+//	//					failItem.Frequency = frequency
+//	//					failItem.Unit = unit
+//	//					failDataList = append(failDataList, failItem)
+//	//					continue
+//	//				}
+//	//
+//	//				//更新指标信息
+//	//				updateCols := make([]string, 0)
+//	//				//更新指标分类
+//	//				if target.ClassifyId <= 0 && classify.ClassifyId > 0 {
+//	//					target.ClassifyId = classify.ClassifyId
+//	//					updateCols = append(updateCols, "ClassifyId")
+//	//				}
+//	//				if target.Frequency != frequency {
+//	//					target.Frequency = frequency
+//	//					target.NoticeTime = ""
+//	//					updateCols = append(updateCols, "Frequency", "NoticeTime")
+//	//				}
+//	//				if target.Unit != unit {
+//	//					target.Unit = unit
+//	//					updateCols = append(updateCols, "Unit")
+//	//				}
+//	//				if len(updateCols) > 0 {
+//	//					_ = target.Update(updateCols)
+//	//				}
+//	//
+//	//				// 判断指标数据列表是否已经存在
+//	//				tmpDataMap, ok := edbCodeDataMap[target.TradeCode]
+//	//				if !ok {
+//	//					tmpDataMap = make(map[string]string)
+//	//					dataList, tmpErr := models.GetTargetsDataList(target.TradeCode)
+//	//					if tmpErr != nil {
+//	//						go alarm_msg.SendAlarmMsg("导入数据"+target.TradeCode+" 获取指标的数据失败,Err:"+err.Error(), 3)
+//	//					}
+//	//					for _, tmpData := range dataList {
+//	//						tmpDataMap[tmpData.Dt] = tmpData.Close
+//	//					}
+//	//					edbCodeDataMap[target.TradeCode] = tmpDataMap
+//	//				}
+//	//
+//	//				//判断数据是否已经存在
+//	//				tmpVal, ok := tmpDataMap[createDate]
+//	//				//数据已存在,进行更新操作
+//	//				if ok {
+//	//					if tmpVal != closeVal {
+//	//						err = models.ModifyTargetsDataByImport(target.TradeCode, createDate, closeVal)
+//	//						if err != nil {
+//	//							go alarm_msg.SendAlarmMsg("导入数据 修改数据失败,Err:"+err.Error(), 3)
+//	//							//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 修改数据失败:Err:"+err.Error(), utils.EmailSendToUsers)
+//	//						}
+//	//					}
+//	//				} else { //数据不存在,进行新增操作
+//	//					if target.TradeCode != "" && createDate != "" && closeVal != "" {
+//	//						models.AddTargetsDataByImport(target.TradeCode, createDate, closeVal)
+//	//						if err != nil {
+//	//							go alarm_msg.SendAlarmMsg("导入数据 新增数据失败,Err:"+err.Error(), 3)
+//	//							//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 新增数据失败:Err:"+err.Error(), utils.EmailSendToUsers)
+//	//						}
+//	//						tmpDataMap[createDate] = closeVal
+//	//						edbCodeDataMap[target.TradeCode] = tmpDataMap
+//	//					}
+//	//				}
+//	//				successCount++
+//	//			} else {
+//	//				//br.ErrMsg = "请填写导入内容"
+//	//				//br.Msg = "请填写导入内容"
+//	//				//return
+//	//			}
+//	//		}
+//	//	}
+//	//}
+//
+//	return
+//}
+
+// ImportManualIndexData
+// @Description: excel模板后的内容
+type ImportManualIndexData struct {
+	IndexName string            `description:"指标名称"`
+	Unit      string            `description:"单位"`
+	ClassName string            `description:"所属品种"`
+	Frequency string            `description:"频度"`
+	DataMap   map[string]string `description:"时间数据"`
+}
+
+// TODO 模板数据获取异常的结果记录
+
+// getDataByTemplate1
+// @Description: 根据模板1获取数据
+// @author: Roc
+// @datetime 2024-07-24 16:17:45
+// @param sheet *xlsx.Sheet
+// @return indexDataList []ImportManualIndexData
+// @return err error
+// @return errMsg string
+func getDataByTemplate1(sheet *xlsx.Sheet, sysUserId int) (indexDataList []ImportManualIndexData, failDataList []*models.EdbdataImportFail, err error, errMsg string) {
+	fmt.Println("sheet name: ", sheet.Name)
+	indexDataList = make([]ImportManualIndexData, 0)
+	indexDataListMap := make(map[string]ImportManualIndexData, 0)
+	failDataList = make([]*models.EdbdataImportFail, 0)
+
+	//遍历行读取
+	maxRow := sheet.MaxRow
+	fmt.Println("maxRow:", maxRow)
+
+	// 表头信息
+	if maxRow <= 2 {
+		errMsg = "模板异常1"
+		err = errors.New(errMsg)
+		return
+	}
+
+	// 表头校验
+	{
+		headerRow := sheet.Row(1)
+		cells := headerRow.Cells
+		if len(cells) < 6 {
+			errMsg = "导入文件异常,请下载最新导入模板文件"
+			err = errors.New(errMsg)
+			return
+		}
+
+		templateFail := false
+		if cells[0].Value != "品种/Variety" {
+			templateFail = true
+		}
+		if cells[1].Value != "指标名称/Indicator Name" {
+			templateFail = true
+		}
+		if cells[2].Value != "指标日期/Indicator Date" {
+			templateFail = true
+		}
+		if cells[3].Value != "值/Value" {
+			templateFail = true
+		}
+		if cells[4].Value != "频度/Frequency" {
+			templateFail = true
+		}
+		if cells[5].Value != "单位/Unit" {
+			templateFail = true
+		}
+		if templateFail {
+			errMsg = "导入文件异常,请下载最新导入模板文件"
+			err = errors.New(errMsg)
+			return
+		}
+	}
+
+	for i := 2; i < maxRow; i++ {
+		row := sheet.Row(i)
+		cells := row.Cells
+		if len(cells) < 6 {
+			errMsg = "导入文件异常,请下载最新导入模板文件"
+			err = errors.New(errMsg)
+			return
+		}
+
+		classifyName := strings.TrimSpace(cells[0].Value) //分类
+		if classifyName == "" {                           //过滤空白行
+			continue
+		}
+		// 指标名称
+		cell1 := cells[1].Value
+		indexName := strings.TrimSpace(cell1)
+		if indexName == "" { //过滤空白行
+			continue
+		}
+		//createDate := utils.ConvertToFormatDay(cell1) //录入日期
+		createDate := cells[2].Value                      //指标日期
+		frequency := strings.TrimSpace(cells[4].String()) //频度
+		unit := strings.TrimSpace(cells[5].String())      //单位
+
+		closeVal := cells[3].Value //值
+		if strings.Contains(closeVal, "#N/A") {
+			continue
+		}
+
+		currDate, tmpErr := getExcelDate(createDate)
+		if tmpErr != nil {
+			failDataList = append(failDataList, &models.EdbdataImportFail{
+				//Id:           0,
+				ClassifyName: classifyName,
+				CreateDate:   createDate,
+				SecName:      indexName,
+				Close:        closeVal,
+				Remark:       "日期格式异常",
+				SysUserId:    strconv.Itoa(sysUserId),
+				Frequency:    frequency,
+				Unit:         unit,
+			})
+			continue
+		}
+
+		closeValFloat, tmpErr := cells[3].Float() //值
+		if tmpErr != nil {
+			failDataList = append(failDataList, &models.EdbdataImportFail{
+				//Id:           0,
+				ClassifyName: classifyName,
+				CreateDate:   currDate,
+				SecName:      indexName,
+				Close:        cells[3].Value,
+				Remark:       "值类型异常",
+				SysUserId:    strconv.Itoa(sysUserId),
+				Frequency:    frequency,
+				Unit:         unit,
+			})
+			continue
+		}
+		newDecimal := decimal.NewFromFloat(closeValFloat)
+		newDecimal.Round(4)
+		closeVal = newDecimal.String()
+		if strings.Contains(closeVal, "#N/A") {
+			continue
+		}
+
+		_, ok := indexDataListMap[indexName]
+		if !ok {
+			indexDataListMap[indexName] = ImportManualIndexData{
+				IndexName: indexName,
+				Unit:      unit,
+				ClassName: classifyName,
+				Frequency: frequency,
+				DataMap:   make(map[string]string),
+			}
+		}
+
+		indexDataListMap[indexName].DataMap[currDate] = closeVal
+	}
+
+	for _, v := range indexDataListMap {
+		indexDataList = append(indexDataList, v)
+	}
+
+	return
+}
+
+// getDataByTemplate2
+// @Description: 根据模板2获取数据
+// @author: Roc
+// @datetime 2024-07-24 16:17:56
+// @param sheet *xlsx.Sheet
+// @return indexDataList []ImportManualIndexData
+// @return err error
+// @return errMsg string
+func getDataByTemplate2(sheet *xlsx.Sheet, sysUserId int) (indexDataList []ImportManualIndexData, failDataList []*models.EdbdataImportFail, err error, errMsg string) {
+	fmt.Println("sheet name: ", sheet.Name)
+	indexDataList = make([]ImportManualIndexData, 0)
+	failDataList = make([]*models.EdbdataImportFail, 0)
+
+	//遍历行读取
+	maxRow := sheet.MaxRow
+	fmt.Println("maxRow:", maxRow)
+
+	varietyList := make([]string, 0)
+	indexNameList := make([]string, 0)
+	unitList := make([]string, 0)
+	frequencyList := make([]string, 0)
+
+	// make(map[指标下标]map[日期]值)
+	indexDateValueMap := make(map[int]map[string]string)
+
+	// 表头信息
+	if maxRow <= 4 {
+		errMsg = "模板异常1"
+		err = errors.New(errMsg)
+		return
+	}
+
+	// 表头处理
+	for i := 1; i <= 4; i++ {
+		row := sheet.Row(i)
+		cells := row.Cells
+		//if len(cells) < 1 {
+		//	errMsg = "模板异常2"
+		//	err = errors.New(errMsg)
+		//	return
+		//}
+
+		switch i {
+		case 1:
+			for k, v := range cells {
+				if k == 0 {
+					continue
+				}
+				varietyList = append(varietyList, strings.TrimSpace(v.String()))
+			}
+		case 2:
+			for k, v := range cells {
+				if k == 0 {
+					continue
+				}
+				indexNameList = append(indexNameList, strings.TrimSpace(v.String()))
+			}
+		case 3:
+			for k, v := range cells {
+				if k == 0 {
+					continue
+				}
+				unitList = append(unitList, strings.TrimSpace(v.String()))
+			}
+		case 4:
+			for k, v := range cells {
+				if k == 0 {
+					continue
+				}
+				frequencyList = append(frequencyList, strings.TrimSpace(v.String()))
+			}
+		}
+	}
+
+	maxNameIndex := len(indexNameList) - 1
+	maxUnitIndex := len(unitList) - 1
+	maxClassNameIndex := len(varietyList) - 1
+	maxFrequencyIndex := len(frequencyList) - 1
+
+	// 数据处理
+	for i := 5; i < maxRow; i++ {
+		row := sheet.Row(i)
+		cells := row.Cells
+		//if len(cells) < 1 {
+		//	errMsg = "模板异常2"
+		//	err = errors.New(errMsg)
+		//	return
+		//}
+		// 当前日期
+		var currDate string
+
+		// 日期是否异常,异常的话,就跳过,进入下一行数据处理
+		var dateErr bool
+
+		// 数据处理
+		for k, v := range cells {
+			if k == 0 {
+				tmpCurrDate, tmpErr := getExcelDate(v.Value)
+				if tmpErr != nil {
+					// TODO 错误数据记录
+					//failItem := new(models.EdbdataImportFail)
+					//failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+					//failItem.ClassifyName = classifyName
+					//failItem.CreateDate = createDate
+					//failItem.SecName = secName
+					//failItem.Close = closeVal
+					//failItem.Remark = "日期格式异常"
+					//failItem.Frequency = frequency
+					//failItem.Unit = unit
+					//failDataList = append(failDataList, failItem)
+					//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
+					dateErr = true
+				}
+
+				currDate = tmpCurrDate
+				continue
+			}
+			key := k - 1
+
+			// 日期异常,所以不处理该行了
+			if dateErr {
+				var indexName, unit, classifyName, frequency string
+				if key <= maxNameIndex {
+					indexName = indexNameList[key]
+				}
+				if key <= maxUnitIndex {
+					unit = unitList[key]
+				}
+				if key <= maxClassNameIndex {
+					classifyName = varietyList[key]
+				}
+				if key <= maxFrequencyIndex {
+					frequency = frequencyList[key]
+				}
+
+				failDataList = append(failDataList, &models.EdbdataImportFail{
+					//Id:           0,
+					ClassifyName: classifyName,
+					CreateDate:   currDate,
+					SecName:      indexName,
+					Close:        cells[3].Value,
+					Remark:       "日期格式异常",
+					SysUserId:    strconv.Itoa(sysUserId),
+					Frequency:    frequency,
+					Unit:         unit,
+				})
+
+				continue
+			}
+
+			_, ok := indexDateValueMap[key]
+			if !ok {
+				indexDateValueMap[key] = make(map[string]string)
+			}
+
+			closeVal := v.Value //值
+			// 没有数据,说明是空串
+			if strings.Contains(closeVal, "#N/A") {
+				indexDateValueMap[key][currDate] = ""
+				continue
+			}
+
+			closeValFloat, tmpErr := v.Float() //值
+			if tmpErr != nil {
+				// TODO 错误数据记录
+				//failItem := new(models.EdbdataImportFail)
+				//failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+				//failItem.ClassifyName = classifyName
+				//failItem.CreateDate = createDate
+				//failItem.SecName = secName
+				//failItem.Close = cells[3].Value
+				//failItem.Remark = "值类型异常"
+				//failItem.Frequency = frequency
+				//failItem.Unit = unit
+				//failDataList = append(failDataList, failItem)
+				indexDateValueMap[key][currDate] = ""
+				continue
+			}
+
+			newDecimal := decimal.NewFromFloat(closeValFloat)
+			newDecimal.Round(4)
+			closeVal = newDecimal.String()
+			if strings.Contains(closeVal, "#N/A") {
+				indexDateValueMap[key][currDate] = ""
+				continue
+			}
+			indexDateValueMap[key][currDate] = closeVal
+		}
+
+	}
+
+	for i, indexName := range indexNameList {
+		var unit, classifyName, frequency string
+		if i <= maxUnitIndex {
+			unit = unitList[i]
+		}
+		if i <= maxClassNameIndex {
+			classifyName = varietyList[i]
+		}
+		if i <= maxFrequencyIndex {
+			frequency = frequencyList[i]
+		}
+		indexData := ImportManualIndexData{
+			IndexName: indexName,
+			Unit:      unit,
+			ClassName: classifyName,
+			Frequency: frequency,
+			DataMap:   indexDateValueMap[i],
+		}
+		indexDataList = append(indexDataList, indexData)
+	}
+
+	return
+}
+
+// getExcelDate
+// @Description: 获取excel的日期
+// @author: Roc
+// @datetime 2024-07-23 17:26:12
+// @param createDate string
+// @return newCreateDate string
+// @return err error
+func getExcelDate(createDate string) (newCreateDate string, err error) {
+	if strings.Contains(createDate, "-") {
+		//如果是带有 - 的普通日期格式文本
+		_, err = time.Parse("2006-1-2", createDate)
+		if err == nil {
+			newCreateDate = createDate
+		}
+	} else if strings.Contains(createDate, "/") {
+		//如果是带有 / 的普通日期格式文本
+		createDateTime, timeErr := time.Parse("2006/1/2", createDate)
+		if timeErr != nil {
+			err = timeErr
+		} else {
+			newCreateDate = createDateTime.Format("2006-01-02")
+		}
+	} else {
+		//可能是excel的日期格式
+		_, tmpErr := strconv.Atoi(createDate)
+		if tmpErr != nil {
+			err = tmpErr
+		} else {
+			newCreateDate = utils.ConvertToFormatDay(createDate) //录入日期
+		}
+	}
+
+	return
+}

BIN
static/template/导入模板1.xlsx


BIN
static/template/导入模板2.xlsx