Program.cs 4.54 KB
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Serilog;
using SqlSugar;
using LqSalaryCalculationService.Services;
using LqSalaryCalculationService.Models;

namespace LqSalaryCalculationService
{
    class Program
    {
        static async Task Main(string[] args)
        {
            // 配置Serilog
            var configuration = GetConfiguration();
            Log.Logger = new LoggerConfiguration()
                .ReadFrom.Configuration(configuration)
                .CreateLogger();

            try
            {
                Log.Information("绿纤美业ERP工资核算服务启动中...");

                var host = CreateHostBuilder(args).Build();
                
                // 获取服务
                var salaryService = host.Services.GetRequiredService<ISalaryCalculationService>();
                var logger = host.Services.GetRequiredService<ILogger<Program>>();

                // 获取计算月份参数
                var calculationMonth = GetCalculationMonth(args);
                if (string.IsNullOrEmpty(calculationMonth))
                {
                    logger.LogError("请提供计算月份参数,格式: yyyy-MM");
                    Console.WriteLine("使用方法: dotnet run -- 2024-09");
                    return;
                }

                logger.LogInformation($"开始执行工资核算,计算月份: {calculationMonth}");

                // 获取用户基础信息并插入到工资表
                logger.LogInformation("开始获取用户基础信息并插入到工资表...");
                var userInfoResult = await salaryService.InitializeUserInfoAsync(calculationMonth);
                
                if (userInfoResult.Success)
                {
                    logger.LogInformation($"✅ 成功初始化 {userInfoResult.UserCount} 名用户信息");
                    Console.WriteLine($"✅ 用户信息初始化完成!");
                    Console.WriteLine($"📊 共处理 {userInfoResult.UserCount} 名用户");
                    Console.WriteLine($"📅 计算月份: {calculationMonth}");
                }
                else
                {
                    logger.LogError($"初始化用户信息失败: {userInfoResult.Message}");
                    Console.WriteLine($"❌ 初始化用户信息失败: {userInfoResult.Message}");
                }
            }
            catch (Exception ex)
            {
                Log.Fatal(ex, "服务启动失败");
                Console.WriteLine($"❌ 服务启动失败: {ex.Message}");
            }
            finally
            {
                Log.CloseAndFlush();
            }
        }

        static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .UseSerilog()
                .ConfigureServices((context, services) =>
                {
                    // 配置SqlSugar
                    services.AddSingleton<SqlSugarClient>(provider =>
                    {
                        var configuration = provider.GetRequiredService<IConfiguration>();
                        var connectionString = configuration.GetConnectionString("DefaultConnection");
                        
                        return new SqlSugarClient(new ConnectionConfig()
                        {
                            ConnectionString = connectionString,
                            DbType = DbType.MySql,
                            IsAutoCloseConnection = true,
                            InitKeyType = InitKeyType.Attribute
                        });
                    });

                    // 注册服务
                    services.AddScoped<ISalaryCalculationService, SalaryCalculationService>();
                });

        static IConfiguration GetConfiguration()
        {
            return new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddEnvironmentVariables()
                .Build();
        }

        static string GetCalculationMonth(string[] args)
        {
            if (args.Length > 0)
            {
                return args[0];
            }

            // 如果没有提供参数,使用当前月份
            return DateTime.Now.ToString("yyyy-MM");
        }
    }
}