using Dapper; using MySqlConnector; using YieldChain.Helpers; using YLErp.BLL; namespace YLErp.Modules.UnderlyingModule { public enum FundManagerLookupStatus { NotFound, Unique, Multiple, Unavailable } public sealed class FundManagerLookupResult { public FundManagerLookupStatus Status { get; init; } public string InvestAdvisorName { get; init; } } /// /// 查询上游基金档案中的基金管理人。上游不可用时返回降级结果,不阻断页面编辑。 /// public sealed class FundManagerLookupService { private sealed class FundManagerRow { public string InvestAdvisorCode { get; set; } public string InvestAdvisorName { get; set; } } //物理库名由连接串 database= 决定(DbSchema 解析),各环境库名不同(如测试环境 glms_bigdata), //SQL 不硬编码库名;连接开在 bigdata 数据源上,将来跨库 join ERP 主库时用 DbSchema.Of("ylcms") 同法插值 private string BuildLookupSql() { return $@" SELECT ia.investadvisorcode AS InvestAdvisorCode, ia.investadvisorname AS InvestAdvisorName FROM {DbSchema.Of("bigdata")}.mf_fundarchives AS fa INNER JOIN {DbSchema.Of("bigdata")}.mf_investadvisoroutline AS ia ON CONVERT(fa.investadvisorcode USING utf8mb4) COLLATE utf8mb4_unicode_ci = CONVERT(ia.investadvisorcode USING utf8mb4) COLLATE utf8mb4_unicode_ci WHERE CONVERT(fa.secucode USING utf8mb4) COLLATE utf8mb4_unicode_ci = CONVERT(TRIM(SUBSTRING_INDEX(@UnderlyingCode, '.', 1)) USING utf8mb4) COLLATE utf8mb4_unicode_ci"; } public FundManagerLookupResult Lookup(string underlyingCode) { var normalizedCode = NormalizeCode(underlyingCode); if (string.IsNullOrEmpty(normalizedCode)) { return new FundManagerLookupResult { Status = FundManagerLookupStatus.NotFound }; } var connectionString = AppManager.GetConnectionString("bigdata"); if (string.IsNullOrWhiteSpace(connectionString)) { return new FundManagerLookupResult { Status = FundManagerLookupStatus.Unavailable }; } try { using var connection = new MySqlConnection(connectionString); var matches = connection.Query(BuildLookupSql(), new { UnderlyingCode = normalizedCode }, commandTimeout: 10) .Where(row => !string.IsNullOrWhiteSpace(row.InvestAdvisorName)) .GroupBy(row => (row.InvestAdvisorCode ?? string.Empty).Trim(), StringComparer.OrdinalIgnoreCase) .Select(group => group.Select(row => row.InvestAdvisorName.Trim()).Distinct(StringComparer.OrdinalIgnoreCase).ToArray()) .Where(names => names.Length > 0) .ToArray(); return matches.Length switch { 0 => new FundManagerLookupResult { Status = FundManagerLookupStatus.NotFound }, 1 when matches[0].Length == 1 => new FundManagerLookupResult { Status = FundManagerLookupStatus.Unique, InvestAdvisorName = matches[0][0] }, _ => new FundManagerLookupResult { Status = FundManagerLookupStatus.Multiple } }; } catch (Exception ex) { LogFactory.GetLogger().Error("查询基金管理人失败,代码:" + normalizedCode, ex); return new FundManagerLookupResult { Status = FundManagerLookupStatus.Unavailable }; } } public static string NormalizeCode(string underlyingCode) { var trimmed = underlyingCode?.Trim(); if (string.IsNullOrEmpty(trimmed)) { return null; } var dotIndex = trimmed.IndexOf('.'); return (dotIndex < 0 ? trimmed : trimmed.Substring(0, dotIndex)).TrimToNull(); } } }