// Package handler provides HTTP handlers for various endpoints. package handler import ( "net/http" "modelRT/logger" "modelRT/model" "modelRT/network" "github.com/gin-gonic/gin" ) // MeasurementRecommendHandler define measurement recommend API // @Summary 测量点推荐(搜索框自动补全) // @Description 根据用户输入的字符串,从 Redis 中查询可能的测量点或结构路径,并提供推荐列表。 // @Tags Measurement Recommend // @Accept json // @Produce json // @Param request body network.MeasurementRecommendRequest true "查询输入参数,例如 'trans' 或 'transformfeeder1_220.'" // @Success 200 {object} network.SuccessResponse{payload=network.MeasurementRecommendPayload} "返回推荐列表成功" // // @Example 200 { // "code": 200, // "msg": "success", // "payload": { // "input": "transformfeeder1_220.", // "offset": 21, // "recommended_list": [ // "I_A_rms", // "I_B_rms", // "I_C_rms", // ] // } // } // // @Failure 400 {object} network.FailureResponse "返回推荐列表失败" // @Example 400 { // "code": 400, // "msg": "failed to get recommend data from redis", // } // @Router /measurement/recommend [get] func MeasurementRecommendHandler(c *gin.Context) { var request network.MeasurementRecommendRequest if err := c.ShouldBindJSON(&request); err != nil { logger.Error(c, "failed to unmarshal measurement recommend request", "error", err) c.JSON(http.StatusOK, network.FailureResponse{ Code: http.StatusBadRequest, Msg: err.Error(), }) return } recommends, isFuzzy, err := model.RedisSearchRecommend(c, request.Input) if err != nil { logger.Error(c, "failed to get recommend data from redis", "input", request.Input, "error", err) c.JSON(http.StatusOK, network.FailureResponse{ Code: http.StatusInternalServerError, Msg: err.Error(), PayLoad: map[string]any{ "input": request.Input, }, }) return } var finalOffset int if isFuzzy { var maxOffset int for index, recommend := range recommends { offset := model.GetLongestCommonPrefixLength(request.Input, recommend) if index == 0 || offset > maxOffset { maxOffset = offset } } finalOffset = maxOffset } else { var minOffset int for index, recommend := range recommends { offset := model.GetLongestCommonPrefixLength(request.Input, recommend) if index == 0 || offset < minOffset { minOffset = offset } } finalOffset = minOffset } resultRecommends := make([]string, 0, len(recommends)) seen := make(map[string]struct{}) for _, recommend := range recommends { recommendTerm := recommend[finalOffset:] if len(recommendTerm) != 0 { if _, exists := seen[recommendTerm]; !exists { seen[recommendTerm] = struct{}{} resultRecommends = append(resultRecommends, recommendTerm) } } } c.JSON(http.StatusOK, network.SuccessResponse{ Code: http.StatusOK, Msg: "success", // PayLoad: map[string]any{ // "input": request.Input, // "offset": finalOffset, // "recommended_list": resultRecommends, // }, PayLoad: &network.MeasurementRecommendPayload{ Input: request.Input, Offset: finalOffset, RecommendedList: resultRecommends, }, }) }