package FileCacheUtil import ( "dsDataex/MyReport/GPSql/GPSqlService" "dsDataex/MyReport/MySwagger" "dsDataex/Utils/ConfigUtil" "encoding/json" "fmt" "io" "io/ioutil" "os" "sort" "strings" "time" ) /** * @title PathExists * @Description 文件/路径是否存在 * @Author wangshuai * @Date 2021-03-01 * @Param path string 路径 * @Return bool 是否存在 * @Return error 错误信息 */ func PathExists(path string) (bool, error) { _, err := os.Stat(path) if err == nil { return true, nil } if os.IsNotExist(err) { return false, nil } return false, err } /** * @title WriteFile * @Description 写入文件 * @Author wangshuai * @Date 2021-03-01 * @Param filename string 文件 * @Param data []byte 内容 * @Param perm os.FileMode 模式(0666,0600) * @Return bool 是否成功 * @Return error 错误信息 */ func WriteFile(filename string, data []byte, perm os.FileMode) (bool, error) { f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm) if err != nil { return false, err } n, err := f.Write(data) if err == nil && n < len(data) { err = io.ErrShortWrite } if err1 := f.Close(); err == nil { err = err1 } return true, err } /** * @title ReadFile * @Description 读取文件 * @Author wangshuai * @Date 2021-03-01 * @Param filename string 文件 * @Param perm os.FileMode 模式(0666,0600) * @Return bool 是否成功 * @Return string 内容 * @Return error 错误信息 */ func ReadFile(filename string, perm os.FileMode) (bool, string, error) { f, err := os.OpenFile(filename, os.O_RDONLY,perm) defer f.Close() if err != nil { return false, "", err } else { contentByte, err := ioutil.ReadAll(f) if err == nil && len(contentByte) > 0 { return true, string(contentByte), err } } return false, "", err } /** * @title ReadDir * @Description 读取目录所有文件 * @Author wangshuai * @Date 2021-03-01 * @Param path string 路径 * @Return bool 是否成功 * @Return []string 文件名列表 * @Return error 错误信息 */ func ReadDir(path string) (bool, []string, error) { var data []string dirs, e := ioutil.ReadDir(path) if e != nil { return false, nil, e } for _, v := range dirs { data = append(data, v.Name()) } return true, data, e } /** * @title LatestCacheDate * @Description 最新缓存文件日期 * @Author wangshuai * @Date 2021-03-01 * @Param path string 路径 * @Param filenamePrefix string 文件名前缀 * @Return bool 是否成功 * @Return string 最新缓存文件日期 * @Return error 错误信息 */ func LatestCacheDate(path, filenamePrefix string) (bool, string, error) { var data []string _, dirs, err := ReadDir(path) if err != nil { return false, "", err } for _, v := range dirs { prefix := strings.LastIndex(v, filenamePrefix) start := strings.LastIndex(v, "-") end := strings.LastIndex(v, ".") if prefix != -1 && start != -1 && end != -1 { cacheDate := v[start + 1 : end] data = append(data, cacheDate) } } if len(data) > 0 { sort.Sort(sort.Reverse(sort.StringSlice(data))) return true, data[0], nil } else { return false, "", nil } } /** * @title SimpleGPCycleCache * @Description 周期缓存 * @Author wangshuai * @Date 2021-03-04 * @Param input string 路径 * @Return bool 是否成功 * @Return string 提示信息 * @Return string 缓存内容 */ func SimpleGPCycleCache(input MySwagger.QuerySimpleGP) (bool, string, string) { var queryID string var queryParam string var queryGroup string var queryCount string var queryFormat string var timeLayout string = "20060102150405" var filename string var filenamePrefix string var exists bool = false var res bool var msg string var data string var DataResult MySwagger.DataResult strTime := time.Now().Format(timeLayout) queryID = input.Query.QueryID queryParam = strings.Join(input.Query.QueryParam , "@") queryGroup = strings.Join(input.QueryGroup , "@") queryCount = strings.Join(input.QueryCount , "@") queryFormat = input.QueryFormat // 文件名 filename = ConfigUtil.FCPathDay + queryID + "-" + queryParam + "-" + queryGroup + "-" + queryCount + "-" + queryFormat + "-" + strTime + ConfigUtil.FCExtension // 文件名前缀 filenamePrefix = queryID + "-" + queryParam + "-" + queryGroup + "-" + queryCount + "-" + queryFormat // 最新缓存日期 result, latestCacheDate, _ := LatestCacheDate(ConfigUtil.FCPathDay, filenamePrefix) if result == true { // 转成时间戳 startUnix, _ := time.Parse(timeLayout, strTime) endUnix, _ := time.Parse(timeLayout, latestCacheDate) startTime := startUnix.Unix() endTime := endUnix.Unix() // 求相差天数 timeSub := (startTime - endTime) / 86400 if input.QueryCache == 1 { // 按日缓存 //exists, _ = FileCacheUtil.PathExists(filename) if timeSub < 1 { exists = true filename = filenamePrefix + "-" + latestCacheDate + ConfigUtil.FCExtension } } else { // 按月缓存 if timeSub < 30 { exists = true filename = filenamePrefix + "-" + latestCacheDate + ConfigUtil.FCExtension } } } if exists { // 读取缓存文件 fmt.Println("开始读取缓存...") result, cache, _ := ReadFile(filename, 0600) if result == false { return false, "读取文件失败, 无法打开", "" } fmt.Println("缓存读取成功, 缓存文件: " + filename) err := json.Unmarshal([]byte(cache), &DataResult) if err != nil { fmt.Println(err) return false, "JSON反序列化失败", "" } res, msg, data = DataResult.Success, DataResult.Message, DataResult.Result return res, msg, data } else { res, msg, data = GPSqlService.QuerySimple(input.Query.QueryID, input.Query.QueryParam, input.QueryGroup, input.QueryCount, input.QueryFormat) fmt.Println("开始写入缓存...") DataResult = MySwagger.DataResult{ Success: true, Message: msg, Result: data, } byteData, err1 := json.Marshal(DataResult) if err1 != nil { fmt.Println("JSON ERR:", err1) return false, "JSON序列化失败", "" } // 写入缓存文件 fmt.Println("filename=", filename, "<<") result, err := WriteFile(filename, byteData, 0666) if result == false { fmt.Println(err) return false, "写入失败", "" } fmt.Println("缓存写入成功, 缓存文件: " + filename) return res, msg, data } } /** * @title SimpleGPCalendarCache * @Description 自然日/月缓存 * @Author wangshuai * @Date 2021-03-04 * @Param input string 路径 * @Return bool 是否成功 * @Return string 提示信息 * @Return string 缓存内容 */ func SimpleGPCalendarCache(input MySwagger.QuerySimpleGP) (bool, string, string) { var queryID string var queryParam string var queryGroup string var queryCount string var queryFormat string var dayTimeLayout string = "20060102" var monthTimeLayout string = "200601" var filename string var exists bool = false var res bool var msg string var data string var DataResult MySwagger.DataResult strDayTime := time.Now().Format(dayTimeLayout) strMonthTime := time.Now().Format(monthTimeLayout) queryID = input.Query.QueryID queryParam = strings.Join(input.Query.QueryParam , "@") queryGroup = strings.Join(input.QueryGroup , "@") queryCount = strings.Join(input.QueryCount , "@") queryFormat = input.QueryFormat // 最新缓存日期 if input.QueryCache == 1 { // 按日缓存 // 文件名 filename = ConfigUtil.FCPathDay + queryID + "-" + queryParam + "-" + queryGroup + "-" + queryCount + "-" + queryFormat + "-" + strDayTime + ConfigUtil.FCExtension } else { // 按月缓存 // 文件名 filename = ConfigUtil.FCPathMonth + queryID + "-" + queryParam + "-" + queryGroup + "-" + queryCount + "-" + queryFormat + "-" + strMonthTime + ConfigUtil.FCExtension } exists, _ = PathExists(filename) if exists { // 读取缓存文件 fmt.Println("开始读取缓存...") result, cache, _ := ReadFile(filename, 0600) if result == false { return false, "读取文件失败, 无法打开", "" } fmt.Println("缓存读取成功, 缓存文件: " + filename) err := json.Unmarshal([]byte(cache), &DataResult) if err != nil { fmt.Println(err) return false, "JSON反序列化失败", "" } res, msg, data = DataResult.Success, DataResult.Message, DataResult.Result return res, msg, data } else { res, msg, data = GPSqlService.QuerySimple(input.Query.QueryID, input.Query.QueryParam, input.QueryGroup, input.QueryCount, input.QueryFormat) fmt.Println("开始写入缓存...") DataResult = MySwagger.DataResult{ Success: true, Message: msg, Result: data, } byteData, err1 := json.Marshal(DataResult) if err1 != nil { fmt.Println("JSON ERR:", err1) return false, "JSON序列化失败", "" } // 写入缓存文件 result, err := WriteFile(filename, byteData, 0666) if result == false { fmt.Println(err) return false, "写入失败", "" } fmt.Println("缓存写入成功, 缓存文件: " + filename) return res, msg, data } } /** * @title LatestCacheFilename * @Description 所有缓存文件名 * @Author wangshuai * @Date 2021-03-01 * @Param path string 路径 * @Param filenamePrefix string 文件名前缀 * @Return bool 是否成功 * @Return string 最新缓存文件名 * @Return error 错误信息 */ func LatestCacheFilename(path, filenamePrefix string) (bool, string, error) { var data []string _, dirs, err := ReadDir(path) if err != nil { return false, "", err } for _, v := range dirs { start := strings.LastIndex(v, "-") end := strings.LastIndex(v, ".") if start != -1 && end != -1 { cacheDate := v[start + 1 : end] data = append(data, cacheDate) } } sort.Sort(sort.Reverse(sort.StringSlice(data))) filename := filenamePrefix + "-" + data[0] + ConfigUtil.FCExtension return true, filename, err }