Browse Source

Merge remote-tracking branch 'origin/bzq1/execl-edit' into eta/2.0.0

# Conflicts:
#	controllers/target.go
#	models/data_manage/excel_style.go
#	models/target.go
Roc 8 months ago
parent
commit
16a9fad89b

+ 737 - 417
controllers/target.go

@@ -18,9 +18,6 @@ import (
 	"eta/eta_api/services/data"
 	"eta/eta_api/utils"
 	"fmt"
-	"github.com/rdlucklib/rdluck_tools/paging"
-	"github.com/shopspring/decimal"
-	"github.com/tealeg/xlsx"
 	"os"
 	"path/filepath"
 	"reflect"
@@ -28,6 +25,10 @@ import (
 	"strconv"
 	"strings"
 	"time"
+
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"github.com/shopspring/decimal"
+	"github.com/tealeg/xlsx"
 )
 
 // TargetController 手工指标服务(鉴权)
@@ -2074,7 +2075,7 @@ func (this *TargetController) TargetItemList() {
 	classifyId, _ := this.GetInt("ClassifyId")
 	edbShowType, _ := this.GetInt("EdbShowType")
 
-	list, err := models.GetTargetItemList(classifyId, edbShowType, frequency, keyword, tradeCode, classifyIdStrList)
+	list, err := models.GetTargetItemListSort(classifyId, edbShowType, frequency, keyword, tradeCode, classifyIdStrList)
 	if err != nil {
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		br.Msg = "获取失败"
@@ -2923,6 +2924,514 @@ func (this *TargetController) ImportTargetFailListDownload() {
 	this.Ctx.Output.Download(savePath, "失败列表.xlsx")
 }
 
+// ExcelDataAdd
+// @Title 复制EXCEL数据保存
+// @Description 复制EXCEL数据保存
+// @Param  request	body models.ExcelStyleReq true "type json string"
+// @Success 200
+//// @router /target/excel_style/add [post]
+// func (this *TargetController) ExcelDataAdd() {
+// 	br := new(models.BaseResponse).Init()
+// 	var err error
+// 	errs := make([]string, 0)
+// 	defer func() {
+// 		if len(errs) > 0 {
+// 			go alarm_msg.SendAlarmMsg("新增复制EXCEL数据 新增或修改数据失败,Err:"+strings.Join(errs, ","), 3)
+// 		}
+// 		this.Data["json"] = br
+// 		this.ServeJSON()
+// 	}()
+
+// 	sysUser := this.SysUser
+// 	if sysUser == nil {
+// 		br.Msg = "请重新登录"
+// 		return
+// 	}
+
+// 	//频度
+// 	//frequency := this.GetString("Frequency")
+// 	//
+// 	//关键字
+// 	//keyword := this.GetString("Keyword")
+// 	//指标编码
+// 	//tradeCode := this.GetString("TradeCode")
+// 	//
+// 	//userId := sysUser.AdminId
+// 	//超管账号可以查看分类下的所有频度数据
+// 	//if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
+// 	//	userId = 0
+// 	//}
+// 	//
+// 	//list, err := models.GetExcelData()
+// 	//if err != nil {
+// 	//	br.ErrMsg = "获取失败,Err:" + err.Error()
+// 	//	br.Msg = "获取失败"
+// 	//	return
+// 	//}
+
+// 	var req data_manage.ExcelStyleReq
+// 	err = json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+// 	if err != nil {
+// 		br.Msg = "参数解析异常!"
+// 		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+// 		return
+// 	}
+// 	//指标map
+// 	targetMap := make(map[string]*models.Edbinfo)
+// 	var cellDataList []map[string]interface{}
+// 	var dataList [][]map[string]interface{}
+// 	//var configList []map[string]interface{}
+// 	for _, item := range req.CellData {
+// 		v := item.(map[string]interface{})
+// 		cellDataList = append(cellDataList, v)
+// 	}
+
+// 	valueIndex := 0
+
+// 	var secNameList []string
+// 	var frequencyList []string
+// 	var unitList []string
+
+// 	var dateList []string
+// 	dateValueMap := make(map[string]map[int]string)
+// 	//取到所有数据
+// 	for i := range req.Data {
+// 		//取到一行
+// 		if i > 4 {
+// 			//先拿下日期列表
+// 			if req.Data[i] == nil || req.Data[i][0] == nil {
+// 				continue
+// 			}
+// 			//fmt.Println("i:", i)
+// 			//fmt.Println(req.Data[i])
+// 			//fmt.Println(req.Data[i][0])
+// 			dateMap := req.Data[i][0].(map[string]interface{})
+// 			_, ok := dateMap["m"]
+// 			if ok {
+// 				dateList = append(dateList, dateMap["m"].(string))
+// 				//fmt.Println("dateList:", dateList)
+// 			} else {
+// 				continue
+// 			}
+// 		}
+// 		for j, dataArr := range req.Data[i] {
+// 			//每一列
+// 			if dataArr == nil {
+// 				continue
+// 			}
+// 			dataMap := dataArr.(map[string]interface{})
+// 			if dataList == nil {
+// 				dataList = make([][]map[string]interface{}, len(req.Data))
+// 			}
+// 			if dataList[i] == nil {
+// 				dataList[i] = make([]map[string]interface{}, len(req.Data[i]))
+// 			}
+// 			dataList[i][j] = dataMap
+// 			//fmt.Println("dataMap", dataMap["m"])
+// 			v, _ := dataMap["m"]
+// 			//指标名称列表
+// 			if v == "指标名称" {
+// 				for nameIndex := 1; nameIndex < len(req.Data[i]); nameIndex++ {
+// 					if req.Data[i][nameIndex] == nil {
+// 						break
+// 					}
+// 					secNameMap := req.Data[i][nameIndex].(map[string]interface{})
+// 					secName, _ := secNameMap["m"]
+// 					if secName == nil {
+// 						continue
+// 					}
+// 					secNameList = append(secNameList, secNameMap["m"].(string))
+// 					//fmt.Println("secName:", secNameList)
+// 				}
+// 			}
+// 			//频度列表
+// 			if v == "频度" {
+// 				for nameIndex := 1; nameIndex < len(req.Data[i]); nameIndex++ {
+// 					if req.Data[i][nameIndex] == nil {
+// 						break
+// 					}
+// 					frequencyMap := req.Data[i][nameIndex].(map[string]interface{})
+// 					frequency, _ := frequencyMap["m"]
+// 					if frequency == nil {
+// 						continue
+// 					}
+// 					frequencyList = append(frequencyList, frequencyMap["m"].(string))
+// 					//fmt.Println("frequencyList:", frequencyList)
+// 				}
+// 			}
+// 			//单位列表
+// 			if v == "单位" {
+// 				for nameIndex := 1; nameIndex < len(req.Data[i]); nameIndex++ {
+// 					if req.Data[i][nameIndex] == nil {
+// 						break
+// 					}
+// 					unitMap := req.Data[i][nameIndex].(map[string]interface{})
+// 					unit, _ := unitMap["m"]
+// 					if unit == nil {
+// 						continue
+// 					}
+// 					unitList = append(unitList, unitMap["m"].(string))
+// 					//fmt.Println("unitList:", unitList)
+// 				}
+// 			}
+// 			//数据列表
+// 			//var valueList []string
+// 			valueListMap := make(map[int]string)
+// 			if i > 4 {
+// 				for index := 1; index < len(req.Data[i]); index++ {
+// 					if req.Data[i][index] == nil {
+// 						continue
+// 					}
+// 					valueMap := req.Data[i][index].(map[string]interface{})
+// 					value, _ := valueMap["m"]
+// 					if value == nil {
+// 						continue
+// 					}
+// 					valueListMap[index] = valueMap["m"].(string)
+
+// 					// 09-27 千位分隔符时用 "m" 取字符串存数据库会把逗号当小数点,现在换用 "v" 直接取数字再转为字符串,看看会不会有问题
+// 					if ct, ok := valueMap["ct"].(map[string]interface{}); ok {
+// 						fa, _ := ct["fa"]
+// 						if fa == "#,##0.000" {
+// 							value = valueMap["v"]
+// 							floatValue := valueMap["v"].(float64)
+// 							valueListMap[index] = strconv.FormatFloat(floatValue, 'f', -1, 64)
+// 						}
+// 					}
+
+// 					//valueList = append(valueList, valueMap["m"].(string))
+// 					//fmt.Println("valueList:", valueList)
+// 				}
+// 				dateMap := req.Data[i][0].(map[string]interface{})
+// 				date := dateMap["m"].(string)
+// 				dateValueMap[date] = valueListMap
+// 			}
+// 		}
+
+// 		//firstCell := req.Data[i][0]
+// 		//if firstCell == nil {
+// 		//	continue
+// 		//}
+// 		//dataMap := firstCell.(map[string]interface{})
+// 		//if dataList == nil {
+// 		//	dataList = make([][]map[string]interface{}, len(req.Data[i]))
+// 		//}
+// 		//if dataList[i] == nil {
+// 		//	dataList[i] = make([]map[string]interface{}, len(req.Data[i]))
+// 		//}
+// 		//dataList[i][0] = dataMap
+// 		//fmt.Println("dataMap", dataMap["m"])
+// 		//v, _ := dataMap["m"]
+// 		////指标名称
+// 		//if v == "指标名称" {
+// 		//	secNameMap := req.Data[i][1].(map[string]interface{})
+// 		//	secName = secNameMap["m"].(string)
+// 		//	fmt.Println("secName:", secName)
+// 		//}
+// 		////频度
+// 		//if v == "频度" {
+// 		//	frequencyMap := req.Data[i][1].(map[string]interface{})
+// 		//	frequency = frequencyMap["m"].(string)
+// 		//	fmt.Println("frequency:", frequency)
+// 		//}
+// 		////单位
+// 		//if v == "单位" {
+// 		//	unitMap := req.Data[i][1].(map[string]interface{})
+// 		//	unit = unitMap["m"].(string)
+// 		//	fmt.Println("unit:", unit)
+// 		//}
+// 		//
+// 		////日期
+// 		//dateMap := req.Data[i][1].(map[string]interface{})
+// 		//createDate = dateMap["m"].(string)
+// 		//
+// 		////值
+// 		//valueMap := req.Data[i][valueIndex].(map[string]interface{})
+// 		//closeVal = valueMap["m"].(string)
+
+// 		//新增指标
+// 		//errMsg := services.AddEdbItem(secName, unit, frequency, req.ClassifyId, sysUser)
+// 		//if errMsg == "" {
+// 		//	br.Msg = "新增指标异常!"
+// 		//	br.ErrMsg = errMsg
+// 		//	return
+// 		//}
+
+// 		valueIndex++
+// 	}
+
+// 	//var excelId int64
+// 	//保存EXCEL样式
+// 	//{
+// 	//	cellData, err := json.Marshal(cellDataList)
+// 	//	if err != nil {
+// 	//		br.Msg = "参数解析异常!"
+// 	//		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+// 	//		return
+// 	//	}
+// 	//	config, err := json.Marshal(req.Config)
+// 	//	if err != nil {
+// 	//		br.Msg = "参数解析异常!"
+// 	//		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+// 	//		return
+// 	//	}
+// 	//	datas, err := json.Marshal(dataList)
+// 	//	if err != nil {
+// 	//		br.Msg = "参数解析异常!"
+// 	//		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+// 	//		return
+// 	//	}
+// 	//	excelItem := data_manage.ExcelStyle{
+// 	//		CellData: string(cellData),
+// 	//		Config:   string(config),
+// 	//		Data:     string(datas),
+// 	//	}
+// 	//	excelId, err = models.AddExcelData(&excelItem)
+// 	//	if err != nil {
+// 	//		br.ErrMsg = "获取失败,Err:" + err.Error()
+// 	//		br.Msg = "获取失败"
+// 	//		return
+// 	//	}
+// 	//
+// 	//	//判断映射表是否已经存在
+// 	//	count, err := data_manage.GetExcelEdbdataMappingCount(req.ClassifyId, target.TradeCode, frequency)
+// 	//	if err != nil {
+// 	//		br.ErrMsg = "GetExcelEdbdataMappingCount,Err:" + err.Error()
+// 	//		br.Msg = "新增映射表失败"
+// 	//		return
+// 	//	}
+// 	//	mappingItem := data_manage.ExcelEdbdataMapping{
+// 	//		ExcelId:    excelId,
+// 	//		ClassifyId: req.ClassifyId,
+// 	//		Frequency:  frequency,
+// 	//		TradeCode:  target.TradeCode,
+// 	//		CreateTime: time.Now(),
+// 	//	}
+// 	//	if count == 0{
+// 	//		//新增
+// 	//		err := data_manage.AddExcelEdbdataMapping(&mappingItem)
+// 	//		if err != nil {
+// 	//			br.ErrMsg = "AddExcelEdbdataMapping,Err:" + err.Error()
+// 	//			br.Msg = "新增映射表失败"
+// 	//			return
+// 	//		}
+// 	//	}
+// 	//}
+
+// 	// 所有的指标数据map
+// 	edbCodeDataMap := make(map[string]map[string]string)
+
+// 	//操作指标,新增指标及数据等
+// 	{
+// 		for i := 0; i < len(secNameList); i++ {
+// 			//fmt.Println("len(secNameList):", len(secNameList))
+// 			secName := secNameList[i]
+// 			frequency := frequencyList[i]
+
+// 			//防止填了指标名称后没填单位报错
+// 			if len(unitList) < len(secNameList) {
+// 				br.Msg = "单位填写异常!"
+// 				br.ErrMsg = "单位填写异常!"
+// 				return
+// 			}
+// 			unit := unitList[i]
+
+// 			for j, s := range dateList {
+// 				var closeVal string
+// 				//valueList, ok := dateValueMap[s]
+// 				valueMap, ok := dateValueMap[s]
+// 				//fmt.Println("valueMap:", valueMap)
+// 				if ok {
+// 					createDate := dateList[j]
+// 					//if i < len(valueList) {
+// 					//	closeVal = valueList[i]
+// 					//} else {
+// 					//	continue
+// 					//}
+// 					closeVal, ok = valueMap[i+1]
+// 					target, ok2 := targetMap[secName]
+// 					if !ok2 {
+// 						tmpTarget, err := models.GetTargetBySecName(secName)
+// 						if err != nil {
+// 							//如果是找不到该指标,那么新增指标
+// 							if err.Error() == utils.ErrNoRow() {
+// 								//if frequency == "" {
+// 								//	failItem := new(models.EdbdataImportFail)
+// 								//	failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+// 								//	failItem.ClassifyName = classifyName
+// 								//	failItem.CreateDate = createDate
+// 								//	failItem.SecName = secName
+// 								//	failItem.Close = closeVal
+// 								//	failItem.Remark = "新增指标失败,频度字段为空"
+// 								//	failItem.Frequency = frequency
+// 								//	failItem.Unit = unit
+// 								//	failDatas = append(failDatas, failItem)
+// 								//	continue
+// 								//}
+// 								//if unit == "" {
+// 								//	failItem := new(models.EdbdataImportFail)
+// 								//	failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
+// 								//	failItem.ClassifyName = classifyName
+// 								//	failItem.CreateDate = createDate
+// 								//	failItem.SecName = secName
+// 								//	failItem.Close = closeVal
+// 								//	failItem.Remark = "新增指标失败,单位字段为空"
+// 								//	failItem.Frequency = frequency
+// 								//	failItem.Unit = unit
+// 								//	failDatas = append(failDatas, failItem)
+// 								//	continue
+// 								//}
+
+// 								tmpErr := data.AddEdbInfo(secName, unit, frequency, "", sysUser.Mobile, req.ClassifyId, sysUser.AdminId)
+// 								if tmpErr != nil {
+// 									//fmt.Println("AddEdbInfo err:", err.Error())
+// 									utils.FileLogData.Error("AddEdbInfo err :%s", tmpErr.Error())
+// 									continue
+// 								}
+// 								tmpTarget, tmpErr := models.GetTargetBySecName(secName)
+// 								target = tmpTarget
+// 								targetMap[secName] = target
+// 							} else {
+// 								fmt.Println("导入数据 获取指标:Err:" + err.Error())
+// 							}
+// 						} else {
+// 							target = tmpTarget
+// 							targetMap[secName] = target
+// 						}
+// 					}
+// 					// 判断指标的顺序是否发生改变
+// 					if targetMap[secName].Sort != i {
+// 						edbinfo := models.Edbinfo{TradeCode: target.TradeCode, Sort: i}
+// 						er := edbinfo.Update([]string{"sort"})
+// 						if er != nil {
+// 							fmt.Println("sort update err:", er.Error())
+// 						}
+// 					}
+
+// 					//判断指标数据是否已经存在
+// 					tmpDataMap, ok2 := edbCodeDataMap[target.TradeCode]
+// 					if !ok2 {
+// 						tmpDataMap = make(map[string]string)
+// 						targetDataList, tmpErr := models.GetTargetsDataList(target.TradeCode)
+// 						if tmpErr != nil {
+// 							err = tmpErr
+// 						}
+// 						for _, tmpData := range targetDataList {
+// 							tmpDataMap[tmpData.Dt] = tmpData.Close
+// 						}
+// 						edbCodeDataMap[target.TradeCode] = tmpDataMap
+// 					}
+
+// 					//判断数据是否已经存在
+// 					tmpVal, ok3 := tmpDataMap[createDate]
+// 					//数据已存在,进行更新操作
+// 					if ok3 {
+// 						if closeVal != "" {
+// 							// 库里面的数据
+// 							tmpValDecimal, tmpErr := decimal.NewFromString(tmpVal)
+// 							if tmpErr != nil {
+// 								fmt.Println("tmpVal Parse err:", tmpErr.Error())
+// 								err = tmpErr
+// 								continue
+// 							}
+// 							// 用户填写的数据
+// 							closeValDecimal, tmpErr := decimal.NewFromString(closeVal)
+// 							if tmpErr != nil {
+// 								fmt.Println("closeVal Parse err:", tmpErr.Error())
+// 								err = tmpErr
+// 								continue
+// 							}
+// 							if !tmpValDecimal.Equal(closeValDecimal) {
+// 								fmt.Println("更新数值")
+// 								err = models.ModifyTargetsDataByImport(target.TradeCode, createDate, closeVal)
+// 								if err != nil {
+// 									fmt.Println("ModifyTargetsDataByImport err:", err.Error())
+// 									errs = append(errs, err.Error())
+// 									//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 修改数据失败:Err:"+err.Error(), utils.EmailSendToUsers)
+// 								}
+// 							}
+// 						} else {
+// 							fmt.Println("删除数值")
+// 							err = models.DeleteTargetsDataByImport(target.TradeCode, createDate)
+// 							if err != nil {
+// 								fmt.Println("DeleteTargetsDataByImport err:", err.Error())
+// 								errs = append(errs, err.Error())
+// 								//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 修改数据失败:Err:"+err.Error(), utils.EmailSendToUsers)
+// 							}
+// 						}
+
+// 						if frequency != target.Frequency || unit != target.Unit || req.ClassifyId != target.ClassifyId {
+// 							fmt.Println("更新指标频度或单位")
+// 							err = models.ModifyEdbinfo(target.TradeCode, unit, frequency, req.ClassifyId)
+// 							if err != nil {
+// 								fmt.Println("EditEdbinfo err:", err.Error())
+// 								return
+// 							}
+// 						}
+// 					} else { //数据不存在,进行新增操作
+// 						if target.TradeCode != "" && createDate != "" && closeVal != "" {
+// 							fmt.Println("新增")
+// 							models.AddTargetsDataByImport(target.TradeCode, createDate, closeVal)
+// 							if err != nil {
+// 								fmt.Println("AddTargetsDataByImport err:", err.Error())
+// 								errs = append(errs, err.Error())
+// 								//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 新增数据失败:Err:"+err.Error(), utils.EmailSendToUsers)
+// 							}
+
+// 							tmpDataMap[createDate] = closeVal
+// 							edbCodeDataMap[target.TradeCode] = tmpDataMap
+// 						}
+// 					}
+
+// 					//保存关联表
+// 					//{
+// 					//	//判断映射表是否已经存在
+// 					//	count, err := data_manage.GetExcelEdbdataMappingCount(req.ClassifyId, target.TradeCode, frequency)
+// 					//	if err != nil {
+// 					//		br.ErrMsg = "GetExcelEdbdataMappingCount,Err:" + err.Error()
+// 					//		br.Msg = "新增映射表失败"
+// 					//		return
+// 					//	}
+// 					//	mappingItem := data_manage.ExcelEdbdataMapping{
+// 					//		ExcelId:    excelId,
+// 					//		ClassifyId: req.ClassifyId,
+// 					//		Frequency:  frequency,
+// 					//		TradeCode:  target.TradeCode,
+// 					//		CreateTime: time.Now(),
+// 					//	}
+// 					//	if count == 0{
+// 					//		//新增
+// 					//		err := data_manage.AddExcelEdbdataMapping(&mappingItem)
+// 					//		if err != nil {
+// 					//			br.ErrMsg = "AddExcelEdbdataMapping,Err:" + err.Error()
+// 					//			br.Msg = "新增映射表失败"
+// 					//			return
+// 					//		}
+// 					//	}
+// 					//}
+// 				}
+// 			}
+// 		}
+
+// 		list, err := models.GetTargetItemList(req.ClassifyId, 1, req.Frequency, "", "", []string{})
+// 		if err != nil {
+// 			br.ErrMsg = "获取失败,Err:" + err.Error()
+// 			br.Msg = "获取失败"
+// 			return
+// 		}
+// 		fmt.Println(list)
+// 	}
+
+// 	//resp := models.TargetItemListResp{
+// 	//	List: list,
+// 	//}
+// 	br.Ret = 200
+// 	br.Success = true
+// 	br.Msg = "获取成功"
+// 	//br.Data = resp
+// 	//br.Data = list
+// }
+
 // ExcelDataAdd
 // @Title 复制EXCEL数据保存
 // @Description 复制EXCEL数据保存
@@ -2947,27 +3456,6 @@ func (this *TargetController) ExcelDataAdd() {
 		return
 	}
 
-	//频度
-	//frequency := this.GetString("Frequency")
-	//
-	//关键字
-	//keyword := this.GetString("Keyword")
-	//指标编码
-	//tradeCode := this.GetString("TradeCode")
-	//
-	//userId := sysUser.AdminId
-	//超管账号可以查看分类下的所有频度数据
-	//if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
-	//	userId = 0
-	//}
-	//
-	//list, err := models.GetExcelData()
-	//if err != nil {
-	//	br.ErrMsg = "获取失败,Err:" + err.Error()
-	//	br.Msg = "获取失败"
-	//	return
-	//}
-
 	var req data_manage.ExcelStyleReq
 	err = json.Unmarshal(this.Ctx.Input.RequestBody, &req)
 	if err != nil {
@@ -2976,23 +3464,13 @@ func (this *TargetController) ExcelDataAdd() {
 		return
 	}
 	//指标map
-	targetMap := make(map[string]*models.Edbinfo)
-	var cellDataList []map[string]interface{}
 	var dataList [][]map[string]interface{}
-	//var configList []map[string]interface{}
-	for _, item := range req.CellData {
-		v := item.(map[string]interface{})
-		cellDataList = append(cellDataList, v)
-	}
-
-	valueIndex := 0
 
 	var secNameList []string
 	var frequencyList []string
 	var unitList []string
 
-	var dateList []string
-	dateValueMap := make(map[string]map[int]string)
+	secNameToDateMap := make(map[string]map[string]string)
 	//取到所有数据
 	for i := range req.Data {
 		//取到一行
@@ -3001,418 +3479,260 @@ func (this *TargetController) ExcelDataAdd() {
 			if req.Data[i] == nil || req.Data[i][0] == nil {
 				continue
 			}
-			//fmt.Println("i:", i)
-			//fmt.Println(req.Data[i])
-			//fmt.Println(req.Data[i][0])
 			dateMap := req.Data[i][0].(map[string]interface{})
 			_, ok := dateMap["m"]
-			if ok {
-				dateList = append(dateList, dateMap["m"].(string))
-				//fmt.Println("dateList:", dateList)
-			} else {
-				continue
-			}
-		}
-		for j, dataArr := range req.Data[i] {
-			//每一列
-			if dataArr == nil {
+			date := dateMap["m"].(string)
+			if !ok {
 				continue
 			}
-			dataMap := dataArr.(map[string]interface{})
-			if dataList == nil {
-				dataList = make([][]map[string]interface{}, len(req.Data))
-			}
-			if dataList[i] == nil {
-				dataList[i] = make([]map[string]interface{}, len(req.Data[i]))
-			}
-			dataList[i][j] = dataMap
-			//fmt.Println("dataMap", dataMap["m"])
-			v, _ := dataMap["m"]
-			//指标名称列表
-			if v == "指标名称" {
-				for nameIndex := 1; nameIndex < len(req.Data[i]); nameIndex++ {
-					if req.Data[i][nameIndex] == nil {
-						break
-					}
-					secNameMap := req.Data[i][nameIndex].(map[string]interface{})
-					secName, _ := secNameMap["m"]
-					if secName == nil {
+			// 存储数据
+			for j := 1; j <= len(secNameList); j++ {
+				closeVal := req.Data[i][j].(map[string]interface{})
+				if item, ok := secNameToDateMap[secNameList[j-1]]; ok {
+					tmpVal, ok := closeVal["m"].(string)
+					if !ok || tmpVal == "" {
 						continue
 					}
-					secNameList = append(secNameList, secNameMap["m"].(string))
-					//fmt.Println("secName:", secNameList)
-				}
-			}
-			//频度列表
-			if v == "频度" {
-				for nameIndex := 1; nameIndex < len(req.Data[i]); nameIndex++ {
-					if req.Data[i][nameIndex] == nil {
-						break
-					}
-					frequencyMap := req.Data[i][nameIndex].(map[string]interface{})
-					frequency, _ := frequencyMap["m"]
-					if frequency == nil {
+					item[date] = tmpVal
+				} else {
+					tmpVal, ok := closeVal["m"].(string)
+					if !ok || tmpVal == "" {
 						continue
 					}
-					frequencyList = append(frequencyList, frequencyMap["m"].(string))
-					//fmt.Println("frequencyList:", frequencyList)
-				}
-			}
-			//单位列表
-			if v == "单位" {
-				for nameIndex := 1; nameIndex < len(req.Data[i]); nameIndex++ {
-					if req.Data[i][nameIndex] == nil {
-						break
-					}
-					unitMap := req.Data[i][nameIndex].(map[string]interface{})
-					unit, _ := unitMap["m"]
-					if unit == nil {
-						continue
+					secNameToDateMap[secNameList[j-1]] = map[string]string{
+						date: tmpVal,
 					}
-					unitList = append(unitList, unitMap["m"].(string))
-					//fmt.Println("unitList:", unitList)
 				}
 			}
-			//数据列表
-			//var valueList []string
-			valueListMap := make(map[int]string)
-			if i > 4 {
-				for index := 1; index < len(req.Data[i]); index++ {
-					if req.Data[i][index] == nil {
-						continue
+
+		} else {
+			for j, dataArr := range req.Data[i] {
+				//每一列
+				if dataArr == nil {
+					continue
+				}
+				dataMap := dataArr.(map[string]interface{})
+				if dataList == nil {
+					dataList = make([][]map[string]interface{}, len(req.Data))
+				}
+				if dataList[i] == nil {
+					dataList[i] = make([]map[string]interface{}, len(req.Data[i]))
+				}
+				dataList[i][j] = dataMap
+				//fmt.Println("dataMap", dataMap["m"])
+				v, _ := dataMap["m"]
+				//指标名称列表
+				if v == "指标名称" {
+					for nameIndex := 1; nameIndex < len(req.Data[i]); nameIndex++ {
+						if req.Data[i][nameIndex] == nil {
+							break
+						}
+						secNameMap := req.Data[i][nameIndex].(map[string]interface{})
+						secName, _ := secNameMap["m"]
+						if secName == nil {
+							continue
+						}
+						secNameList = append(secNameList, secNameMap["m"].(string))
+						//fmt.Println("secName:", secNameList)
 					}
-					valueMap := req.Data[i][index].(map[string]interface{})
-					value, _ := valueMap["m"]
-					if value == nil {
-						continue
+				}
+				//频度列表
+				if v == "频度" {
+					for nameIndex := 1; nameIndex < len(req.Data[i]); nameIndex++ {
+						if req.Data[i][nameIndex] == nil {
+							break
+						}
+						frequencyMap := req.Data[i][nameIndex].(map[string]interface{})
+						frequency, _ := frequencyMap["m"]
+						if frequency == nil {
+							continue
+						}
+						frequencyList = append(frequencyList, frequencyMap["m"].(string))
 					}
-					valueListMap[index] = valueMap["m"].(string)
-
-					// 09-27 千位分隔符时用 "m" 取字符串存数据库会把逗号当小数点,现在换用 "v" 直接取数字再转为字符串,看看会不会有问题
-					if ct, ok := valueMap["ct"].(map[string]interface{}); ok {
-						fa, _ := ct["fa"]
-						if fa == "#,##0.000" {
-							value = valueMap["v"]
-							floatValue := valueMap["v"].(float64)
-							valueListMap[index] = strconv.FormatFloat(floatValue, 'f', -1, 64)
+				}
+				//单位列表
+				if v == "单位" {
+					for nameIndex := 1; nameIndex < len(req.Data[i]); nameIndex++ {
+						if req.Data[i][nameIndex] == nil {
+							break
 						}
+						unitMap := req.Data[i][nameIndex].(map[string]interface{})
+						unit, _ := unitMap["m"]
+						if unit == nil {
+							continue
+						}
+						unitList = append(unitList, unitMap["m"].(string))
 					}
-
-					//valueList = append(valueList, valueMap["m"].(string))
-					//fmt.Println("valueList:", valueList)
 				}
-				dateMap := req.Data[i][0].(map[string]interface{})
-				date := dateMap["m"].(string)
-				dateValueMap[date] = valueListMap
 			}
 		}
-
-		//firstCell := req.Data[i][0]
-		//if firstCell == nil {
-		//	continue
-		//}
-		//dataMap := firstCell.(map[string]interface{})
-		//if dataList == nil {
-		//	dataList = make([][]map[string]interface{}, len(req.Data[i]))
-		//}
-		//if dataList[i] == nil {
-		//	dataList[i] = make([]map[string]interface{}, len(req.Data[i]))
-		//}
-		//dataList[i][0] = dataMap
-		//fmt.Println("dataMap", dataMap["m"])
-		//v, _ := dataMap["m"]
-		////指标名称
-		//if v == "指标名称" {
-		//	secNameMap := req.Data[i][1].(map[string]interface{})
-		//	secName = secNameMap["m"].(string)
-		//	fmt.Println("secName:", secName)
-		//}
-		////频度
-		//if v == "频度" {
-		//	frequencyMap := req.Data[i][1].(map[string]interface{})
-		//	frequency = frequencyMap["m"].(string)
-		//	fmt.Println("frequency:", frequency)
-		//}
-		////单位
-		//if v == "单位" {
-		//	unitMap := req.Data[i][1].(map[string]interface{})
-		//	unit = unitMap["m"].(string)
-		//	fmt.Println("unit:", unit)
-		//}
-		//
-		////日期
-		//dateMap := req.Data[i][1].(map[string]interface{})
-		//createDate = dateMap["m"].(string)
-		//
-		////值
-		//valueMap := req.Data[i][valueIndex].(map[string]interface{})
-		//closeVal = valueMap["m"].(string)
-
-		//新增指标
-		//errMsg := services.AddEdbItem(secName, unit, frequency, req.ClassifyId, sysUser)
-		//if errMsg == "" {
-		//	br.Msg = "新增指标异常!"
-		//	br.ErrMsg = errMsg
-		//	return
-		//}
-
-		valueIndex++
-	}
-
-	//var excelId int64
-	//保存EXCEL样式
-	//{
-	//	cellData, err := json.Marshal(cellDataList)
-	//	if err != nil {
-	//		br.Msg = "参数解析异常!"
-	//		br.ErrMsg = "参数解析失败,Err:" + err.Error()
-	//		return
-	//	}
-	//	config, err := json.Marshal(req.Config)
-	//	if err != nil {
-	//		br.Msg = "参数解析异常!"
-	//		br.ErrMsg = "参数解析失败,Err:" + err.Error()
-	//		return
-	//	}
-	//	datas, err := json.Marshal(dataList)
-	//	if err != nil {
-	//		br.Msg = "参数解析异常!"
-	//		br.ErrMsg = "参数解析失败,Err:" + err.Error()
-	//		return
-	//	}
-	//	excelItem := data_manage.ExcelStyle{
-	//		CellData: string(cellData),
-	//		Config:   string(config),
-	//		Data:     string(datas),
-	//	}
-	//	excelId, err = models.AddExcelData(&excelItem)
-	//	if err != nil {
-	//		br.ErrMsg = "获取失败,Err:" + err.Error()
-	//		br.Msg = "获取失败"
-	//		return
-	//	}
-	//
-	//	//判断映射表是否已经存在
-	//	count, err := data_manage.GetExcelEdbdataMappingCount(req.ClassifyId, target.TradeCode, frequency)
-	//	if err != nil {
-	//		br.ErrMsg = "GetExcelEdbdataMappingCount,Err:" + err.Error()
-	//		br.Msg = "新增映射表失败"
-	//		return
-	//	}
-	//	mappingItem := data_manage.ExcelEdbdataMapping{
-	//		ExcelId:    excelId,
-	//		ClassifyId: req.ClassifyId,
-	//		Frequency:  frequency,
-	//		TradeCode:  target.TradeCode,
-	//		CreateTime: time.Now(),
-	//	}
-	//	if count == 0{
-	//		//新增
-	//		err := data_manage.AddExcelEdbdataMapping(&mappingItem)
-	//		if err != nil {
-	//			br.ErrMsg = "AddExcelEdbdataMapping,Err:" + err.Error()
-	//			br.Msg = "新增映射表失败"
-	//			return
-	//		}
-	//	}
-	//}
+	}
 
 	// 所有的指标数据map
-	edbCodeDataMap := make(map[string]map[string]string)
-
-	//操作指标,新增指标及数据等
-	{
-		for i := 0; i < len(secNameList); i++ {
-			//fmt.Println("len(secNameList):", len(secNameList))
-			secName := secNameList[i]
-			frequency := frequencyList[i]
-
-			//防止填了指标名称后没填单位报错
-			if len(unitList) < len(secNameList) {
-				br.Msg = "单位填写异常!"
-				br.ErrMsg = "单位填写异常!"
-				return
-			}
-			unit := unitList[i]
-
-			for j, s := range dateList {
-				var closeVal string
-				//valueList, ok := dateValueMap[s]
-				valueMap, ok := dateValueMap[s]
-				//fmt.Println("valueMap:", valueMap)
-				if ok {
-					createDate := dateList[j]
-					//if i < len(valueList) {
-					//	closeVal = valueList[i]
-					//} else {
-					//	continue
-					//}
-					closeVal, ok = valueMap[i+1]
-					target, ok2 := targetMap[secName]
-					if !ok2 {
-						tmpTarget, err := models.GetTargetBySecName(secName)
-						if err != nil {
-							//如果是找不到该指标,那么新增指标
-							if err.Error() == utils.ErrNoRow() {
-								//if frequency == "" {
-								//	failItem := new(models.EdbdataImportFail)
-								//	failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
-								//	failItem.ClassifyName = classifyName
-								//	failItem.CreateDate = createDate
-								//	failItem.SecName = secName
-								//	failItem.Close = closeVal
-								//	failItem.Remark = "新增指标失败,频度字段为空"
-								//	failItem.Frequency = frequency
-								//	failItem.Unit = unit
-								//	failDatas = append(failDatas, failItem)
-								//	continue
-								//}
-								//if unit == "" {
-								//	failItem := new(models.EdbdataImportFail)
-								//	failItem.SysUserId = strconv.Itoa(sysUser.AdminId)
-								//	failItem.ClassifyName = classifyName
-								//	failItem.CreateDate = createDate
-								//	failItem.SecName = secName
-								//	failItem.Close = closeVal
-								//	failItem.Remark = "新增指标失败,单位字段为空"
-								//	failItem.Frequency = frequency
-								//	failItem.Unit = unit
-								//	failDatas = append(failDatas, failItem)
-								//	continue
-								//}
-
-								tmpErr := data.AddEdbInfo(secName, unit, frequency, "", sysUser.Mobile, req.ClassifyId, sysUser.AdminId, sysUser.RealName)
-								if tmpErr != nil {
-									//fmt.Println("AddEdbInfo err:", err.Error())
-									utils.FileLogData.Error("AddEdbInfo err :%s", tmpErr.Error())
-									continue
-								}
-								tmpTarget, tmpErr := models.GetTargetBySecName(secName)
-								target = tmpTarget
-								targetMap[secName] = target
-							} else {
-								fmt.Println("导入数据 获取指标:Err:" + err.Error())
-							}
-						} else {
-							target = tmpTarget
-							targetMap[secName] = target
-						}
-					}
+	edbCodeInfoMap := make(map[string]*models.EdbInfoItem)
 
-					//判断指标数据是否已经存在
-					tmpDataMap, ok2 := edbCodeDataMap[target.TradeCode]
-					if !ok2 {
-						tmpDataMap = make(map[string]string)
-						targetDataList, tmpErr := models.GetTargetsDataList(target.TradeCode)
-						if tmpErr != nil {
-							err = tmpErr
-						}
-						for _, tmpData := range targetDataList {
-							tmpDataMap[tmpData.Dt] = tmpData.Close
-						}
-						edbCodeDataMap[target.TradeCode] = tmpDataMap
-					}
+	if len(frequencyList) == 0 {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "保存成功"
+		return
+	}
 
-					//判断数据是否已经存在
-					tmpVal, ok3 := tmpDataMap[createDate]
-					//数据已存在,进行更新操作
-					if ok3 {
-						if closeVal != "" {
-							// 库里面的数据
-							tmpValDecimal, tmpErr := decimal.NewFromString(tmpVal)
-							if tmpErr != nil {
-								fmt.Println("tmpVal Parse err:", tmpErr.Error())
-								err = tmpErr
-								continue
-							}
-							// 用户填写的数据
-							closeValDecimal, tmpErr := decimal.NewFromString(closeVal)
-							if tmpErr != nil {
-								fmt.Println("closeVal Parse err:", tmpErr.Error())
-								err = tmpErr
-								continue
-							}
-							if !tmpValDecimal.Equal(closeValDecimal) {
-								fmt.Println("更新数值")
-								err = models.ModifyTargetsDataByImport(target.TradeCode, createDate, closeVal)
-								if err != nil {
-									fmt.Println("ModifyTargetsDataByImport err:", err.Error())
-									errs = append(errs, err.Error())
-									//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 修改数据失败:Err:"+err.Error(), utils.EmailSendToUsers)
-								}
-							}
-						} else {
-							fmt.Println("删除数值")
-							err = models.DeleteTargetsDataByImport(target.TradeCode, createDate)
-							if err != nil {
-								fmt.Println("DeleteTargetsDataByImport err:", err.Error())
-								errs = append(errs, err.Error())
-								//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 修改数据失败:Err:"+err.Error(), utils.EmailSendToUsers)
-							}
-						}
+	//获取账户所拥有权限的分类id集合
+	classifyIdStrList, err := data.GetEdbClassifyListByAdminId(int64(sysUser.AdminId))
+	if err != nil {
+		br.Msg = "获取分类数据失败"
+		return
+	}
+	IsVaild := 0
+	for _, classifyId := range classifyIdStrList {
+		if strconv.Itoa(req.ClassifyId) == classifyId {
+			IsVaild += 1
+		}
+		if strconv.Itoa(req.OldClassifyId) == classifyId {
+			IsVaild += 1
+		}
+	}
+	if IsVaild != 2 {
+		br.Msg = "操作权限不足,请检查分类操作权限"
+		br.ErrMsg = "操作权限不足"
+		return
+	}
 
-						if frequency != target.Frequency || unit != target.Unit || req.ClassifyId != target.ClassifyId {
-							fmt.Println("更新指标频度或单位")
-							err = models.ModifyEdbinfo(target.TradeCode, unit, frequency, req.ClassifyId)
-							if err != nil {
-								fmt.Println("EditEdbinfo err:", err.Error())
-								return
-							}
-						}
-					} else { //数据不存在,进行新增操作
-						if target.TradeCode != "" && createDate != "" && closeVal != "" {
-							fmt.Println("新增")
-							models.AddTargetsDataByImport(target.TradeCode, createDate, closeVal)
-							if err != nil {
-								fmt.Println("AddTargetsDataByImport err:", err.Error())
-								errs = append(errs, err.Error())
-								//go utils.SendEmail(utils.APPNAME+"失败提醒", "导入数据 新增数据失败:Err:"+err.Error(), utils.EmailSendToUsers)
-							}
-
-							tmpDataMap[createDate] = closeVal
-							edbCodeDataMap[target.TradeCode] = tmpDataMap
-						}
-					}
+	// 获取当前类所有的有效指标
+	list, err := models.GetTargetItemListSort(req.ClassifyId, 1, req.Frequence, "", "", classifyIdStrList)
+	if err != nil {
+		br.Msg = "获取指标失败"
+		br.ErrMsg = "获取有效指标失败,系统错误,Err:" + err.Error()
+		return
+	}
 
-					//保存关联表
-					//{
-					//	//判断映射表是否已经存在
-					//	count, err := data_manage.GetExcelEdbdataMappingCount(req.ClassifyId, target.TradeCode, frequency)
-					//	if err != nil {
-					//		br.ErrMsg = "GetExcelEdbdataMappingCount,Err:" + err.Error()
-					//		br.Msg = "新增映射表失败"
-					//		return
-					//	}
-					//	mappingItem := data_manage.ExcelEdbdataMapping{
-					//		ExcelId:    excelId,
-					//		ClassifyId: req.ClassifyId,
-					//		Frequency:  frequency,
-					//		TradeCode:  target.TradeCode,
-					//		CreateTime: time.Now(),
-					//	}
-					//	if count == 0{
-					//		//新增
-					//		err := data_manage.AddExcelEdbdataMapping(&mappingItem)
-					//		if err != nil {
-					//			br.ErrMsg = "AddExcelEdbdataMapping,Err:" + err.Error()
-					//			br.Msg = "新增映射表失败"
-					//			return
-					//		}
-					//	}
-					//}
+	for _, item := range list {
+		edbCodeInfoMap[item.SecName] = item
+	}
+	//历史的类别下的指标
+	oldEdbCodeInfoMap := make(map[string]*models.EdbInfoItem)
+	if req.ClassifyId != req.OldClassifyId || req.Frequence != req.OldFrequence {
+		// 获取历史类所有的有效指标
+		oldList, err := models.GetTargetItemListSort(req.OldClassifyId, 1, req.OldFrequence, "", "", classifyIdStrList)
+		if err != nil {
+			br.Msg = "获取指标失败"
+			br.ErrMsg = "获取有效指标失败,系统错误,Err:" + err.Error()
+			return
+		}
+		for _, item := range oldList {
+			edbCodeInfoMap[item.SecName] = item
+			oldEdbCodeInfoMap[item.SecName] = item
+		}
+	} else {
+		// 如果没有更换指标类别和频度,那就保持一致
+		oldEdbCodeInfoMap = edbCodeInfoMap
+	}
+
+	// 删除历史类别下的指标及数据
+	if req.TradeCode == "" {
+		// TradeCode == "" 表示当前数据不是经过搜索的数据,可以进行删除指标操作
+		deleteTraceCodeList := make([]string, 0)
+		for k, v := range oldEdbCodeInfoMap {
+			if _, ok := secNameToDateMap[k]; !ok {
+				deleteTraceCodeList = append(deleteTraceCodeList, v.TradeCode)
+			}
+		}
+		// 删除指标
+		err = models.DeleteEdbinfoByTraceCodeList(deleteTraceCodeList)
+		if err != nil {
+			br.Msg = "excel保存失败"
+			br.ErrMsg = "指标及指标数据删除失败,Err:" + err.Error()
+			return
+		}
+	}
+
+	// 获得需要新增的指标
+	addEdbInfoList := make([]*models.Edbinfo, 0)
+	sortEdbInfoList := make([]*models.Edbinfo, 0)
+	for i, v := range secNameList {
+		if item, ok := edbCodeInfoMap[v]; !ok {
+			t := new(models.Edbinfo)
+			t.SecName = v
+			t.Unit = unitList[i]
+			t.Remark = "手动"
+			t.Frequency = frequencyList[i]
+			t.ClassifyId = req.ClassifyId
+			t.UserId = sysUser.AdminId
+			t.Sort = len(list) + i
+			addEdbInfoList = append(addEdbInfoList, t)
+			edbCodeInfoMap[t.SecName] = &models.EdbInfoItem{
+				TradeCode: t.TradeCode,
+				SecName:   t.SecName,
+				Unit:      t.Unit,
+				Frequency: t.Frequency,
+				UserId:    t.UserId,
+			}
+		} else {
+			t := new(models.Edbinfo)
+			t.TradeCode = item.TradeCode
+			if req.Frequence != req.OldFrequence || req.ClassifyId != req.OldClassifyId {
+				t.Sort = len(list) + i
+			} else {
+				if req.TradeCode != "" {
+					// 如果是搜索的指标,那就保存原来的排序
+					t.Sort = item.Sort
+				} else {
+					t.Sort = i
 				}
 			}
+			t.Frequency = req.Frequence
+			t.ClassifyId = req.ClassifyId
+			sortEdbInfoList = append(sortEdbInfoList, t)
+		}
+	}
+	// 更新指标频度,分类,顺序
+	for _, v := range sortEdbInfoList {
+		err = v.Update([]string{"frequency", "classify_id", "sort"})
+		if err != nil {
+			br.Msg = "excel保存失败"
+			br.ErrMsg = "excel更新顺序失败,Err:" + err.Error()
+			return
+		}
+	}
+	// 新增指标
+	msg, err := data.MultiAddEdbInfo(addEdbInfoList, sysUser.Mobile)
+	if err != nil {
+		if msg != "" {
+			br.Msg = msg
+		} else {
+			br.Msg = "指标保存失败"
+		}
+		br.ErrMsg = "新增指标失败,系统错误,Err:" + err.Error()
+		return
+	}
+	for _, v := range addEdbInfoList {
+		edbCodeInfoMap[v.SecName].TradeCode = v.TradeCode
+	}
+	// 新增指标数据
+	addEdbDataList := make([]*models.Edbdata, 0)
+	for _, v := range secNameList {
+		// 指标数据
+		for date, closeVal := range secNameToDateMap[v] {
+			t := new(models.Edbdata)
+			// 理论上这里面不应该出现空值
+			t.TradeCode = edbCodeInfoMap[v].TradeCode
+			t.Dt = date
+			t.Close = closeVal
+			t.ModifyTime = time.Now()
+			addEdbDataList = append(addEdbDataList, t)
 		}
 	}
+	err = models.MultiAddEdbdata(addEdbDataList)
+	if err != nil {
+		br.Msg = "excel保存失败"
+		br.ErrMsg = "新增指标数据失败,系统错误,Err:" + err.Error()
+		return
+	}
 
-	//resp := models.TargetItemListResp{
-	//	List: list,
-	//}
 	br.Ret = 200
 	br.Success = true
-	br.Msg = "获取成功"
-	//br.Data = resp
-	//br.Data = list
+	br.Msg = "保存成功"
 }
 
 // ExcelDataEdit

+ 6 - 2
models/data_manage/excel_style.go

@@ -1,8 +1,9 @@
 package data_manage
 
 import (
-	"github.com/beego/beego/v2/client/orm"
 	"time"
+
+	"github.com/beego/beego/v2/client/orm"
 )
 
 type ExcelStyle struct {
@@ -30,8 +31,11 @@ type ExcelStyleReq struct {
 	CellData         []interface{}
 	Config           interface{}
 	Data             [][]interface{}
-	Frequency        string `description:"频度"`
+	TradeCode        string `description:"指标编码"`
+	Frequence        string `description:"频度"`
 	ClassifyId       int    `description:"分类id"`
+	OldClassifyId    int    `description:"历史分类id"`
+	OldFrequence     string `description:"历史频度"`
 }
 
 type CellData struct {

+ 3 - 1
models/db.go

@@ -25,9 +25,10 @@ import (
 	"eta/eta_api/models/system"
 	"eta/eta_api/models/yb"
 	"eta/eta_api/utils"
-	_ "github.com/go-sql-driver/mysql"
 	"time"
 
+	_ "github.com/go-sql-driver/mysql"
+
 	"github.com/beego/beego/v2/client/orm"
 )
 
@@ -104,6 +105,7 @@ func init() {
 		new(VarietyTag),                 // 标签表
 		new(ResearchVarietyTagRelation), // 研究员标签关系表
 		new(ReportPptImg),               //Ppt转报告的图片记录表
+		new(EdbinfoUser),
 	)
 
 	// 系统表 数据表

+ 171 - 13
models/target.go

@@ -1,15 +1,17 @@
 package models
 
 import (
+	"context"
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"sort"
 	"strconv"
 	"strings"
 	"time"
+
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
 )
 
 type DataList struct {
@@ -70,6 +72,32 @@ type Edbdata struct {
 	ModifyTime time.Time `orm:"column(modify_time)" description:"修改时间"`
 }
 
+func MultiAddEdbdata(edbDataList []*Edbdata) (err error) {
+	if len(edbDataList) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("edb")
+	err = o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
+		holder := make([]string, 0)
+		tradeCodeList := make([]string, 0)
+		for _, v := range edbDataList {
+			holder = append(holder, "?")
+			tradeCodeList = append(tradeCodeList, v.TradeCode)
+		}
+		sql := "DELETE FROM edbdata WHERE TRADE_CODE in (" + strings.Join(holder, ",") + ")"
+		_, err := txOrm.Raw(sql, tradeCodeList).Exec()
+		if err != nil {
+			return err
+		}
+		_, err = txOrm.InsertMulti(500, edbDataList)
+		if err != nil {
+			return err
+		}
+		return nil
+	})
+	return
+}
+
 func GetDataInfo(tradeCode, creteDate string) (item *Edbdata, err error) {
 	sql := " SELECT * FROM edbdata WHERE TRADE_CODE=? AND DT=? "
 	o := orm.NewOrmUsingDB("edb")
@@ -137,18 +165,35 @@ func DeleteAllEdbData(tradeCode string) (err error) {
 	return
 }
 
+// DeleteAllEdbDataByTradeCodeList 根据指标code删除数据
+func DeleteAllEdbDataByTradeCodeList(tradeCodeList []string) (err error) {
+	if len(tradeCodeList) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("edb")
+	var holder []string
+	for range tradeCodeList {
+		holder = append(holder, "?")
+	}
+	sql := ` DELETE FROM edbdata WHERE TRADE_CODE in (` + strings.Join(holder, ",") + `) `
+	_, err = o.Raw(sql, tradeCodeList).Exec()
+	return
+}
+
 type Edbinfo struct {
-	TradeCode   string  `orm:"column(TRADE_CODE);pk" description:"指标code"`
-	SecName     string  `orm:"column(SEC_NAME);" description:"指标名称"`
-	Unit        string  `orm:"column(UNIT);" description:"单位"`
-	Remark      string  `orm:"column(REMARK);" description:"备注"`
-	Frequency   string  `description:"频度"`
-	ClassifyId  int     `description:"分类id"`
-	CreateDate  string  `description:"创建时间"`
-	UserId      int     `description:"录入用户id"`
-	UserName    string  `description:"录入用户名称"`
-	NoticeTime  string  `description:"通知时间"`
-	Mobile      string  `description:"录入者手机号"`
+	TradeCode    string `orm:"column(TRADE_CODE);pk" description:"指标code"`
+	SecName      string `orm:"column(SEC_NAME);" description:"指标名称"`
+	Unit         string `orm:"column(UNIT);" description:"单位"`
+	Remark       string `orm:"column(REMARK);" description:"备注"`
+	Frequency    string `orm:"column(frequency)" description:"频度"`
+	ClassifyId   int    `orm:"column(classify_id)" description:"分类id"`
+	ClassifyName string `orm:"-" description:"分类名称"`
+	CreateDate   string `orm:"column(create_date)" description:"创建时间"`
+	UserId       int    `orm:"column(user_id)" description:"录入用户id"`
+	UserName     string `orm:"column(user_name)" description:"录入用户名称"`
+	NoticeTime   string `orm:"column(notice_time)" description:"通知时间"`
+	Mobile       string `orm:"column(mobile)" description:"录入者手机号"`
+	Sort         int    `orm:"column(sort)" description:"排序"`
 	ModifyTime  string  `description:"最近一次更新时间"`
 	IsJoinEdb   int8    `description:"指标库是否已添加:0-否;1-是"`
 	StartDate   string  `description:"数据开始日期"`
@@ -156,6 +201,31 @@ type Edbinfo struct {
 	LatestValue float64 `description:"指标最新值"`
 }
 
+func DeleteEdbinfoByTraceCodeList(tradeCodeList []string) (err error) {
+	if len(tradeCodeList) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("edb")
+	err = o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {
+		var holder []string
+		for range tradeCodeList {
+			holder = append(holder, "?")
+		}
+		sql := ` DELETE FROM edbdata WHERE TRADE_CODE in (` + strings.Join(holder, ",") + `) `
+		_, err := txOrm.Raw(sql, tradeCodeList).Exec()
+		if err != nil {
+			return err
+		}
+		sql = ` DELETE FROM edbinfo WHERE TRADE_CODE in (` + strings.Join(holder, ",") + `)`
+		_, err = txOrm.Raw(sql, tradeCodeList).Exec()
+		if err != nil {
+			return err
+		}
+		return nil
+	})
+	return
+}
+
 func GetEdbinfoListCount(condition string, pars []interface{}, mobile string, roleType int) (count int, err error) {
 	o := orm.NewOrmUsingDB("edb")
 	sql := ``
@@ -283,6 +353,24 @@ func GetEdbinfoBySecName(secName string) (item *Edbinfo, err error) {
 	return
 }
 
+func GetEdbinfoBySecNameList(secNameList []string) (items []*Edbinfo, err error) {
+	if len(secNameList) == 0 {
+		return
+	}
+	sql := `SELECT * FROM edbinfo WHERE  left(TRADE_CODE,1)='W' AND REMARK='手动' `
+	if len(secNameList) > 0 {
+		var holder []string
+		for range secNameList {
+			holder = append(holder, "?")
+		}
+
+		sql += " AND SEC_NAME IN (" + strings.Join(holder, ",") + ") "
+	}
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql, secNameList).QueryRows(&items)
+	return
+}
+
 func GetEdbinfoByTradeCode(tradeCode string) (item *Edbinfo, err error) {
 	sql := `SELECT * FROM edbinfo WHERE TRADE_CODE=? `
 	o := orm.NewOrmUsingDB("edb")
@@ -313,6 +401,12 @@ func AddEdbinfo(tradeCode, secName, unit, remark, frequency, noticeTime string,
 	return
 }
 
+func MultiAddEdbinfoV2(edbInfoList []*Edbinfo) (err error) {
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.InsertMulti(len(edbInfoList), edbInfoList)
+	return
+}
+
 func AddEdbinfoUser(tradeCode, mobile string) (err error) {
 	o := orm.NewOrmUsingDB("edb")
 	sql := `INSERT INTO edbinfo_user(TRADE_CODE, mobile) VALUES (?,?)`
@@ -320,6 +414,18 @@ func AddEdbinfoUser(tradeCode, mobile string) (err error) {
 	return
 }
 
+type EdbinfoUser struct {
+	EdbinfoUserId int    `orm:"pk" description:"主键"`
+	TradeCode     string `orm:"column(TRADE_CODE);" description:"指标code"`
+	Mobile        string `orm:"column(mobile);" description:"手机号"`
+}
+
+func MultiAddEdbinfoUser(edbInfoUserList []*EdbinfoUser) (err error) {
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.InsertMulti(len(edbInfoUserList), edbInfoUserList)
+	return
+}
+
 type EdbinfoEditReq struct {
 	TradeCode  string `description:"指标code"`
 	SecName    string `description:"指标名称"`
@@ -1233,6 +1339,7 @@ type EdbInfoItem struct {
 	ModifyDate   string     `description:"待更新日期"`
 	ModifyTime   string     `description:"最近一次更新时间"`
 	Status       string     `description:"状态:未完成/完成"`
+	Sort         int        `description:"排序"`
 	IsJoinEdb    int8       `description:"指标库是否已添加:0-否;1-是"`
 	StartDate    string     `description:"数据开始日期"`
 	EndDate      string     `description:"数据结束日期"`
@@ -1291,6 +1398,57 @@ left join edbdata b on a.TRADE_CODE=b.TRADE_CODE `
 
 }
 
+// GetTargetItemList 获取指标列表数据
+func GetTargetItemListSort(classifyId, edbShowType int, frequency, keyword, tradeCode string, classifyIdStrList []string) (items []*EdbInfoItem, err error) {
+	o := orm.NewOrmUsingDB("edb")
+
+	pars := make([]interface{}, 0)
+
+	sql := ` SELECT a.*,'' modify_date,'' STATUS FROM edbinfo AS a `
+	if edbShowType != 0 {
+		sql = ` SELECT a.*,b.DT,'' modify_date,'' STATUS FROM edbinfo AS a 
+left join edbdata b on a.TRADE_CODE=b.TRADE_CODE `
+	}
+	sql += ` WHERE LEFT(a.TRADE_CODE,1)='W' AND a.REMARK='手动' AND a.classify_id>0 `
+
+	//如果没有分类id集合列表,那么就没有数据了,不用往下执行了,直接返回好了
+	if len(classifyIdStrList) <= 0 {
+		return
+	}
+	if len(classifyIdStrList) > 0 {
+		sql += ` AND a.classify_id in (` + strings.Join(classifyIdStrList, ",") + `)  `
+	}
+	if classifyId > 0 {
+		sql += ` AND a.classify_id=` + strconv.Itoa(classifyId) + ` `
+	}
+	//频度
+	if frequency != "" {
+		sql += ` AND a.frequency="` + frequency + `" `
+	}
+	//关键字
+	if keyword != "" {
+		sql += ` AND (a.SEC_NAME like ?  or a.TRADE_CODE like ? )`
+		pars = utils.GetLikeKeywordPars(pars, keyword, 2)
+	}
+	//指定指标
+	if tradeCode != "" {
+		sql += ` AND a.TRADE_CODE = "` + tradeCode + `" `
+	}
+	//指标里面是否有数据
+	switch edbShowType {
+	case 1:
+		sql += ` AND b.CLOSE is not null `
+	case 2:
+		sql += ` AND b.CLOSE is null `
+	}
+	sql += ` GROUP BY a.TRADE_CODE `
+
+	sql = sql + ` ORDER BY sort ASC, CONVERT(a.SEC_NAME USING gbk )  COLLATE gbk_chinese_ci ASC `
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+
+}
+
 // GetLzItemList 模糊查询隆众数据库指标列表
 func GetLzItemList(keyword string) (items []*data_manage.LongzhongSurveyProduct, err error) {
 	o := orm.NewOrmUsingDB("edb")

+ 8 - 7
services/data/chart_info.go

@@ -3370,8 +3370,7 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 		}
 		// 上下限区间
 		if seasonConfig.MaxMinLimits.Year > 0 {
-			yearRange := time.Now().Year() - seasonConfig.MaxMinLimits.Year
-			startYear := time.Now().AddDate(-yearRange, 0, 0).Year()
+			startYear := time.Now().AddDate(-seasonConfig.MaxMinLimits.Year, 0, 0).Year()
 			dataResp.MaxMinLimits.List = make([]*data_manage.MaxMinLimitsData, 0)
 			dataTimeMap := make(map[time.Time]time.Time)
 			dataTimeList := make([]string, 0)
@@ -3689,7 +3688,7 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 			dataTimeList := make([]string, 0)
 			valueMap := make(map[time.Time]float64)
 			averageDataList := make([]*data_manage.SamePeriodAverageData, 0)
-			for i := len(quarterDataList) - 1; i > len(quarterDataList)-seasonConfig.SamePeriodAverage.Year && i > 0; i-- {
+			for i := len(quarterDataList) - 1; i >= 0; i-- {
 				// 插值成日度
 				dataTimeList, _, err = HandleDataByLinearRegressionToList(quarterDataList[i].DataList, handleDataMap)
 				if err != nil {
@@ -3702,8 +3701,7 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 						err = errors.New("时间格式化异常, Err:" + e.Error())
 						return
 					}
-					yearRange := time.Now().Year() - seasonConfig.SamePeriodAverage.Year
-					startYear := time.Now().AddDate(-yearRange, 0, 0).Year()
+					startYear := time.Now().AddDate(-seasonConfig.SamePeriodAverage.Year, 0, 0).Year()
 					if dateTime.Year() < startYear {
 						continue
 					}
@@ -3711,6 +3709,10 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 					if dateTime.Month() == 2 && dateTime.Day() == 29 {
 						continue
 					}
+					// 不包含当年
+					if quarterDataList[i].ChartLegend == strconv.Itoa(time.Now().Year()) {
+						continue
+					}
 					newDate := dateTime.AddDate(time.Now().Year()-dateTime.Year(), 0, 0)
 					// 处理均值
 					if value, ok := valueMap[newDate]; ok {
@@ -3753,8 +3755,7 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 
 		// 自定义同期标准差
 		if seasonConfig.SamePeriodStandardDeviation.Year > 1 && seasonConfig.SamePeriodStandardDeviation.Multiple > 0 {
-			yearRange := time.Now().Year() - seasonConfig.SamePeriodAverage.Year
-			startYear := time.Now().AddDate(-yearRange, 0, 0).Year()
+			startYear := time.Now().AddDate(-seasonConfig.SamePeriodStandardDeviation.Year, 0, 0).Year()
 
 			// 先算均值,再算标准差
 			handleDataMap := make(map[string]float64)

+ 78 - 0
services/data/edb_info.go

@@ -757,6 +757,84 @@ func AddEdbInfo(secName, unit, frequency, noticeTime, mobile string, classifyId,
 	return
 }
 
+// AddEdbInfo 新增手工指标数据
+func MultiAddEdbInfo(edbInfoList []*models.Edbinfo, mobile string) (msg string, err error) {
+	if len(edbInfoList) == 0 {
+		return
+	}
+	var ok bool
+	for i := 0; i < 10; i++ {
+		// 重试加锁
+		ok = utils.Rc.SetNX(utils.CACHE_KEY_EDBINFO_ADD, 1, time.Second*10)
+		if ok {
+			defer func() {
+				_ = utils.Rc.Delete(utils.CACHE_KEY_EDBINFO_ADD)
+			}()
+			break
+		}
+		time.Sleep(100 * time.Millisecond)
+	}
+	if !ok {
+		msg = "当前指标保存过于频繁,请稍后重试"
+		err = errors.New("当前指标保存过于频繁,请稍后重试")
+		return
+	}
+	tradeCode, err := models.GetMaxTradeCode()
+	if err != nil {
+		return
+	}
+	if tradeCode == "" {
+		err = errors.New("最大编码为空")
+		return
+	}
+	maxTradeCodeList, err := utils.GetTradeCodeList(tradeCode, len(edbInfoList))
+	if err != nil {
+		err = errors.New("获取编码信息失败,Err:" + err.Error())
+		return
+	}
+	if len(maxTradeCodeList) == 0 {
+		err = errors.New("编码为空,请联系技术")
+		return
+	}
+	var secNameList []string
+	for _, v := range edbInfoList {
+		secNameList = append(secNameList, v.SecName)
+	}
+	items, err := models.GetEdbinfoBySecNameList(secNameList)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		err = errors.New("获取信息失败,Err:" + err.Error())
+		return
+	}
+	if len(items) > 0 {
+		var existName []string
+		for _, edbInfo := range items {
+			existName = append(existName, edbInfo.SecName)
+		}
+		msg = fmt.Sprintf("指标名称已存在:%s", strings.Join(existName, ","))
+		err = errors.New("指标名称已存在")
+		return
+	}
+	// 先删除该指标编码的历史数据(避免上海删除指标时,没有删除该指标数据)
+	_ = models.DeleteAllEdbDataByTradeCodeList(maxTradeCodeList)
+	// 再次新增指标
+	edbInfoUserList := make([]*models.EdbinfoUser, 0)
+	for i, v := range maxTradeCodeList {
+		t := new(models.EdbinfoUser)
+		t.TradeCode = v
+		t.Mobile = mobile
+		edbInfoUserList = append(edbInfoUserList, t)
+
+		edbInfoList[i].TradeCode = v
+	}
+	err = models.MultiAddEdbinfoV2(edbInfoList)
+	if err != nil {
+		err = errors.New("新增失败,Err:" + err.Error())
+		return
+	}
+	err = models.MultiAddEdbinfoUser(edbInfoUserList)
+	return
+}
+
 //全部刷新指标
 //func EdbInfoRefreshAllFromBase(edbInfoId int) (err error) {
 //	var errmsg string

+ 101 - 105
services/smart_report.go

@@ -156,11 +156,11 @@ async def main():
     })
     await page.goto('%s', {
         'waitUntil': 'networkidle0',
-        'timeout': 1000000  # 设置超时时间为 100 秒
+        'timeout': 3000000  # 设置超时时间为 100 秒
     })
 
     # 在生成PDF之前等待2秒
-    await asyncio.sleep(5)
+    await asyncio.sleep(10)
 
     await page.pdf({
         'path': "%s",
@@ -229,7 +229,7 @@ async def main():
         # 导航到页面
         await page.goto('%s', {
             'waitUntil': 'networkidle0',
-            'timeout': 1000000  # 设置超时时间为 100 秒
+            'timeout': 3000000  # 设置超时时间为 100 秒
         })
         # Customizing footer for page numbers starting from page 2
 
@@ -239,7 +239,7 @@ async def main():
         await page.screenshot({
             'path': "%s",
             'fullPage': True,
-			'quality':100
+			'quality':80
         })
         
     except errors.BrowserError as e:
@@ -327,127 +327,123 @@ func Report2pdfAndJpeg(reportUrl string, reportId, reportType int) {
 	reportCode := utils.MD5(strconv.Itoa(reportId))
 
 	pdfPath := `./static/` + reportCode + ".pdf"
-	jpegPath := `./static/` + reportCode + ".jpeg"
+	jpegPath := `./static/` + reportCode + ".jpg"
 
-	go func() {
-		err := ReportToPdf(reportUrl, pdfPath)
-		if err != nil {
-			utils.FileLog.Info("ReportToPdf failed: , error: \n" + err.Error())
-			go alarm_msg.SendAlarmMsg("ReportToPdf failed:"+err.Error(), 3)
-		}
-
-		file, err := os.Open(pdfPath)
-		if err != nil {
-			utils.FileLog.Info("Open failed: , error: \n" + err.Error())
-			go alarm_msg.SendAlarmMsg("Open failed:"+err.Error(), 3)
-			return
-		}
+	err = ReportToPdf(reportUrl, pdfPath)
+	if err != nil {
+		utils.FileLog.Info("ReportToPdf failed: , error: \n" + err.Error())
+		go alarm_msg.SendAlarmMsg("ReportToPdf failed:"+err.Error(), 3)
+	}
 
-		ext := path.Ext(file.Name())
+	file, err := os.Open(pdfPath)
+	if err != nil {
+		utils.FileLog.Info("Open failed: , error: \n" + err.Error())
+		go alarm_msg.SendAlarmMsg("Open failed:"+err.Error(), 3)
+		return
+	}
 
-		randStr := utils.GetRandStringNoSpecialChar(28)
-		fileName := randStr + ext
-		defer file.Close() //关闭上传文件
+	ext := path.Ext(file.Name())
 
-		resourceUrl := ``
-		ossClient := NewOssClient()
-		if ossClient == nil {
-			utils.FileLog.Info("初始化OSS服务失败")
-			return
-		}
-		resourceUrl, err = ossClient.UploadFile(fileName, pdfPath, "")
-		if err != nil {
-			utils.FileLog.Info("文件上传失败, Err: \n" + err.Error())
-			go alarm_msg.SendAlarmMsg("文件上传失败:"+err.Error(), 3)
-			return
-		}
-		defer func() {
-			_ = os.Remove(pdfPath)
-		}()
-
-		if reportType == 3 {
-			// 更新pdf url
-			ob := new(smart_report.SmartReport)
-			ob.SmartReportId = reportId
-			ob.DetailPdfUrl = resourceUrl
-			if err = ob.Update([]string{"DetailPdfUrl"}); err != nil {
-				utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
-				return
-			}
-		} else if reportType == 2 {
-			err = models.ModifyEnglishReportPdfUrl(reportId, resourceUrl)
-			if err != nil {
-				utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
-				return
-			}
-		} else if reportType == 1 {
-			err = models.ModifyReportPdfUrl(reportId, resourceUrl)
-			if err != nil {
-				utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
-				return
-			}
-		}
+	randStr := utils.GetRandStringNoSpecialChar(28)
+	fileName := randStr + ext
+	defer file.Close() //关闭上传文件
 
+	resourceUrl := ``
+	ossClient := NewOssClient()
+	if ossClient == nil {
+		utils.FileLog.Info("初始化OSS服务失败")
+		return
+	}
+	resourceUrl, err = ossClient.UploadFile(fileName, pdfPath, "")
+	if err != nil {
+		utils.FileLog.Info("文件上传失败, Err: \n" + err.Error())
+		go alarm_msg.SendAlarmMsg("文件上传失败:"+err.Error(), 3)
+		return
+	}
+	defer func() {
+		_ = os.Remove(pdfPath)
 	}()
 
-	go func() {
-		width := 1200
-		if reportType == 3 {
-			width = 800
+	if reportType == 3 {
+		// 更新pdf url
+		ob := new(smart_report.SmartReport)
+		ob.SmartReportId = reportId
+		ob.DetailPdfUrl = resourceUrl
+		if err = ob.Update([]string{"DetailPdfUrl"}); err != nil {
+			utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
+			return
 		}
-		err := ReportToJpeg(width, reportUrl, jpegPath)
+	} else if reportType == 2 {
+		err = models.ModifyEnglishReportPdfUrl(reportId, resourceUrl)
 		if err != nil {
-			utils.FileLog.Info("ReportToJpeg failed: , error: \n" + err.Error())
+			utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
+			return
 		}
-		file, err := os.Open(jpegPath)
+	} else if reportType == 1 {
+		err = models.ModifyReportPdfUrl(reportId, resourceUrl)
 		if err != nil {
-			utils.FileLog.Info("open file failed: , error: \n" + err.Error())
+			utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
 			return
 		}
+	}
 
-		ext := path.Ext(file.Name())
+	time.Sleep(1 * time.Minute)
 
-		randStr := utils.GetRandStringNoSpecialChar(28)
-		fileName := randStr + ext
-		defer file.Close() //关闭上传文件
+	width := 1200
+	if reportType == 3 {
+		width = 800
+	}
+	err = ReportToJpeg(width, reportUrl, jpegPath)
+	if err != nil {
+		utils.FileLog.Info("ReportToJpeg failed: , error: \n" + err.Error())
+	}
+	file, err = os.Open(jpegPath)
+	if err != nil {
+		utils.FileLog.Info("open file failed: , error: \n" + err.Error())
+		return
+	}
+
+	ext = path.Ext(file.Name())
+
+	randStr = utils.GetRandStringNoSpecialChar(28)
+	fileName = randStr + ext
+	defer file.Close() //关闭上传文件
+
+	resourceUrl = ``
+	ossClient = NewOssClient()
+	if ossClient == nil {
+		utils.FileLog.Info("初始化OSS服务失败")
+		return
+	}
+	resourceUrl, err = ossClient.UploadFile(fileName, jpegPath, "")
+	if err != nil {
+		utils.FileLog.Info("文件上传失败, Err: \n" + err.Error())
+		return
+	}
+	defer func() {
+		_ = os.Remove(jpegPath)
+	}()
 
-		resourceUrl := ``
-		ossClient := NewOssClient()
-		if ossClient == nil {
-			utils.FileLog.Info("初始化OSS服务失败")
+	if reportType == 3 {
+		// 更新jpeg url
+		ob := new(smart_report.SmartReport)
+		ob.SmartReportId = reportId
+		ob.DetailImgUrl = resourceUrl
+		if err = ob.Update([]string{"DetailImgUrl"}); err != nil {
+			utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
 			return
 		}
-		resourceUrl, err = ossClient.UploadFile(fileName, jpegPath, "")
+	} else if reportType == 2 {
+		err = models.ModifyEnglishReportImgUrl(reportId, resourceUrl)
 		if err != nil {
-			utils.FileLog.Info("文件上传失败, Err: \n" + err.Error())
+			utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
 			return
 		}
-		defer func() {
-			_ = os.Remove(jpegPath)
-		}()
-
-		if reportType == 3 {
-			// 更新jpeg url
-			ob := new(smart_report.SmartReport)
-			ob.SmartReportId = reportId
-			ob.DetailImgUrl = resourceUrl
-			if err = ob.Update([]string{"DetailImgUrl"}); err != nil {
-				utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
-				return
-			}
-		} else if reportType == 2 {
-			err = models.ModifyEnglishReportImgUrl(reportId, resourceUrl)
-			if err != nil {
-				utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
-				return
-			}
-		} else if reportType == 1 {
-			err = models.ModifyReportImgUrl(reportId, resourceUrl)
-			if err != nil {
-				utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
-				return
-			}
+	} else if reportType == 1 {
+		err = models.ModifyReportImgUrl(reportId, resourceUrl)
+		if err != nil {
+			utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
+			return
 		}
-
-	}()
+	}
 }

+ 19 - 4
utils/common.go

@@ -12,10 +12,6 @@ import (
 	"encoding/json"
 	"errors"
 	"fmt"
-	"github.com/PuerkitoBio/goquery"
-	"github.com/microcosm-cc/bluemonday"
-	"github.com/shopspring/decimal"
-	xhtml "golang.org/x/net/html"
 	"html"
 	"image"
 	"image/png"
@@ -34,6 +30,11 @@ import (
 	"strings"
 	"time"
 	"unicode"
+
+	"github.com/PuerkitoBio/goquery"
+	"github.com/microcosm-cc/bluemonday"
+	"github.com/shopspring/decimal"
+	xhtml "golang.org/x/net/html"
 )
 
 // 随机数种子
@@ -622,6 +623,20 @@ func GetMaxTradeCode(tradeCode string) (maxTradeCode string, err error) {
 	return
 }
 
+func GetTradeCodeList(tradeCode string, num int) (tradeCodeList []string, err error) {
+	tradeCode = strings.Replace(tradeCode, "W", "", -1)
+	tradeCode = strings.Trim(tradeCode, " ")
+	tradeCodeInt, err := strconv.Atoi(tradeCode)
+	if err != nil {
+		return
+	}
+	for i := 0; i < num; i++ {
+		tradeCodeInt = tradeCodeInt + 1
+		tradeCodeList = append(tradeCodeList, fmt.Sprintf("W%06d", tradeCodeInt))
+	}
+	return
+}
+
 // excel日期字段格式化 yyyy-mm-dd
 func ConvertToFormatDay(excelDaysString string) string {
 	// 2006-01-02 距离 1900-01-01的天数

+ 1 - 0
utils/constants.go

@@ -219,6 +219,7 @@ const (
 	CACHE_KEY_DAYNEW_REFRESH          = "admin:day_new:refresh"               //每日资讯拉取企业微信聊天记录
 	CACHE_KEY_DAYNEW_TRANSLATE        = "admin:day_new:translate"             //每日资讯中翻英
 	CACHE_KEY_ADMIN_OPERATE_RECORD    = "HZ_ADMIN_CACHE_ADMIN_OPERATE_RECORD" //系统用户操作日志队列
+	CACHE_KEY_EDBINFO_ADD             = "eta_api:edbinfo:add"                 //手工指标录入的key
 
 	CACHE_SYNC_ADMIN        = "hz_crm_eta:sync_admin"        // 同步用户的缓存队列key
 	CACHE_SYNC_ROLE         = "hz_crm_eta:sync_role"         // 同步角色的缓存队列key