Browse Source

fix:修改手工数据导入

zqbao 8 months ago
parent
commit
a98a768dc9
5 changed files with 820 additions and 435 deletions
  1. 656 427
      controllers/target.go
  2. 66 4
      models/target.go
  3. 78 0
      services/data/edb_info.go
  4. 19 4
      utils/common.go
  5. 1 0
      utils/constants.go

+ 656 - 427
controllers/target.go

@@ -3363,6 +3363,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数据保存
@@ -3387,27 +3895,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 {
@@ -3416,23 +3903,14 @@ 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 {
 		//取到一行
@@ -3441,434 +3919,185 @@ 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"]
+			date := dateMap["m"].(string)
 			if ok {
-				dateList = append(dateList, dateMap["m"].(string))
-				//fmt.Println("dateList:", dateList)
+				dateList = append(dateList, date)
 			} 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
+			// 存储数据
+			for j := 1; j < len(req.Data[i]); j++ {
+				closeVal := req.Data[i][j].(map[string]interface{})
+				if item, ok := secNameToDateMap[secNameList[j-1]]; ok {
+					item[date] = closeVal["m"].(string)
+				} else {
+					// secNameToDateMap[secNameList[j]] = make(map[string]string)
+					secNameToDateMap[secNameList[j-1]] = map[string]string{
+						date: closeVal["m"].(string),
 					}
-					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)
+
+		} else {
+			for j, dataArr := range req.Data[i] {
+				//每一列
+				if dataArr == nil {
+					continue
 				}
-			}
-			//单位列表
-			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)
+				dataMap := dataArr.(map[string]interface{})
+				if dataList == nil {
+					dataList = make([][]map[string]interface{}, len(req.Data))
 				}
-			}
-			//数据列表
-			//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)
+				if dataList[i] == nil {
+					dataList[i] = make([]map[string]interface{}, len(req.Data[i]))
 				}
-				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
+				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
 						}
-					}
-					// 判断指标的顺序是否发生改变
-					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())
+						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)
 					}
-
-					//判断指标数据是否已经存在
-					tmpDataMap, ok2 := edbCodeDataMap[target.TradeCode]
-					if !ok2 {
-						tmpDataMap = make(map[string]string)
-						targetDataList, tmpErr := models.GetTargetsDataList(target.TradeCode)
-						if tmpErr != nil {
-							err = tmpErr
+				}
+				//频度列表
+				if v == "频度" {
+					for nameIndex := 1; nameIndex < len(req.Data[i]); nameIndex++ {
+						if req.Data[i][nameIndex] == nil {
+							break
 						}
-						for _, tmpData := range targetDataList {
-							tmpDataMap[tmpData.Dt] = tmpData.Close
+						frequencyMap := req.Data[i][nameIndex].(map[string]interface{})
+						frequency, _ := frequencyMap["m"]
+						if frequency == nil {
+							continue
 						}
-						edbCodeDataMap[target.TradeCode] = tmpDataMap
+						frequencyList = append(frequencyList, frequencyMap["m"].(string))
 					}
-
-					//判断数据是否已经存在
-					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
-							}
+				}
+				//单位列表
+				if v == "单位" {
+					for nameIndex := 1; nameIndex < len(req.Data[i]); nameIndex++ {
+						if req.Data[i][nameIndex] == nil {
+							break
 						}
-					} 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
+						unitMap := req.Data[i][nameIndex].(map[string]interface{})
+						unit, _ := unitMap["m"]
+						if unit == nil {
+							continue
 						}
+						unitList = append(unitList, unitMap["m"].(string))
 					}
-
-					//保存关联表
-					//{
-					//	//判断映射表是否已经存在
-					//	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{})
+	// 所有的指标数据map
+	edbCodeDataMap := make(map[string]*models.EdbInfoItem)
+
+	if len(frequencyList) == 0 {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "保存成功"
+		return
+	}
+	// 获取当前类所有的有效指标
+	list, err := models.GetTargetItemListSort(req.ClassifyId, 1, frequencyList[0], "", "", []string{strconv.Itoa(req.ClassifyId)})
+	if err != nil {
+		br.Msg = "获取指标失败"
+		br.ErrMsg = "获取有效指标失败,系统错误,Err:" + err.Error()
+		return
+	}
+
+	for _, item := range list {
+		edbCodeDataMap[item.SecName] = item
+	}
+
+	// 获得需要新增的指标
+	addEdbInfoList := make([]*models.Edbinfo, 0)
+	sortEdbInfoList := make([]*models.Edbinfo, 0)
+	for i, v := range secNameList {
+		if item, ok := edbCodeDataMap[v]; !ok {
+			t := new(models.Edbinfo)
+			t.SecName = v
+			t.Unit = unitList[i]
+			t.Frequency = frequencyList[i]
+			t.Mobile = sysUser.Mobile
+			t.ClassifyId = req.ClassifyId
+			t.UserId = sysUser.AdminId
+			t.Sort = len(list) + i
+			addEdbInfoList = append(addEdbInfoList, t)
+			edbCodeDataMap[t.SecName] = &models.EdbInfoItem{
+				TradeCode: t.TradeCode,
+				SecName:   t.SecName,
+				Unit:      t.Unit,
+				Frequency: t.Frequency,
+				UserId:    t.UserId,
+			}
+		} else {
+			if item.Sort != i {
+				t := new(models.Edbinfo)
+				t.TradeCode = item.TradeCode
+				t.Sort = i
+				sortEdbInfoList = append(sortEdbInfoList, t)
+			}
+		}
+	}
+	// 更新指标顺序
+	for _, v := range sortEdbInfoList {
+		err = v.Update([]string{"sort"})
 		if err != nil {
-			br.ErrMsg = "获取失败,Err:" + err.Error()
-			br.Msg = "获取失败"
+			br.Msg = "excel保存失败"
+			br.ErrMsg = "excel更新顺序失败,Err:" + err.Error()
 			return
 		}
-		fmt.Println(list)
+	}
+	// 新增指标
+	msg, err := data.MultiAddEdbInfo(addEdbInfoList, sysUser.Mobile)
+	if err != nil {
+		if msg != "" {
+			br.Msg = msg
+		} else {
+			br.Msg = "指标保存失败"
+		}
+		br.ErrMsg = "新增指标失败,系统错误,Err:" + err.Error()
+		return
+	}
+	// 新增指标数据
+	addEdbDataList := make([]*models.Edbdata, 0)
+	for _, v := range secNameList {
+		// 指标数据
+		for date, closeVal := range secNameToDateMap[v] {
+			t := new(models.Edbdata)
+			// 理论上这里面不应该出现空值
+			t.TradeCode = edbCodeDataMap[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

+ 66 - 4
models/target.go

@@ -1,6 +1,7 @@
 package models
 
 import (
+	"context"
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/utils"
 	"fmt"
@@ -71,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")
@@ -138,6 +165,17 @@ func DeleteAllEdbData(tradeCode string) (err error) {
 	return
 }
 
+// DeleteAllEdbData 根据指标code删除数据
+func DeleteAllEdbDataByTradeCodeList(tradeCodeList []string) (err error) {
+	if len(tradeCodeList) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("edb")
+	sql := ` DELETE FROM edbdata WHERE TRADE_CODE in (` + strings.Join(tradeCodeList, ",") + `) `
+	_, err = o.Raw(sql).Exec()
+	return
+}
+
 type Edbinfo struct {
 	TradeCode    string `orm:"column(TRADE_CODE);pk" description:"指标code"`
 	SecName      string `orm:"column(SEC_NAME);" description:"指标名称"`
@@ -262,6 +300,19 @@ 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 {
+		sql += " AND SEC_NAME IN (" + strings.Join(secNameList, ",") + ") "
+	}
+	o := orm.NewOrmUsingDB("edb")
+	err = o.Raw(sql).QueryRow(&items)
+	return
+}
+
 func GetEdbinfoByTradeCode(tradeCode string) (item *Edbinfo, err error) {
 	sql := `SELECT * FROM edbinfo WHERE TRADE_CODE=? `
 	o := orm.NewOrmUsingDB("edb")
@@ -277,11 +328,9 @@ func AddEdbinfo(tradeCode, secName, unit, remark, frequency, noticeTime string,
 	return
 }
 
-func AddEdbinfoV2(tradeCode, secName, unit, remark, frequency, noticeTime string, classifyId int, userId, sort int) (err error) {
-	sql := `INSERT INTO edbinfo(TRADE_CODE, SEC_NAME,UNIT, REMARK,frequency, classify_id,notice_time,user_id,create_date, sort) 
-			VALUES(?,?,?,?,?,?,?,?,now(), ?) `
+func MultiAddEdbinfoV2(edbInfoList []*Edbinfo) (err error) {
 	o := orm.NewOrmUsingDB("edb")
-	_, err = o.Raw(sql, tradeCode, secName, unit, remark, frequency, classifyId, noticeTime, userId, sort).Exec()
+	_, err = o.InsertMulti(len(edbInfoList), edbInfoList)
 	return
 }
 
@@ -292,6 +341,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:"指标名称"`
@@ -1199,6 +1260,7 @@ type EdbInfoItem struct {
 	Mobile       string     `description:"录入者手机号"`
 	ModifyDate   string     `description:"待更新日期"`
 	Status       string     `description:"状态:未完成/完成"`
+	Sort         int        `description:"排序"`
 	DataList     []*Edbdata `description:"指标数据列表"`
 }
 

+ 78 - 0
services/data/edb_info.go

@@ -750,6 +750,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 {
+		msg = "指标名称已存在:"
+		for _, edbInfo := range items {
+			msg += edbInfo.SecName + ","
+		}
+		msg = msg[:len(msg)-2]
+		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

+ 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

@@ -218,6 +218,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