Browse Source

新增团组操作日志功能及状态字段支持

- 新增 `IGroupTextFileLogger` 接口及其实现 `GroupTextFileLogger`,用于记录团组操作日志。
- 在 `GroupsController` 中引入 `IGroupTextFileLogger`,并在 `EnterpriseWeChatNotificationAsyncBaoPi` 方法中添加日志记录逻辑。
- 在 `Grp_DelegationInfo` 实体类中新增 `Step` 字段,表示团组状态/步骤,并在 `DelegationInfoView` 中提供状态文字描述。
- 修改 SQL 查询,支持新增的 `Step` 字段。
- 修改 `EnterpriseWeChatNotificationAsyncBaoPi` 方法,新增 `currUserId` 参数,记录操作人信息,并更新团组状态。
- 在 `Program.cs` 中新增团组操作日志目录配置及初始化,注册 `IGroupTextFileLogger` 实现。
- 在 `appsettings.json` 中新增 `FileExportSettings` 配置项。
- 优化日志记录,补充状态文字描述及注释说明。
Lyyyi 16 hours ago
parent
commit
3d77e857ca

+ 46 - 3
OASystem/OASystem.Api/Controllers/GroupsController.cs

@@ -63,6 +63,7 @@ namespace OASystem.API.Controllers
     {
         private readonly ILogger<GroupsController> _logger;
         private readonly ITextFileLogger _eec_textLogger;
+        private readonly IGroupTextFileLogger _groupTextLogger;
         private readonly GrpScheduleRepository _grpScheduleRep;
         private readonly IMapper _mapper;
         private readonly DelegationInfoRepository _groupRepository;
@@ -120,6 +121,7 @@ namespace OASystem.API.Controllers
         /// </summary>
         /// <param name="logger"></param>
         /// <param name="eec_textLogger"></param>
+        /// <param name="groupTextLogger"></param>
         /// <param name="mapper"></param>
         /// <param name="hubContext"></param>
         /// <param name="sqlSugar"></param>
@@ -163,6 +165,7 @@ namespace OASystem.API.Controllers
         public GroupsController(
             ILogger<GroupsController> logger,
             ITextFileLogger eec_textLogger,
+            IGroupTextFileLogger groupTextLogger,
             IMapper mapper,
             IHubContext<ChatHub, IChatClient> hubContext,
             SqlSugarClient sqlSugar,
@@ -208,6 +211,7 @@ namespace OASystem.API.Controllers
         {
             _logger = logger;
             _eec_textLogger = eec_textLogger;
+            _groupTextLogger = groupTextLogger;
             _mapper = mapper;
             _grpScheduleRep = grpScheduleRep;
             _groupRepository = groupRepository;
@@ -876,12 +880,12 @@ namespace OASystem.API.Controllers
                 string sql = string.Format(@"Select Row_Number,Id,SalesQuoteNo,TourCode,TeamTypeId, TeamType,Department,
                                              	TeamLevId,TeamLev,TeamName,ClientName,ClientUnit,
                                              	VisitDate,VisitDays,VisitPNumber,JietuanOperatorId,
-                                             	JietuanOperator,IsSure,CreateTime,IsBid
+                                             	JietuanOperator,IsSure,CreateTime,IsBid,Step
                                              	From (
                                              	Select row_number() over(order by gdi.VisitStartDate Desc) as Row_Number,
                                                 CASE WHEN gdi.JietuanOperator = 4 OR gdi.JietuanOperator = 21 THEN '国交部'
                                                 ELSE (Select DepName FROM OA2023DB.dbo.Sys_Department WHERE Id = su.DepId) END AS 'Department',
-                                             	gdi.Id,SalesQuoteNo,TourCode,ssd.Id TeamTypeId, ssd.Name TeamType,
+                                             	gdi.Id,SalesQuoteNo,TourCode,ssd.Id TeamTypeId, ssd.Name TeamType,gdi.Step,
                                              	ssd1.Id TeamLevId,ssd1.Name TeamLev,TeamName,ClientName,ClientUnit,
                                              	VisitDate,VisitDays,VisitPNumber,JietuanOperator JietuanOperatorId,
                                              	su.CnName JietuanOperator,IsSure,gdi.CreateTime,gdi.IsBid
@@ -2749,10 +2753,11 @@ FROM
         /// <summary>
         /// 报批完成企微通知
         /// </summary>
+        /// <param name="currUserId"></param>
         /// <param name="diid"></param>
         /// <returns></returns>
         [HttpPost]
-        public async Task<IActionResult> EnterpriseWeChatNotificationAsyncBaoPi(int diid)
+        public async Task<IActionResult> EnterpriseWeChatNotificationAsyncBaoPi(int currUserId,int diid)
         {
             var jw = JsonView(true);
             var users = new List<string>();
@@ -2763,6 +2768,44 @@ FROM
             {
                 users = JsonConvert.DeserializeObject<List<string>>(ssd.Remark);
                 var res = await AppNoticeLibrary.SendUserMsg_BaoPi_ToUser(users, diid);
+                
+                //消息通知成功 更改团组step、记录日志
+                if (res)
+                {
+                    var groupStep = 0; //0-新建 1-企微消息通知
+
+                    //更改团组step
+                    var updStatus = await _sqlSugar.Updateable<Grp_DelegationInfo>()
+                        .SetColumns(x => new Grp_DelegationInfo()
+                        {
+                            Step = 2
+                        })
+                        .Where(x => x.Id == diid && x.IsDel == 0)
+                        .ExecuteCommandAsync();
+                    if (updStatus > 0) groupStep = 2;
+                    string groupStepLabel = groupStep switch
+                    {
+                        1 => "新建",
+                        2 => "企微消息通知(报批)",
+                        _ => "未设置"
+                    };
+
+                    //记录日志
+
+                    var teamName = _sqlSugar.Queryable<Grp_DelegationInfo>()
+                        .Where(x => x.Id == diid && x.IsDel == 0)
+                        .Select(x => x.TeamName)
+                        .First() ?? "-";
+
+                    var operationName = _sqlSugar.Queryable<Sys_Users>()
+                        .Where(x => x.Id == currUserId && x.IsDel == 0)
+                        .Select(x => x.CnName)
+                        .First() ?? "-";
+
+                    _groupTextLogger.LogInformation("团组:【{teamName}({groupId})】 操作人:【{operationName}】 操作时间:【{operationTime}】{logContent}", teamName, diid, operationName, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), groupStepLabel);
+
+                }
+
             }
             catch (Exception ex)
             {

+ 11 - 1
OASystem/OASystem.Api/OAMethodLib/Logging/ITextFileLogger.cs

@@ -1,7 +1,7 @@
 namespace OASystem.API.OAMethodLib.Logging
 {
     /// <summary>
-    /// 文本日志接口
+    /// 出入境费用文本日志接口
     /// </summary>
     public interface ITextFileLogger
     {
@@ -9,4 +9,14 @@
         void LogWarning(string message, params object[] args);
         void LogError(Exception ex, string message, params object[] args);
     }
+
+    /// <summary>
+    /// 团组不走操作日志接口
+    /// </summary>
+    public interface IGroupTextFileLogger
+    {
+        void LogInformation(string message, params object[] args);
+        void LogWarning(string message, params object[] args);
+        void LogError(Exception ex, string message, params object[] args);
+    }
 }

+ 21 - 0
OASystem/OASystem.Api/OAMethodLib/Logging/TextFileLogger.cs

@@ -2,6 +2,9 @@
 
 namespace OASystem.API.OAMethodLib.Logging
 {
+    /// <summary>
+    /// 出入境费用明细日志记录
+    /// </summary>
     public class TextFileLogger : ITextFileLogger
     {
         private readonly ILogger _logger;
@@ -16,4 +19,22 @@ namespace OASystem.API.OAMethodLib.Logging
         public void LogError(Exception ex, string message, params object[] args)
             => _logger.Error(ex, message, args);
     }
+
+    /// <summary>
+    /// 团组不走操作日志
+    /// </summary>
+    public class GroupTextFileLogger : IGroupTextFileLogger
+    {
+        private readonly ILogger _logger;
+        public GroupTextFileLogger(ILogger logger) => _logger = logger;
+
+        public void LogInformation(string message, params object[] args)
+            => _logger.Information(message, args);
+
+        public void LogWarning(string message, params object[] args)
+            => _logger.Warning(message, args);
+
+        public void LogError(Exception ex, string message, params object[] args)
+            => _logger.Error(ex, message, args);
+    }
 }

+ 32 - 1
OASystem/OASystem.Api/Program.cs

@@ -362,7 +362,9 @@ Log.Logger = new LoggerConfiguration()
        .WriteTo.File(Path.Combine("Logs", @"Log.txt"), rollingInterval: RollingInterval.Day)
        .CreateLogger();
 
-// 创建出入境费用明细日志记录器专门用于文本记录
+// 
+
+#region 出入境费用明细 专用记录器
 
 // 指定磁盘绝对路径(示例:D盘的AppLogs文件夹)
 var logDirectory = @"D:\OASystem\Logs\EnterExitCost";
@@ -384,10 +386,39 @@ var eec_TextLogger = new LoggerConfiguration()
     .WriteTo.File(Path.Combine(logDirectory, "text-records-.txt"), rollingInterval: RollingInterval.Month)
     .CreateLogger();
 
+#endregion
+
+
+#region 团组步骤操作 专用记录器
+
+// 指定磁盘绝对路径(示例:D盘的AppLogs文件夹)
+var groupLogDir = @"D:\OASystem\Logs\GroupStepOP";
+
+// 自动创建目录(如果不存在)
+try
+{
+    Directory.CreateDirectory(groupLogDir);
+    Log.Information($"日志目录已创建/确认存在: {groupLogDir}");
+}
+catch (Exception ex)
+{
+    Log.Fatal($"无法创建日志目录 {groupLogDir}: {ex.Message}");
+    throw;
+}
+
+var groupStepOP_TextLogger = new LoggerConfiguration()
+    .MinimumLevel.Information()
+    .WriteTo.File(Path.Combine(groupLogDir, "text-records-.txt"), rollingInterval: RollingInterval.Month)
+    .CreateLogger();
+
+#endregion
+
+
 // 配置Serilog为Log;
 builder.Host.UseSerilog();
 
 builder.Services.AddSingleton<ITextFileLogger>(new TextFileLogger(eec_TextLogger));
+builder.Services.AddSingleton<IGroupTextFileLogger>(new GroupTextFileLogger(groupStepOP_TextLogger));
 #endregion
 
 #region 引入注册Autofac Module

+ 9 - 1
OASystem/OASystem.Api/appsettings.json

@@ -505,5 +505,13 @@
         }
       ]
     }
-  ]
+  ],
+  "FileExportSettings": {
+    "ExportBasePath": "wwwroot/exports",
+    "DownloadBaseUrl": "/exports",
+    "RetentionDays": 7,
+    "MaxFileSizeMB": 50,
+    "ExcelTemplatesPath": "Templates/Excel"
+  },
+  "AllowedHosts": "*"
 }

+ 6 - 0
OASystem/OASystem.Domain/Entities/Groups/Grp_DelegationInfo.cs

@@ -253,6 +253,12 @@ namespace OASystem.Domain.Entities.Groups
         [SugarColumn(IsNullable = true, ColumnDataType = "varchar(300)")]
         public string Officialneeds { get; set; }
         #endregion
+
+        /// <summary>
+        /// 团组状态/步骤 1-新建 2-企微消息通知
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDataType = "int")]
+        public int Step { get; set; } = 1;
     }
 
 }

+ 17 - 0
OASystem/OASystem.Domain/ViewModels/Groups/DelegationInfoView.cs

@@ -533,6 +533,23 @@ namespace OASystem.Domain.ViewModels.Groups
         /// </summary>
         public string OperatorLabel { get; set; }
 
+        public int Step { get; set; }
+
+        public string StepLabel
+        {
+            get
+            {
+
+                return Step switch
+                {
+                    1 => "新建",
+                    2 => "企微消息通知(报批)",
+                    _ => "未设置"
+                };
+
+            }
+        }
+
     }