|
@@ -5,12 +5,15 @@ 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"
|
|
|
"time"
|
|
@@ -1271,3 +1274,457 @@ func (this *TargetController) BatchDel() {
|
|
|
br.Success = true
|
|
|
br.IsAddLog = true
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+func (this *TargetController) ImportData() {
|
|
|
+ br := new(models.BaseResponse).Init()
|
|
|
+ defer func() {
|
|
|
+ this.Data["json"] = br
|
|
|
+ this.ServeJSON()
|
|
|
+ }()
|
|
|
+ sysUser := this.SysUser
|
|
|
+ if sysUser == nil {
|
|
|
+ br.Msg = "请重新登录"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ file, _, err := this.GetFile("EntryFile")
|
|
|
+ if err != nil {
|
|
|
+ br.Msg = "获取文件失败"
|
|
|
+ br.ErrMsg = "获取文件失败,Err:" + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ path := "./static/数据导入_" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
|
|
|
+ defer file.Close()
|
|
|
+ err = this.SaveToFile("EntryFile", path)
|
|
|
+ if err != nil {
|
|
|
+ br.Msg = "文件保存失败"
|
|
|
+ br.ErrMsg = "文件保存失败,Err:" + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if utils.RunMode == "debug" {
|
|
|
+ defer os.Remove(path)
|
|
|
+ }
|
|
|
+ xlFile, err := xlsx.OpenFile(path)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println(err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ userId := sysUser.AdminId
|
|
|
+ if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
|
|
|
+ userId = 0
|
|
|
+ }
|
|
|
+
|
|
|
+ classifyNameStrList, edbDataClassifyMap, err := data.GetEdbClassifyNameListByAdminId(int64(userId))
|
|
|
+ if err != nil {
|
|
|
+ br.Msg = "获取分类数据失败"
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ successCount := 0
|
|
|
+
|
|
|
+ failDatas := make([]*models.EdbdataImportFail, 0)
|
|
|
+
|
|
|
+
|
|
|
+ targetMap := make(map[string]*models.Edbinfo)
|
|
|
+ defer func() {
|
|
|
+ for _, target := range targetMap {
|
|
|
+
|
|
|
+ key := "import:edbinfo:data:" + target.TradeCode
|
|
|
+ utils.Rc.Delete(key)
|
|
|
+
|
|
|
+
|
|
|
+ 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())
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+
|
|
|
+ edbCodeDataMap := make(map[string]map[string]string)
|
|
|
+
|
|
|
+
|
|
|
+ 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 := 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)
|
|
|
+
|
|
|
+ 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)
|
|
|
+
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ createDate = createDateTime.Format("2006-01-02")
|
|
|
+ } else {
|
|
|
+
|
|
|
+ _, 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)
|
|
|
+
|
|
|
+ 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
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ classifyName = strings.Trim(classifyName, " ")
|
|
|
+ frequency = utils.TrimStr(frequency)
|
|
|
+ unit = utils.TrimStr(unit)
|
|
|
+
|
|
|
+
|
|
|
+ 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)
|
|
|
+
|
|
|
+ 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
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ 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)
|
|
|
+
|
|
|
+ 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
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ 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)
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if target.TradeCode != "" && createDate != "" && closeVal != "" {
|
|
|
+ models.AddTargetsDataByImport(target.TradeCode, createDate, closeVal)
|
|
|
+ if err != nil {
|
|
|
+ go alarm_msg.SendAlarmMsg("导入数据 新增数据失败,Err:"+err.Error(), 3)
|
|
|
+
|
|
|
+ }
|
|
|
+ tmpDataMap[createDate] = closeVal
|
|
|
+ edbCodeDataMap[target.TradeCode] = tmpDataMap
|
|
|
+ }
|
|
|
+ }
|
|
|
+ successCount++
|
|
|
+ } else {
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ 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 alarm_msg.SendAlarmMsg("导入数据 存在部分数据导入失败:"+strings.Join(failContents, ";"), 3)
|
|
|
+
|
|
|
+
|
|
|
+ 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
|
|
|
+}
|