ソースを参照

fix:导入接口调整,支持多模板

Roc 7 ヶ月 前
コミット
22068c336a

+ 6 - 399
controllers/data_manage/manual_edb.go

@@ -6,14 +6,12 @@ import (
 	"eta/eta_api/models"
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/system"
-	"eta/eta_api/services/alarm_msg"
 	"eta/eta_api/services/data"
 	etaTrialService "eta/eta_api/services/eta_trial"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"github.com/shopspring/decimal"
-	"github.com/tealeg/xlsx"
 	"os"
 	"strconv"
 	"strings"
@@ -1429,410 +1427,19 @@ func (c *ManualEdbController) ImportData() {
 	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))
+	successCount, failCount, err, errMsg := data.ImportManualData(path, sysUser)
 	if err != nil {
-		br.Msg = "获取分类数据失败"
+		br.Msg = errMsg
+		br.ErrMsg = err.Error()
 		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)
-
+		FailCount:    failCount,
+	}
+	if failCount > 0 {
 		if successCount == 0 {
 			resp.Status = -1
 			resp.Msg = "导入失败"

+ 454 - 0
controllers/target.go

@@ -3452,3 +3452,457 @@ func (this *TargetController) ExcelDataEdit() {
 	//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
+//}

+ 17 - 2
models/edbdata_import_fail.go

@@ -1,6 +1,9 @@
 package models
 
-import "github.com/beego/beego/v2/client/orm"
+import (
+	"eta/eta_api/utils"
+	"github.com/beego/beego/v2/client/orm"
+)
 
 type EdbdataImportFail struct {
 	Id           int `orm:"column(id);pk"`
@@ -20,6 +23,19 @@ func AddEdbdataImportFail(item *EdbdataImportFail) (err error) {
 	return err
 }
 
+// MultiAddEdbdataImportFail
+// @Description: 批量添加导入失败的信息
+// @author: Roc
+// @datetime 2024-07-30 19:48:06
+// @param items []*EdbdataImportFail
+// @return err error
+func MultiAddEdbdataImportFail(items []*EdbdataImportFail) (err error) {
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.InsertMulti(utils.MultiAddNum, items)
+
+	return err
+}
+
 // DelEdbDataImportFail 删除导入指标失败记录
 func DelEdbDataImportFail(userId int) (err error) {
 	o := orm.NewOrmUsingDB("edb")
@@ -27,4 +43,3 @@ func DelEdbDataImportFail(userId int) (err error) {
 	_, err = o.Raw(sql, userId).Exec()
 	return err
 }
-

+ 37 - 0
models/manual_edb.go

@@ -235,6 +235,43 @@ func DelManualIndexByCodeList(codeList []string) (err error) {
 	return
 }
 
+// GetEdbinfoBySecNameList
+// @Description: 根据指标名称获取列表数据
+// @author: Roc
+// @datetime 2024-07-30 19:14:25
+// @param secNameList []string
+// @return item []*Edbinfo
+// @return err error
+func GetEdbinfoBySecNameList(secNameList []string) (item []*Edbinfo, err error) {
+	num := len(secNameList)
+	if num <= 0 {
+		return
+	}
+	sql := `SELECT * FROM edbinfo WHERE SEC_NAME in (` + utils.GetOrmInReplace(num) + ` ) AND REMARK='手动' `
+	o := orm.NewOrmUsingDB("edb")
+	err = o.Raw(sql, secNameList).QueryRow(&item)
+	return
+}
+
+// GetTargetsDataListByCodeList
+// @Description: 根据code列表获取指标数据列表
+// @author: Roc
+// @datetime 2024-07-30 19:19:36
+// @param tradeCodeList []string
+// @return items []*Edbdata
+// @return err error
+func GetTargetsDataListByCodeList(tradeCodeList []string) (items []*Edbdata, err error) {
+	num := len(tradeCodeList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("edb")
+	sql := `SELECT * FROM edbdata WHERE TRADE_CODE in (` + utils.GetOrmInReplace(num) + ` ) ORDER BY DT ASC `
+	_, err = o.Raw(sql, tradeCodeList).QueryRows(&items)
+
+	return
+}
+
 // EdbinfoOpRecord
 // @Description: 手工数据的操作日志
 type EdbinfoOpRecord struct {

+ 362 - 439
services/data/manual.go

@@ -5,6 +5,7 @@ import (
 	"eta/eta_api/models"
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/system"
+	"eta/eta_api/services/alarm_msg"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/shopspring/decimal"
@@ -215,445 +216,367 @@ func ManualIndexSource2Edb(req ManualIndexSource2EdbReq, lang string) (edb *data
 	return
 }
 
-//func ImportManualData(path string, sysUser *system.Admin) (err error, errMsg string) {
-//	errMsg = `导入失败`
-//	xlFile, err := xlsx.OpenFile(path)
-//	if err != nil {
-//		fmt.Println(err.Error())
-//		return
-//	}
-//	if len(xlFile.Sheets) <= 0 {
-//		errMsg = "导入模板异常"
-//		err = errors.New(errMsg)
-//		return
-//	}
-//
-//	//导入成功数量
-//	successCount := 0
-//	//导入失败数据
-//	failDataList := make([]*models.EdbdataImportFail, 0)
-//	var indexDataList []ImportManualIndexData
-//
-//	// 模板校验,然后处理成标准化格式
-//	for _, sheet := range xlFile.Sheets {
-//		var tmpIndexDataList []ImportManualIndexData
-//		var tmpFailDataList []*models.EdbdataImportFail
-//		rowList := sheet.Rows
-//		if len(rowList) <= 0 {
-//			errMsg = sheet.Name + "页异常"
-//			err = errors.New(errMsg)
-//			return
-//		}
-//		headerCell := rowList[0].Cells
-//		if len(headerCell) < 7 {
-//			errMsg = sheet.Name + "页模板异常"
-//			err = errors.New(errMsg)
-//			return
-//		}
-//
-//		templateName := headerCell[6].String()
-//		switch templateName {
-//		case "导入模板2/Import Template 2":
-//			// 模板2需要走对应的取数逻辑
-//			tmpIndexDataList, tmpFailDataList, err, errMsg = getDataByTemplate2(sheet, sysUser.AdminId)
-//		default:
-//			// 模板1需要走对应的取数逻辑
-//			tmpIndexDataList, tmpFailDataList, err, errMsg = getDataByTemplate1(sheet, sysUser.AdminId)
-//		}
-//		indexDataList = append(indexDataList, tmpIndexDataList...)
-//		failDataList = append(failDataList, tmpFailDataList...)
-//	}
-//
-//	var indexDataListMap map[string]ImportManualIndexData
-//	for _, v := range indexDataList {
-//		indexData, ok := indexDataListMap[v.IndexName]
-//		if !ok {
-//			// 没有就赋值
-//			indexDataListMap[v.IndexName] = v
-//			continue
-//		}
-//
-//		indexData.Unit = v.Unit
-//		indexData.ClassName = v.ClassName
-//		indexData.Frequency = v.Frequency
-//
-//		indexData.DataMap = v.DataMap
-//	}
-//
-//	//超管账号可以查看分类下的所有频度数据
-//	userId := sysUser.AdminId
-//	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
-//		userId = 0
-//	}
-//	//获取账户所拥有权限的分类id集合
-//	classifyNameStrList, edbDataClassifyMap, err := GetEdbClassifyNameListByAdminId(int64(userId))
-//	if err != nil {
-//		errMsg = "获取分类数据失败"
-//		return
-//	}
-//
-//	////指标map
-//	//targetMap := make(map[string]*models.Edbinfo)
-//	//defer func() {
-//	//	for _, target := range targetMap {
-//	//		//结束后,清除掉对应的缓存
-//	//		key := "import:edbinfo:data:" + target.TradeCode
-//	//		utils.Rc.Delete(key)
-//	//
-//	//		//将该指标的code加入到 “手工数据导入后刷新” 缓存
-//	//		if utils.Re == nil {
-//	//			err := utils.Rc.LPush(utils.CACHE_IMPORT_MANUAL_DATA, target.TradeCode)
-//	//			if err != nil {
-//	//				fmt.Println("CACHE_IMPORT_MANUAL_DATA LPush Err:" + err.Error())
-//	//			}
-//	//		}
-//	//	}
-//	//}()
-//	//
-//	//// 所有的指标数据map
-//	//edbCodeDataMap := make(map[string]map[string]string)
-//
-//	// 遍历sheet页读取
-//	//for _, sheet := range xlFile.Sheets {
-//	//	fmt.Println("sheet name: ", sheet.Name)
-//	//	//遍历行读取
-//	//	maxRow := sheet.MaxRow
-//	//	fmt.Println("maxRow:", maxRow)
-//	//	fmt.Println("maxRow")
-//	//	for i := 0; i < maxRow; i++ {
-//	//		if i == 1 {
-//	//			row := sheet.Row(i)
-//	//			cells := row.Cells
-//	//			if len(cells) < 6 {
-//	//				br.ErrMsg = "导入文件异常,请下载最新导入模板文件"
-//	//				br.Msg = "导入文件异常,请下载最新导入模板文件"
-//	//				return
-//	//			}
-//	//			templateFail := false
-//	//			if cells[0].Value != "品种分类" && cells[0].Value != "Species Category" {
-//	//				templateFail = true
-//	//			}
-//	//			if cells[1].Value != "录入日期" && cells[1].Value != "Input Date" {
-//	//				templateFail = true
-//	//			}
-//	//			if cells[2].Value != "指标名称" && cells[2].Value != "Indicator Name Indicator Name" {
-//	//				templateFail = true
-//	//			}
-//	//			if cells[3].Value != "值" && cells[3].Value != "Value" {
-//	//				templateFail = true
-//	//			}
-//	//			if cells[4].Value != "频度" && cells[4].Value != "Frequency" {
-//	//				templateFail = true
-//	//			}
-//	//			if cells[5].Value != "单位" && cells[5].Value != "Unit" {
-//	//				templateFail = true
-//	//			}
-//	//			if templateFail {
-//	//				br.ErrMsg = "导入文件异常,请下载最新导入模板文件"
-//	//				br.Msg = "导入文件异常,请下载最新导入模板文件"
-//	//				return
-//	//			}
-//	//		}
-//	//		if i > 1 {
-//	//			row := sheet.Row(i)
-//	//			cells := row.Cells
-//	//			if len(cells) >= 6 {
-//	//				classifyName := cells[0].Value //分类
-//	//				if classifyName == "" {        //过滤空白行
-//	//					continue
-//	//				}
-//	//				cell1 := cells[1].Value
-//	//				//createDate := utils.ConvertToFormatDay(cell1) //录入日期
-//	//				createDate := cell1
-//	//				cell2 := cells[2].Value //指标名称
-//	//				secName := utils.TrimStr(cell2)
-//	//				frequency := cells[4].Value //频度
-//	//				unit := cells[5].Value      //单位
-//	//
-//	//				closeVal := cells[3].Value //值
-//	//				if strings.Contains(closeVal, "#N/A") {
-//	//					continue
-//	//				}
-//	//
-//	//				//校验表格中的日期格式
-//	//				if strings.Contains(createDate, "-") {
-//	//					//如果是带有 - 的普通日期格式文本
-//	//					_, timeErr := time.Parse("2006-1-2", createDate)
-//	//					if timeErr != nil {
-//	//						failItem := new(models.EdbdataImportFail)
-//	//						failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
-//	//						failItem.ClassifyName = classifyName
-//	//						failItem.CreateDate = createDate
-//	//						failItem.SecName = secName
-//	//						failItem.Close = closeVal
-//	//						failItem.Remark = "日期格式异常"
-//	//						failItem.Frequency = frequency
-//	//						failItem.Unit = unit
-//	//						failDataList = append(failDataList, failItem)
-//	//						//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
-//	//						continue
-//	//					}
-//	//				} else if strings.Contains(createDate, "/") {
-//	//					//如果是带有 / 的普通日期格式文本
-//	//					createDateTime, timeErr := time.Parse("2006/1/2", createDate)
-//	//					if timeErr != nil {
-//	//						failItem := new(models.EdbdataImportFail)
-//	//						failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
-//	//						failItem.ClassifyName = classifyName
-//	//						failItem.CreateDate = createDate
-//	//						failItem.SecName = secName
-//	//						failItem.Close = closeVal
-//	//						failItem.Remark = "日期格式异常"
-//	//						failItem.Frequency = frequency
-//	//						failItem.Unit = unit
-//	//						failDataList = append(failDataList, failItem)
-//	//						//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
-//	//						continue
-//	//					}
-//	//					createDate = createDateTime.Format("2006-01-02")
-//	//				} else {
-//	//					//可能是excel的日期格式
-//	//					_, tmpErr := strconv.Atoi(createDate)
-//	//					if tmpErr != nil {
-//	//						failItem := new(models.EdbdataImportFail)
-//	//						failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
-//	//						failItem.ClassifyName = classifyName
-//	//						failItem.CreateDate = createDate
-//	//						failItem.SecName = secName
-//	//						failItem.Close = closeVal
-//	//						failItem.Remark = "日期格式异常"
-//	//						failItem.Frequency = frequency
-//	//						failItem.Unit = unit
-//	//						failDataList = append(failDataList, failItem)
-//	//						//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
-//	//						continue
-//	//					}
-//	//					createDate = utils.ConvertToFormatDay(createDate) //录入日期
-//	//				}
-//	//
-//	//				closeValFloat, err := cells[3].Float() //值
-//	//
-//	//				if err != nil {
-//	//					failItem := new(models.EdbdataImportFail)
-//	//					failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
-//	//					failItem.ClassifyName = classifyName
-//	//					failItem.CreateDate = createDate
-//	//					failItem.SecName = secName
-//	//					failItem.Close = cells[3].Value
-//	//					failItem.Remark = "值类型异常"
-//	//					failItem.Frequency = frequency
-//	//					failItem.Unit = unit
-//	//					failDataList = append(failDataList, failItem)
-//	//					continue
-//	//				}
-//	//				newDecimal := decimal.NewFromFloat(closeValFloat)
-//	//				newDecimal.Round(4)
-//	//				closeVal = newDecimal.String()
-//	//				if strings.Contains(closeVal, "#N/A") {
-//	//					continue
-//	//				}
-//	//				//closeVal := closeValFloat.
-//	//
-//	//				//判断指标,类型,等数据是否正常
-//	//				classifyName = strings.Trim(classifyName, " ")
-//	//				frequency = utils.TrimStr(frequency)
-//	//				unit = utils.TrimStr(unit)
-//	//
-//	//				// 成功数量超过20个指标,那就不导入了
-//	//				if len(targetMap) >= 150 {
-//	//					failItem := new(models.EdbdataImportFail)
-//	//					failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
-//	//					failItem.ClassifyName = classifyName
-//	//					failItem.CreateDate = createDate
-//	//					failItem.SecName = secName
-//	//					failItem.Close = closeVal
-//	//					failItem.Remark = "导入指标数量过多"
-//	//					failItem.Frequency = frequency
-//	//					failItem.Unit = unit
-//	//					failDataList = append(failDataList, failItem)
-//	//					//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
-//	//					continue
-//	//				}
-//	//
-//	//				if !strings.Contains(strings.Join(classifyNameStrList, ","), classifyName) {
-//	//					failItem := new(models.EdbdataImportFail)
-//	//					failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
-//	//					failItem.ClassifyName = classifyName
-//	//					failItem.CreateDate = createDate
-//	//					failItem.SecName = secName
-//	//					failItem.Close = closeVal
-//	//					failItem.Remark = "没有该品种分类权限"
-//	//					failItem.Frequency = frequency
-//	//					failItem.Unit = unit
-//	//					failDataList = append(failDataList, failItem)
-//	//					continue
-//	//				}
-//	//				//fmt.Println(classifyName, createDate, secName, closeVal)
-//	//
-//	//				//获取指标分类信息
-//	//				classify, ok := edbDataClassifyMap[classifyName]
-//	//				if !ok {
-//	//					failItem := new(models.EdbdataImportFail)
-//	//					failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
-//	//					failItem.ClassifyName = classifyName
-//	//					failItem.CreateDate = createDate
-//	//					failItem.SecName = secName
-//	//					failItem.Close = closeVal
-//	//					failItem.Remark = "指标分类不存在"
-//	//					failItem.Frequency = frequency
-//	//					failItem.Unit = unit
-//	//					failDataList = append(failDataList, failItem)
-//	//					//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
-//	//					continue
-//	//				}
-//	//
-//	//				//判断指标是否存在
-//	//				target, ok := targetMap[secName]
-//	//				if !ok {
-//	//					tmpTarget, err := models.GetTargetBySecName(secName)
-//	//					if err != nil {
-//	//						//如果是找不到该指标,那么新增指标
-//	//						if err.Error() == utils.ErrNoRow() {
-//	//							if frequency == "" {
-//	//								failItem := new(models.EdbdataImportFail)
-//	//								failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
-//	//								failItem.ClassifyName = classifyName
-//	//								failItem.CreateDate = createDate
-//	//								failItem.SecName = secName
-//	//								failItem.Close = closeVal
-//	//								failItem.Remark = "新增指标失败,频度字段为空"
-//	//								failItem.Frequency = frequency
-//	//								failItem.Unit = unit
-//	//								failDataList = append(failDataList, failItem)
-//	//								continue
-//	//							}
-//	//							if unit == "" {
-//	//								failItem := new(models.EdbdataImportFail)
-//	//								failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
-//	//								failItem.ClassifyName = classifyName
-//	//								failItem.CreateDate = createDate
-//	//								failItem.SecName = secName
-//	//								failItem.Close = closeVal
-//	//								failItem.Remark = "新增指标失败,单位字段为空"
-//	//								failItem.Frequency = frequency
-//	//								failItem.Unit = unit
-//	//								failDataList = append(failDataList, failItem)
-//	//								continue
-//	//							}
-//	//							tmpErr := data.AddEdbInfo(secName, unit, frequency, "", sysUser.Mobile, classify.ClassifyId, sysUser.AdminId)
-//	//							if tmpErr != nil {
-//	//								fmt.Println("line 158")
-//	//								failItem := new(models.EdbdataImportFail)
-//	//								failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
-//	//								failItem.ClassifyName = classifyName
-//	//								failItem.CreateDate = createDate
-//	//								failItem.SecName = secName
-//	//								failItem.Close = closeVal
-//	//								failItem.Remark = "新增指标失败"
-//	//								failItem.Frequency = frequency
-//	//								failItem.Unit = unit
-//	//								failDataList = append(failDataList, failItem)
-//	//								continue
-//	//							}
-//	//							tmpTarget, tmpErr := models.GetTargetBySecName(secName)
-//	//							target = tmpTarget
-//	//							targetMap[secName] = target
-//	//						} else {
-//	//							fmt.Println("导入数据 获取指标:Err:" + err.Error())
-//	//						}
-//	//					} else {
-//	//						target = tmpTarget
-//	//						targetMap[secName] = target
-//	//					}
-//	//
-//	//					//设置10分钟缓存,不允许其他地方删除
-//	//					key := "import:edbinfo:data:" + target.TradeCode
-//	//					utils.Rc.SetNX(key, 1, time.Second*600)
-//	//				}
-//	//
-//	//				if target == nil {
-//	//					fmt.Println("指标不存在")
-//	//					failItem := new(models.EdbdataImportFail)
-//	//					failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
-//	//					failItem.ClassifyName = classifyName
-//	//					failItem.CreateDate = createDate
-//	//					failItem.SecName = secName
-//	//					failItem.Close = closeVal
-//	//					failItem.Remark = "指标不存在"
-//	//					failItem.Frequency = frequency
-//	//					failItem.Unit = unit
-//	//					failDataList = append(failDataList, failItem)
-//	//					continue
-//	//				}
-//	//
-//	//				//更新指标信息
-//	//				updateCols := make([]string, 0)
-//	//				//更新指标分类
-//	//				if target.ClassifyId <= 0 && classify.ClassifyId > 0 {
-//	//					target.ClassifyId = classify.ClassifyId
-//	//					updateCols = append(updateCols, "ClassifyId")
-//	//				}
-//	//				if target.Frequency != frequency {
-//	//					target.Frequency = frequency
-//	//					target.NoticeTime = ""
-//	//					updateCols = append(updateCols, "Frequency", "NoticeTime")
-//	//				}
-//	//				if target.Unit != unit {
-//	//					target.Unit = unit
-//	//					updateCols = append(updateCols, "Unit")
-//	//				}
-//	//				if len(updateCols) > 0 {
-//	//					_ = target.Update(updateCols)
-//	//				}
-//	//
-//	//				// 判断指标数据列表是否已经存在
-//	//				tmpDataMap, ok := edbCodeDataMap[target.TradeCode]
-//	//				if !ok {
-//	//					tmpDataMap = make(map[string]string)
-//	//					dataList, tmpErr := models.GetTargetsDataList(target.TradeCode)
-//	//					if tmpErr != nil {
-//	//						go alarm_msg.SendAlarmMsg("导入数据"+target.TradeCode+" 获取指标的数据失败,Err:"+err.Error(), 3)
-//	//					}
-//	//					for _, tmpData := range dataList {
-//	//						tmpDataMap[tmpData.Dt] = tmpData.Close
-//	//					}
-//	//					edbCodeDataMap[target.TradeCode] = tmpDataMap
-//	//				}
-//	//
-//	//				//判断数据是否已经存在
-//	//				tmpVal, ok := tmpDataMap[createDate]
-//	//				//数据已存在,进行更新操作
-//	//				if ok {
-//	//					if tmpVal != closeVal {
-//	//						err = models.ModifyTargetsDataByImport(target.TradeCode, createDate, closeVal)
-//	//						if err != nil {
-//	//							go alarm_msg.SendAlarmMsg("导入数据 修改数据失败,Err:"+err.Error(), 3)
-//	//							//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 修改数据失败:Err:"+err.Error(), utils.EmailSendToUsers)
-//	//						}
-//	//					}
-//	//				} else { //数据不存在,进行新增操作
-//	//					if target.TradeCode != "" && createDate != "" && closeVal != "" {
-//	//						models.AddTargetsDataByImport(target.TradeCode, createDate, closeVal)
-//	//						if err != nil {
-//	//							go alarm_msg.SendAlarmMsg("导入数据 新增数据失败,Err:"+err.Error(), 3)
-//	//							//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 新增数据失败:Err:"+err.Error(), utils.EmailSendToUsers)
-//	//						}
-//	//						tmpDataMap[createDate] = closeVal
-//	//						edbCodeDataMap[target.TradeCode] = tmpDataMap
-//	//					}
-//	//				}
-//	//				successCount++
-//	//			} else {
-//	//				//br.ErrMsg = "请填写导入内容"
-//	//				//br.Msg = "请填写导入内容"
-//	//				//return
-//	//			}
-//	//		}
-//	//	}
-//	//}
-//
-//	return
-//}
+func ImportManualData(path string, sysUser *system.Admin) (successCount, failCount int, err error, errMsg string) {
+	errMsg = `导入失败`
+	xlFile, err := xlsx.OpenFile(path)
+	if err != nil {
+		fmt.Println(err.Error())
+		return
+	}
+	if len(xlFile.Sheets) <= 0 {
+		errMsg = "导入模板异常"
+		err = errors.New(errMsg)
+		return
+	}
+
+	//导入失败数据
+	failDataList := make([]*models.EdbdataImportFail, 0)
+	var indexDataList []ImportManualIndexData
+	// 指标名称列表
+	indexNameList := make([]string, 0)
+
+	// 模板校验,然后处理成标准化格式
+	for _, sheet := range xlFile.Sheets {
+		var tmpIndexDataList []ImportManualIndexData
+		var tmpFailDataList []*models.EdbdataImportFail
+		rowList := sheet.Rows
+		if len(rowList) <= 0 {
+			errMsg = sheet.Name + "页异常"
+			err = errors.New(errMsg)
+			return
+		}
+		headerCell := rowList[0].Cells
+		if len(headerCell) < 7 {
+			errMsg = sheet.Name + "页模板异常"
+			err = errors.New(errMsg)
+			return
+		}
+
+		templateName := headerCell[6].String()
+		switch templateName {
+		case "导入模板2/Import Template 2":
+			// 模板2需要走对应的取数逻辑
+			tmpIndexDataList, tmpFailDataList, err, errMsg = getDataByTemplate2(sheet, sysUser.AdminId)
+		default:
+			// 模板1需要走对应的取数逻辑
+			tmpIndexDataList, tmpFailDataList, err, errMsg = getDataByTemplate1(sheet, sysUser.AdminId)
+		}
+		indexDataList = append(indexDataList, tmpIndexDataList...)
+		failDataList = append(failDataList, tmpFailDataList...)
+	}
+
+	var indexDataListMap map[string]ImportManualIndexData
+	for _, v := range indexDataList {
+		indexData, ok := indexDataListMap[v.IndexName]
+		if !ok {
+			// 没有就赋值
+			indexDataListMap[v.IndexName] = v
+			indexNameList = append(indexNameList, v.IndexName)
+			continue
+		}
+
+		indexData.Unit = v.Unit
+		indexData.ClassName = v.ClassName
+		indexData.Frequency = v.Frequency
+
+		indexData.DataMap = v.DataMap
+	}
+
+	if len(indexNameList) <= 0 {
+		return
+	}
+
+	//超管账号可以查看分类下的所有频度数据
+	userId := sysUser.AdminId
+	if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
+		userId = 0
+	}
+	//获取账户所拥有权限的分类id集合
+	classifyNameStrList, edbDataClassifyMap, err := GetEdbClassifyNameListByAdminId(int64(userId))
+	if err != nil {
+		errMsg = "获取分类数据失败"
+		return
+	}
+
+	//指标map
+	targetMap := make(map[string]*models.Edbinfo)
+	defer func() {
+		for _, target := range targetMap {
+			//结束后,清除掉对应的缓存
+			key := "import:edbinfo:data:" + target.TradeCode
+			utils.Rc.Delete(key)
+
+			//将该指标的code加入到 “手工数据导入后刷新” 缓存
+			if utils.Re == nil {
+				err := utils.Rc.LPush(utils.CACHE_IMPORT_MANUAL_DATA, target.TradeCode)
+				if err != nil {
+					fmt.Println("CACHE_IMPORT_MANUAL_DATA LPush Err:" + err.Error())
+				}
+			}
+		}
+	}()
+
+	// 所有的指标数据map
+	edbCodeDataMap := make(map[string]map[string]string)
+
+	{
+		// 获取指标信息
+		manualIndexList, tmpErr := models.GetEdbinfoBySecNameList(indexNameList)
+		if tmpErr != nil {
+			err = tmpErr
+			errMsg = "获取指标信息失败"
+			return
+		}
+
+		tradeCodeList := make([]string, 0)
+		for _, v := range manualIndexList {
+			targetMap[v.SecName] = v
+			tradeCodeList = append(tradeCodeList, v.TradeCode)
+		}
+
+		// 获取明细数据
+		dataList, tmpErr := models.GetTargetsDataListByCodeList(tradeCodeList)
+		if tmpErr != nil {
+			err = tmpErr
+			errMsg = "获取指标明细数据失败"
+			return
+		}
+		for _, tmpData := range dataList {
+			//tmpDataMap,ok := edbCodeDataMap[tmpData.TradeCode]
+			//if !ok{
+			//	tmpDataMap = make(map[string]string)
+			//}
+			edbCodeDataMap[tmpData.TradeCode][tmpData.Dt] = tmpData.Close
+		}
+	}
+
+	//// TODO 成功数量超过20个指标,那就不导入了
+	//if len(targetMap) >= 150 {
+	//	failItem := new(models.EdbdataImportFail)
+	//	failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+	//	failItem.ClassifyName = classifyName
+	//	failItem.CreateDate = createDate
+	//	failItem.SecName = secName
+	//	failItem.Close = closeVal
+	//	failItem.Remark = "导入指标数量过多"
+	//	failItem.Frequency = frequency
+	//	failItem.Unit = unit
+	//	failDataList = append(failDataList, failItem)
+	//	//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
+	//	continue
+	//}
+
+	errMsgList := make([]string, 0)
+	addDataList := make([]*models.Edbdata, 0)
+
+	for _, v := range indexDataListMap {
+		if len(v.DataMap) <= 0 {
+			continue
+		}
+		var tmpDate, tmpValue string
+		for date, val := range v.DataMap {
+			tmpDate = date
+			tmpValue = val
+			break
+		}
+		if !strings.Contains(strings.Join(classifyNameStrList, ","), v.ClassName) {
+			failItem := &models.EdbdataImportFail{
+				ClassifyName: v.ClassName,
+				CreateDate:   tmpDate,
+				SecName:      v.IndexName,
+				Close:        tmpValue,
+				Remark:       "没有该品种分类权限",
+				SysUserId:    fmt.Sprint(sysUser.AdminId),
+				Frequency:    v.Frequency,
+				Unit:         v.Unit,
+			}
+			failDataList = append(failDataList, failItem)
+			continue
+		}
+
+		//获取指标分类信息
+		classify, ok := edbDataClassifyMap[v.ClassName]
+		if !ok {
+			failItem := &models.EdbdataImportFail{
+				ClassifyName: v.ClassName,
+				CreateDate:   tmpDate,
+				SecName:      v.IndexName,
+				Close:        tmpValue,
+				Remark:       "指标分类不存在",
+				SysUserId:    fmt.Sprint(sysUser.AdminId),
+				Frequency:    v.Frequency,
+				Unit:         v.Unit,
+			}
+			failDataList = append(failDataList, failItem)
+			continue
+		}
+
+		target, ok := targetMap[v.IndexName]
+		if !ok {
+			if v.Frequency == "" {
+				failItem := &models.EdbdataImportFail{
+					ClassifyName: v.ClassName,
+					CreateDate:   tmpDate,
+					SecName:      v.IndexName,
+					Close:        tmpValue,
+					Remark:       "新增指标失败,频度字段为空",
+					SysUserId:    fmt.Sprint(sysUser.AdminId),
+					Frequency:    v.Frequency,
+					Unit:         v.Unit,
+				}
+				failDataList = append(failDataList, failItem)
+				continue
+			}
+			if v.Unit == "" {
+				failItem := &models.EdbdataImportFail{
+					ClassifyName: v.ClassName,
+					CreateDate:   tmpDate,
+					SecName:      v.IndexName,
+					Close:        tmpValue,
+					Remark:       "新增指标失败,单位字段为空",
+					SysUserId:    fmt.Sprint(sysUser.AdminId),
+					Frequency:    v.Frequency,
+					Unit:         v.Unit,
+				}
+				failDataList = append(failDataList, failItem)
+				continue
+			}
+			tmpErr := AddEdbInfo(v.IndexName, v.Unit, v.Frequency, "", sysUser.Mobile, classify.ClassifyId, sysUser.AdminId)
+			if tmpErr != nil {
+				fmt.Println("line 158")
+
+				failItem := &models.EdbdataImportFail{
+					ClassifyName: v.ClassName,
+					CreateDate:   tmpDate,
+					SecName:      v.IndexName,
+					Close:        tmpValue,
+					Remark:       "新增指标失败",
+					SysUserId:    fmt.Sprint(sysUser.AdminId),
+					Frequency:    v.Frequency,
+					Unit:         v.Unit,
+				}
+				failDataList = append(failDataList, failItem)
+				continue
+			}
+			tmpTarget, tmpErr := models.GetTargetBySecName(v.IndexName)
+			target = tmpTarget
+			targetMap[v.IndexName] = target
+		}
+
+		if target == nil {
+			fmt.Println("指标不存在")
+			failItem := &models.EdbdataImportFail{
+				ClassifyName: v.ClassName,
+				CreateDate:   tmpDate,
+				SecName:      v.IndexName,
+				Close:        tmpValue,
+				Remark:       "指标不存在",
+				SysUserId:    fmt.Sprint(sysUser.AdminId),
+				Frequency:    v.Frequency,
+				Unit:         v.Unit,
+			}
+			failDataList = append(failDataList, failItem)
+			continue
+		}
+
+		//设置10分钟缓存,不允许其他地方删除
+		key := "import:edbinfo:data:" + target.TradeCode
+		utils.Rc.SetNX(key, 1, time.Second*600)
+
+		//更新指标信息
+		{
+			updateCols := make([]string, 0)
+			//更新指标分类
+			if target.ClassifyId <= 0 && classify.ClassifyId > 0 {
+				target.ClassifyId = classify.ClassifyId
+				updateCols = append(updateCols, "ClassifyId")
+			}
+			if target.Frequency != v.Frequency {
+				target.Frequency = v.Frequency
+				target.NoticeTime = ""
+				updateCols = append(updateCols, "Frequency", "NoticeTime")
+			}
+			if target.Unit != v.Unit {
+				target.Unit = v.Unit
+				updateCols = append(updateCols, "Unit")
+			}
+			if len(updateCols) > 0 {
+				_ = target.Update(updateCols)
+			}
+		}
+
+		{
+			// 判断指标数据列表是否已经存在
+			tmpDataMap, ok := edbCodeDataMap[target.TradeCode]
+			if !ok {
+				tmpDataMap = make(map[string]string)
+			}
+
+			for createDate, closeVal := range v.DataMap {
+				//判断数据是否已经存在
+				tmpVal, ok := tmpDataMap[createDate]
+				//数据已存在,进行更新操作
+				if ok {
+					if tmpVal != closeVal {
+						edbCodeDataMap[target.TradeCode][createDate] = closeVal
+						tmpErr := models.ModifyTargetsDataByImport(target.TradeCode, createDate, closeVal)
+						if tmpErr != nil {
+							errMsgList = append(errMsgList, fmt.Sprintf("%s修改数据失败,日期:%s,值:%v,Err:%s", target.TradeCode, createDate, closeVal, tmpErr.Error()))
+						}
+					}
+				} else { //数据不存在,进行新增操作
+					if target.TradeCode != "" && createDate != "" && closeVal != "" {
+						addDataList = append(addDataList, &models.Edbdata{
+							TradeCode:  target.TradeCode,
+							Dt:         createDate,
+							Close:      closeVal,
+							ModifyTime: time.Now(),
+						})
+						edbCodeDataMap[target.TradeCode][createDate] = closeVal
+					}
+				}
+				successCount++
+			}
+		}
+	}
+
+	// 批量添加明细数据
+	if len(addDataList) > 0 {
+		tmpErr := models.OnlyMultiAddEdbdata(addDataList)
+		if tmpErr != nil {
+			fmt.Println("line 221")
+			errMsgList = append(errMsgList, fmt.Sprintf("批量添加明细数据失败,Err:%s", tmpErr.Error()))
+		}
+	}
+
+	// 失败数量
+	failCount = len(failDataList)
+	//fmt.Println("failDataList:", len(failDataList))
+	if failCount > 0 {
+		//先删除导入失败记录
+		_ = models.DelEdbDataImportFail(sysUser.AdminId)
+
+		// 批量添加导入失败记录
+		err = models.MultiAddEdbdataImportFail(failDataList)
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("导入数据 新增失败记录失败,Err:"+err.Error(), 3)
+			//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 新增失败记录失败:Err:"+err.Error(), utils.EmailSendToUsers)
+		}
+
+		{
+			//错误信息字符串切片,最后作为发送邮件通知使用
+			failContents := make([]string, 0)
+			for _, v := range failDataList {
+				failContents = append(failContents, fmt.Sprint(v.SecName, "导入失败:", v.Remark))
+			}
+			utils.FileLog.Info("导入数据 存在部分数据导入失败:" + strings.Join(failContents, ";"))
+			//导入失败的话,最后统一邮件提醒就好啦,不需要每次都去提醒
+			go alarm_msg.SendAlarmMsg("导入数据 存在部分数据导入失败:"+strings.Join(failContents, ";"), 3)
+		}
+	}
+
+	return
+}
 
 // ImportManualIndexData
 // @Description: excel模板后的内容