Explorar o código

新增自动下载录音文件功能

Dun.Jason %!s(int64=2) %!d(string=hai) anos
pai
achega
1684618582

+ 12 - 0
src/CallCenter.Api/.config/dotnet-tools.json

@@ -0,0 +1,12 @@
+{
+  "version": 1,
+  "isRoot": true,
+  "tools": {
+    "dotnet-ef": {
+      "version": "7.0.0",
+      "commands": [
+        "dotnet-ef"
+      ]
+    }
+  }
+}

+ 0 - 1
src/CallCenter.Api/Controllers/HomeController.cs

@@ -45,7 +45,6 @@ public class HomeController : BaseController
         var db = _uow.Db;
         db.DbMaintenance.CreateDatabase();
         db.CodeFirst.InitTables<Blacklist>();
-
         return Task.CompletedTask;
     }
 }

+ 61 - 40
src/CallCenter.CacheManager/CallRecordManager.cs

@@ -1,7 +1,9 @@
 
+using CacheManager.Core.Logging;
 using CallCenter.Calls;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Logging;
 using Microsoft.Extensions.Options;
 using SqlSugar;
 using System.Net;
@@ -21,8 +23,10 @@ namespace CallCenter.CacheManager
 
         protected override async Task ExecuteAsync(CancellationToken stoppingToken)
         {
+            using var sc = _serviceScopeFactory.CreateScope();
+            var _logger = sc.ServiceProvider.GetService<ILogger<CallRecordManager>>();
             var time = TimeSpan.FromMinutes(1);
-            await Task.Delay(time, stoppingToken);
+            //await Task.Delay(time, stoppingToken);
             while(!stoppingToken.IsCancellationRequested)
             {
                 using var scope = _serviceScopeFactory.CreateScope();
@@ -30,47 +34,51 @@ namespace CallCenter.CacheManager
                 //var _recordSettings = scope.ServiceProvider.GetConfigValue<RecordSettings>();
                 var _recordSettings = _serviceScopeFactory.CreateScope().ServiceProvider.GetRequiredService<IOptionsSnapshot<RecordSettings>>();
                 //TODO 查询所有没有下载语音文件的记录
-                var canDownList = await _callRecordRepository!.QueryAsync(x => !x.IsDown);
-                if (canDownList != null)
+                var canDown = await _callRecordRepository!.GetCanDownVoice(stoppingToken);
+                
+                if (canDown != null)
                 {
+                    _logger.LogInformation(canDown.Recording);
                     //TODO 下载语音文件
-                    foreach (var item in canDownList)
+
+                    //分隔数据
+                    if (!string.IsNullOrEmpty(canDown.Recording))
                     {
-                        //分隔数据
-                        if (!string.IsNullOrEmpty(item.Recording))
+                        string dir = canDown.Recording.Split("/")[0];
+                        string filename = canDown.Recording.Split("/")[1];
+                        //string url = "";
+                        string url = _recordSettings.Value.Remote + canDown.Recording;//远程地址
+                        string localfile = "Recorder/" + dir + "/"; //本地地址
+                        long startPosition = 0;//上次下载的文件起始位置
+                        FileStream writeStream;//写入本地文件流对象
+                        if (File.Exists(localfile+filename))
+                        {
+                            writeStream = File.OpenWrite(localfile + filename);
+                            startPosition = writeStream.Length;     //获取已经下载的长度
+                            writeStream.Seek(startPosition, SeekOrigin.Current);//本地文件写入位置定位
+                        }
+                        else
                         {
-                            string dir = item.Recording.Split("/")[0];
-                            string filename = item.Recording.Split("/")[1];
-                            //string url = "";
-                            string url = _recordSettings.Value.Remote + item.Recording;//远程地址
-                            string localfile = "Recorder/" + dir + "/"; //本地地址
-                            long startPosition = 0;//上次下载的文件起始位置
-                            FileStream writeStream;//写入本地文件流对象
-                            if (File.Exists(localfile+filename))
+                            if (!File.Exists(localfile))
                             {
-                                writeStream = File.OpenWrite(localfile + filename);
-                                startPosition = writeStream.Length;     //获取已经下载的长度
-                                writeStream.Seek(startPosition, SeekOrigin.Current);//本地文件写入位置定位
+                                System.IO.Directory.CreateDirectory(localfile);
                             }
-                            else
+                            writeStream = new FileStream(localfile + filename, FileMode.Create);//保存
+                            startPosition = 0;
+                        }
+
+                        try
+                        {
+                            HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(url);// 打开网络连接
+                            myRequest.Timeout = 600;//10分钟超时
+                            if (startPosition>0)
                             {
-                                if (!File.Exists(localfile))
-                                {
-                                    System.IO.Directory.CreateDirectory(localfile);
-                                }
-                                writeStream = new FileStream(localfile + filename, FileMode.Create);//保存
-                                startPosition = 0;
+                                myRequest.AddRange((int)startPosition); //设置Range值,与上面的writeStream.Seek用意相同,是为了定义远程文件读取位置
                             }
-
-                            try
+                            Stream readStream = myRequest.GetResponse().GetResponseStream();// 向服务器请求,获得服务器的回应数据流
+                            if (readStream.CanRead)
                             {
-                                HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(url);// 打开网络连接
-
-                                if (startPosition>0)
-                                {
-                                    myRequest.AddRange((int)startPosition); //设置Range值,与上面的writeStream.Seek用意相同,是为了定义远程文件读取位置
-                                }
-                                Stream readStream = myRequest.GetResponse().GetResponseStream();// 向服务器请求,获得服务器的回应数据流
+                                _logger.LogInformation("读取设备");
                                 byte[] btArray = new byte[512];// 定义一个字节数据,用来向readStream读取内容和向writeStream写入内容
                                 int contentSize = readStream.Read(btArray, 0, btArray.Length);// 向远程文件读第一次
 
@@ -85,19 +93,32 @@ namespace CallCenter.CacheManager
                                 readStream.Close();
 
                                 //成功 修改状态
-                                item.IsDown = true;
-                                await _callRecordRepository.UpdateAsync(item);
+                                canDown.IsDown = true;
+                                canDown.DownRemark = "下载成功(200)";
+                                await _callRecordRepository.UpdateAsync(canDown);
                             }
-                            catch
+                            else
                             {
-                                writeStream.Close();
+                                canDown.IsDown = true;
+                                canDown.DownRemark = "无法读取(500)";
+                                await _callRecordRepository.UpdateAsync(canDown);
                             }
                         }
+                        catch(Exception ex)
+                        {
+                            _logger.LogInformation(ex.Message);
+                            canDown.IsDown = true;
+                            canDown.DownRemark = "未找到文件(404)";
+                            await _callRecordRepository.UpdateAsync(canDown);
+                            writeStream.Close();
+                            await Task.Delay(time, stoppingToken);
+                        }
                     }
                 }
-
-
-                await Task.Delay(time,stoppingToken);
+                else
+                {
+                    await Task.Delay(time, stoppingToken);
+                }
             }
         }
     }

+ 6 - 0
src/CallCenter.Repository.SqlSugar/CallRecordRepository.cs

@@ -15,5 +15,11 @@ namespace CallCenter.Repository.SqlSugar
         public CallRecordRepository(ISugarUnitOfWork<CallCenterDbContext> uow) : base(uow)
         {
         }
+
+        public async Task<CallRecord> GetCanDownVoice(CancellationToken cancellationToken)
+        {
+            var model = await Db.Queryable<CallRecord>().Where(x => !x.IsDown && x.Recording != "").OrderBy(x=>x.CreationTime).FirstAsync();
+            return model;
+        }
     }
 }

+ 7 - 1
src/CallCenter/Calls/CallRecord.cs

@@ -123,7 +123,13 @@ namespace CallCenter.Calls
         /// <summary>
         /// 是否下载
         /// </summary>
-        [SugarColumn(ColumnDataType ="是否下载")]
+        [SugarColumn(ColumnDescription = "是否下载")]
         public bool IsDown { get; set; }
+
+        /// <summary>
+        /// 下载备注
+        /// </summary>
+        [SugarColumn(ColumnDescription = "下载备注",IsNullable = true)]
+        public string? DownRemark { get; set; }
     }
 }

+ 1 - 0
src/CallCenter/Calls/ICallRecordRepository.cs

@@ -9,5 +9,6 @@ namespace CallCenter.Calls
 {
     public interface ICallRecordRepository:IRepository<CallRecord>
     {
+        Task<CallRecord> GetCanDownVoice(CancellationToken cancellationToken);
     }
 }