Browse Source

导入系统日期

xyxie 1 year ago
parent
commit
e207d63571

+ 1 - 1
controllers/data_manage/excel/mixed_table.go

@@ -38,7 +38,7 @@ func (c *ExcelInfoController) GetSystemDate() {
 		return
 	}
 
-	date, err, errMsg := excel2.HandleDate(req.DataTimeType, req.Value)
+	date, _, err, errMsg := excel2.HandleDate(req.DataTimeType, req.Value, req.Extra)
 	if err != nil {
 		br.Msg = "获取系统日期失败"
 		if errMsg != `` {

+ 24 - 2
models/data_manage/excel/request/mixed_table.go

@@ -34,9 +34,9 @@ type MixedTableReq struct {
 // MixedTableCellDataReq 混合表格单元格参数
 type MixedTableCellDataReq struct {
 	Uid          string `description:"单元格唯一标识"`
-	DataType     int    `description:"数据类型,1:日期,2:指标,3:自定义文本,4:插值"`
+	DataType     int    `description:"数据类型,1:日期,2:指标,3:自定义文本,4:插值, 5:日期计算"`
 	DataTime     string `description:"所属日期"`
-	DataTimeType int    `description:"日期类型:0:手动输入日期;1:导入系统日期;;3:导入指标日期(指标库的最新日期);"`
+	DataTimeType int    `description:"日期类型:0:手动输入日期(固定日期);1:导入系统日期;;3:导入指标日期(指标库的最新日期);"`
 	EdbInfoId    int    `description:"指标id"`
 	ShowValue    string `description:"展示值"`
 	Value        string `description:"实际值"`
@@ -76,6 +76,28 @@ type EdbDateConf struct {
 	EdbInfoId int `description:"指标id"`
 }
 
+// EdbDateExtraConf
+// @Description: 导入指标日期前移和日期变换
+type EdbDateExtraConf struct {
+	EdbInfoId   int `description:"指标id"`
+	MoveForward int `description:"前移的期数"`
+	DateChange  []*EdbDateExtraDateChange
+}
+type EdbDateExtraDateChange struct {
+	DateCalculate   *EdbDateExtraDateCalculate
+	FrequencyChange *EdbDateExtraFrequencyChange
+}
+type EdbDateExtraDateCalculate struct {
+	Year  int
+	Month int
+	Day   int
+}
+
+type EdbDateExtraFrequencyChange struct {
+	Frequency    string `description:"频度变换"`
+	FrequencyDay string `description:"频度的固定日期"`
+}
+
 // CalculateConf
 // @Description: 计算公式
 type CalculateConf struct {

+ 135 - 16
services/data/excel/mixed_table.go

@@ -119,9 +119,19 @@ func GetMixedTableCellData(mixedTableReq request.MixedTableReq) (newMixedTableCe
 				if err != nil {
 					return
 				}
-				if edbInfo, ok := edbInfoMap[edbDateConfig.EdbInfoId]; ok {
-					cell.ShowValue = edbInfo.EndDate
-					cell.DataTime = edbInfo.EndDate
+				if dataList, ok := edbDataListMap[edbDateConfig.EdbInfoId]; ok {
+					// todo 获取配置信息,根据配置信息进行日期变换
+					var newDate string
+					newDate, err = GetEdbDateByMoveForward(config[k][i].Extra, dataList)
+					if err != nil {
+						return
+					}
+					newDate, err = HandleMixTableDateChange(newDate, config[k][i].Extra)
+					if err != nil {
+						return
+					}
+					cell.ShowValue = newDate
+					cell.DataTime = newDate
 					config[k][i] = cell
 				}
 			}
@@ -475,7 +485,7 @@ func handleConfig(configList [][]request.MixedTableCellDataReq) (newConfig [][]r
 				dataEdbInfoIdList = append(dataEdbInfoIdList, cell.EdbInfoId)
 
 			case request.DateDT: // 日期类型
-				date, tmpErr, tmpErrMsg := handleDate(cell.DataTimeType, cell.Value)
+				date, extra, tmpErr, tmpErrMsg := handleDate(cell.DataTimeType, cell.Value, cell.Extra)
 				if tmpErr != nil {
 					err = tmpErr
 					errMsg = tmpErrMsg
@@ -483,6 +493,7 @@ func handleConfig(configList [][]request.MixedTableCellDataReq) (newConfig [][]r
 				}
 				rowList[rk].DataTime = date
 				rowList[rk].ShowValue = date
+				rowList[rk].Extra = extra //兼容原有的历史数据中系统导入日期,把value里的值赋值给了extra字段
 
 				// 指标日期类型的单元格需要额外将指标id取出来
 				if cell.DataTimeType == request.EdbDateDT {
@@ -512,8 +523,8 @@ func handleConfig(configList [][]request.MixedTableCellDataReq) (newConfig [][]r
 // @return date string
 // @return err error
 // @return errMsg string
-func HandleDate(dataTimeType int, val string) (date string, err error, errMsg string) {
-	return handleDate(dataTimeType, val)
+func HandleDate(dataTimeType int, val, extra string) (date string, newExtra string, err error, errMsg string) {
+	return handleDate(dataTimeType, val, extra)
 }
 
 // handleDate
@@ -525,17 +536,34 @@ func HandleDate(dataTimeType int, val string) (date string, err error, errMsg st
 // @return date string
 // @return err error
 // @return errMsg string
-func handleDate(dataTimeType int, val string) (date string, err error, errMsg string) {
+func handleDate(dataTimeType int, val, extra string) (date string, newExtra string, err error, errMsg string) {
+	newExtra = extra
 	if val == `` {
 		errMsg = "错误的日期数据"
 		err = errors.New(errMsg)
 		return
 	}
+
 	switch dataTimeType {
 	case request.CustomDateT: //手动输入日期
 		date = val
+		date, err = HandleMixTableDateChange(date, extra)
+		if err != nil {
+			return
+		}
 	case request.SystemDateT: // 系统日期
-		date, err, errMsg = handleSystemDateT(val)
+		date = time.Now().Format(utils.FormatDate)
+		if extra == "" { //旧版的系统日期计算, 需要处理成新版本的系统,整理成extra 里的值,并将value值处理成空值
+			extra, err, errMsg = handleOldSystemDateT(val)
+			if err != nil {
+				return
+			}
+		}
+		date, err = HandleMixTableDateChange(date, extra)
+		if err != nil {
+			return
+		}
+		newExtra = extra
 	case request.EdbDateDT: // 导入指标日期(指标库的最新日期)
 	default:
 		errMsg = "错误的日期类型"
@@ -546,27 +574,118 @@ func handleDate(dataTimeType int, val string) (date string, err error, errMsg st
 	return
 }
 
-// handleSystemDateT
-// @Description: 处理导入系统日期
+func GetEdbDateByMoveForward(extra string, edbDataList []*data_manage.EdbDataList) (date string, err error) {
+	moveForward := 0
+	if extra != "" {
+		var edbDateExtraConf request.EdbDateExtraConf
+		err = json.Unmarshal([]byte(extra), &edbDateExtraConf)
+		if err != nil {
+			err = fmt.Errorf("日期变换配置json解析失败失败: %s", err.Error())
+			return
+		}
+		moveForward = edbDateExtraConf.MoveForward
+	}
+	// 根据日期进行排序
+	index := len(edbDataList) - 1 - moveForward
+	for k, v := range edbDataList {
+		if k == index {
+			date = v.DataTime
+		}
+	}
+	return
+}
+
+// HandleMixTableDateChange 处理表格中的日期变换
+func HandleMixTableDateChange(date, extra string) (newDate string, err error) {
+	newDate = date
+	if extra == "" {
+		return
+	}
+	var edbDateExtraConf request.EdbDateExtraConf
+	err = json.Unmarshal([]byte(extra), &edbDateExtraConf)
+	if err != nil {
+		err = fmt.Errorf("日期变换配置json解析失败失败: %s", err.Error())
+		return
+	}
+	if len(edbDateExtraConf.DateChange) > 0 {
+		var dateTime time.Time
+		dateTime, err = time.ParseInLocation(utils.FormatDate, newDate, time.Local)
+		if err != nil {
+			err = fmt.Errorf("日期解析失败: %s", err.Error())
+			return
+		}
+		for _, v := range edbDateExtraConf.DateChange {
+			if v.DateCalculate != nil {
+				dateTime = dateTime.AddDate(v.DateCalculate.Year, v.DateCalculate.Month, v.DateCalculate.Day)
+				newDate = dateTime.Format(utils.FormatDate)
+			}
+
+			if v.FrequencyChange != nil {
+				newDate, err, _ = handleSystemAppointDateT(dateTime, v.FrequencyChange.FrequencyDay, v.FrequencyChange.Frequency)
+				if err != nil {
+					return
+				}
+				dateTime, err = time.ParseInLocation(utils.FormatDate, newDate, time.Local)
+				if err != nil {
+					err = fmt.Errorf("日期解析失败: %s", err.Error())
+					return
+				}
+			}
+		}
+	}
+	return
+}
+
+// handleOldSystemDateT
+// @Description: 历史数据中的导入系统日期
 // @author: Roc
 // @datetime2023-10-27 09:36:21
 // @param confStr string
 // @return date string
 // @return err error
 // @return errMsg string
-func handleSystemDateT(confStr string) (date string, err error, errMsg string) {
+func handleOldSystemDateT(confStr string) (extra string, err error, errMsg string) {
 	var config request.SystemDateConf
 	err = json.Unmarshal([]byte(confStr), &config)
 	if err != nil {
 		return
 	}
+	var extraConf request.EdbDateExtraConf
+	dateChange := new(request.EdbDateExtraDateChange)
+	dateCalculate := new(request.EdbDateExtraDateCalculate)
+	frequencyChange := new(request.EdbDateExtraFrequencyChange)
+	dateChangeList := make([]*request.EdbDateExtraDateChange, 0)
+
 	switch config.Source {
 	case request.SystemCurrDateT:
-		date = time.Now().Format(utils.FormatDate)
+		return
 	case request.SystemCalculateDateT:
-		date, err, errMsg = handleSystemCalculateDateT(config.CalculateNum, config.CalculateFrequency)
+		// todo 是否直接更新该excel记录,
+		dateCalculate.Day = config.CalculateNum
+		dateChange.DateCalculate = dateCalculate
+		dateChangeList = append(dateChangeList, dateChange)
+		extraConf.DateChange = dateChangeList
+		extraByte, e := json.Marshal(extraConf)
+		if e != nil {
+			err = fmt.Errorf("日期计算额外配置,json序列化失败: %s", e.Error())
+			return
+		}
+		extra = string(extraByte)
+		return
 	case request.SystemFrequencyDateT: // 处理系统日期相关的指定频率(所在周/旬/月/季/半年/年的最后/最早一天)
-		date, err, errMsg = handleSystemAppointDateT(config.Day, config.Frequency)
+		frequencyChange.FrequencyDay = config.Day
+		frequencyChange.Frequency = config.Frequency
+
+		dateChange.FrequencyChange = frequencyChange
+		dateChangeList = append(dateChangeList, dateChange)
+		extraConf.DateChange = dateChangeList
+		extraByte, e := json.Marshal(extraConf)
+		if e != nil {
+			err = fmt.Errorf("日期计算额外配置,json序列化失败: %s", e.Error())
+			return
+		}
+		extra = string(extraByte)
+		return
 	default:
 		errMsg = "错误的日期日期导入方式"
 		err = errors.New(fmt.Sprint("错误的日期日期导入方式:", config.Source))
@@ -611,8 +730,8 @@ func handleSystemCalculateDateT(num int, frequency string) (date string, err err
 // @return date string
 // @return err error
 // @return errMsg string
-func handleSystemAppointDateT(appointDay, frequency string) (date string, err error, errMsg string) {
-	currDate := time.Now()
+func handleSystemAppointDateT(currDate time.Time, appointDay, frequency string) (date string, err error, errMsg string) {
+	//currDate := time.Now()
 	switch frequency {
 	case "本周":
 		day := int(currDate.Weekday())