Quellcode durchsuchen

添加额外逻辑处理

iks vor 20 Stunden
Ursprung
Commit
4303e5ec25
2 geänderte Dateien mit 130 neuen und 9 gelöschten Zeilen
  1. 19 9
      service/metric_process_config.go
  2. 111 0
      service/transform.go

+ 19 - 9
service/metric_process_config.go

@@ -4,16 +4,17 @@ import (
 	"bytes"
 	"encoding/json"
 	"fmt"
-	"github.com/tidwall/gjson"
 	"io"
 	"net/http"
 	"net/url"
-	"newaterobot-process/entity"
-	"newaterobot-process/model"
-	"newaterobot-process/utils"
 	"strings"
 	"text/template"
 	"time"
+
+	"github.com/tidwall/gjson"
+	"newaterobot-process/entity"
+	"newaterobot-process/model"
+	"newaterobot-process/utils"
 )
 
 // MetricProcessConfigService 指标处理配置服务
@@ -51,12 +52,12 @@ func (s *MetricProcessConfigService) ProcessMetric(inputData entity.MetricProces
 	var config entity.MetricProcessConfig
 	var ok bool
 
-	//未配置该处理分支直接返回,在dify中处理
+	// 未配置该处理分支直接返回,在dify中处理
 	if config, ok = configsMap[key]; !ok {
 		ret.Flag = entity.NoExecute
 		return ret, nil
 	}
-	//直接回复分支
+	// 直接回复分支
 	templateVarMap := s.objToMap(inputData)
 	if config.Type == 1 {
 		contextTemplate := config.ContextTemplate
@@ -71,24 +72,33 @@ func (s *MetricProcessConfigService) ProcessMetric(inputData entity.MetricProces
 		return ret, nil
 	}
 
-	//发送http 请求
+	// 发送http 请求
 	responseData, err := s.sendHTTPRequest(&config, templateVarMap, inputData.JwtToken)
 	if err != nil {
 		return ret, err
 	}
 
-	//抽取字段
+	// 抽取字段
 	responseExtract := make(map[string]string)
 	err = json.Unmarshal([]byte(config.ResponseExtract), &responseExtract)
 	if err != nil {
 		return ret, err
 	}
+
+	// 额外逻辑处理
+	switch config.MetricType {
+	case 2:
+		responseData, _ = TransformType2(responseData)
+	case 4:
+		responseData, _ = TransformType4(responseData)
+	}
+
 	extractMap := s.extractFields(responseExtract, responseData)
 	for k, v := range extractMap {
 		templateVarMap[k] = v
 	}
 
-	//解析返回模板
+	// 解析返回模板
 	replyContext, err := s.parseTemplate(config.ContextTemplate, templateVarMap)
 	if err != nil {
 		return ret, err

+ 111 - 0
service/transform.go

@@ -0,0 +1,111 @@
+package service
+
+import (
+	"fmt"
+	"math"
+	"strconv"
+	"strings"
+
+	jsoniter "github.com/json-iterator/go"
+)
+
+func TransformType2(responseData string) (string, error) {
+	// 解析入参
+	type inputData struct {
+		Data struct {
+			Today    float64  `json:"Today"`
+			Change   float64  `json:"Change"`
+			DsToday  float64  `json:"DsToday"`
+			DsChange float64  `json:"DsChange"`
+			Items    []string `json:"Items"`
+		} `json:"data"`
+	}
+	var input inputData
+	if err := jsoniter.Unmarshal([]byte(responseData), &input); err != nil {
+		return "", err
+	}
+
+	// 处理内层数据
+	inner := struct {
+		Today    float64 `json:"today"`
+		Change   string  `json:"change"`
+		Items    string  `json:"items"`
+		DsChange string  `json:"dsChange"`
+		DsToday  float64 `json:"dsToday"`
+	}{Today: input.Data.Today, DsToday: input.Data.DsToday}
+
+	// 处理百分比逻辑
+	switch {
+	case input.Data.Change > 0:
+		inner.Change = fmt.Sprintf("增加%.0f%%", input.Data.Change)
+	case input.Data.Change == 0:
+		inner.Change = "无变化"
+	default:
+		inner.Change = fmt.Sprintf("减少%.0f%%", -input.Data.Change)
+	}
+	switch {
+	case input.Data.DsChange > 0:
+		inner.DsChange = fmt.Sprintf("增加%.0f%%", input.Data.DsChange)
+	case input.Data.DsChange == 0:
+		inner.DsChange = "无变化"
+	default:
+		inner.DsChange = fmt.Sprintf("减少%.0f%%", -input.Data.DsChange)
+	}
+
+	// 拼接Items
+	if len(input.Data.Items) > 0 {
+		inner.Items = strings.Join(input.Data.Items, ",")
+	}
+
+	// 正确的外层包裹
+	outer := struct {
+		Data interface{} `json:"data"`
+	}{Data: inner}
+	resultJSON, err := jsoniter.Marshal(outer)
+	return string(resultJSON), err
+}
+
+func TransformType4(arg1 string) (string, error) {
+	// 定义入参结构体(匹配真实格式)
+	type inputData struct {
+		Data struct {
+			FeedFlow      float64 `json:"feed_flow"`
+			WaterQuantity string  `json:"water_quantity"`
+			Level         string  `json:"level"`
+			PlantFeedFlow float64 `json:"plant_feed_flow"`
+		} `json:"data"`
+	}
+
+	var input inputData
+	if err := jsoniter.Unmarshal([]byte(arg1), &input); err != nil {
+		return "", err
+	}
+
+	// 处理内层数据
+	inner := struct {
+		FeedFlow      float64 `json:"feed_flow"`
+		WaterQuantity string  `json:"water_quantity"`
+		Level         string  `json:"level"`
+		PlantFeedFlow float64 `json:"plant_feed_flow"`
+	}{
+		FeedFlow:      input.Data.FeedFlow,
+		WaterQuantity: input.Data.WaterQuantity,
+	}
+
+	// 处理level(字符串转数字+容错)
+	levelNum, _ := strconv.Atoi(input.Data.Level)
+	inner.Level = "一般"
+	if levelNum != 0 {
+		inner.Level = "已达标"
+	}
+
+	// 保留2位小数
+	inner.PlantFeedFlow = math.Round(input.Data.PlantFeedFlow*100) / 100
+
+	// 外层包裹data
+	outer := struct {
+		Data interface{} `json:"data"`
+	}{Data: inner}
+	resultJSON, err := jsoniter.Marshal(outer)
+	return string(resultJSON), err
+}