package map_service import ( "context" "encoding/json" "fmt" "github.com/cloudwego/hertz/pkg/app" "github.com/cloudwego/hertz/pkg/protocol/consts" "io/ioutil" "net/http" "pji_desktop_http/common/config" "pji_desktop_http/common/entity" "pji_desktop_http/common/util" "strings" ) // CheckMapBufConsistency . // @router /map/checkmapbuf [GET] func CheckMapBufConsistency(ctx context.Context, c *app.RequestContext) { var err error var req []string err = c.BindAndValidate(&req) if err != nil { c.String(consts.StatusBadRequest, err.Error()) return } fmt.Println(req) if len(req) == 0 { // 请求数据为空 c.JSON(consts.StatusBadRequest, entity.HttpResult{Status: false, Code: "", Message: "请求数据为空。"}) } else if len(req) == 1 { // 只有一条数据则直接返回 c.JSON(consts.StatusOK, entity.HttpResult{Status: true, Code: "", Message: "mapBuf文件夹数据一致。"}) } else { var firstValue int for i, v := range req { // 根据id获取对应的oss文件列表 fileList, err := getFileObjectBYId(v) if err != nil { c.String(consts.StatusBadRequest, err.Error()) return } // 过滤特定后缀的文件列表 suffixes := []string{ "map.pgm", "map.yaml", "map.json", "forbid_area.json", } filteredFileList := filterBySuffixes(fileList, suffixes...) fmt.Println("Filtered Strings:", filteredFileList) // 获取文件列表的总大小 totalSize := calculateTotalFileSize(filteredFileList) fmt.Println("Total Size:", totalSize) // 判断不同文件列表(mapBuf)中文件的总大小是否一致 if i == 0 { firstValue = totalSize } else { if totalSize != firstValue { c.JSON(consts.StatusOK, entity.HttpResult{Status: false, Code: "", Message: "mapBuf文件夹数据不一致。"}) return } } } c.JSON(consts.StatusOK, entity.HttpResult{Status: true, Code: "", Message: "mapBuf文件夹数据一致。"}) } } // 根据id获取对应的oss文件列表 func getFileObjectBYId(id string) (fileList []string, err error) { url := config.SenceOssDownUrl + id // 构建请求 req, err := http.NewRequest("GET", url, nil) if err != nil { fmt.Println("Error creating request:", err) return } // 添加认证头 req.Header.Set("Authorization", config.Token) // 发送请求 client := &http.Client{} resp, err := client.Do(req) if err != nil { fmt.Println("Error executing request:", err) return } defer resp.Body.Close() body, _ := ioutil.ReadAll(resp.Body) // Json转换为map var data map[string]interface{} err = json.Unmarshal(body, &data) // 提取响应体中的data字段 dataField, ok := data["data"].([]interface{}) if !ok { fmt.Println("Error extracting data field") return } // 转换字符串切片 for _, item := range dataField { str, ok := item.(string) if !ok { fmt.Println("Error converting item to string") return } fileList = append(fileList, str) } return fileList, err } // 从字符串切片中筛选出以特定后缀结尾的字符串 func filterBySuffixes(strList []string, suffixes ...string) []string { var filtered []string for _, s := range strList { for _, suffix := range suffixes { if strings.HasSuffix(s, suffix) { filtered = append(filtered, s) break } } } return filtered } // 计算oss中文件列表的总大小 func calculateTotalFileSize(fileList []string) int { var totalSize int for _, file := range fileList { size, err := util.GetOSSFileSize(config.OssBucket, file) // 获取oss中单个文件的大小 if err != nil { return 0 } totalSize += size } return totalSize }