|
@@ -1,11 +1,17 @@
|
|
|
package data
|
|
|
|
|
|
import (
|
|
|
+ "errors"
|
|
|
"eta/eta_api/models"
|
|
|
"eta/eta_api/models/data_manage"
|
|
|
"eta/eta_api/models/system"
|
|
|
"eta/eta_api/utils"
|
|
|
"fmt"
|
|
|
+ "github.com/shopspring/decimal"
|
|
|
+ "github.com/tealeg/xlsx"
|
|
|
+ "strconv"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
)
|
|
|
|
|
|
func GetManualSysUser(keyWord string) (list []*data_manage.ManualSysUser, err error) {
|
|
@@ -199,3 +205,800 @@ 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
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, sheet := range xlFile.Sheets {
|
|
|
+ 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需要走对应的取数逻辑
|
|
|
+ fmt.Println(getDataByTemplate2(sheet))
|
|
|
+ default:
|
|
|
+ // 模板1需要走对应的取数逻辑
|
|
|
+ fmt.Println(getDataByTemplate1(sheet))
|
|
|
+
|
|
|
+ }
|
|
|
+ fmt.Println(sheet)
|
|
|
+ }
|
|
|
+
|
|
|
+ ////超管账号可以查看分类下的所有频度数据
|
|
|
+ //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
|
|
|
+ //}
|
|
|
+ //
|
|
|
+ ////导入成功数量
|
|
|
+ //successCount := 0
|
|
|
+ ////导入失败数据
|
|
|
+ //failDataList := 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
|
|
|
+ // failDataList = append(failDataList, failItem)
|
|
|
+ // //go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
|
|
|
+ // continue
|
|
|
+ // }
|
|
|
+ // } else if strings.Contains(createDate, "/") {
|
|
|
+ // //如果是带有 / 的普通日期格式文本
|
|
|
+ // createDateTime, timeErr := time.Parse("2006/1/2", createDate)
|
|
|
+ // if timeErr != nil {
|
|
|
+ // failItem := new(models.EdbdataImportFail)
|
|
|
+ // failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
|
|
|
+ // failItem.ClassifyName = classifyName
|
|
|
+ // failItem.CreateDate = createDate
|
|
|
+ // failItem.SecName = secName
|
|
|
+ // failItem.Close = closeVal
|
|
|
+ // failItem.Remark = "日期格式异常"
|
|
|
+ // failItem.Frequency = frequency
|
|
|
+ // failItem.Unit = unit
|
|
|
+ // failDataList = append(failDataList, failItem)
|
|
|
+ // //go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
|
|
|
+ // continue
|
|
|
+ // }
|
|
|
+ // createDate = createDateTime.Format("2006-01-02")
|
|
|
+ // } else {
|
|
|
+ // //可能是excel的日期格式
|
|
|
+ // _, tmpErr := strconv.Atoi(createDate)
|
|
|
+ // if tmpErr != nil {
|
|
|
+ // failItem := new(models.EdbdataImportFail)
|
|
|
+ // failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
|
|
|
+ // failItem.ClassifyName = classifyName
|
|
|
+ // failItem.CreateDate = createDate
|
|
|
+ // failItem.SecName = secName
|
|
|
+ // failItem.Close = closeVal
|
|
|
+ // failItem.Remark = "日期格式异常"
|
|
|
+ // failItem.Frequency = frequency
|
|
|
+ // failItem.Unit = unit
|
|
|
+ // failDataList = append(failDataList, failItem)
|
|
|
+ // //go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
|
|
|
+ // continue
|
|
|
+ // }
|
|
|
+ // createDate = utils.ConvertToFormatDay(createDate) //录入日期
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // closeValFloat, err := cells[3].Float() //值
|
|
|
+ //
|
|
|
+ // if err != nil {
|
|
|
+ // failItem := new(models.EdbdataImportFail)
|
|
|
+ // failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
|
|
|
+ // failItem.ClassifyName = classifyName
|
|
|
+ // failItem.CreateDate = createDate
|
|
|
+ // failItem.SecName = secName
|
|
|
+ // failItem.Close = cells[3].Value
|
|
|
+ // failItem.Remark = "值类型异常"
|
|
|
+ // failItem.Frequency = frequency
|
|
|
+ // failItem.Unit = unit
|
|
|
+ // failDataList = append(failDataList, failItem)
|
|
|
+ // continue
|
|
|
+ // }
|
|
|
+ // newDecimal := decimal.NewFromFloat(closeValFloat)
|
|
|
+ // newDecimal.Round(4)
|
|
|
+ // closeVal = newDecimal.String()
|
|
|
+ // if strings.Contains(closeVal, "#N/A") {
|
|
|
+ // continue
|
|
|
+ // }
|
|
|
+ // //closeVal := closeValFloat.
|
|
|
+ //
|
|
|
+ // //判断指标,类型,等数据是否正常
|
|
|
+ // classifyName = strings.Trim(classifyName, " ")
|
|
|
+ // frequency = utils.TrimStr(frequency)
|
|
|
+ // unit = utils.TrimStr(unit)
|
|
|
+ //
|
|
|
+ // // 成功数量超过20个指标,那就不导入了
|
|
|
+ // if len(targetMap) >= 150 {
|
|
|
+ // failItem := new(models.EdbdataImportFail)
|
|
|
+ // failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
|
|
|
+ // failItem.ClassifyName = classifyName
|
|
|
+ // failItem.CreateDate = createDate
|
|
|
+ // failItem.SecName = secName
|
|
|
+ // failItem.Close = closeVal
|
|
|
+ // failItem.Remark = "导入指标数量过多"
|
|
|
+ // failItem.Frequency = frequency
|
|
|
+ // failItem.Unit = unit
|
|
|
+ // failDataList = append(failDataList, failItem)
|
|
|
+ // //go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
|
|
|
+ // continue
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // if !strings.Contains(strings.Join(classifyNameStrList, ","), classifyName) {
|
|
|
+ // failItem := new(models.EdbdataImportFail)
|
|
|
+ // failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
|
|
|
+ // failItem.ClassifyName = classifyName
|
|
|
+ // failItem.CreateDate = createDate
|
|
|
+ // failItem.SecName = secName
|
|
|
+ // failItem.Close = closeVal
|
|
|
+ // failItem.Remark = "没有该品种分类权限"
|
|
|
+ // failItem.Frequency = frequency
|
|
|
+ // failItem.Unit = unit
|
|
|
+ // failDataList = append(failDataList, failItem)
|
|
|
+ // continue
|
|
|
+ // }
|
|
|
+ // //fmt.Println(classifyName, createDate, secName, closeVal)
|
|
|
+ //
|
|
|
+ // //获取指标分类信息
|
|
|
+ // classify, ok := edbDataClassifyMap[classifyName]
|
|
|
+ // if !ok {
|
|
|
+ // failItem := new(models.EdbdataImportFail)
|
|
|
+ // failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
|
|
|
+ // failItem.ClassifyName = classifyName
|
|
|
+ // failItem.CreateDate = createDate
|
|
|
+ // failItem.SecName = secName
|
|
|
+ // failItem.Close = closeVal
|
|
|
+ // failItem.Remark = "指标分类不存在"
|
|
|
+ // failItem.Frequency = frequency
|
|
|
+ // failItem.Unit = unit
|
|
|
+ // failDataList = append(failDataList, failItem)
|
|
|
+ // //go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
|
|
|
+ // continue
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // //判断指标是否存在
|
|
|
+ // target, ok := targetMap[secName]
|
|
|
+ // if !ok {
|
|
|
+ // tmpTarget, err := models.GetTargetBySecName(secName)
|
|
|
+ // if err != nil {
|
|
|
+ // //如果是找不到该指标,那么新增指标
|
|
|
+ // if err.Error() == utils.ErrNoRow() {
|
|
|
+ // if frequency == "" {
|
|
|
+ // failItem := new(models.EdbdataImportFail)
|
|
|
+ // failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
|
|
|
+ // failItem.ClassifyName = classifyName
|
|
|
+ // failItem.CreateDate = createDate
|
|
|
+ // failItem.SecName = secName
|
|
|
+ // failItem.Close = closeVal
|
|
|
+ // failItem.Remark = "新增指标失败,频度字段为空"
|
|
|
+ // failItem.Frequency = frequency
|
|
|
+ // failItem.Unit = unit
|
|
|
+ // failDataList = append(failDataList, failItem)
|
|
|
+ // continue
|
|
|
+ // }
|
|
|
+ // if unit == "" {
|
|
|
+ // failItem := new(models.EdbdataImportFail)
|
|
|
+ // failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
|
|
|
+ // failItem.ClassifyName = classifyName
|
|
|
+ // failItem.CreateDate = createDate
|
|
|
+ // failItem.SecName = secName
|
|
|
+ // failItem.Close = closeVal
|
|
|
+ // failItem.Remark = "新增指标失败,单位字段为空"
|
|
|
+ // failItem.Frequency = frequency
|
|
|
+ // failItem.Unit = unit
|
|
|
+ // failDataList = append(failDataList, failItem)
|
|
|
+ // continue
|
|
|
+ // }
|
|
|
+ // tmpErr := data.AddEdbInfo(secName, unit, frequency, "", sysUser.Mobile, classify.ClassifyId, sysUser.AdminId)
|
|
|
+ // if tmpErr != nil {
|
|
|
+ // fmt.Println("line 158")
|
|
|
+ // failItem := new(models.EdbdataImportFail)
|
|
|
+ // failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
|
|
|
+ // failItem.ClassifyName = classifyName
|
|
|
+ // failItem.CreateDate = createDate
|
|
|
+ // failItem.SecName = secName
|
|
|
+ // failItem.Close = closeVal
|
|
|
+ // failItem.Remark = "新增指标失败"
|
|
|
+ // failItem.Frequency = frequency
|
|
|
+ // failItem.Unit = unit
|
|
|
+ // failDataList = append(failDataList, failItem)
|
|
|
+ // continue
|
|
|
+ // }
|
|
|
+ // tmpTarget, tmpErr := models.GetTargetBySecName(secName)
|
|
|
+ // target = tmpTarget
|
|
|
+ // targetMap[secName] = target
|
|
|
+ // } else {
|
|
|
+ // fmt.Println("导入数据 获取指标:Err:" + err.Error())
|
|
|
+ // }
|
|
|
+ // } else {
|
|
|
+ // target = tmpTarget
|
|
|
+ // targetMap[secName] = target
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // //设置10分钟缓存,不允许其他地方删除
|
|
|
+ // key := "import:edbinfo:data:" + target.TradeCode
|
|
|
+ // utils.Rc.SetNX(key, 1, time.Second*600)
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // if target == nil {
|
|
|
+ // fmt.Println("指标不存在")
|
|
|
+ // failItem := new(models.EdbdataImportFail)
|
|
|
+ // failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
|
|
|
+ // failItem.ClassifyName = classifyName
|
|
|
+ // failItem.CreateDate = createDate
|
|
|
+ // failItem.SecName = secName
|
|
|
+ // failItem.Close = closeVal
|
|
|
+ // failItem.Remark = "指标不存在"
|
|
|
+ // failItem.Frequency = frequency
|
|
|
+ // failItem.Unit = unit
|
|
|
+ // failDataList = append(failDataList, failItem)
|
|
|
+ // continue
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // //更新指标信息
|
|
|
+ // updateCols := make([]string, 0)
|
|
|
+ // //更新指标分类
|
|
|
+ // if target.ClassifyId <= 0 && classify.ClassifyId > 0 {
|
|
|
+ // target.ClassifyId = classify.ClassifyId
|
|
|
+ // updateCols = append(updateCols, "ClassifyId")
|
|
|
+ // }
|
|
|
+ // if target.Frequency != frequency {
|
|
|
+ // target.Frequency = frequency
|
|
|
+ // target.NoticeTime = ""
|
|
|
+ // updateCols = append(updateCols, "Frequency", "NoticeTime")
|
|
|
+ // }
|
|
|
+ // if target.Unit != unit {
|
|
|
+ // target.Unit = unit
|
|
|
+ // updateCols = append(updateCols, "Unit")
|
|
|
+ // }
|
|
|
+ // if len(updateCols) > 0 {
|
|
|
+ // _ = target.Update(updateCols)
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // // 判断指标数据列表是否已经存在
|
|
|
+ // tmpDataMap, ok := edbCodeDataMap[target.TradeCode]
|
|
|
+ // if !ok {
|
|
|
+ // tmpDataMap = make(map[string]string)
|
|
|
+ // dataList, tmpErr := models.GetTargetsDataList(target.TradeCode)
|
|
|
+ // if tmpErr != nil {
|
|
|
+ // go alarm_msg.SendAlarmMsg("导入数据"+target.TradeCode+" 获取指标的数据失败,Err:"+err.Error(), 3)
|
|
|
+ // }
|
|
|
+ // for _, tmpData := range dataList {
|
|
|
+ // tmpDataMap[tmpData.Dt] = tmpData.Close
|
|
|
+ // }
|
|
|
+ // edbCodeDataMap[target.TradeCode] = tmpDataMap
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // //判断数据是否已经存在
|
|
|
+ // tmpVal, ok := tmpDataMap[createDate]
|
|
|
+ // //数据已存在,进行更新操作
|
|
|
+ // if ok {
|
|
|
+ // if tmpVal != closeVal {
|
|
|
+ // err = models.ModifyTargetsDataByImport(target.TradeCode, createDate, closeVal)
|
|
|
+ // if err != nil {
|
|
|
+ // go alarm_msg.SendAlarmMsg("导入数据 修改数据失败,Err:"+err.Error(), 3)
|
|
|
+ // //go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 修改数据失败:Err:"+err.Error(), utils.EmailSendToUsers)
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // } else { //数据不存在,进行新增操作
|
|
|
+ // if target.TradeCode != "" && createDate != "" && closeVal != "" {
|
|
|
+ // models.AddTargetsDataByImport(target.TradeCode, createDate, closeVal)
|
|
|
+ // if err != nil {
|
|
|
+ // go alarm_msg.SendAlarmMsg("导入数据 新增数据失败,Err:"+err.Error(), 3)
|
|
|
+ // //go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 新增数据失败:Err:"+err.Error(), utils.EmailSendToUsers)
|
|
|
+ // }
|
|
|
+ // tmpDataMap[createDate] = closeVal
|
|
|
+ // edbCodeDataMap[target.TradeCode] = tmpDataMap
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // successCount++
|
|
|
+ // } else {
|
|
|
+ // //br.ErrMsg = "请填写导入内容"
|
|
|
+ // //br.Msg = "请填写导入内容"
|
|
|
+ // //return
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ //}
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// ImportManualIndexData
|
|
|
+// @Description: excel模板后的内容
|
|
|
+type ImportManualIndexData struct {
|
|
|
+ IndexName string `description:"指标名称"`
|
|
|
+ Unit string `description:"单位"`
|
|
|
+ ClassName string `description:"所属品种"`
|
|
|
+ Frequency string `description:"频度"`
|
|
|
+ DataMap map[string]string `description:"时间数据"`
|
|
|
+}
|
|
|
+
|
|
|
+// TODO 模板数据获取异常的结果记录
|
|
|
+
|
|
|
+// getDataByTemplate1
|
|
|
+// @Description: 根据模板1获取数据
|
|
|
+// @author: Roc
|
|
|
+// @datetime 2024-07-24 16:17:45
|
|
|
+// @param sheet *xlsx.Sheet
|
|
|
+// @return indexDataList []ImportManualIndexData
|
|
|
+// @return err error
|
|
|
+// @return errMsg string
|
|
|
+func getDataByTemplate1(sheet *xlsx.Sheet) (indexDataList []ImportManualIndexData, err error, errMsg string) {
|
|
|
+ fmt.Println("sheet name: ", sheet.Name)
|
|
|
+ indexDataList = make([]ImportManualIndexData, 0)
|
|
|
+ indexDataListMap := make(map[string]ImportManualIndexData, 0)
|
|
|
+
|
|
|
+ //遍历行读取
|
|
|
+ maxRow := sheet.MaxRow
|
|
|
+ fmt.Println("maxRow:", maxRow)
|
|
|
+
|
|
|
+ // 表头信息
|
|
|
+ if maxRow <= 2 {
|
|
|
+ errMsg = "模板异常1"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 表头校验
|
|
|
+ {
|
|
|
+ headerRow := sheet.Row(1)
|
|
|
+ cells := headerRow.Cells
|
|
|
+ if len(cells) < 6 {
|
|
|
+ errMsg = "导入文件异常,请下载最新导入模板文件"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ templateFail := false
|
|
|
+ if cells[0].Value != "品种/Variety" {
|
|
|
+ templateFail = true
|
|
|
+ }
|
|
|
+ if cells[1].Value != "指标名称/Indicator Name" {
|
|
|
+ templateFail = true
|
|
|
+ }
|
|
|
+ if cells[2].Value != "指标日期/Indicator Date" {
|
|
|
+ templateFail = true
|
|
|
+ }
|
|
|
+ if cells[3].Value != "值/Value" {
|
|
|
+ templateFail = true
|
|
|
+ }
|
|
|
+ if cells[4].Value != "频度/Frequency" {
|
|
|
+ templateFail = true
|
|
|
+ }
|
|
|
+ if cells[5].Value != "单位/Unit" {
|
|
|
+ templateFail = true
|
|
|
+ }
|
|
|
+ if templateFail {
|
|
|
+ errMsg = "导入文件异常,请下载最新导入模板文件"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for i := 2; i < maxRow; i++ {
|
|
|
+ row := sheet.Row(i)
|
|
|
+ cells := row.Cells
|
|
|
+ if len(cells) < 6 {
|
|
|
+ errMsg = "导入文件异常,请下载最新导入模板文件"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ classifyName := strings.TrimSpace(cells[0].Value) //分类
|
|
|
+ if classifyName == "" { //过滤空白行
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ // 指标名称
|
|
|
+ cell1 := cells[1].Value
|
|
|
+ indexName := strings.TrimSpace(cell1)
|
|
|
+ if indexName == "" { //过滤空白行
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ //createDate := utils.ConvertToFormatDay(cell1) //录入日期
|
|
|
+ createDate := cells[2].Value //指标日期
|
|
|
+ frequency := strings.TrimSpace(cells[4].String()) //频度
|
|
|
+ unit := strings.TrimSpace(cells[5].String()) //单位
|
|
|
+
|
|
|
+ closeVal := cells[3].Value //值
|
|
|
+ if strings.Contains(closeVal, "#N/A") {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ createDate, tmpErr := getExcelDate(createDate)
|
|
|
+ if tmpErr != nil {
|
|
|
+ // TODO 错误数据记录
|
|
|
+ //failItem := new(models.EdbdataImportFail)
|
|
|
+ //failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
|
|
|
+ //failItem.ClassifyName = classifyName
|
|
|
+ //failItem.CreateDate = createDate
|
|
|
+ //failItem.SecName = secName
|
|
|
+ //failItem.Close = closeVal
|
|
|
+ //failItem.Remark = "日期格式异常"
|
|
|
+ //failItem.Frequency = frequency
|
|
|
+ //failItem.Unit = unit
|
|
|
+ //failDataList = append(failDataList, failItem)
|
|
|
+ //go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
|
|
|
+ }
|
|
|
+
|
|
|
+ closeValFloat, tmpErr := cells[3].Float() //值
|
|
|
+ if tmpErr != nil {
|
|
|
+ // TODO 错误数据记录
|
|
|
+ //failItem := new(models.EdbdataImportFail)
|
|
|
+ //failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
|
|
|
+ //failItem.ClassifyName = classifyName
|
|
|
+ //failItem.CreateDate = createDate
|
|
|
+ //failItem.SecName = secName
|
|
|
+ //failItem.Close = cells[3].Value
|
|
|
+ //failItem.Remark = "值类型异常"
|
|
|
+ //failItem.Frequency = frequency
|
|
|
+ //failItem.Unit = unit
|
|
|
+ //failDatas = append(failDatas, failItem)
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ newDecimal := decimal.NewFromFloat(closeValFloat)
|
|
|
+ newDecimal.Round(4)
|
|
|
+ closeVal = newDecimal.String()
|
|
|
+ if strings.Contains(closeVal, "#N/A") {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ _, ok := indexDataListMap[indexName]
|
|
|
+ if !ok {
|
|
|
+ indexDataListMap[indexName] = ImportManualIndexData{
|
|
|
+ IndexName: indexName,
|
|
|
+ Unit: unit,
|
|
|
+ ClassName: classifyName,
|
|
|
+ Frequency: frequency,
|
|
|
+ DataMap: make(map[string]string),
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ indexDataListMap[indexName].DataMap[createDate] = closeVal
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, v := range indexDataListMap {
|
|
|
+ indexDataList = append(indexDataList, v)
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// getDataByTemplate2
|
|
|
+// @Description: 根据模板2获取数据
|
|
|
+// @author: Roc
|
|
|
+// @datetime 2024-07-24 16:17:56
|
|
|
+// @param sheet *xlsx.Sheet
|
|
|
+// @return indexDataList []ImportManualIndexData
|
|
|
+// @return err error
|
|
|
+// @return errMsg string
|
|
|
+func getDataByTemplate2(sheet *xlsx.Sheet) (indexDataList []ImportManualIndexData, err error, errMsg string) {
|
|
|
+ fmt.Println("sheet name: ", sheet.Name)
|
|
|
+ indexDataList = make([]ImportManualIndexData, 0)
|
|
|
+
|
|
|
+ //遍历行读取
|
|
|
+ maxRow := sheet.MaxRow
|
|
|
+ fmt.Println("maxRow:", maxRow)
|
|
|
+
|
|
|
+ varietyList := make([]string, 0)
|
|
|
+ indexNameList := make([]string, 0)
|
|
|
+ unitList := make([]string, 0)
|
|
|
+ frequencyList := make([]string, 0)
|
|
|
+
|
|
|
+ // make(map[指标下标]map[日期]值)
|
|
|
+ indexDateValueMap := make(map[int]map[string]string)
|
|
|
+
|
|
|
+ // 表头信息
|
|
|
+ if maxRow <= 4 {
|
|
|
+ errMsg = "模板异常1"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ for i := 1; i < maxRow; i++ {
|
|
|
+ row := sheet.Row(i)
|
|
|
+ cells := row.Cells
|
|
|
+ //if len(cells) < 1 {
|
|
|
+ // errMsg = "模板异常2"
|
|
|
+ // err = errors.New(errMsg)
|
|
|
+ // return
|
|
|
+ //}
|
|
|
+
|
|
|
+ // 表头处理
|
|
|
+ if i <= 4 {
|
|
|
+ switch i {
|
|
|
+ case 1:
|
|
|
+ for k, v := range cells {
|
|
|
+ if k == 0 {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ varietyList = append(varietyList, strings.TrimSpace(v.String()))
|
|
|
+ }
|
|
|
+ case 2:
|
|
|
+ for k, v := range cells {
|
|
|
+ if k == 0 {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ indexNameList = append(indexNameList, strings.TrimSpace(v.String()))
|
|
|
+ }
|
|
|
+ case 3:
|
|
|
+ for k, v := range cells {
|
|
|
+ if k == 0 {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ unitList = append(unitList, strings.TrimSpace(v.String()))
|
|
|
+ }
|
|
|
+ case 4:
|
|
|
+ for k, v := range cells {
|
|
|
+ if k == 0 {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ frequencyList = append(frequencyList, strings.TrimSpace(v.String()))
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ // 当前日期
|
|
|
+ var currDate string
|
|
|
+
|
|
|
+ // 日期是否异常,异常的话,就跳过,进入下一行数据处理
|
|
|
+ var dateErr bool
|
|
|
+
|
|
|
+ // 数据处理
|
|
|
+ for k, v := range cells {
|
|
|
+ if k == 0 {
|
|
|
+ createDate, tmpErr := getExcelDate(v.Value)
|
|
|
+ if tmpErr != nil {
|
|
|
+ // TODO 错误数据记录
|
|
|
+ //failItem := new(models.EdbdataImportFail)
|
|
|
+ //failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
|
|
|
+ //failItem.ClassifyName = classifyName
|
|
|
+ //failItem.CreateDate = createDate
|
|
|
+ //failItem.SecName = secName
|
|
|
+ //failItem.Close = closeVal
|
|
|
+ //failItem.Remark = "日期格式异常"
|
|
|
+ //failItem.Frequency = frequency
|
|
|
+ //failItem.Unit = unit
|
|
|
+ //failDataList = append(failDataList, failItem)
|
|
|
+ //go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 获取分类:Err:"+err.Error(), utils.EmailSendToUsers)
|
|
|
+ dateErr = true
|
|
|
+ }
|
|
|
+
|
|
|
+ currDate = createDate
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ // 日期异常,所以不处理该行了
|
|
|
+ if dateErr {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ key := k - 1
|
|
|
+ _, ok := indexDateValueMap[key]
|
|
|
+ if !ok {
|
|
|
+ indexDateValueMap[key] = make(map[string]string)
|
|
|
+ }
|
|
|
+
|
|
|
+ closeVal := v.Value //值
|
|
|
+ // 没有数据,说明是空串
|
|
|
+ if strings.Contains(closeVal, "#N/A") {
|
|
|
+ indexDateValueMap[key][currDate] = ""
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ closeValFloat, tmpErr := v.Float() //值
|
|
|
+ if tmpErr != nil {
|
|
|
+ // TODO 错误数据记录
|
|
|
+ //failItem := new(models.EdbdataImportFail)
|
|
|
+ //failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
|
|
|
+ //failItem.ClassifyName = classifyName
|
|
|
+ //failItem.CreateDate = createDate
|
|
|
+ //failItem.SecName = secName
|
|
|
+ //failItem.Close = cells[3].Value
|
|
|
+ //failItem.Remark = "值类型异常"
|
|
|
+ //failItem.Frequency = frequency
|
|
|
+ //failItem.Unit = unit
|
|
|
+ //failDataList = append(failDataList, failItem)
|
|
|
+ indexDateValueMap[key][currDate] = ""
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ newDecimal := decimal.NewFromFloat(closeValFloat)
|
|
|
+ newDecimal.Round(4)
|
|
|
+ closeVal = newDecimal.String()
|
|
|
+ if strings.Contains(closeVal, "#N/A") {
|
|
|
+ indexDateValueMap[key][currDate] = ""
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ indexDateValueMap[key][currDate] = closeVal
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ maxUnitIndex := len(unitList) - 1
|
|
|
+ maxClassNameIndex := len(varietyList) - 1
|
|
|
+ maxFrequencyIndex := len(frequencyList) - 1
|
|
|
+ for i, indexName := range indexNameList {
|
|
|
+ var unit, classifyName, frequency string
|
|
|
+ if i <= maxUnitIndex {
|
|
|
+ unit = unitList[i]
|
|
|
+ }
|
|
|
+ if i <= maxClassNameIndex {
|
|
|
+ classifyName = varietyList[i]
|
|
|
+ }
|
|
|
+ if i <= maxFrequencyIndex {
|
|
|
+ frequency = frequencyList[i]
|
|
|
+ }
|
|
|
+ indexData := ImportManualIndexData{
|
|
|
+ IndexName: indexName,
|
|
|
+ Unit: unit,
|
|
|
+ ClassName: classifyName,
|
|
|
+ Frequency: frequency,
|
|
|
+ DataMap: indexDateValueMap[i],
|
|
|
+ }
|
|
|
+ indexDataList = append(indexDataList, indexData)
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// getExcelDate
|
|
|
+// @Description: 获取excel的日期
|
|
|
+// @author: Roc
|
|
|
+// @datetime 2024-07-23 17:26:12
|
|
|
+// @param createDate string
|
|
|
+// @return newCreateDate string
|
|
|
+// @return err error
|
|
|
+func getExcelDate(createDate string) (newCreateDate string, err error) {
|
|
|
+ if strings.Contains(createDate, "-") {
|
|
|
+ //如果是带有 - 的普通日期格式文本
|
|
|
+ _, err = time.Parse("2006-1-2", createDate)
|
|
|
+ if err == nil {
|
|
|
+ newCreateDate = createDate
|
|
|
+ }
|
|
|
+ } else if strings.Contains(createDate, "/") {
|
|
|
+ //如果是带有 / 的普通日期格式文本
|
|
|
+ createDateTime, timeErr := time.Parse("2006/1/2", createDate)
|
|
|
+ if timeErr != nil {
|
|
|
+ err = timeErr
|
|
|
+ } else {
|
|
|
+ newCreateDate = createDateTime.Format("2006-01-02")
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ //可能是excel的日期格式
|
|
|
+ _, tmpErr := strconv.Atoi(createDate)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ } else {
|
|
|
+ newCreateDate = utils.ConvertToFormatDay(createDate) //录入日期
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+}
|