- 将除权除息相关数值字段从 double 类型改为 decimal 类型以提高精度 - 重构了红利比率计算方法 GetRatio,新增 GetRatioDecimal 方法使用 decimal 计算 - 修改价格和持仓数量计算逻辑,统一使用 decimal 进行高精度运算 - 更新数据库查询逻辑,将篮子标的判断从 IsBasket() 方法改为 CommodityCode 条件 - 优化 AddDividendInfos 方法中的批量处理逻辑,增加业务键冲突检测 - 添加数据源标识字段 DataSource 和来源更新时间字段 SourceUpdatedAt - 新增 FindExDividendByBusinessKey 和 MergeNonZeroDividendValues 辅助方法 - 更新结算服务中除权除息信息的获取方式,使用字典查找替代 LINQ JOIN - 修复前端保存除权信息时的响应处理逻辑 - 为基金类型也开放除权功能,不仅限于股票类型 - 添加单元测试验证篮子标的查询翻译逻辑的正确性
69 lines
2.7 KiB
C#
69 lines
2.7 KiB
C#
using System;
|
|
using System.IO;
|
|
|
|
namespace YLErp.Modules.EodModule
|
|
{
|
|
[TestClass]
|
|
public class DividendBasketQueryTranslationTest
|
|
{
|
|
[TestMethod]
|
|
public void DividendBasketQueriesUseEfTranslatableCommodityCondition()
|
|
{
|
|
var source = ReadDividendServiceSource();
|
|
var addDividendQuery = ExtractQuery(
|
|
source,
|
|
"var basketList =",
|
|
"IEnumerable<eod_stock_price> priceList = null;");
|
|
var executeStatusQuery = ExtractQuery(
|
|
source,
|
|
"var umList = DataCacheProvider.GetUnderlyingDataSource().AsQueryable(",
|
|
").Select(O => O.UnderlyingCode).ToArray();");
|
|
|
|
AssertQueryUsesCommodityCondition(addDividendQuery, "AddDividendInfos");
|
|
AssertQueryUsesCommodityCondition(executeStatusQuery, "checkDividendInfoExecuteStatus");
|
|
}
|
|
|
|
private static void AssertQueryUsesCommodityCondition(string query, string methodName)
|
|
{
|
|
Assert.IsFalse(
|
|
query.Contains("IsBasket()", StringComparison.Ordinal),
|
|
$"{methodName} must not put IsBasket() in an IQueryable predicate.");
|
|
Assert.IsTrue(
|
|
query.Contains("O.CommodityCode == \"篮子标的\"", StringComparison.Ordinal),
|
|
$"{methodName} must filter baskets with the EF-translatable CommodityCode condition.");
|
|
}
|
|
|
|
private static string ExtractQuery(string source, string startMarker, string endMarker)
|
|
{
|
|
var start = source.IndexOf(startMarker, StringComparison.Ordinal);
|
|
Assert.IsTrue(start >= 0, $"Could not find query marker: {startMarker}");
|
|
var end = source.IndexOf(endMarker, start + startMarker.Length, StringComparison.Ordinal);
|
|
Assert.IsTrue(end >= 0, $"Could not find query end marker: {endMarker}");
|
|
return source.Substring(start, end + endMarker.Length - start);
|
|
}
|
|
|
|
private static string ReadDividendServiceSource()
|
|
{
|
|
var directory = new DirectoryInfo(AppContext.BaseDirectory);
|
|
while (directory != null)
|
|
{
|
|
var path = Path.Combine(
|
|
directory.FullName,
|
|
"YLErpDAL",
|
|
"Modules",
|
|
"TradeModule",
|
|
"DealModule",
|
|
"DividendService.cs");
|
|
if (File.Exists(path))
|
|
{
|
|
return File.ReadAllText(path);
|
|
}
|
|
directory = directory.Parent;
|
|
}
|
|
|
|
Assert.Fail("Could not locate DividendService.cs from the test output directory.");
|
|
return string.Empty;
|
|
}
|
|
}
|
|
}
|