|
@@ -1616,3 +1616,369 @@ func (c *ManualEdbController) RecordList() {
|
|
|
br.Msg = "获取成功"
|
|
|
br.Data = resp
|
|
|
}
|
|
|
+
|
|
|
+// BatchSaveExcelData
|
|
|
+// @Title 批量保存手工数据
|
|
|
+// @Description 批量保存手工数据
|
|
|
+// @Param request body []models.ManualEdbExcelStyleEditReq true "type json string"
|
|
|
+// @Success 200
|
|
|
+// @router /target/edb/excel_style/batch_save [post]
|
|
|
+func (c *ManualEdbController) BatchSaveExcelData() {
|
|
|
+ br := new(models.BaseResponse).Init()
|
|
|
+ var err error
|
|
|
+ errs := make([]string, 0)
|
|
|
+ defer func() {
|
|
|
+ if len(errs) > 0 {
|
|
|
+ utils.FileLog.Info("编辑EXCEL数据 新增或修改数据失败,Err:" + strings.Join(errs, "\n"))
|
|
|
+ }
|
|
|
+ c.Data["json"] = br
|
|
|
+ c.ServeJSON()
|
|
|
+ }()
|
|
|
+
|
|
|
+ sysUser := c.SysUser
|
|
|
+ if sysUser == nil {
|
|
|
+ br.Msg = "请重新登录"
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ var req []data_manage.ManualEdbExcelStyleEditReq
|
|
|
+ err = json.Unmarshal(c.Ctx.Input.RequestBody, &req)
|
|
|
+ if err != nil {
|
|
|
+ br.Msg = "参数解析异常!"
|
|
|
+ br.ErrMsg = "参数解析失败,Err:" + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ countReq := len(req)
|
|
|
+ if countReq <= 0 {
|
|
|
+ br.Msg = "无数据!"
|
|
|
+ br.ErrMsg = "无数据!"
|
|
|
+ br.IsSendEmail = false
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if countReq <= 0 {
|
|
|
+ br.Msg = "超出上限,导入失败!"
|
|
|
+ br.ErrMsg = "超出上限,导入失败!"
|
|
|
+ br.IsSendEmail = false
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 当前来说,所有指标都是同一个分类,所以取的第一个的分类id,后面如果可以做不通分类的配置的话,那就需要做微调
|
|
|
+ editClassifyIdList := make([]int, 0)
|
|
|
+ tmpClassifyIdMap := make(map[int]bool)
|
|
|
+ for _, item := range req {
|
|
|
+ classifyId := item.ClassifyId
|
|
|
+ if classifyId <= 0 {
|
|
|
+ br.Msg = "品种填写异常!"
|
|
|
+ br.ErrMsg = "品种填写异常!"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if _, ok := tmpClassifyIdMap[classifyId]; ok {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ editClassifyIdList = append(editClassifyIdList, classifyId)
|
|
|
+ tmpClassifyIdMap[classifyId] = true
|
|
|
+ }
|
|
|
+
|
|
|
+ //超管账号可以查看分类下的所有频度数据
|
|
|
+ userId := sysUser.AdminId
|
|
|
+ if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
|
|
|
+ userId = 0
|
|
|
+ }
|
|
|
+
|
|
|
+ //获取账户所拥有权限的分类id集合
|
|
|
+ classifyIdList, err := data.GetUserManualClassifyIdList(userId)
|
|
|
+ if err != nil {
|
|
|
+ br.Msg = "获取分类数据失败"
|
|
|
+ br.Msg = "获取拥有的分类数据失败,Err:" + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, classifyId := range editClassifyIdList {
|
|
|
+ if !utils.InArrayByInt(classifyIdList, classifyId) {
|
|
|
+ br.Msg = "无权访问"
|
|
|
+ br.ErrMsg = "无权访问"
|
|
|
+ br.IsSendEmail = false
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 指标map
|
|
|
+ targetMap := make(map[string]*models.Edbinfo)
|
|
|
+ addEdbTradeMap := make(map[string]bool)
|
|
|
+ updateEdbTradeMap := make(map[string]bool)
|
|
|
+ updateDataTradeMap := make(map[string]bool)
|
|
|
+ defer func() {
|
|
|
+ go func(addEdbTradeMap, updateEdbTradeMap, updateDataTradeMap map[string]bool) {
|
|
|
+ addRecordList := make([]*models.EdbinfoOpRecord, 0)
|
|
|
+ for tradeCode := range addEdbTradeMap {
|
|
|
+ addRecordList = append(addRecordList, &models.EdbinfoOpRecord{
|
|
|
+ TradeCode: tradeCode,
|
|
|
+ Remark: "创建指标",
|
|
|
+ UserId: sysUser.AdminId,
|
|
|
+ UserName: sysUser.RealName,
|
|
|
+ CreateTime: time.Now(),
|
|
|
+ })
|
|
|
+ }
|
|
|
+ for tradeCode := range updateEdbTradeMap {
|
|
|
+ addRecordList = append(addRecordList, &models.EdbinfoOpRecord{
|
|
|
+ TradeCode: tradeCode,
|
|
|
+ Remark: "编辑指标",
|
|
|
+ UserId: sysUser.AdminId,
|
|
|
+ UserName: sysUser.RealName,
|
|
|
+ CreateTime: time.Now(),
|
|
|
+ })
|
|
|
+ }
|
|
|
+ for tradeCode := range updateDataTradeMap {
|
|
|
+ addRecordList = append(addRecordList, &models.EdbinfoOpRecord{
|
|
|
+ TradeCode: tradeCode,
|
|
|
+ Remark: "更新数据",
|
|
|
+ UserId: sysUser.AdminId,
|
|
|
+ UserName: sysUser.RealName,
|
|
|
+ CreateTime: time.Now(),
|
|
|
+ })
|
|
|
+ }
|
|
|
+ if len(addRecordList) > 0 {
|
|
|
+ obj := models.EdbinfoOpRecord{}
|
|
|
+ _ = obj.MulCreate(addRecordList)
|
|
|
+ }
|
|
|
+
|
|
|
+ //将该指标的code加入到 “手工数据导入后刷新” 缓存
|
|
|
+ if utils.Re == nil {
|
|
|
+ for tradeCode := range updateDataTradeMap {
|
|
|
+ // 更新手工数据的最大最小值
|
|
|
+ data.ModifyManualEdbMaxMinDate(tradeCode)
|
|
|
+ //将该指标的code加入到 “手工数据导入后刷新” 缓存
|
|
|
+ err := utils.Rc.LPush(utils.CACHE_IMPORT_MANUAL_DATA, tradeCode)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("CACHE_IMPORT_MANUAL_DATA LPush Err:" + err.Error())
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }(addEdbTradeMap, updateEdbTradeMap, updateDataTradeMap)
|
|
|
+ }()
|
|
|
+
|
|
|
+ for _, item := range req {
|
|
|
+ if item.Unit == `` {
|
|
|
+ br.Msg = "单位填写异常!"
|
|
|
+ br.ErrMsg = "单位填写异常!"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if item.Frequency == `` {
|
|
|
+ br.Msg = "频度填写异常!"
|
|
|
+ br.ErrMsg = "频度填写异常!"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if item.ClassifyId <= 0 {
|
|
|
+ br.Msg = "品种填写异常!"
|
|
|
+ br.ErrMsg = "品种填写异常!"
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 是否新增指标
|
|
|
+ var isAddEdb bool
|
|
|
+
|
|
|
+ secName := strings.TrimSpace(item.EdbName)
|
|
|
+ frequency := strings.TrimSpace(item.Frequency)
|
|
|
+ unit := strings.TrimSpace(item.Unit)
|
|
|
+
|
|
|
+ manualEdbInfo, ok := targetMap[item.EdbName]
|
|
|
+ if !ok {
|
|
|
+ manualEdbInfo, err = models.GetTargetBySecName(secName)
|
|
|
+ if err != nil {
|
|
|
+ //如果是找不到该指标,那么新增指标
|
|
|
+ if err.Error() == utils.ErrNoRow() {
|
|
|
+ tmpErr := data.AddEdbInfo(secName, unit, frequency, "", sysUser.Mobile, item.ClassifyId, sysUser.AdminId, sysUser.RealName)
|
|
|
+ if tmpErr != nil {
|
|
|
+ utils.FileLogData.Error("AddEdbInfo err :%s", tmpErr.Error())
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ isAddEdb = true
|
|
|
+ tmpTarget, tmpErr := models.GetTargetBySecName(secName)
|
|
|
+ manualEdbInfo = tmpTarget
|
|
|
+ targetMap[secName] = manualEdbInfo
|
|
|
+
|
|
|
+ // 指标新增
|
|
|
+ addEdbTradeMap[manualEdbInfo.TradeCode] = true
|
|
|
+ } else {
|
|
|
+ fmt.Println("导入数据 获取指标:Err:" + err.Error())
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ targetMap[secName] = manualEdbInfo
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 没有该分类品种权限的话,那么就过滤
|
|
|
+ if !utils.InArrayByInt(classifyIdList, manualEdbInfo.ClassifyId) {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ dateValueMap := make(map[string]string)
|
|
|
+ //取到所有数据
|
|
|
+ for _, dateValue := range item.Data {
|
|
|
+ // 检验时间格式
|
|
|
+ _, err := time.Parse(utils.FormatDate, dateValue.Date)
|
|
|
+ if err != nil {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ dateValueMap[dateValue.Date] = strconv.FormatFloat(dateValue.Value, 'f', -1, 64)
|
|
|
+ }
|
|
|
+
|
|
|
+ //操作指标,新增指标及数据等
|
|
|
+ {
|
|
|
+
|
|
|
+ // 如果不是新增指标,那么指标基础信息变更
|
|
|
+ if !isAddEdb {
|
|
|
+ updateCols := make([]string, 0)
|
|
|
+
|
|
|
+ if manualEdbInfo.SecName != secName {
|
|
|
+ // 校验是否存在相同指标名称
|
|
|
+ var condition string
|
|
|
+ var pars []interface{}
|
|
|
+ condition += " AND SEC_NAME=? AND left(TRADE_CODE,1)='W' AND REMARK='手动' AND TRADE_CODE != ? "
|
|
|
+ pars = append(pars, secName, manualEdbInfo.TradeCode)
|
|
|
+ count, err := models.GetManualEdbCountByCondition(condition, pars)
|
|
|
+ if err != nil {
|
|
|
+ br.Msg = `指标保存失败`
|
|
|
+ br.ErrMsg = `获取同名指标信息异常,ERR:` + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if count > 0 {
|
|
|
+ br.Msg = `已存在同名指标`
|
|
|
+ br.ErrMsg = `已存在同名指标`
|
|
|
+ br.IsSendEmail = false
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ updateCols = append(updateCols, "SecName")
|
|
|
+ manualEdbInfo.SecName = secName
|
|
|
+ }
|
|
|
+
|
|
|
+ if manualEdbInfo.ClassifyId != item.ClassifyId {
|
|
|
+ updateCols = append(updateCols, "ClassifyId")
|
|
|
+ manualEdbInfo.ClassifyId = item.ClassifyId
|
|
|
+ }
|
|
|
+
|
|
|
+ if manualEdbInfo.Frequency != frequency {
|
|
|
+ updateCols = append(updateCols, "Frequency")
|
|
|
+ manualEdbInfo.Frequency = frequency
|
|
|
+ }
|
|
|
+
|
|
|
+ if manualEdbInfo.Unit != unit {
|
|
|
+ updateCols = append(updateCols, "Unit")
|
|
|
+ manualEdbInfo.Unit = unit
|
|
|
+ }
|
|
|
+
|
|
|
+ if len(updateCols) > 0 {
|
|
|
+ manualEdbInfo.ModifyTime = time.Now().Format(utils.FormatDateTime)
|
|
|
+ updateCols = append(updateCols, "ModifyTime")
|
|
|
+ err = manualEdbInfo.Update(updateCols)
|
|
|
+ if err != nil {
|
|
|
+ br.Msg = `指标保存失败`
|
|
|
+ br.ErrMsg = `指标保存失败,ERR:` + err.Error()
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ updateEdbTradeMap[manualEdbInfo.TradeCode] = true
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 当前已经存在的指标明细数据
|
|
|
+ targetDataList, tmpErr := models.GetTargetsDataList(manualEdbInfo.TradeCode)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ }
|
|
|
+ existDataMap := make(map[string]string)
|
|
|
+ deleteDataMap := make(map[string]string)
|
|
|
+ for _, tmpData := range targetDataList {
|
|
|
+ existDataMap[tmpData.Dt] = tmpData.Close
|
|
|
+ deleteDataMap[tmpData.Dt] = tmpData.Dt
|
|
|
+ }
|
|
|
+
|
|
|
+ var isUpdateData bool
|
|
|
+ addDataList := make([]*models.Edbdata, 0)
|
|
|
+
|
|
|
+ for createDate, closeVal := range dateValueMap {
|
|
|
+ if createDate == "" || closeVal == "" {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ //判断数据是否已经存在
|
|
|
+ tmpVal, ok3 := existDataMap[createDate]
|
|
|
+ // 不存在,那么后面进行插入
|
|
|
+ if !ok3 {
|
|
|
+ addDataList = append(addDataList, &models.Edbdata{
|
|
|
+ TradeCode: manualEdbInfo.TradeCode,
|
|
|
+ Dt: createDate,
|
|
|
+ Close: closeVal,
|
|
|
+ ModifyTime: time.Now(),
|
|
|
+ })
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ delete(deleteDataMap, createDate)
|
|
|
+
|
|
|
+ // 库里面的数据
|
|
|
+ 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) {
|
|
|
+ isUpdateData = true
|
|
|
+ fmt.Println("更新数值")
|
|
|
+ err = models.ModifyTargetsDataByImport(manualEdbInfo.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)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 新增明细数据
|
|
|
+ if len(addDataList) > 0 {
|
|
|
+ isUpdateData = true
|
|
|
+ err = models.OnlyMultiAddEdbdata(addDataList)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("MultiAddEdbdata err:", err.Error())
|
|
|
+ errs = append(errs, err.Error())
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 删除不需要的日期数据
|
|
|
+ num := len(deleteDataMap)
|
|
|
+ if num > 0 {
|
|
|
+ isUpdateData = true
|
|
|
+ deleteDateList := make([]string, 0)
|
|
|
+ for date := range deleteDataMap {
|
|
|
+ deleteDateList = append(deleteDateList, date)
|
|
|
+ }
|
|
|
+
|
|
|
+ err = models.DelEdbdataByCodeAndDateList(manualEdbInfo.TradeCode, deleteDateList)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("DelEdbdataByCodeAndDateList err:", err.Error())
|
|
|
+ errs = append(errs, err.Error())
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新数据
|
|
|
+ if isUpdateData {
|
|
|
+ updateDataTradeMap[manualEdbInfo.TradeCode] = true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ br.Ret = 200
|
|
|
+ br.Success = true
|
|
|
+ br.Msg = "保存成功"
|
|
|
+}
|