/*
 * Copyright (c) 2023. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
 * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
 * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
 * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
 * Vestibulum commodo. Ut rhoncus gravida arcu.
 */

package controllers

import (
	"encoding/json"
	"eta/eta_api/models"
	"eta/eta_api/models/data_manage"
	"eta/eta_api/models/data_source"
	"eta/eta_api/models/system"
	"eta/eta_api/services/alarm_msg"
	"eta/eta_api/services/data"
	"eta/eta_api/utils"
	"fmt"
	"os"
	"path/filepath"
	"reflect"
	"sort"
	"strconv"
	"strings"
	"time"

	"github.com/rdlucklib/rdluck_tools/paging"
	"github.com/shopspring/decimal"
	"github.com/tealeg/xlsx"
)

// TargetController 手工指标服务(鉴权)
type TargetController struct {
	BaseAuthController
}

// TargetCommonController 手工指标服务(不鉴权)
type TargetCommonController struct {
	BaseCommonController
}

// DataList
// @Title 获取指标列表
// @Description 获取指标列表接口
// @Param   PageSize   query   int  true       "每页数据条数"
// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
// @Param   StartDate   query   string  true       "开始日期"
// @Param   EndDate   query   string  true       "结束日期"
// @Param   Frequency   query   string  true       "频度"
// @Param   ClassifyId   query   int  true       "分类"
// @Param   KeyWord   query   string  true       "名称关键词"
// @Param   TradeCode   query   string  true       "指标唯一编码"
// @Success 200 {object} models.DataListResp
// @router /data/list [get]
func (this *TargetController) DataList() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	pageSize, _ := this.GetInt("PageSize")
	currentIndex, _ := this.GetInt("CurrentIndex")
	keyWord := this.GetString("KeyWord")
	startDate := this.GetString("StartDate")
	endDate := this.GetString("EndDate")
	frequency := this.GetString("Frequency")
	tradeCode := this.GetString("TradeCode")
	classifyId, _ := this.GetInt("ClassifyId") //分类

	var startSize int
	if pageSize <= 0 {
		pageSize = utils.PageSize20
	}
	if currentIndex <= 0 {
		currentIndex = 1
	}
	startSize = utils.StartIndex(currentIndex, pageSize)

	var condition string
	var pars []interface{}

	if keyWord != "" {
		condition += ` AND a.SEC_NAME LIKE ? `
		pars = utils.GetLikeKeywordPars(pars, keyWord, 1)
	}
	if startDate != "" {
		condition += ` AND c.DT >= ? `
		pars = append(pars, startDate)
	}
	if endDate != "" {
		condition += ` AND c.DT <= ? `
		pars = append(pars, endDate)
	}

	if frequency != "" {
		condition += ` AND a.frequency = ? `
		pars = append(pars, frequency)
	}

	if classifyId > 0 {
		condition += ` AND a.classify_id = ? `

		pars = append(pars, classifyId)
	}

	if tradeCode != "" {
		condition += ` AND c.TRADE_CODE = ? `
		pars = append(pars, tradeCode)
	}

	total, err := models.GetDataListCount(condition, pars)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	list, err := models.GetDataList(condition, pars, startSize, pageSize)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	page := paging.GetPaging(currentIndex, pageSize, total)
	resp := new(models.DataListResp)
	resp.Paging = page
	if len(list) <= 0 {
		list = make([]*models.DataList, 0)
	}
	resp.List = list
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// DataAdd
// @Title 录入数据
// @Description 录入数据接口
// @Param	request	body models.DataAddReq true "type json string"
// @Success 200 Ret=200 录入成功
// @router /data/add [post]
func (this *TargetController) DataAdd() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req models.DataAddReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	if req.TradeCode == "" {
		br.Msg = "指标编码不可为空!"
		return
	}

	if req.CreateDate == "" {
		br.Msg = "请选择日期"
		return
	}
	item, err := models.GetDataInfo(req.TradeCode, req.CreateDate)
	if err != nil && err.Error() != utils.ErrNoRow() {
		br.Msg = "获取信息失败!"
		br.ErrMsg = "获取信息失败,Err:" + err.Error()
		return
	}
	if item != nil {
		br.Msg = "该指标当前日期下,数据已录入"
		return
	}
	edbdata := new(models.Edbdata)
	edbdata.TradeCode = req.TradeCode
	edbdata.Dt = req.CreateDate
	edbdata.Close = req.Close
	edbdata.ModifyTime = time.Now()
	_, err = models.AddEdbdata(edbdata)
	if err != nil {
		br.Msg = "新增失败"
		br.ErrMsg = "新增失败,Err:" + err.Error()
		return
	}

	// 添加操作记录
	go func() {
		record := &models.EdbinfoOpRecord{
			TradeCode:  edbdata.TradeCode,
			Remark:     "更新数据",
			UserId:     this.SysUser.AdminId,
			UserName:   this.SysUser.RealName,
			CreateTime: time.Now(),
		}
		data.ModifyManualEdbMaxMinDate(edbdata.TradeCode)
		_ = record.Create()

		//将该指标的code加入到 “手工数据导入后刷新” 缓存
		if utils.Re == nil {
			err := utils.Rc.LPush(utils.CACHE_IMPORT_MANUAL_DATA, req.TradeCode)
			if err != nil {
				fmt.Println("CACHE_IMPORT_MANUAL_DATA LPush Err:" + err.Error())
			}
		}
	}()

	br.Ret = 200
	br.Success = true
	br.Msg = "新增成功"
}

// DataEdit
// @Title 编辑数据
// @Description 编辑数据接口
// @Param	request	body models.DataEditReq true "type json string"
// @Success 200 Ret=200 编辑数据成功
// @router /data/edit [post]
func (this *TargetController) DataEdit() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req models.DataEditReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	if req.TradeCode == "" {
		br.Msg = "指标编码不可为空!"
		return
	}

	if req.CreateDate == "" {
		br.Msg = "请选择日期"
		return
	}

	close := ""
	loc := reflect.ValueOf(req.Close).Kind().String()
	if loc == "string" {
		close = req.Close.(string)
	} else if loc == "int" {
		closeInt := req.Close.(int)
		close = strconv.Itoa(closeInt)
	} else if loc == "float64" {
		close64 := req.Close.(float64)
		close = strconv.FormatFloat(close64, 'g', 30, 64)
	} else {
		close = ""
	}

	edbdata := new(models.Edbdata)
	edbdata.TradeCode = req.TradeCode
	edbdata.Dt = req.CreateDate
	edbdata.Close = close
	edbdata.ModifyTime = time.Now()

	if req.OldCreateDate == "" {
		item, err := models.GetDataInfo(req.TradeCode, req.CreateDate)
		if err != nil && err.Error() != utils.ErrNoRow() {
			br.Msg = "获取信息失败!"
			br.ErrMsg = "获取信息失败,Err:" + err.Error()
			return
		}
		if item == nil { //新增
			_, err = models.AddEdbdata(edbdata)
			if err != nil {
				br.Msg = "新增失败"
				br.ErrMsg = "新增失败,Err:" + err.Error()
				return
			}
		} else { //修改
			err = models.EditEdbdata(edbdata)
			if err != nil {
				br.Msg = "编辑失败"
				br.ErrMsg = "编辑失败,Err:" + err.Error()
				return
			}
		}
	} else {
		if req.CreateDate == req.OldCreateDate { //修改
			err = models.EditEdbdata(edbdata)
			if err != nil {
				br.Msg = "编辑失败"
				br.ErrMsg = "编辑失败,Err:" + err.Error()
				return
			}
		} else {
			item, err := models.GetDataInfo(req.TradeCode, req.CreateDate)
			if err != nil && err.Error() != utils.ErrNoRow() {
				br.Msg = "获取信息失败!"
				br.ErrMsg = "获取信息失败,Err:" + err.Error()
				return
			}
			if item == nil {
				_, err = models.AddEdbdata(edbdata)
				if err != nil {
					br.Msg = "新增失败"
					br.ErrMsg = "新增失败,Err:" + err.Error()
					return
				}
			} else {
				err = models.EditEdbdata(edbdata)
				if err != nil {
					br.Msg = "编辑失败"
					br.ErrMsg = "编辑失败,Err:" + err.Error()
					return
				}
			}
			oldItem, err := models.GetDataInfo(req.TradeCode, req.OldCreateDate)
			if err != nil && err.Error() != utils.ErrNoRow() {
				br.Msg = "获取信息失败!"
				br.ErrMsg = "获取信息失败,Err:" + err.Error()
				return
			}
			if oldItem != nil {
				record := new(models.EdbdataDeleteRecord)
				record.TradeCode = oldItem.TradeCode
				record.Dt = oldItem.Dt
				record.Close = oldItem.Close
				record.ModifyTime = oldItem.ModifyTime
				record.CreateTime = time.Now()
				record.SysUserId = this.SysUser.AdminId
				_, err = models.AddEdbdataDeleteRecord(record)
				if err != nil {
					br.Msg = "编辑失败"
					br.ErrMsg = "新增删除记录失败,Err:" + err.Error()
					return
				}
				//删除数据
				models.DeleteEdbData(req.TradeCode, req.OldCreateDate)
			}
		}
	}

	// 数据操作完后的最大最小值/指标库更新
	{
		go func() {
			data.ModifyManualEdbMaxMinDate(req.TradeCode)
			//将该指标的code加入到 “手工数据导入后刷新” 缓存
			if utils.Re == nil {
				err := utils.Rc.LPush(utils.CACHE_IMPORT_MANUAL_DATA, req.TradeCode)
				if err != nil {
					fmt.Println("CACHE_IMPORT_MANUAL_DATA LPush Err:" + err.Error())
				}
			}
		}()
	}

	br.Ret = 200
	br.Success = true
	br.Msg = "编辑成功"
}

// BatchDataEdit
// @Title 批量编辑数据
// @Description 批量编辑数据接口
// @Param	request	body models.BatchDataEditReq true "type json string"
// @Success 200 Ret=200 编辑数据成功
// @router /data/batch_edit [post]
func (this *TargetController) BatchDataEdit() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req models.BatchDataEditReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	if req.CreateDate == req.OldCreateDate { //修改
		br.Msg = "开始日期与结束日期一致!"
		return
	}

	edbDataEditList := make([]data.EdbDataEdit, 0)
	for _, trade := range req.List {
		if trade.TradeCode == "" {
			br.Msg = "指标编码不可为空!"
			return
		}

		close := ""
		loc := reflect.ValueOf(trade.Close).Kind().String()
		if loc == "string" {
			close = trade.Close.(string)
		} else if loc == "int" {
			closeInt := trade.Close.(int)
			close = strconv.Itoa(closeInt)
		} else if loc == "float64" {
			close64 := trade.Close.(float64)
			close = strconv.FormatFloat(close64, 'g', 30, 64)
		} else {
			close = ""
		}
		edbDataEdit := data.EdbDataEdit{
			OldCreateDate: req.OldCreateDate,
			CreateDate:    req.CreateDate,
			TradeCode:     trade.TradeCode,
			Close:         close,
		}
		edbDataEditList = append(edbDataEditList, edbDataEdit)
	}

	//批量修改
	failEdbDataList, err := data.BatchEdbData(req.OldCreateDate, req.CreateDate, edbDataEditList, this.SysUser.AdminId)
	if err != nil {
		br.Msg = "批量修改失败"
		br.ErrMsg = "批量修改失败:" + err.Error()
		return
	}
	br.Ret = 200
	br.Success = true
	br.Data = failEdbDataList
	br.Msg = "编辑成功"
}

// TargetList
// @Title 指标列表
// @Description 指标列表接口
// @Param   PageSize   query   int  true       "每页数据条数"
// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
// @Param   StartDate   query   string  true       "开始日期"
// @Param   EndDate   query   string  true       "结束日期"
// @Param   Frequency   query   string  true       "频度"
// @Param   ClassifyId   query   int  true       "分类"
// @Param   KeyWord   query   string  true       "名称关键词"
// @Success 200 {object} models.TargetListResp
// @router /target/list [get]
func (this *TargetController) TargetList() {
	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.TargetListResp)

	pageSize, _ := this.GetInt("PageSize")
	currentIndex, _ := this.GetInt("CurrentIndex")
	keyWord := this.GetString("KeyWord")
	startDate := this.GetString("StartDate")
	endDate := this.GetString("EndDate")
	frequency := this.GetString("Frequency")
	classifyId, _ := this.GetInt("ClassifyId") //分类

	var startSize int
	if pageSize <= 0 {
		pageSize = utils.PageSize20
	}
	if currentIndex <= 0 {
		currentIndex = 1
	}
	startSize = utils.StartIndex(currentIndex, pageSize)

	var condition string
	var pars []interface{}

	userId := sysUser.AdminId
	//超管账号可以查看分类下的所有频度数据
	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
		userId = 0
	}
	//获取账户所拥有权限的分类id集合
	classifyIdStrList, err := data.GetEdbClassifyListByAdminId(int64(userId))
	if err != nil {
		br.Msg = "获取分类数据失败"
		return
	}
	total := 0
	list := make([]*models.EdbinfoItem, 0)

	//有分类数据权限才查询
	if len(classifyIdStrList) > 0 {
		condition += ` AND a.classify_id in (` + strings.Join(classifyIdStrList, ",") + `)  `

		//关键字
		if keyWord != "" {
			condition += ` AND (a.SEC_NAME LIKE '%` + keyWord + `%'  or a.TRADE_CODE LIKE '%` + keyWord + `%' )`
		}

		if startDate != "" {
			startDate = startDate + " 00:00:00"
			condition += ` AND a.create_date >= ? `
			pars = append(pars, startDate)
		}
		if endDate != "" {
			endDate = endDate + " 23:59:59"
			condition += ` AND a.create_date <= ? `
			pars = append(pars, endDate)
		}

		if frequency != "" {
			condition += ` AND a.frequency = ? `
			pars = append(pars, frequency)
		}

		if classifyId > 0 {
			condition += ` AND a.classify_id = ? `

			pars = append(pars, classifyId)
		}
		mobile := sysUser.Mobile
		total, err = models.GetEdbinfoListCount(condition, pars, mobile, sysUser.RoleType)
		if err != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "获取失败,Err:" + err.Error()
			return
		}
		tmpList, err := models.GetEdbinfoItemList(condition, pars, startSize, pageSize, mobile, sysUser.RoleType)
		if err != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "获取失败,Err:" + err.Error()
			return
		}
		if len(tmpList) <= 0 {
			list = make([]*models.EdbinfoItem, 0)
		} else {
			list = tmpList
		}

		systemUserMap := make(map[int]string)
		for k, v := range list {
			userName, ok := systemUserMap[v.UserId]
			if ok == false {
				systemUser, _ := system.GetSysAdminById(v.UserId)
				if systemUser != nil {
					userName = systemUser.RealName
				} else {
					userName = `无`
				}
				systemUserMap[v.UserId] = userName
			}
			list[k].UserName = userName
		}
	}
	page := paging.GetPaging(currentIndex, pageSize, total)
	resp.Paging = page
	resp.List = list

	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// TargetAdd
// @Title 录入指标
// @Description 录入指标接口
// @Param	request	body models.EdbinfoAddReq true "type json string"
// @Success 200 Ret=200 录入成功
// @router /target/add [post]
func (this *TargetController) TargetAdd() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req models.EdbinfoAddReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请重新登录"
		return
	}

	tradeCode, err := models.GetMaxTradeCode()
	if err != nil {
		br.Msg = "获取数据失败"
		br.ErrMsg = "获取最大交易编码失败,Err:" + err.Error()
		return
	}

	maxTradeCode, err := utils.GetMaxTradeCode(tradeCode)
	if err != nil {
		br.Msg = "数据异常"
		br.ErrMsg = "获取编码信息失败,Err:" + err.Error()
		return
	}
	if maxTradeCode == "" {
		br.Msg = "编码为空,请联系技术"
		br.ErrMsg = "编码为空,请联系技术"
		return
	}
	if req.SecName == "" {
		br.Msg = "指标名称不能为空"
		return
	}
	item, err := models.GetEdbinfoBySecName(req.SecName)
	if err != nil && err.Error() != utils.ErrNoRow() {
		br.Msg = "获取信息失败!"
		br.ErrMsg = "获取信息失败,Err:" + err.Error()
		return
	}
	if item != nil {
		br.Msg = "指标名称已存在"
		return
	}

	err = models.AddEdbinfo(maxTradeCode, req.SecName, req.Unit, "手动", req.Frequency, req.NoticeTime, req.ClassifyId, sysUser.AdminId, sysUser.RealName)
	if err != nil {
		br.Msg = "新增失败"
		br.ErrMsg = "新增失败,Err:" + err.Error()
		return
	}
	err = models.AddEdbinfoUser(maxTradeCode, sysUser.Mobile)
	if err != nil {
		br.Msg = "新增失败"
		br.ErrMsg = "新增失败,Err:" + err.Error()
		return
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "新增成功"
}

// TargetEdit
// @Title 编辑指标
// @Description 编辑指标
// @Param	request	body models.EdbinfoEditReq true "type json string"
// @Success 200 Ret=200 录入成功
// @router /target/edit [post]
func (this *TargetController) TargetEdit() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req models.EdbinfoEditReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请重新登录"
		return
	}

	if req.TradeCode == "" {
		br.Msg = "数据异常"
		br.ErrMsg = "最大编码为空"
		return
	}

	if req.SecName == "" {
		br.Msg = "指标名称不能为空"
		return
	}
	item, err := models.GetEdbinfoBySecName(req.SecName)
	if err != nil && err.Error() != utils.ErrNoRow() {
		br.Msg = "获取信息失败!"
		br.ErrMsg = "获取信息失败,Err:" + err.Error()
		return
	}
	if item != nil {
		if req.TradeCode != item.TradeCode {
			br.Msg = "指标名称已存在"
			return
		}
	}
	err = models.EditEdbinfo(req.TradeCode, req.SecName, req.Unit, req.Frequency, req.NoticeTime, req.ClassifyId)
	if err != nil {
		br.Msg = "编辑失败"
		br.ErrMsg = "编辑失败,Err:" + err.Error()
		return
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "编辑成功"
}

// TargetSearch
// @Title 搜索指标
// @Description 搜索指标
// @Param   ClassifyId   query   int  true       "分类"
// @Param   KeyWord   query   string  true       "名称关键词"
// @Success 200 {object} models.SearchTargetListResp
// @router /target/search [get]
func (this *TargetController) TargetSearch() {
	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
	}
	classifyId, _ := this.GetInt("ClassifyId")
	keyWord := this.GetString("KeyWord")
	list, err := models.SearchTargetEntry(classifyId, keyWord)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	resp := new(models.SearchTargetListResp)
	resp.List = list
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// ClassifyList
// @Title 获取分类
// @Description 获取分类
// @Success 200 {object} models.EdbdataClassifyResp
// @router /classify [get]
func (this *TargetController) ClassifyList() {
	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
	}
	//mobile := sysUser.Mobile
	//var wxUserId int64
	//if mobile != "" {
	//	wxUser, err := models.GetUserByMobile(mobile)
	//	if err != nil && err.Error() != utils.ErrNoRow() {
	//		br.Msg = "获取用户信息失败"
	//		br.ErrMsg = "获取用户信息失败,err:" + err.Error()
	//		return
	//	}
	//	if wxUser != nil {
	//		wxUserId = wxUser.UserId
	//	}
	//}
	var wxUserId int64
	wxUserId = int64(sysUser.AdminId)
	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
		wxUserId = 0
	}
	list, err := models.GetEdbdataClassify(wxUserId)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}

	classifyIdStrList := make([]string, 0)
	for _, classifyList := range list {
		if classifyList.Child != nil {
			for _, classify := range classifyList.Child {
				classifyIdStrList = append(classifyIdStrList, strconv.Itoa(classify.ClassifyId))
			}
		}
	}
	if len(classifyIdStrList) > 0 {
		edbInfoGroupCountList, err := models.GetEdbInfoGroupCountByClassifyIds(strings.Join(classifyIdStrList, ","))
		if err != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "获取分类下有数据的指标数量失败,Err:" + err.Error()
			return
		}

		edbInfoGroupCountMap := make(map[int]int)
		for _, edbInfoGroupCount := range edbInfoGroupCountList {
			edbInfoGroupCountMap[edbInfoGroupCount.ClassifyId] = edbInfoGroupCount.Count
		}
		for _, classifyList := range list {
			classifyList.UniqueCode = utils.MD5(fmt.Sprint(classifyList.ClassifyId))
			if classifyList.Child != nil {
				for _, classify := range classifyList.Child {
					if total, ok := edbInfoGroupCountMap[classify.ClassifyId]; ok {
						classify.EdbInfoTotal = total
						classify.UniqueCode = utils.MD5(fmt.Sprint(classify.ClassifyId))
					}
				}
			}
		}
	}
	resp := new(models.EdbdataClassifyResp)
	resp.List = list
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// TemplateDownload
// @Title 下载模板
// @Description 下载模板
// @Success 200 {object} models.EdbdataClassifyResp
// @Param   Source   query   int  false       "来源:1:模板1;2:模板2"
// @router /template [get]
func (this *TargetCommonController) TemplateDownload() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	source, _ := this.GetInt("Source")
	switch source {
	case 2:
		this.Ctx.Output.Download("./static/template/导入模板2.xlsx", "数据导入模板2.xlsx")
	default:
		this.Ctx.Output.Download("./static/template/导入模板1.xlsx", "数据导入模板1.xlsx")
	}

	//this.Ctx.Output.Download("./static/数据导入模板.xlsx", "数据导入模板.xlsx")

	br.Ret = 200
	br.Success = true
	br.Msg = "下载成功"
}

// TemplateDownload
// @Title 下载模板
// @Description 下载模板
// @Success 200 {object} models.EdbdataClassifyResp
// @router /template/en [get]
func (this *TargetCommonController) TemplateDownloadEn() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()

	this.Ctx.Output.Download("./static/Data Import Template.xlsx", "Data Import Template.xlsx")

	br.Ret = 200
	br.Success = true
	br.Msg = "下载成功"
}

// ImportFailListDownload
// @Title 下载失败列表
// @Description 下载失败列表
// @Success 200 {object} models.EdbdataClassifyResp
// @router /import/failList [get]
func (this *TargetController) ImportFailListDownload() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请重新登录"
		return
	}
	item, err := models.GetFailList(sysUser.AdminId)
	if err != nil {
		br.Msg = "获取数据失败"
		br.Msg = "获取数据失败,Err:" + err.Error()
		return
	}
	xlsxFile := xlsx.NewFile()
	SheetName := "导入失败数据"
	if this.Lang == utils.EnLangVersion {
		SheetName = "Import Fail List"
	}
	sheet, err := xlsxFile.AddSheet(SheetName)
	headRow := sheet.AddRow()
	headRow.AddCell().SetValue("品种/Variety")
	headRow.AddCell().SetValue("指标名称/Indicator Name")
	headRow.AddCell().SetValue("指标日期/Indicator Date")
	headRow.AddCell().SetValue("值/Value")
	headRow.AddCell().SetValue("频度/Frequency")
	headRow.AddCell().SetValue("单位/Unit")
	headRow.AddCell().SetValue("备注/Note")

	for _, v := range item {
		row := sheet.AddRow()
		row.AddCell().SetValue(v.ClassifyName)
		row.AddCell().SetValue(v.SecName)
		row.AddCell().SetValue(v.CreateDate)
		row.AddCell().SetString(v.Close)
		row.AddCell().SetValue(v.Frequency)
		row.AddCell().SetValue(v.Unit)
		row.AddCell().SetValue(v.Remark)
	}
	fileName := time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
	savePath := "./static/" + fileName
	err = xlsxFile.Save(savePath)
	if err != nil {
		br.Msg = "文件保存失败"
		br.ErrMsg = "文件保存失败,Err:" + err.Error()
		return
	}
	defer func() {
		os.Remove(savePath)
	}()
	finalFileName := "失败列表.xlsx"

	if this.Lang == utils.EnLangVersion {
		finalFileName = "Failure List.xlsx"
	}
	this.Ctx.Output.Download(savePath, finalFileName)
}

// ExportDataList
// @Title 导出数据
// @Description 导出数据列表
// @Param   StartDate   query   string  true       "开始日期"
// @Param   EndDate   query   string  true       "结束日期"
// @Param   Frequency   query   string  true       "频度"
// @Param   ClassifyId   query   int  true       "分类"
// @Param   KeyWord   query   string  true       "名称关键词"
// @Param   TradeCode   query   string  true       "指标唯一编码"
// @Param   Mobile   query   string  true       "手机号"
// @Success 200  导出成功
// @router /export/dataList [get]
func (this *TargetController) ExportDataList() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请重新登录"
		return
	}

	keyWord := this.GetString("KeyWord")
	startDate := this.GetString("StartDate")
	endDate := this.GetString("EndDate")
	frequency := this.GetString("Frequency")
	classifyId, _ := this.GetInt("ClassifyId") //分类
	mobile := this.GetString("Mobile")         //分类
	tradeCode := this.GetString("TradeCode")   //指标唯一编码

	var condition string
	var pars []interface{}
	// 指标名称
	if keyWord != "" {
		condition += ` AND  a.SEC_NAME LIKE '%` + keyWord + `%'`
	}
	//分类ID
	if tradeCode != "" {
		condition += ` AND  a.TRADE_CODE = ? `
		pars = append(pars, tradeCode)
	}

	if startDate != "" {
		condition += ` AND c.DT >= ? `
		pars = append(pars, startDate)
	}
	if endDate != "" {
		condition += ` AND c.DT <= ? `
		pars = append(pars, endDate)
	}
	if frequency != "" {
		condition += ` AND a.frequency = ? `
		pars = append(pars, frequency)
	}
	permissionUserId := sysUser.AdminId
	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
		permissionUserId = 0
	}

	childClassifyIdList := make([]int, 0)
	// 所属分类
	if classifyId > 0 {
		// 获取有用权限的分类
		classifyList, err := models.GetEdbdataClassify(int64(permissionUserId))
		if err != nil {
			return
		}

		var isParent bool
		for _, v := range classifyList {
			if v.ClassifyId == classifyId {
				isParent = true
				childClassifyIdList = append(childClassifyIdList, v.ClassifyId)
				if v.Child != nil && len(v.Child) > 0 {
					for _, vv := range v.Child {
						childClassifyIdList = append(childClassifyIdList, vv.ClassifyId)
					}
				}
				break
			}
		}

		// 如果是最小级,那么就把自己放进去
		if !isParent {
			childClassifyIdList = append(childClassifyIdList, classifyId)
		}
	}

	// 如果所选分类是一级时,那么是一级下的所有分类;如果是二级时,那么是二级自己本身
	num := len(childClassifyIdList)
	condition += ` AND a.classify_id in (` + utils.GetOrmInReplace(num) + `) `
	pars = append(pars, childClassifyIdList)

	if mobile != "" {
		condition += ` AND d.mobile=? `
		pars = append(pars, mobile)
	}

	userId := sysUser.AdminId
	//超管账号可以查看分类下的所有频度数据
	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
		userId = 0
	}
	//获取账户所拥有权限的分类id集合
	classifyIdStrList, err := data.GetEdbClassifyListByAdminId(int64(userId))
	if err != nil {
		br.Msg = "获取分类数据失败"
		return
	}

	dir, _ := os.Executable()
	exPath := filepath.Dir(dir)

	downloadFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
	xlsxFile := xlsx.NewFile()
	if err != nil {
		br.Msg = "生成文件失败"
		br.ErrMsg = "生成文件失败"
		return
	}
	var frequencies []string
	if len(childClassifyIdList) > 0 {
		frequencies, err = models.GetEdbDataFrequencyByClassifyIdList(childClassifyIdList)
		if err != nil {
			br.Msg = "查询频度失败"
			br.ErrMsg = "查询频度失败"
			return
		}
	} else if tradeCode != `` {
		manualEdb, err := models.GetEdbinfoByTradeCode(tradeCode)
		if err != nil {
			br.Msg = "查询指标信息失败"
			br.ErrMsg = "查询指标信息失败,err:" + err.Error()
			return
		}
		frequencies = append(frequencies, manualEdb.Frequency)
	} else if keyWord != `` {
		frequencies, err = models.GetEdbDataFrequencyByKeyord(keyWord)
		if err != nil {
			br.Msg = "查询频度失败"
			br.ErrMsg = "查询频度失败"
			return
		}
	} else {
		// 啥也没选的情况下
		frequencies = append(frequencies, `日度`, `周度`, `月度`, `季度`, `半年度`, `年度`)
	}

	fileName := `手工数据`
	if frequencies == nil {
		sheet, err := xlsxFile.AddSheet("无数据")
		if err != nil {
			br.Msg = "新增Sheet失败"
			br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
			return
		}
		rowSecName := sheet.AddRow()
		celSecName := rowSecName.AddCell()
		celSecName.SetValue("")
	}
	for _, frequency := range frequencies {
		secNameList := make([]*models.EdbdataExportList, 0)
		if len(classifyIdStrList) > 0 {
			newCondition := condition
			newCondition += ` AND a.classify_id in (` + strings.Join(classifyIdStrList, ",") + `)  `
			newCondition += ` AND a.frequency = ? `
			pars := append(pars, frequency)
			tmpSecNameList, err := models.GetEdbdataSecName(newCondition, pars)
			if err != nil {
				br.Msg = "获取数据失败"
				br.ErrMsg = "获取数据失败,Err:" + err.Error()
				return
			}
			secNameList = tmpSecNameList
		}
		var sheet *xlsx.Sheet
		if len(secNameList) > 0 {
			sheet, err = xlsxFile.AddSheet(frequency)
			if err != nil {
				br.Msg = "新增Sheet失败"
				br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
				return
			}
			fileName = secNameList[0].ClassifyName
		} else {
			continue
		}
		//获取指标数据
		rowSecName := sheet.AddRow()
		celSecName := rowSecName.AddCell()
		celSecName.SetValue("指标名称")
		rowFrequency := sheet.AddRow()
		celFrequency := rowFrequency.AddCell()
		celFrequency.SetValue("频率")
		rowUnit := sheet.AddRow()
		celUnit := rowUnit.AddCell()
		celUnit.SetValue("单位")

		rowModifyDate := sheet.AddRow()
		rowModifyCell := rowModifyDate.AddCell()
		rowModifyCell.SetValue("更新时间")

		dataMap := make(map[string]map[string]*models.EdbdataItem)
		var tradeCodeList []string
		for _, v := range secNameList {
			cellSenName := rowSecName.AddCell()
			cellSenName.SetValue(v.SecName)
			celFrequency := rowFrequency.AddCell()
			celFrequency.SetValue(v.Frequency)
			celUnit := rowUnit.AddCell()
			celUnit.SetValue(v.Unit)
			rowModifyCell := rowModifyDate.AddCell()
			rowModifyCell.SetValue(v.Dt)
			tradeCodeList = append(tradeCodeList, v.TradeCode)
			items, err := models.GetEdbdataAllByTradeCode(v.TradeCode)
			if err != nil && err.Error() != utils.ErrNoRow() {
				br.ErrMsg = "GetEdbdataAllByTradeCode,Err:" + err.Error()
				br.Msg = "获取数据失败"
				return
			}
			for _, item := range items {
				if dataMap[item.TradeCode] == nil {
					dataMap[item.TradeCode] = make(map[string]*models.EdbdataItem)
				}
				dataMap[item.TradeCode][item.Dt] = item
				fmt.Println(item.TradeCode, item.Dt)
			}
		}

		tradeCodeStr := strings.Join(tradeCodeList, "','")
		tradeCodeStr = "'" + tradeCodeStr + "'"
		dateList, err := models.GetEdbdataList(tradeCodeStr)
		if err != nil {
			br.Msg = "获取数据失败"
			br.ErrMsg = "获取数据失败,Err:" + err.Error()
			return
		}
		for _, n := range dateList {
			rowData := sheet.AddRow()
			celDate := rowData.AddCell()
			celDate.SetValue(n.Dt)

			for _, m := range secNameList {
				celData := rowData.AddCell()
				fmt.Println(m.TradeCode)
				fmt.Println(n.Dt)
				if dataMap[m.TradeCode][n.Dt] != nil {
					celData.SetValue(dataMap[m.TradeCode][n.Dt].Close)
				}
			}
		}

	}

	err = xlsxFile.Save(downloadFilePath)
	if err != nil {
		//有指标无数据时先导出一遍空表
		sheet, err := xlsxFile.AddSheet("无数据")
		if err != nil {
			br.Msg = "新增Sheet失败"
			br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
			return
		}
		rowSecName := sheet.AddRow()
		celSecName := rowSecName.AddCell()
		celSecName.SetValue("")
		err = xlsxFile.Save(downloadFilePath)
		if err != nil {
			br.Msg = "保存文件失败"
			br.ErrMsg = "保存文件失败"
			return
		}
	}
	defer func() {
		os.Remove(downloadFilePath)
	}()

	fileName += time.Now().Format("06.01.02") + `.xlsx` //文件名称
	this.Ctx.Output.Download(downloadFilePath, fileName)

	br.Ret = 200
	br.Success = true
	br.Msg = "success"
}

// DataList
// @Title 导出数据
// @Description 导出数据列表
// @Param   StartDate   query   string  true       "开始日期"
// @Param   EndDate   query   string  true       "结束日期"
// @Param   Frequency   query   string  true       "频度"
// @Param   ClassifyId   query   int  true       "分类"
// @Param   KeyWord   query   string  true       "名称关键词"
// @Param   Mobile   query   string  true       "手机号"
// @Success 200  导出成功
// @router /dataList [get]
func (this *TargetCommonController) DataList() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	br.Msg = "成功"
	br.Ret = 200
}

// DataDelete
// @Title 数据删除
// @Description 数据删除
// @Param	request	body models.DataDeleteReq true "type json string"
// @Success 200 Ret=200 录入成功
// @router /data/delete [post]
func (this *TargetController) DataDelete() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req models.DataDeleteReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请重新登录"
		return
	}

	if req.TradeCode == "" {
		br.Msg = "指标编码不可为空"
		br.ErrMsg = "指标编码不可为空"
		return
	}

	if req.CreateDate == "" {
		br.Msg = "数据录入日期不可为空"
		return
	}
	item, err := models.GetDataInfo(req.TradeCode, req.CreateDate)
	if err != nil && err.Error() != utils.ErrNoRow() {
		br.Msg = "获取信息失败!"
		br.ErrMsg = "获取信息失败,Err:" + err.Error()
		return
	}
	if item == nil {
		br.Msg = "数据不存在"
		return
	}

	err = models.DataDelete(req.TradeCode, req.CreateDate, item.Close, item.ModifyTime, sysUser.AdminId)
	if err != nil {
		br.Msg = "删除失败"
		br.ErrMsg = "删除失败,Err:" + err.Error()
		return
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "删除成功"
}

// DataCheck
// @Title 数据删除校验
// @Description 数据删除校验
// @Param   TradeCode   query   string  true       "指标唯一编码"
// @Param   CreateDate   query   string  true       "数据录入日期"
// @Success Ret=200 可删除
// @router /data/check [get]
func (this *TargetController) DataCheck() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	tradeCode := this.GetString("TradeCode")
	createDate := this.GetString("CreateDate")
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请重新登录"
		return
	}
	if tradeCode == "" {
		br.Msg = "指标编码不可为空"
		return
	}
	if createDate == "" {
		br.Msg = "请选择日期"
		return
	}
	resp := new(models.DataCheckResp)
	item, err := models.GetDataInfo(tradeCode, createDate)
	if err != nil && err.Error() != utils.ErrNoRow() {
		br.Msg = "获取数据失败"
		br.Msg = "获取数据失败,Err:" + err.Error()
		return
	}
	if item != nil {
		resp.Status = 1
		resp.Close = item.Close
	} else {
		resp.Status = 0
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "检测成功"
	br.Data = resp
}

// TargetCheck
// @Title 指标删除校验
// @Description 指标删除校验
// @Param   TradeCode   query   string  true       "指标唯一编码"
// @Success Ret=200 可删除
// @router /target/check [get]
func (this *TargetController) TargetCheck() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()

	tradeCode := this.GetString("TradeCode")

	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请重新登录"
		return
	}
	if tradeCode == "" {
		br.Msg = "指标编码不可为空"
		return
	}
	resp := new(models.DataCheckResp)
	count, err := data_manage.GetEdbInfoCount(utils.DATA_SOURCE_MANUAL, tradeCode)
	if err != nil && err.Error() != utils.ErrNoRow() {
		br.Msg = "获取数据失败"
		br.Msg = "获取数据失败,Err:" + err.Error()
		return
	}
	if count > 0 {
		resp.Status = 1
	} else {
		resp.Status = 0
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "指标不存在关联数据,可直接删除"
	br.Data = resp
}

// TargetDelete
// @Title 指标删除
// @Description 指标删除
// @Param	request	body models.TargetDeleteReq true "type json string"
// @Success Ret=200 删除成功
// @router /target/delete [post]
func (this *TargetController) TargetDelete() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()

	var req models.TargetDeleteReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}

	if req.TradeCode == "" {
		br.Msg = "指标编码不可为空"
		return
	}

	//判断是否在指标数据导入的过程,如果是在该过程,那么就不允许用户操作
	key := "import:edbinfo:data:" + req.TradeCode
	if utils.Rc.IsExist(key) {
		br.Msg = "该指标正在导入数据中,请稍后操作"
		return
	}
	err = models.TargetDelete(req.TradeCode)
	if err != nil {
		br.Msg = "删除失败"
		br.Msg = "删除失败,Err:" + err.Error()
		return
	}
	br.Ret = 200
	br.Success = true
	br.IsAddLog = true
	br.Msg = "删除成功"
}

// GetResearcher
// @Title 获取研究员
// @Description 获取研究员
// @Success 200 {object} models.ResearcherListResp
// @router /getResearcher [get]
func (this *TargetController) GetResearcher() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()

	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请重新登录"
		return
	}
	var err error
	list := make([]*models.Researcher, 0)
	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN ||
		sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN ||
		sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN {
		list, err = models.GetResearcherEntry()
		if err != nil {
			br.Msg = "获取数据失败"
			br.Msg = "获取数据失败,Err:" + err.Error()
			return
		}
	} else if sysUser.Role == "hggroup" {
		mobileStr := "'15888577277','15888856487','15158848535','13651627324' "
		list, err = models.GetResearcherEntryByMobile(mobileStr)
		if err != nil {
			br.Msg = "获取数据失败"
			br.Msg = "获取数据失败,Err:" + err.Error()
			return
		}
	} else if sysUser.AdminName == "dfma" {
		list, err = models.GetResearcherEntry()
		if err != nil {
			br.Msg = "获取数据失败"
			br.Msg = "获取数据失败,Err:" + err.Error()
			return
		}

	}
	resp := new(models.ResearcherListResp)
	resp.List = list
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// GetTargetItems
// @Title 获取研究员指标
// @Description 获取研究员指标
// @Param   Mobile   query   string  true       "手机号"
// @Param   ClassifyId   query   int  true       "分类id"
// @Success 200 {object} models.ResearcherListResp
// @router /getTargetItems [get]
func (this *TargetController) GetTargetItems() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()

	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请重新登录"
		return
	}

	mobile := this.GetString("Mobile")

	if mobile == "" {
		mobile = sysUser.Mobile
	}
	classifyId, _ := this.GetInt("ClassifyId")
	items, err := models.GetTargetItems(mobile, classifyId)
	if err != nil {
		br.ErrMsg = "获取失败,Err:" + err.Error()
		br.Msg = "获取失败"
		return
	}
	resp := new(models.TargetItemsResp)
	resp.List = items
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// ExportLongzhong
// @Title 隆众数据下载
// @Description 隆众数据下载接口
// @Success 200 {object} models.ResearcherListResp
// @router /export/longzhong [get]
func (this *TargetCommonController) ExportLongzhong() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	parentId := 4
	classifyList, err := models.GetEdbdataClassifyByParentId(parentId)
	if err != nil {
		return
	}
	xlsxFile := xlsx.NewFile()
	if err != nil {
		fmt.Println("生成文件失败" + err.Error())
		return
	}
	dir, _ := os.Executable()
	exPath := filepath.Dir(dir)
	downLoadnFilePath := exPath + "/static/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
	for _, v := range classifyList {
		fmt.Println(v.ClassifyId, v.ClassifyName)
		//获取指标
		secNameList, err := data_source.GetLongzhonginfoByClassifyId(v.ClassifyId)
		if err != nil {
			fmt.Println("获取数据失败,Err:" + err.Error())
			return
		}
		if len(secNameList) <= 0 {
			continue
		}
		sheetNew, err := xlsxFile.AddSheet(v.ClassifyName)

		if err != nil {
			fmt.Println("新增Sheet失败", err.Error())
			return
		}
		//sheetNew.SetColWidth()
		//获取指标数据
		windRow := sheetNew.AddRow()
		secNameRow := sheetNew.AddRow()
		frequencyRow := sheetNew.AddRow()
		unitRow := sheetNew.AddRow()
		lastModifyDateRow := sheetNew.AddRow()
		//获取分类下指标最大数据量
		dataMax, err := data_source.GetLongzhongDataMaxCount(v.ClassifyId)
		if err != nil {
			fmt.Println("获取指标最大数据量失败", err.Error())
			return
		}
		for k, sv := range secNameList {
			fmt.Println("line 399:", v.ClassifyId, v.ClassifyName, sv.SecName, sv.Frequency)

			windRow.AddCell().SetValue("Wind")
			secNameRow.AddCell().SetValue("指标名称")
			frequencyRow.AddCell().SetValue("频率")
			unitRow.AddCell().SetValue("单位")
			lastModifyDateRow.AddCell().SetValue("更新时间")

			secNameRow.AddCell().SetValue(sv.SecName)
			frequencyRow.AddCell().SetValue(sv.Frequency)
			unitRow.AddCell().SetValue(sv.Unit)
			lastModifyDateRow.AddCell().SetValue(sv.LastModifyDate)

			windRow.AddCell()
			windRow.AddCell()
			secNameRow.AddCell()
			frequencyRow.AddCell()
			unitRow.AddCell()
			lastModifyDateRow.AddCell()
			min := k * 3
			sheetNew.SetColWidth(min, min, 15)
			//获取数据
			dataList, err := data_source.GetLongzhongDataById(sv.LongzhonginfoId)
			if err != nil {
				br.Msg = "获取数据失败"
				br.ErrMsg = "获取数据失败,Err:" + err.Error()
				return
			}
			if len(dataList) <= 0 {
				for n := 0; n < dataMax; n++ {
					rowIndex := 5 + n
					row := sheetNew.Row(rowIndex)
					row.AddCell()
					row.AddCell()
					row.AddCell()
				}
			} else {
				endRowIndex := 0
				for rk, dv := range dataList {
					rowIndex := 5 + rk
					row := sheetNew.Row(rowIndex)
					displayDate, _ := time.Parse(utils.FormatDate, dv.DisplayTime)
					displayDateCell := row.AddCell()
					style := new(xlsx.Style)
					style.ApplyAlignment = true
					style.Alignment.WrapText = true
					displayDateCell.SetStyle(style)
					displayDateCell.SetDate(displayDate)

					row.AddCell().SetFloat(dv.Close)
					row.AddCell()
					endRowIndex = rowIndex
				}
				if len(dataList) < dataMax {
					dataLen := dataMax - len(dataList)
					for n := 0; n < dataLen; n++ {
						rowIndex := (endRowIndex + 1) + n
						row := sheetNew.Row(rowIndex)
						row.AddCell()
						row.AddCell()
						row.AddCell()
					}
				}
			}
		}
	}

	err = xlsxFile.Save(downLoadnFilePath)
	if err != nil {
		br.Msg = "保存文件失败"
		br.ErrMsg = "保存文件失败"
		return
	}
	fileName := "隆众石化数据" + time.Now().Format("200601021504") + ".xlsx"
	this.Ctx.Output.Download(downLoadnFilePath, fileName)
	defer func() {
		os.Remove(downLoadnFilePath)
	}()
	br.Ret = 200
	br.Success = true
	br.Msg = "success"
}

// ExportLongzhongPrice
// @Title 隆众价格数据下载
// @Description 隆众价格数据下载接口
// @Success 200 {object} models.ResearcherListResp
// @router /export/longzhong/price [get]
func (this *TargetCommonController) ExportLongzhongPrice() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	classifyList, err := models.GetLzPriceClassify()
	if err != nil {
		return
	}
	xlsxFile := xlsx.NewFile()
	if err != nil {
		fmt.Println("生成文件失败" + err.Error())
		return
	}
	dir, _ := os.Executable()
	exPath := filepath.Dir(dir)
	downLoadnFilePath := exPath + "/static/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
	for _, v := range classifyList {
		//获取指标
		secNameList, err := models.GetLongzhongpriceinfoByClassifyName(v.ProductName)
		if err != nil {
			fmt.Println("获取数据失败,Err:" + err.Error())
			return
		}
		if len(secNameList) <= 0 {
			continue
		}
		sheetNew, err := xlsxFile.AddSheet(v.ProductName)
		if err != nil {
			fmt.Println("新增Sheet失败", err.Error())
			return
		}
		//获取指标数据
		windRow := sheetNew.AddRow()
		secNameRow := sheetNew.AddRow()
		frequencyRow := sheetNew.AddRow()
		unitRow := sheetNew.AddRow()
		lastModifyDateRow := sheetNew.AddRow()
		marketRow := sheetNew.AddRow()
		manufactureRow := sheetNew.AddRow()
		standardRow := sheetNew.AddRow()  //规格
		modelNameRow := sheetNew.AddRow() //规格型号

		titleRow := sheetNew.AddRow()
		//获取分类下指标最大数据量
		dataMax, err := models.GetLongzhongPriceDataMaxCount(v.ProductName)
		if err != nil {
			fmt.Println("获取指标最大数据量失败", err.Error())
			return
		}

		for k, sv := range secNameList {
			fmt.Println("line 399:", v.ProductName, sv.InfoTypeRemark, sv.AreaName)

			windRow.AddCell().SetString("Wind")
			secNameRow.AddCell().SetValue("分类")
			frequencyRow.AddCell().SetValue("价格类型")
			unitRow.AddCell().SetValue("单位")
			lastModifyDateRow.AddCell().SetValue("地区")
			marketRow.AddCell().SetValue("市场名称")
			manufactureRow.AddCell().SetValue("厂家名称")
			standardRow.AddCell().SetValue("规格")
			modelNameRow.AddCell().SetValue("规格型号")

			secNameRow.AddCell().SetValue(sv.InfoTypeRemark)
			frequencyRow.AddCell().SetValue(sv.PriceType)
			unitRow.AddCell().SetValue(sv.Unit)
			lastModifyDateRow.AddCell().SetValue(sv.AreaName)
			marketRow.AddCell().SetValue(sv.MarketName)
			manufactureRow.AddCell().SetValue(sv.ManufactureName)
			standardRow.AddCell().SetValue(sv.Standard)
			modelNameRow.AddCell().SetValue(sv.ModelName)

			windRow.AddCell()
			windRow.AddCell()
			windRow.AddCell()
			windRow.AddCell()

			secNameRow.AddCell()
			frequencyRow.AddCell()
			unitRow.AddCell()
			lastModifyDateRow.AddCell()
			marketRow.AddCell()
			manufactureRow.AddCell()
			standardRow.AddCell()
			modelNameRow.AddCell()

			secNameRow.AddCell()
			frequencyRow.AddCell()
			unitRow.AddCell()
			lastModifyDateRow.AddCell()
			marketRow.AddCell()
			manufactureRow.AddCell()
			standardRow.AddCell()
			modelNameRow.AddCell()

			secNameRow.AddCell()
			frequencyRow.AddCell()
			unitRow.AddCell()
			lastModifyDateRow.AddCell()
			marketRow.AddCell()
			manufactureRow.AddCell()
			standardRow.AddCell()
			modelNameRow.AddCell()

			titleRow.AddCell().SetValue("价格日期")
			titleRow.AddCell().SetValue("价格")
			titleRow.AddCell().SetValue("低端价格")
			titleRow.AddCell().SetValue("高端价格")
			titleRow.AddCell()

			min := k * 5
			sheetNew.SetColWidth(min, min, 15)

			//获取数据
			dataList, err := models.GetLongzhongPriceDataById(sv.LongzhongpriceinfoId)
			if err != nil {
				fmt.Println("GetLongzhongDataById Err:" + err.Error())
				return
			}
			rowStart := 10
			if len(dataList) <= 0 {
				for n := 0; n < dataMax; n++ {
					rowIndex := rowStart + n
					row := sheetNew.Row(rowIndex)
					row.AddCell()
					row.AddCell()
					row.AddCell()
					row.AddCell()
					row.AddCell()
				}
			} else {
				endRowIndex := 0
				for rk, dv := range dataList {
					rowIndex := rowStart + rk
					row := sheetNew.Row(rowIndex)
					priceDate, _ := time.Parse(utils.FormatDate, dv.PriceDate)
					row.AddCell().SetDate(priceDate)
					row.AddCell().SetFloat(dv.Price)
					row.AddCell().SetFloat(dv.LowPrice)
					row.AddCell().SetFloat(dv.HighPrice)

					row.AddCell()
					endRowIndex = rowIndex
				}
				if len(dataList) < dataMax {
					dataLen := dataMax - len(dataList)
					for n := 0; n < dataLen; n++ {
						rowIndex := (endRowIndex + 1) + n
						row := sheetNew.Row(rowIndex)
						row.AddCell()
						row.AddCell()
						row.AddCell()
						row.AddCell()
						row.AddCell()
					}
				}
			}
		}
	}

	err = xlsxFile.Save(downLoadnFilePath)
	if err != nil {
		br.Msg = "保存文件失败"
		br.ErrMsg = "保存文件失败"
		return
	}
	fileName := "隆众价格数据" + time.Now().Format("200601021504") + ".xlsx"
	this.Ctx.Output.Download(downLoadnFilePath, fileName)
	defer func() {
		os.Remove(downLoadnFilePath)
	}()
	br.Ret = 200
	br.Success = true
	br.Msg = "success"
}

// ExportLongzhongSurvey
// @Title 隆众调研数据下载
// @Description 隆众调研数据下载接口
// @Success 200 {object} models.ResearcherListResp
// @router /export/longzhong/survey [get]
func (this *TargetCommonController) ExportLongzhongSurvey() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	classifyList, err := models.GetLzSurveyClassify()
	if err != nil {
		return
	}
	xlsxFile := xlsx.NewFile()
	if err != nil {
		fmt.Println("生成文件失败" + err.Error())
		return
	}
	dir, _ := os.Executable()
	exPath := filepath.Dir(dir)
	downLoadnFilePath := exPath + "/static/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
	for _, v := range classifyList {
		//获取指标
		secNameList, err := models.GetLongzhongSurveyProductByClassifyName(v.ProductName)
		if err != nil {
			fmt.Println("获取数据失败,Err:" + err.Error())
			return
		}
		if len(secNameList) <= 0 {
			continue
		}
		sheetNew, err := xlsxFile.AddSheet(v.ProductName)

		if err != nil {
			fmt.Println("新增Sheet失败", err.Error())
			return
		}
		//sheetNew.SetColWidth()
		//获取指标数据
		windRow := sheetNew.AddRow()
		secNameRow := sheetNew.AddRow()
		indexCodeRow := sheetNew.AddRow()
		frequencyRow := sheetNew.AddRow()
		unitRow := sheetNew.AddRow()
		lastModifyDateRow := sheetNew.AddRow()
		//获取分类下指标最大数据量
		dataMax, err := data_source.GetLongzhongSurveyDataMaxCount(v.ProductName)
		if err != nil {
			fmt.Println("获取指标最大数据量失败", err.Error())
			return
		}
		setRowIndex := 6
		for k, sv := range secNameList {

			windRow.AddCell().SetValue("隆众")
			secNameRow.AddCell().SetValue("指标名称")
			indexCodeRow.AddCell().SetValue("指标ID")
			frequencyRow.AddCell().SetValue("频率")
			unitRow.AddCell().SetValue("单位")
			lastModifyDateRow.AddCell().SetValue("更新时间")

			secNameRow.AddCell().SetValue(sv.SampleName + sv.BreedName + sv.Custom + sv.QuotaName)
			indexCodeRow.AddCell().SetValue(sv.LzCode)
			if sv.Frequency == 1 {
				frequencyRow.AddCell().SetValue("日度")
			} else if sv.Frequency == 2 {
				frequencyRow.AddCell().SetValue("周度")
			} else if sv.Frequency == 3 {
				frequencyRow.AddCell().SetValue("月度")
			} else if sv.Frequency == 4 {
				frequencyRow.AddCell().SetValue("季度")
			} else if sv.Frequency == 5 {
				frequencyRow.AddCell().SetValue("年度")
			} else if sv.Frequency == 99 {
				frequencyRow.AddCell().SetValue("无固定频率")
			}

			unitRow.AddCell().SetValue(sv.UnitName)
			lastModifyDateRow.AddCell().SetValue(sv.EndDate)

			windRow.AddCell()
			windRow.AddCell()
			secNameRow.AddCell()
			indexCodeRow.AddCell()
			frequencyRow.AddCell()
			unitRow.AddCell()
			lastModifyDateRow.AddCell()
			min := k * 3
			sheetNew.SetColWidth(min, min, 15)
			//获取数据
			dataList, err := data_source.GetLongzhongSurveyDataById(sv.SurveyProductId)
			if err != nil {
				br.Msg = "获取数据失败"
				br.ErrMsg = "获取数据失败,Err:" + err.Error()
				return
			}
			if len(dataList) <= 0 {
				for n := 0; n < dataMax; n++ {
					rowIndex := setRowIndex + n
					row := sheetNew.Row(rowIndex)
					row.AddCell()
					row.AddCell()
					row.AddCell()
				}
			} else {
				endRowIndex := 0
				for rk, dv := range dataList {
					rowIndex := setRowIndex + rk
					row := sheetNew.Row(rowIndex)
					displayDate, _ := time.Parse(utils.FormatDate, dv.DataTime)
					displayDateCell := row.AddCell()
					style := new(xlsx.Style)
					style.ApplyAlignment = true
					style.Alignment.WrapText = true
					displayDateCell.SetStyle(style)
					displayDateCell.SetDate(displayDate)

					row.AddCell().SetFloat(dv.InputValue)
					row.AddCell()
					endRowIndex = rowIndex
				}
				if len(dataList) < dataMax {
					dataLen := dataMax - len(dataList)
					for n := 0; n < dataLen; n++ {
						rowIndex := (endRowIndex + 1) + n
						row := sheetNew.Row(rowIndex)
						row.AddCell()
						row.AddCell()
						row.AddCell()
					}
				}
			}
		}
	}

	err = xlsxFile.Save(downLoadnFilePath)
	if err != nil {
		br.Msg = "保存文件失败"
		br.ErrMsg = "保存文件失败"
		return
	}
	fileName := "隆众调研数据" + time.Now().Format("200601021504") + ".xlsx"
	this.Ctx.Output.Download(downLoadnFilePath, fileName)
	defer func() {
		os.Remove(downLoadnFilePath)
	}()
	br.Ret = 200
	br.Success = true
	br.Msg = "success"
}

// TargetUnitList
// @Title 指标列表
// @Description 指标列表接口
// @Success 200 {object} []string
// @router /target/unit_list [get]
func (this *TargetController) TargetUnitList() {
	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
	}

	list, err := models.GetEdbUnitList()
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	edbUnitList := make([]string, 0)
	for _, unit := range list {
		edbUnitList = append(edbUnitList, unit.Unit)
	}

	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = edbUnitList
}

// TargetFrequencyList
// @Title 指标频度列表
// @Description 指标频度列表接口
// @Param   ClassifyId   query   int  true       "分类"
// @Success 200 {object} []string
// @router /target/frequency_list [get]
func (this *TargetController) TargetFrequencyList() {
	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
	}

	classifyId, _ := this.GetInt("ClassifyId") //分类
	if classifyId <= 0 {
		br.Msg = "分类ID必传"
		return
	}
	userId := sysUser.AdminId
	//超管账号可以查看分类下的所有频度数据
	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
		userId = 0
	}
	list, err := models.GetEdbFrequencyList(classifyId, userId)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	edbFrequencyList := make([]string, 0)
	for _, unit := range list {
		edbFrequencyList = append(edbFrequencyList, unit.Frequency)
	}
	edbFrequencyList = sortEdbFrequency(edbFrequencyList)

	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = edbFrequencyList
}

func sortEdbFrequency(frequencyList []string) (newFrequencyList []string) {
	var frequencyMap1 = map[string]int{
		"日度":  1,
		"周度":  2,
		"旬度":  3,
		"月度":  4,
		"季度":  5,
		"半年度": 6,
		"年度":  7,
	}

	var frequencyMap2 = map[int]string{
		1: "日度",
		2: "周度",
		3: "旬度",
		4: "月度",
		5: "季度",
		6: "半年度",
		7: "年度",
	}

	idList := make([]int, 0)
	for _, frequency := range frequencyList {
		idList = append(idList, frequencyMap1[frequency])
	}
	sort.Ints(idList)

	for _, id := range idList {
		newFrequencyList = append(newFrequencyList, frequencyMap2[id])
	}
	return
}

// TargetItemList
// @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/item_list [get]
func (this *TargetController) TargetItemList() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()

	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请重新登录"
		return
	}

	//频度
	frequency := this.GetString("Frequency")

	//关键字
	keyword := this.GetString("Keyword")
	//指标编码
	tradeCode := this.GetString("TradeCode")

	userId := sysUser.AdminId
	//超管账号可以查看分类下的所有频度数据
	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
		userId = 0
	}
	//获取账户所拥有权限的分类id集合
	classifyIdStrList, err := data.GetEdbClassifyListByAdminId(int64(userId))
	if err != nil {
		br.Msg = "获取分类数据失败"
		return
	}

	classifyId, _ := this.GetInt("ClassifyId")
	edbShowType, _ := this.GetInt("EdbShowType")

	list, err := models.GetTargetItemList(classifyId, edbShowType, frequency, keyword, tradeCode, classifyIdStrList)
	if err != nil {
		br.ErrMsg = "获取失败,Err:" + err.Error()
		br.Msg = "获取失败"
		return
	}
	edbTradeCodeList := make([]string, 0)
	//频度数据
	frequencyMap := make(map[string]int)
	for _, edb := range list {
		edbTradeCodeList = append(edbTradeCodeList, edb.TradeCode)
		frequencyMap[edb.Frequency] = 0
	}
	frequencyList := make([]string, 0)
	for k := range frequencyMap {
		frequencyList = append(frequencyList, k)
	}
	frequencyList = sortEdbFrequency(frequencyList)

	if len(edbTradeCodeList) > 0 {
		edbTradeCodeStr := `"` + strings.Join(edbTradeCodeList, `","`) + `"`
		edbDataList, err := models.GetEdbDataListByCodes(edbTradeCodeStr)
		if err != nil {
			br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
			br.Msg = "获取失败"
			return
		}
		edbDataMap := make(map[string][]*models.Edbdata, 0)
		for _, edbData := range edbDataList {
			if _, ok := edbDataMap[edbData.TradeCode]; ok {
				edbDataMap[edbData.TradeCode] = append(edbDataMap[edbData.TradeCode], edbData)
			} else {
				tmpEdbDataList := make([]*models.Edbdata, 0)
				tmpEdbDataList = append(tmpEdbDataList, edbData)
				edbDataMap[edbData.TradeCode] = tmpEdbDataList
			}
		}

		//nowWeek := time.Now().Weekday().String() //当前周几
		myYear := time.Now().Year()        //当前年份
		myMonth := time.Now().Format("01") //当前月份

		//当前周的周一与周日
		nowWeekFirstDay := utils.GetNowWeekMonday()
		nowWeekLastDay := utils.GetNowWeekLastDay()

		//当前月的一号与最后一天
		nowMonthFirstDay := utils.GetNowMonthFirstDay()
		nowMonthLastDay := utils.GetNowMonthLastDay()

		//当前季度的第一天与最后一天
		nowQuarterFirstDay := utils.GetNowQuarterFirstDay()
		nowQuarterLastDay := utils.GetNowQuarterLastDay()

		//当前半年的第一天与最后一天
		nowHalfYearFirstDay := utils.GetNowHalfYearFirstDay()
		nowHalfYearLastDay := utils.GetNowHalfYearLastDay()

		// 当前年的第一天与最后一天
		nowYearFirstDay := utils.GetNowYearFirstDay()
		nowYearLastDay := utils.GetNowYearLastDay()

		for _, edb := range list {
			edb.Status = "未完成"
			if dataList, ok := edbDataMap[edb.TradeCode]; ok {
				edb.DataList = dataList
				dataDtTime, _ := time.ParseInLocation(utils.FormatDate, dataList[0].Dt, time.Now().Location()) //最近的一条数据时间

				switch edb.Frequency {
				case "日度":
					if time.Now().After(dataDtTime.AddDate(0, 0, 1)) {
						edb.ModifyDate = time.Now().Format(utils.FormatDate)
					} else {
						edb.ModifyDate = dataDtTime.AddDate(0, 0, 1).Format(utils.FormatDate)
						edb.Status = "完成"
					}
				case "周度":
					//if edb.NoticeTime != "" {
					//	noticeArr := strings.Split(edb.NoticeTime, " ")
					//	noticeWeek := noticeArr[0]
					//	addDay := 0
					//
					//	if nowWeek == "Sunday" {
					//		if noticeWeek == "周日" {
					//			addDay = 0
					//		} else if noticeWeek == "周一" {
					//			addDay = 1
					//		} else if noticeWeek == "周二" {
					//			addDay = 2
					//		} else if noticeWeek == "周三" {
					//			addDay = 3
					//		} else if noticeWeek == "周四" {
					//			addDay = 4
					//		} else if noticeWeek == "周五" {
					//			addDay = 5
					//		} else if noticeWeek == "周六" {
					//			addDay = 6
					//		} else {
					//			addDay = 0
					//		}
					//	} else if nowWeek == "Monday" {
					//		if noticeWeek == "周日" {
					//			addDay = 6
					//		} else if noticeWeek == "周一" {
					//			addDay = 0
					//		} else if noticeWeek == "周二" {
					//			addDay = 1
					//		} else if noticeWeek == "周三" {
					//			addDay = 2
					//		} else if noticeWeek == "周四" {
					//			addDay = 3
					//		} else if noticeWeek == "周五" {
					//			addDay = 4
					//		} else if noticeWeek == "周六" {
					//			addDay = 5
					//		} else {
					//			addDay = 0
					//		}
					//	} else if nowWeek == "Tuesday" {
					//		if noticeWeek == "周日" {
					//			addDay = 5
					//		} else if noticeWeek == "周一" {
					//			addDay = 6
					//		} else if noticeWeek == "周二" {
					//			addDay = 0
					//		} else if noticeWeek == "周三" {
					//			addDay = 1
					//		} else if noticeWeek == "周四" {
					//			addDay = 2
					//		} else if noticeWeek == "周五" {
					//			addDay = 3
					//		} else if noticeWeek == "周六" {
					//			addDay = 4
					//		} else {
					//			addDay = 0
					//		}
					//	} else if nowWeek == "Wednesday" {
					//		if noticeWeek == "周日" {
					//			addDay = 4
					//		} else if noticeWeek == "周一" {
					//			addDay = 5
					//		} else if noticeWeek == "周二" {
					//			addDay = 6
					//		} else if noticeWeek == "周三" {
					//			addDay = 0
					//		} else if noticeWeek == "周四" {
					//			addDay = 1
					//		} else if noticeWeek == "周五" {
					//			addDay = 2
					//		} else if noticeWeek == "周六" {
					//			addDay = 3
					//		} else {
					//			addDay = 0
					//		}
					//	} else if nowWeek == "Thursday" {
					//		if noticeWeek == "周日" {
					//			addDay = 3
					//		} else if noticeWeek == "周一" {
					//			addDay = 4
					//		} else if noticeWeek == "周二" {
					//			addDay = 5
					//		} else if noticeWeek == "周三" {
					//			addDay = 6
					//		} else if noticeWeek == "周四" {
					//			addDay = 0
					//		} else if noticeWeek == "周五" {
					//			addDay = 1
					//		} else if noticeWeek == "周六" {
					//			addDay = 2
					//		} else {
					//			addDay = 0
					//		}
					//	} else if nowWeek == "Friday" {
					//		if noticeWeek == "周日" {
					//			addDay = 2
					//		} else if noticeWeek == "周一" {
					//			addDay = 3
					//		} else if noticeWeek == "周二" {
					//			addDay = 4
					//		} else if noticeWeek == "周三" {
					//			addDay = 5
					//		} else if noticeWeek == "周四" {
					//			addDay = 6
					//		} else if noticeWeek == "周五" {
					//			addDay = 0
					//		} else if noticeWeek == "周六" {
					//			addDay = 1
					//		} else {
					//			addDay = 0
					//		}
					//	} else if nowWeek == "Saturday" {
					//		if noticeWeek == "周日" {
					//			addDay = 1
					//		} else if noticeWeek == "周一" {
					//			addDay = 2
					//		} else if noticeWeek == "周二" {
					//			addDay = 3
					//		} else if noticeWeek == "周三" {
					//			addDay = 4
					//		} else if noticeWeek == "周四" {
					//			addDay = 5
					//		} else if noticeWeek == "周五" {
					//			addDay = 6
					//		} else if noticeWeek == "周六" {
					//			addDay = 0
					//		} else {
					//			addDay = 0
					//		}
					//	}
					//
					//	modifyDate := time.Now().AddDate(0, 0, addDay)
					//	if modifyDate.After(dataDtTime.AddDate(0, 0, 1)) {
					//		edb.ModifyDate = modifyDate.Format(utils.FormatDate)
					//	} else {
					//		edb.ModifyDate = modifyDate.AddDate(0, 0, 7).Format(utils.FormatDate)
					//		edb.Status = "完成"
					//	}
					//} else {
					//	if startWeekDay.Unix() <= dataDtTime.Unix() {
					//		edb.ModifyDate = endWeekDay.AddDate(0, 0, 7).Format(utils.FormatDate)
					//		edb.Status = "完成"
					//	} else {
					//		edb.ModifyDate = endWeekDay.Format(utils.FormatDate)
					//	}
					//}

					modifyDate := nowWeekLastDay //下次更新日期
					if edb.NoticeTime != "" {
						addDay := 7
						noticeArr := strings.Split(edb.NoticeTime, " ")
						noticeWeek := noticeArr[0]
						switch noticeWeek {
						case "周一":
							addDay = 1
						case "周二":
							addDay = 2
						case "周三":
							addDay = 3
						case "周四":
							addDay = 4
						case "周五":
							addDay = 5
						case "周六":
							addDay = 6
						case "周日":
							addDay = 7
						}
						modifyDate = modifyDate.AddDate(0, 0, addDay-7)
					}
					if nowWeekFirstDay.Before(dataDtTime) {
						edb.ModifyDate = modifyDate.AddDate(0, 0, 7).Format(utils.FormatDate)
						edb.Status = "完成"
					} else {
						edb.ModifyDate = modifyDate.Format(utils.FormatDate)
					}
				case "月度":
					addDay := 0
					modifyDate := nowMonthLastDay //下次更新日期
					if edb.NoticeTime != "" {
						strArr := strings.Split(edb.NoticeTime, "日")
						tmpAddDay, tmpErr := strconv.Atoi(strArr[0])
						if tmpErr != nil {
							continue
						}
						addDay = tmpAddDay - 1
						modifyDate = nowMonthFirstDay.AddDate(0, 0, addDay)
					}

					if nowMonthFirstDay.Before(dataDtTime) {
						if int(time.Now().Month()) != int(nowMonthFirstDay.Month()) {
							edb.ModifyDate = nowMonthLastDay.Format(utils.FormatDate)
						} else {
							month := nowMonthLastDay.Month() + 1
							edb.ModifyDate = time.Date(nowMonthLastDay.Year(), month, 1, 0, 0, 0, 0, modifyDate.Location()).AddDate(0, 1, -1).Format(utils.FormatDate)
						}
						edb.Status = "完成"
					} else {
						edb.ModifyDate = modifyDate.Format(utils.FormatDate)
					}
				case "季度":
					//每季度更新数据时间
					if nowQuarterFirstDay.After(dataDtTime) {
						edb.ModifyDate = nowQuarterLastDay.Format(utils.FormatDate)
					} else {
						edb.ModifyDate = nowQuarterLastDay.AddDate(0, 3, 0).Format(utils.FormatDate)
						edb.Status = "完成"
					}
				case "半年度":
					//每半年度更新数据时间
					if nowHalfYearFirstDay.After(dataDtTime) {
						edb.ModifyDate = nowHalfYearLastDay.Format(utils.FormatDate)
					} else {
						month := nowHalfYearLastDay.Month() + 1
						edb.ModifyDate = time.Date(nowMonthLastDay.Year(), month, 1, 0, 0, 0, 0, nowHalfYearLastDay.Location()).AddDate(0, 6, -1).Format(utils.FormatDate)
						edb.Status = "完成"
					}
				case "年度":
					//每年度更新数据时间
					if nowYearFirstDay.After(dataDtTime) {
						edb.ModifyDate = nowYearLastDay.Format(utils.FormatDate)
					} else {
						edb.ModifyDate = nowYearLastDay.AddDate(1, 0, 0).Format(utils.FormatDate)
						edb.Status = "完成"
					}
				}
			} else {
				edb.DataList = make([]*models.Edbdata, 0)
				switch edb.Frequency {
				case "日度":
					edb.ModifyDate = time.Now().Format(utils.FormatDate)
				case "周度":
					modifyDate := nowWeekLastDay //下次更新日期
					if edb.NoticeTime != "" {
						addDay := 7
						noticeArr := strings.Split(edb.NoticeTime, " ")
						noticeWeek := noticeArr[0]
						switch noticeWeek {
						case "周一":
							addDay = 1
						case "周二":
							addDay = 2
						case "周三":
							addDay = 3
						case "周四":
							addDay = 4
						case "周五":
							addDay = 5
						case "周六":
							addDay = 6
						case "周日":
							addDay = 7
						}
						modifyDate = modifyDate.AddDate(0, 0, addDay-7)
					}
					edb.ModifyDate = modifyDate.Format(utils.FormatDate)
				case "月度":
					if edb.NoticeTime != "" {
						var modifyDateStr string
						strArr := strings.Split(edb.NoticeTime, "日")
						modifyDateStr = strconv.Itoa(myYear) + "-" + myMonth + "-" + strArr[0]
						edb.ModifyDate = modifyDateStr
					} else {
						edb.ModifyDate = nowMonthFirstDay.AddDate(0, 1, -1).Format(utils.FormatDate)
					}
				case "季度":
					edb.ModifyDate = utils.GetNowQuarterLastDay().Format(utils.FormatDate)
				case "半年度":
					edb.ModifyDate = utils.GetNowHalfYearLastDay().Format(utils.FormatDate)
				case "年度":
					edb.ModifyDate = utils.GetNowYearLastDay().Format(utils.FormatDate)
				}
			}
		}
	}

	resp := models.TargetItemListResp{
		List:          list,
		FrequencyList: frequencyList,
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	//br.Data = resp
	br.Data = resp
}

// TargetItemNameList
// @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/item_name_list [get]
func (this *TargetController) TargetItemNameList() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()

	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请重新登录"
		return
	}

	//频度
	frequency := this.GetString("Frequency")

	//关键字
	keyword := this.GetString("Keyword")
	//指标编码
	tradeCode := this.GetString("TradeCode")

	userId := sysUser.AdminId
	//超管账号可以查看分类下的所有频度数据
	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
		userId = 0
	}
	//获取账户所拥有权限的分类id集合
	classifyIdStrList, err := data.GetEdbClassifyListByAdminId(int64(userId))
	if err != nil {
		br.Msg = "获取分类数据失败"
		return
	}
	classifyId, _ := this.GetInt("ClassifyId")
	edbShowType, _ := this.GetInt("EdbShowType")

	list, err := models.GetTargetItemList(classifyId, edbShowType, frequency, keyword, tradeCode, classifyIdStrList)
	if err != nil {
		br.ErrMsg = "获取失败,Err:" + err.Error()
		br.Msg = "获取失败"
		return
	}

	resp := models.TargetItemListResp{
		List: list,
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	//br.Data = resp
	br.Data = resp
}

// BatchDataDeleteByDate
// @Title 根据日期批量删除指标的数据
// @Description 根据日期批量删除指标的数据接口
// @Param	request	body models.BatchDataDeleteReq true "type json string"
// @Success 200 Ret=200 删除数据成功
// @router /data/batch_delete_by_date [post]
func (this *TargetController) BatchDataDeleteByDate() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req models.BatchDataDeleteReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	if len(req.TradeCodeList) <= 0 {
		br.Msg = "至少传入一个指标编码!"
		return
	}

	if req.CreateDate == "" {
		br.Msg = "请选择日期"
		return
	}

	TradeCodeStr := `"` + strings.Join(req.TradeCodeList, `","`) + `"`

	//删除数据
	err = models.BatchDeleteEdbDataByDate(TradeCodeStr, req.CreateDate, this.SysUser.AdminId)
	if err != nil {
		br.Msg = "删除失败!"
		br.ErrMsg = "删除失败,Err:" + err.Error()
		return
	}

	br.Ret = 200
	br.Success = true
	br.Msg = "删除成功"
}

// BatchDataDeleteByTradeCode
// @Title 批量删除指标的数据
// @Description 批量删除指标的数据接口
// @Param	request	body models.TargetDeleteReq true "type json string"
// @Success 200 Ret=200 删除数据成功
// @router /data/batch_delete [post]
func (this *TargetController) BatchDataDeleteByTradeCode() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	var req models.TargetDeleteReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}

	if req.TradeCode == "" {
		br.Msg = "指标编码不可为空"
		return
	}

	//删除数据
	err = models.BatchDeleteEdbData(req.TradeCode, this.SysUser.AdminId)
	if err != nil {
		br.Msg = "删除失败!"
		br.ErrMsg = "删除失败,Err:" + err.Error()
		return
	}

	br.Ret = 200
	br.Success = true
	br.Msg = "删除成功"
}

// EdbTemplateDownload
// @Title 下载指标导入模板
// @Description 下载指标导入模板
// @router /target/template [get]
func (this *TargetCommonController) EdbTemplateDownload() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	this.Ctx.Output.Download("./static/指标导入模板.xlsx", "指标导入模板.xlsx")
	br.Ret = 200
	br.Success = true
	br.Msg = "下载成功"
}

// ImportTarget
// @Title 导入指标
// @Description 导入指标接口
// @Success 200 Ret=200 导入成功
// @router /target/import [post]
func (this *TargetController) ImportTarget() {
	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("ImportTargetFile")
	if err != nil {
		br.Msg = "获取文件失败"
		br.ErrMsg = "获取文件失败,Err:" + err.Error()
		return
	}
	path := "./static/手工指标数据导入_" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
	defer func() {
		file.Close()
		os.Remove(path)
	}()
	err = this.SaveToFile("ImportTargetFile", path)
	if err != nil {
		br.Msg = "文件保存失败"
		br.ErrMsg = "文件保存失败,Err:" + err.Error()
		return
	}
	xlFile, err := xlsx.OpenFile(path)
	if err != nil {
		fmt.Println(err.Error())
		br.Msg = "excel打开失败"
		br.ErrMsg = "excel打开失败,Err:" + err.Error()
		return
	}

	//分类map
	classifyMap := make(map[string]*models.EdbdataClassify)
	//获取当前账号拥有的所有分类权限
	userId := sysUser.AdminId
	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
		userId = 0
	}
	classifyList, err := models.GetEdbdataClassify(int64(userId))
	for _, classify := range classifyList {
		if classify.Child != nil {
			for _, child := range classify.Child {
				classifyMap[child.ClassifyName] = child
			}
		}
	}

	failDatas := make([]*models.EdbImportFail, 0)
	// 遍历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) >= 4 {
					cell1 := cells[0].Value //指标名称
					secName := strings.Trim(cell1, " ")
					if secName == "" { //过滤空白行
						continue
					}

					cell2 := cells[1].Value
					frequency := strings.Trim(cell2, " ") //频度

					classifyName := cells[2].Value //分类
					classifyName = strings.Trim(classifyName, " ")

					unit := cells[3].Value //单位
					unit = strings.Trim(unit, " ")

					//获取分类
					classify, ok := classifyMap[classifyName]
					if !ok {
						failItem := &models.EdbImportFail{
							ClassifyName: classifyName,
							Frequency:    frequency,
							SecName:      secName,
							Unit:         unit,
							Remark:       "分类不存在",
							SysUserId:    strconv.Itoa(sysUser.AdminId),
						}
						failDatas = append(failDatas, failItem)
						continue
					}

					tradeCode, err := models.GetMaxTradeCode()
					if err != nil {
						failItem := &models.EdbImportFail{
							ClassifyName: classifyName,
							Frequency:    frequency,
							SecName:      secName,
							Unit:         unit,
							Remark:       "获取数据失败",
							SysUserId:    strconv.Itoa(sysUser.AdminId),
						}
						failDatas = append(failDatas, failItem)
						continue
						//br.Msg = "获取数据失败"
						//br.ErrMsg = "获取最大交易编码失败,Err:" + err.Error()
						//return
					}

					if tradeCode == "" {
						failItem := &models.EdbImportFail{
							ClassifyName: classifyName,
							Frequency:    frequency,
							SecName:      secName,
							Unit:         unit,
							Remark:       "数据异常",
							SysUserId:    strconv.Itoa(sysUser.AdminId),
						}
						failDatas = append(failDatas, failItem)
						continue
					}
					maxTradeCode, err := utils.GetMaxTradeCode(tradeCode)
					if err != nil {
						failItem := &models.EdbImportFail{
							ClassifyName: classifyName,
							Frequency:    frequency,
							SecName:      secName,
							Unit:         unit,
							Remark:       "数据异常",
							SysUserId:    strconv.Itoa(sysUser.AdminId),
						}
						failDatas = append(failDatas, failItem)
						continue
						//br.Msg = "数据异常"
						//br.ErrMsg = "获取编码信息失败,Err:" + err.Error()
						//return
					}
					if maxTradeCode == "" {
						failItem := &models.EdbImportFail{
							ClassifyName: classifyName,
							Frequency:    frequency,
							SecName:      secName,
							Unit:         unit,
							Remark:       "编码为空,请联系技术",
							SysUserId:    strconv.Itoa(sysUser.AdminId),
						}
						failDatas = append(failDatas, failItem)
						continue
						//br.Msg = "编码为空,请联系技术"
						//br.ErrMsg = "编码为空,请联系技术"
						//return
					}
					if secName == "" {
						failItem := &models.EdbImportFail{
							ClassifyName: classifyName,
							Frequency:    frequency,
							SecName:      secName,
							Unit:         unit,
							Remark:       "指标名称不能为空",
							SysUserId:    strconv.Itoa(sysUser.AdminId),
						}
						failDatas = append(failDatas, failItem)
						continue
						//br.Msg = "指标名称不能为空"
						//return
					}
					item, err := models.GetEdbinfoBySecName(secName)
					if err != nil && err.Error() != utils.ErrNoRow() {
						failItem := &models.EdbImportFail{
							ClassifyName: classifyName,
							Frequency:    frequency,
							SecName:      secName,
							Unit:         unit,
							Remark:       "获取信息失败",
							SysUserId:    strconv.Itoa(sysUser.AdminId),
						}
						failDatas = append(failDatas, failItem)
						continue
						//br.Msg = "获取信息失败!"
						//br.ErrMsg = "获取信息失败,Err:" + err.Error()
						//return
					}
					//存在该指标,那么退出当前循环,进入下一循环
					if item != nil {
						failItem := &models.EdbImportFail{
							ClassifyName: classifyName,
							Frequency:    frequency,
							SecName:      secName,
							Unit:         unit,
							Remark:       "指标已存在",
							SysUserId:    strconv.Itoa(sysUser.AdminId),
						}
						failDatas = append(failDatas, failItem)
						continue
					}
					err = models.AddEdbinfo(maxTradeCode, secName, unit, "手动", frequency, "", classify.ClassifyId, sysUser.AdminId, sysUser.RealName)
					if err != nil {
						failItem := &models.EdbImportFail{
							ClassifyName: classifyName,
							Frequency:    frequency,
							SecName:      secName,
							Unit:         unit,
							Remark:       "导入失败",
							SysUserId:    strconv.Itoa(sysUser.AdminId),
						}
						failDatas = append(failDatas, failItem)
						continue

						//br.Msg = "导入失败"
						//br.ErrMsg = "导入失败,Err:" + err.Error()
						//return
					}
					err = models.AddEdbinfoUser(maxTradeCode, sysUser.Mobile)
					if err != nil {
						failItem := &models.EdbImportFail{
							ClassifyName: classifyName,
							Frequency:    frequency,
							SecName:      secName,
							Unit:         unit,
							Remark:       "创建账号关系失败",
							SysUserId:    strconv.Itoa(sysUser.AdminId),
						}
						failDatas = append(failDatas, failItem)
						continue
						//br.Msg = "导入失败"
						//br.ErrMsg = "导入失败,Err:" + err.Error()
						//return
					}
				}
			}
		}
	}

	resp := new(models.EdbdataImportResp)
	if len(failDatas) > 0 {
		//先删除导入失败记录
		_ = models.DelEdbImportFail(sysUser.AdminId)
		//错误信息字符串切片,最后作为发送邮件通知使用
		failContents := make([]string, 0)
		for _, v := range failDatas {
			failContents = append(failContents, fmt.Sprint(v.SecName, "导入失败:", v.Remark))
			err = models.AddEdbImportFail(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("导入数据 存在部分数据导入失败,Err:"+err.Error(), 3)
		//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入指标 存在部分数据导入失败:"+strings.Join(failContents, ";"), utils.EmailSendToUsers)

		resp.Status = 1
		resp.Msg = "存在部分导入失败"
	} else {
		resp.Status = 0
	}

	br.Ret = 200
	br.Success = true
	br.Msg = "导入成功"
	br.Data = resp
}

// ImportTargetFailListDownload
// @Title 下载指标数据导入失败列表
// @Description 下载指标数据导入失败列表
// @router /import_target/failList [get]
func (this *TargetController) ImportTargetFailListDownload() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请重新登录"
		return
	}
	item, err := models.GetEdbImportFailList(sysUser.AdminId)
	if err != nil {
		br.Msg = "获取数据失败"
		br.Msg = "获取数据失败,Err:" + err.Error()
		return
	}
	xlsxFile := xlsx.NewFile()
	sheet, err := xlsxFile.AddSheet("导入失败数据")
	headRow := sheet.AddRow()
	headRow.AddCell().SetValue("指标名称")
	headRow.AddCell().SetValue("频度")
	headRow.AddCell().SetValue("品种分类")
	headRow.AddCell().SetValue("单位")
	headRow.AddCell().SetValue("备注")
	for _, v := range item {
		row := sheet.AddRow()
		row.AddCell().SetValue(v.SecName)
		row.AddCell().SetValue(v.Frequency)
		row.AddCell().SetValue(v.ClassifyName)
		row.AddCell().SetValue(v.Unit)
		row.AddCell().SetValue(v.Remark)
	}
	fileName := time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
	savePath := "./static/" + fileName
	err = xlsxFile.Save(savePath)
	if err != nil {
		br.Msg = "文件保存失败"
		br.ErrMsg = "文件保存失败,Err:" + err.Error()
		return
	}
	defer func() {
		os.Remove(savePath)
	}()
	this.Ctx.Output.Download(savePath, "失败列表.xlsx")
}

// ExcelDataAdd
// @Title 复制EXCEL数据保存
// @Description 复制EXCEL数据保存
// @Param  request	body models.ExcelStyleReq true "type json string"
// @Success 200
// @router /target/excel_style/add [post]
func (this *TargetController) ExcelDataAdd() {
	br := new(models.BaseResponse).Init()
	var err error
	errs := make([]string, 0)
	defer func() {
		if len(errs) > 0 {
			go alarm_msg.SendAlarmMsg("新增复制EXCEL数据 新增或修改数据失败,Err:"+strings.Join(errs, ","), 3)
		}
		this.Data["json"] = br
		this.ServeJSON()
	}()

	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请重新登录"
		return
	}

	//频度
	//frequency := this.GetString("Frequency")
	//
	//关键字
	//keyword := this.GetString("Keyword")
	//指标编码
	//tradeCode := this.GetString("TradeCode")
	//
	//userId := sysUser.AdminId
	//超管账号可以查看分类下的所有频度数据
	//if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
	//	userId = 0
	//}
	//
	//list, err := models.GetExcelData()
	//if err != nil {
	//	br.ErrMsg = "获取失败,Err:" + err.Error()
	//	br.Msg = "获取失败"
	//	return
	//}

	var req data_manage.ExcelStyleReq
	err = json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	//指标map
	targetMap := make(map[string]*models.Edbinfo)
	var cellDataList []map[string]interface{}
	var dataList [][]map[string]interface{}
	//var configList []map[string]interface{}
	for _, item := range req.CellData {
		v := item.(map[string]interface{})
		cellDataList = append(cellDataList, v)
	}

	valueIndex := 0

	var secNameList []string
	var frequencyList []string
	var unitList []string

	var dateList []string
	dateValueMap := make(map[string]map[int]string)
	//取到所有数据
	for i := range req.Data {
		//取到一行
		if i > 4 {
			//先拿下日期列表
			if req.Data[i] == nil || req.Data[i][0] == nil {
				continue
			}
			//fmt.Println("i:", i)
			//fmt.Println(req.Data[i])
			//fmt.Println(req.Data[i][0])
			dateMap := req.Data[i][0].(map[string]interface{})
			_, ok := dateMap["m"]
			if ok {
				dateList = append(dateList, dateMap["m"].(string))
				//fmt.Println("dateList:", dateList)
			} else {
				continue
			}
		}
		for j, dataArr := range req.Data[i] {
			//每一列
			if dataArr == nil {
				continue
			}
			dataMap := dataArr.(map[string]interface{})
			if dataList == nil {
				dataList = make([][]map[string]interface{}, len(req.Data))
			}
			if dataList[i] == nil {
				dataList[i] = make([]map[string]interface{}, len(req.Data[i]))
			}
			dataList[i][j] = dataMap
			//fmt.Println("dataMap", dataMap["m"])
			v, _ := dataMap["m"]
			//指标名称列表
			if v == "指标名称" {
				for nameIndex := 1; nameIndex < len(req.Data[i]); nameIndex++ {
					if req.Data[i][nameIndex] == nil {
						break
					}
					secNameMap := req.Data[i][nameIndex].(map[string]interface{})
					secName, _ := secNameMap["m"]
					if secName == nil {
						continue
					}
					secNameList = append(secNameList, secNameMap["m"].(string))
					//fmt.Println("secName:", secNameList)
				}
			}
			//频度列表
			if v == "频度" {
				for nameIndex := 1; nameIndex < len(req.Data[i]); nameIndex++ {
					if req.Data[i][nameIndex] == nil {
						break
					}
					frequencyMap := req.Data[i][nameIndex].(map[string]interface{})
					frequency, _ := frequencyMap["m"]
					if frequency == nil {
						continue
					}
					frequencyList = append(frequencyList, frequencyMap["m"].(string))
					//fmt.Println("frequencyList:", frequencyList)
				}
			}
			//单位列表
			if v == "单位" {
				for nameIndex := 1; nameIndex < len(req.Data[i]); nameIndex++ {
					if req.Data[i][nameIndex] == nil {
						break
					}
					unitMap := req.Data[i][nameIndex].(map[string]interface{})
					unit, _ := unitMap["m"]
					if unit == nil {
						continue
					}
					unitList = append(unitList, unitMap["m"].(string))
					//fmt.Println("unitList:", unitList)
				}
			}
			//数据列表
			//var valueList []string
			valueListMap := make(map[int]string)
			if i > 4 {
				for index := 1; index < len(req.Data[i]); index++ {
					if req.Data[i][index] == nil {
						continue
					}
					valueMap := req.Data[i][index].(map[string]interface{})
					value, _ := valueMap["m"]
					if value == nil {
						continue
					}
					valueListMap[index] = 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)
							valueListMap[index] = strconv.FormatFloat(floatValue, 'f', -1, 64)
						}
					}

					//valueList = append(valueList, valueMap["m"].(string))
					//fmt.Println("valueList:", valueList)
				}
				dateMap := req.Data[i][0].(map[string]interface{})
				date := dateMap["m"].(string)
				dateValueMap[date] = valueListMap
			}
		}

		//firstCell := req.Data[i][0]
		//if firstCell == nil {
		//	continue
		//}
		//dataMap := firstCell.(map[string]interface{})
		//if dataList == nil {
		//	dataList = make([][]map[string]interface{}, len(req.Data[i]))
		//}
		//if dataList[i] == nil {
		//	dataList[i] = make([]map[string]interface{}, len(req.Data[i]))
		//}
		//dataList[i][0] = dataMap
		//fmt.Println("dataMap", dataMap["m"])
		//v, _ := dataMap["m"]
		////指标名称
		//if v == "指标名称" {
		//	secNameMap := req.Data[i][1].(map[string]interface{})
		//	secName = secNameMap["m"].(string)
		//	fmt.Println("secName:", secName)
		//}
		////频度
		//if v == "频度" {
		//	frequencyMap := req.Data[i][1].(map[string]interface{})
		//	frequency = frequencyMap["m"].(string)
		//	fmt.Println("frequency:", frequency)
		//}
		////单位
		//if v == "单位" {
		//	unitMap := req.Data[i][1].(map[string]interface{})
		//	unit = unitMap["m"].(string)
		//	fmt.Println("unit:", unit)
		//}
		//
		////日期
		//dateMap := req.Data[i][1].(map[string]interface{})
		//createDate = dateMap["m"].(string)
		//
		////值
		//valueMap := req.Data[i][valueIndex].(map[string]interface{})
		//closeVal = valueMap["m"].(string)

		//新增指标
		//errMsg := services.AddEdbItem(secName, unit, frequency, req.ClassifyId, sysUser)
		//if errMsg == "" {
		//	br.Msg = "新增指标异常!"
		//	br.ErrMsg = errMsg
		//	return
		//}

		valueIndex++
	}

	//var excelId int64
	//保存EXCEL样式
	//{
	//	cellData, err := json.Marshal(cellDataList)
	//	if err != nil {
	//		br.Msg = "参数解析异常!"
	//		br.ErrMsg = "参数解析失败,Err:" + err.Error()
	//		return
	//	}
	//	config, err := json.Marshal(req.Config)
	//	if err != nil {
	//		br.Msg = "参数解析异常!"
	//		br.ErrMsg = "参数解析失败,Err:" + err.Error()
	//		return
	//	}
	//	datas, err := json.Marshal(dataList)
	//	if err != nil {
	//		br.Msg = "参数解析异常!"
	//		br.ErrMsg = "参数解析失败,Err:" + err.Error()
	//		return
	//	}
	//	excelItem := data_manage.ExcelStyle{
	//		CellData: string(cellData),
	//		Config:   string(config),
	//		Data:     string(datas),
	//	}
	//	excelId, err = models.AddExcelData(&excelItem)
	//	if err != nil {
	//		br.ErrMsg = "获取失败,Err:" + err.Error()
	//		br.Msg = "获取失败"
	//		return
	//	}
	//
	//	//判断映射表是否已经存在
	//	count, err := data_manage.GetExcelEdbdataMappingCount(req.ClassifyId, target.TradeCode, frequency)
	//	if err != nil {
	//		br.ErrMsg = "GetExcelEdbdataMappingCount,Err:" + err.Error()
	//		br.Msg = "新增映射表失败"
	//		return
	//	}
	//	mappingItem := data_manage.ExcelEdbdataMapping{
	//		ExcelId:    excelId,
	//		ClassifyId: req.ClassifyId,
	//		Frequency:  frequency,
	//		TradeCode:  target.TradeCode,
	//		CreateTime: time.Now(),
	//	}
	//	if count == 0{
	//		//新增
	//		err := data_manage.AddExcelEdbdataMapping(&mappingItem)
	//		if err != nil {
	//			br.ErrMsg = "AddExcelEdbdataMapping,Err:" + err.Error()
	//			br.Msg = "新增映射表失败"
	//			return
	//		}
	//	}
	//}

	// 所有的指标数据map
	edbCodeDataMap := make(map[string]map[string]string)

	addEdbTradeMap := make(map[string]bool)
	updateEdbTradeMap := make(map[string]bool)
	updateDataTradeMap := make(map[string]bool)
	defer func() {
		go func(addEdbTradeMap, updateEdbTradeMap, updateDataTradeMap map[string]bool) {
			addRecordList := make([]*models.EdbinfoOpRecord, 0)
			for tradeCode := range addEdbTradeMap {
				addRecordList = append(addRecordList, &models.EdbinfoOpRecord{
					TradeCode:  tradeCode,
					Remark:     "创建指标",
					UserId:     sysUser.AdminId,
					UserName:   sysUser.RealName,
					CreateTime: time.Now(),
				})
			}
			for tradeCode := range updateEdbTradeMap {
				addRecordList = append(addRecordList, &models.EdbinfoOpRecord{
					TradeCode:  tradeCode,
					Remark:     "编辑指标",
					UserId:     sysUser.AdminId,
					UserName:   sysUser.RealName,
					CreateTime: time.Now(),
				})
			}
			for tradeCode := range updateDataTradeMap {
				addRecordList = append(addRecordList, &models.EdbinfoOpRecord{
					TradeCode:  tradeCode,
					Remark:     "更新数据",
					UserId:     sysUser.AdminId,
					UserName:   sysUser.RealName,
					CreateTime: time.Now(),
				})
			}
			if len(addRecordList) > 0 {
				obj := models.EdbinfoOpRecord{}
				_ = obj.MulCreate(addRecordList)
			}

			//将该指标的code加入到 “手工数据导入后刷新” 缓存
			if utils.Re == nil {
				for tradeCode := range updateDataTradeMap {
					// 更新手工数据的最大最小值
					data.ModifyManualEdbMaxMinDate(tradeCode)
					//将该指标的code加入到 “手工数据导入后刷新” 缓存
					err := utils.Rc.LPush(utils.CACHE_IMPORT_MANUAL_DATA, tradeCode)
					if err != nil {
						fmt.Println("CACHE_IMPORT_MANUAL_DATA LPush Err:" + err.Error())
					}
				}

			}
		}(addEdbTradeMap, updateEdbTradeMap, updateDataTradeMap)
	}()

	//超管账号可以查看分类下的所有频度数据
	userId := sysUser.AdminId
	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
		userId = 0
	}

	//获取账户所拥有权限的分类id集合
	classifyIdList, err := data.GetUserManualClassifyIdList(userId)
	if err != nil {
		br.Msg = "获取分类数据失败"
		br.Msg = "获取拥有的分类数据失败,Err:" + err.Error()
		return
	}
	if !utils.InArrayByInt(classifyIdList, req.ClassifyId) {
		br.Msg = "无权访问"
		br.ErrMsg = "无权访问"
		br.IsSendEmail = false
		return
	}

	//操作指标,新增指标及数据等
	{
		for i := 0; i < len(secNameList); i++ {
			//fmt.Println("len(secNameList):", len(secNameList))
			secName := secNameList[i]
			frequency := frequencyList[i]

			//防止填了指标名称后没填单位报错
			if len(unitList) < len(secNameList) {
				br.Msg = "单位填写异常!"
				br.ErrMsg = "单位填写异常!"
				return
			}
			unit := unitList[i]

			for j, s := range dateList {
				var closeVal string
				//valueList, ok := dateValueMap[s]
				valueMap, ok := dateValueMap[s]
				//fmt.Println("valueMap:", valueMap)
				if ok {
					createDate := dateList[j]
					//if i < len(valueList) {
					//	closeVal = valueList[i]
					//} else {
					//	continue
					//}
					closeVal, ok = valueMap[i+1]
					target, ok2 := targetMap[secName]
					if !ok2 {
						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, req.ClassifyId, sysUser.AdminId, sysUser.RealName)
								if tmpErr != nil {
									//fmt.Println("AddEdbInfo err:", err.Error())
									utils.FileLogData.Error("AddEdbInfo err :%s", tmpErr.Error())
									continue
								}
								tmpTarget, tmpErr := models.GetTargetBySecName(secName)
								target = tmpTarget
								targetMap[secName] = target

								// 指标新增
								addEdbTradeMap[target.TradeCode] = true
							} else {
								fmt.Println("导入数据 获取指标:Err:" + err.Error())
							}
						} else {
							target = tmpTarget
							targetMap[secName] = target
						}
					}

					// 没有该分类品种权限的话,那么就过滤
					if !utils.InArrayByInt(classifyIdList, target.ClassifyId) {
						continue
					}

					// 指标信息变更,需要更新
					if frequency != target.Frequency || unit != target.Unit || req.ClassifyId != target.ClassifyId {
						fmt.Println("更新指标频度或单位")
						err = models.ModifyEdbinfo(target.TradeCode, unit, frequency, req.ClassifyId)
						if err != nil {
							fmt.Println("EditEdbinfo err:", err.Error())
							return
						}
						// 指标信息变更
						if _, isAdd := addEdbTradeMap[target.TradeCode]; !isAdd {
							updateEdbTradeMap[target.TradeCode] = true
						}
					}

					//判断指标数据是否已经存在
					tmpDataMap, ok2 := edbCodeDataMap[target.TradeCode]
					if !ok2 {
						tmpDataMap = make(map[string]string)
						targetDataList, tmpErr := models.GetTargetsDataList(target.TradeCode)
						if tmpErr != nil {
							err = tmpErr
						}
						for _, tmpData := range targetDataList {
							tmpDataMap[tmpData.Dt] = tmpData.Close
						}
						edbCodeDataMap[target.TradeCode] = tmpDataMap
					}

					//判断数据是否已经存在
					tmpVal, ok3 := tmpDataMap[createDate]
					//数据已存在,进行更新操作
					if ok3 {
						if closeVal != "" {
							// 库里面的数据
							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(target.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)
								}
								// 指标数据变更
								updateDataTradeMap[target.TradeCode] = true
							}
						} else {
							fmt.Println("删除数值")
							err = models.DeleteTargetsDataByImport(target.TradeCode, createDate)
							if err != nil {
								fmt.Println("DeleteTargetsDataByImport err:", err.Error())
								errs = append(errs, err.Error())
								//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 修改数据失败:Err:"+err.Error(), utils.EmailSendToUsers)
							}
							// 指标数据变更
							updateDataTradeMap[target.TradeCode] = true
						}
					} else { //数据不存在,进行新增操作
						if target.TradeCode != "" && createDate != "" && closeVal != "" {
							fmt.Println("新增")
							models.AddTargetsDataByImport(target.TradeCode, createDate, closeVal)
							if err != nil {
								fmt.Println("AddTargetsDataByImport err:", err.Error())
								errs = append(errs, err.Error())
								//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 新增数据失败:Err:"+err.Error(), utils.EmailSendToUsers)
							}

							tmpDataMap[createDate] = closeVal
							edbCodeDataMap[target.TradeCode] = tmpDataMap
							// 指标数据变更
							updateDataTradeMap[target.TradeCode] = true
						}
					}

					//保存关联表
					//{
					//	//判断映射表是否已经存在
					//	count, err := data_manage.GetExcelEdbdataMappingCount(req.ClassifyId, target.TradeCode, frequency)
					//	if err != nil {
					//		br.ErrMsg = "GetExcelEdbdataMappingCount,Err:" + err.Error()
					//		br.Msg = "新增映射表失败"
					//		return
					//	}
					//	mappingItem := data_manage.ExcelEdbdataMapping{
					//		ExcelId:    excelId,
					//		ClassifyId: req.ClassifyId,
					//		Frequency:  frequency,
					//		TradeCode:  target.TradeCode,
					//		CreateTime: time.Now(),
					//	}
					//	if count == 0{
					//		//新增
					//		err := data_manage.AddExcelEdbdataMapping(&mappingItem)
					//		if err != nil {
					//			br.ErrMsg = "AddExcelEdbdataMapping,Err:" + err.Error()
					//			br.Msg = "新增映射表失败"
					//			return
					//		}
					//	}
					//}
				}
			}
		}
	}

	//resp := models.TargetItemListResp{
	//	List: list,
	//}
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	//br.Data = resp
	//br.Data = list
}

// ExcelDataEdit
// @Title 在线Excel编辑
// @Description 在线Excel编辑
// @Param   ClassifyId   query   string  false       "指标唯一编码"
// @Param   TradeCode   query   string  false       "指标唯一编码"
// @Param   Frequency   query   string  true       "频度"
// @Success 200
// @router /target/excel_style/edit [get]
func (this *TargetController) ExcelDataEdit() {
	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")
	classifyId, _ := this.GetInt("ClassifyId")
	frequency := this.GetString("Frequency")

	excelId, err := data_manage.GetExcelEdbdataMappingByTradeCode(classifyId, frequency)
	if err != nil {
		br.Msg = "查找关联表失败"
		br.ErrMsg = "GetExcelEdbdataMappingByTradeCode,Err:" + err.Error()
		return
	}

	item, err := data_manage.GetExcelStyleById(*excelId)
	if err != nil {
		br.Msg = "查找样式失败"
		br.ErrMsg = "GetExcelStyleById,Err:" + err.Error()
		return
	}

	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	//br.Data = resp
	br.Data = item
}

//// 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
//}