yinbangzhong
2024-06-18 500985cf7556808ee42e2e9e3066bb4648a8e534
service/process.go
@@ -165,6 +165,10 @@
   if mkdirErr != nil {
      logx.Errorf("function os.MkdirAll() err:%v", mkdirErr)
   }
   mkdirErr1 := os.MkdirAll(conf.LocalConf.StorePath, os.ModePerm)
   if mkdirErr1 != nil {
      logx.Errorf("function os.MkdirAll() err:%v", mkdirErr1)
   }
   //文件夹下新增音频文件时触发
   watcher, err := fsnotify.NewWatcher()
   if err != nil {
@@ -175,32 +179,20 @@
   if err != nil {
      log.Fatal(err)
   }
FOR:
   for {
      select {
      case <-cxt.Done():
         fmt.Println("preload stop")
         break FOR // 退出循环
      case event, ok := <-watcher.Events:
         if !ok {
            continue
         }
         if event.Op&fsnotify.Create == fsnotify.Create {
            // 判断文件类型是否为.mp3或.wav
            if filepath.Ext(event.Name) == ".mp3" || filepath.Ext(event.Name) == ".wav" {
   audoF := func(eventName, fileName string, audio *models.Audio) bool {
               time.Sleep(time.Second * 1)
               //设置文件访问权限
               err = os.Chmod(event.Name, 0777)
      err = os.Chmod(eventName, 0777)
               if err != nil {
                  logx.Errorf(fmt.Sprintf("%s:%s", event.Name, "设置文件权限失败"))
         logx.Errorf(fmt.Sprintf("%s:%s", eventName, "设置文件权限失败"))
               }
               // 文件名
               fileName := filepath.Base(event.Name)
               //校验文件命名
               arr := strings.Split(fileName, "_")
               if len(arr) != 6 {
                  logx.Errorf(fmt.Sprintf("%s:%s", fileName, "文件名称错误"))
                  continue
         return false
               }
               timeStr := arr[4] + strings.Split(arr[5], ".")[0]
               t, err := time.ParseInLocation("20060102150405", timeStr, time.Local)
@@ -212,7 +204,7 @@
               _, err = models.NewAudioSearch().SetName(fileName).First()
               if err != gorm.ErrRecordNotFound {
                  logx.Errorf(fmt.Sprintf("%s:%s", fileName, "重复上传"))
                  continue
         return false
               }
               //将文件移动到uploads文件夹下
@@ -223,40 +215,114 @@
               } else {
                  src = conf.LocalConf.StorePath + "/" + fileName
               }
               err = os.Rename(event.Name, src)
      err = os.Rename(eventName, src)
               if err != nil {
                  logx.Errorf(fmt.Sprintf("%s:%s", fileName, "移动文件失败"))
                  continue
         return false
               }
               // 读取文件大小
               fileInfo, err := os.Stat(src)
               if err != nil {
                  logx.Errorf(fmt.Sprintf("%s:%s", fileName, "获取文件大小失败"))
                  continue
         return false
               }
               size := fileInfo.Size()
               fmt.Println("fileName:", fileName, "size:", size, "src1", src)
               audio := &models.Audio{
                  Name:             fileName,
                  Size:             size,
                  FilePath:         src,
                  AudioStatus:      constvar.AudioStatusUploadOk,
                  LocomotiveNumber: arr[0],
                  TrainNumber:      arr[1],
                  DriverNumber:     arr[2],
                  Station:          arr[3],
                  OccurrenceAt:     t,
                  IsFollowed:       0,
      audio.Name = fileName
      audio.Size = size
      audio.FilePath = src
      audio.AudioStatus = constvar.AudioStatusUploadOk
      audio.LocomotiveNumber = arr[0]
      audio.TrainNumber = arr[1]
      audio.DriverNumber = arr[2]
      audio.Station = arr[3]
      audio.OccurrenceAt = t
      audio.IsFollowed = 0
      return true
               }
   txtF := func(filePath string, audio *models.Audio) bool {
      fileName := filepath.Base(filePath)
      //读取filepath文件内容到bts
      bts, err := os.ReadFile(filePath)
      if err != nil {
         logx.Errorf(fmt.Sprintf("%s:%s", filePath, "读取txt文件失败"))
         return false
      }
      //解析 交路号:123_公里标:321
      fileds := string(bts)
      arr := strings.Split(fileds, "_")
      if len(arr) != 2 {
         logx.Errorf(fmt.Sprintf("%s:%s", filePath, "读取txt文件内容格式不对"))
         return false
      } else {
         RouteNumber := strings.Split(arr[0], ":")
         KilometerMarker := strings.Split(arr[1], ":")
         if len(RouteNumber) > 1 && len(KilometerMarker) > 1 {
            audio.RouteNumber = RouteNumber[1]
            audio.KilometerMarker = KilometerMarker[1]
         } else {
            logx.Errorf(fmt.Sprintf("%s:%s", filePath, "文件内容格式不对"))
            return false
         }
      }
      var src string
      if strings.HasSuffix(conf.LocalConf.StorePath, "/") {
         src = conf.LocalConf.StorePath + fileName
      } else {
         src = conf.LocalConf.StorePath + "/" + fileName
      }
      err = os.Rename(filePath, src)
      if err != nil {
         logx.Errorf(fmt.Sprintf("%s:%s", fileName, "移动文件失败"))
         return false
      }
      audio.TxtFilePath = src
      return true
   }
   //成对变量
   pair := make(map[string]string)
FOR:
   for {
      select {
      case <-cxt.Done():
         fmt.Println("preload stop")
         break FOR // 退出循环
      case event, ok := <-watcher.Events:
         if !ok {
            continue
         }
         if event.Op&fsnotify.Create == fsnotify.Create {
            // 文件名
            fileName := filepath.Base(event.Name)
            //获取不带扩展名的文件名
            name := strings.TrimSuffix(fileName, filepath.Ext(fileName))
            //判断文件在pair中
            if _, ok := pair[name]; !ok {
               pair[name] = event.Name
            } else {
               audio := &models.Audio{}
               isOk := true
               // 判断文件类型是否为.mp3或.wav
               if filepath.Ext(event.Name) == ".mp3" || filepath.Ext(event.Name) == ".wav" {
                  isOk = audoF(event.Name, fileName, audio) && txtF(pair[name], audio)
               }
               if filepath.Ext(event.Name) == ".txt" {
                  isOk = audoF(pair[name], filepath.Base(pair[name]), audio) && txtF(event.Name, audio)
               }
               if !isOk {
                  delete(pair, name)
                  continue
               }
               if len(audio.Name) > 0 {
               if err = models.NewAudioSearch().Create(audio); err != nil {
                  logx.Errorf(fmt.Sprintf("%s:%s", fileName, "数据库create失败"))
                  continue
               }
               go func() {
                  var trainInfoNames = []string{arr[0], arr[1], arr[3]} //
                     var trainInfoNames = []string{audio.LocomotiveNumber, audio.TrainNumber, audio.Station} //
                  var (
                     info   *models.TrainInfo
                     err    error
@@ -280,6 +346,7 @@
               }()
            }
         }
         }
      case err, ok := <-watcher.Errors:
         if !ok {
            logx.Errorf(err.Error())