using BaseOUDAL;
using System.Data;
using System.Runtime.Intrinsics.Arm;
using YLErp.Commons;
using YLErp.DBModels;
using YLErp.Helpers;
using YLErp.Modules.ClientModule;
namespace YLErp.Modules.UnderlyingModule
{
///
/// 分红率服务
///
public class UnderlyingSpanTwoService : YLBaseService
{
public UnderlyingSpanTwoService(OptUserInfo userInfo) : base(userInfo)
{
}
///
/// 获取最新分红率
///
public SearchListResult GetLatestList(UnderlyingSpanTwoQueryModel req)
{
// DbContext.SetDebugLog();
var groupSpan = DbContext.UnderlyingSpanTwo.AsNoTracking()
.GroupBy(s => s.UnderlyingId)
.Select(g => new
{
UnderlyingId = g.Key,
ValueDate = g.Max(s => s.ValueDate)
});
var span = DbContext.UnderlyingSpanTwo.AsNoTracking().Join
(groupSpan, s => new { f1 = s.UnderlyingId, f2 = s.ValueDate }, u => new { f1 = u.UnderlyingId, f2 = u.ValueDate },
(s, u) => new { s, u })
.Select(g => new
{
id = g.s.id,
UnderlyingId = g.u.UnderlyingId,
SpanRate = g.s.SpanRate,
ValueDate = g.u.ValueDate
});
var query = span.AsNoTracking().Join(DbContext.underlying_manager, s => s.UnderlyingId, u => u.id, (s, u) => new UnderlyingSpanTwoDto
{
id = s.id,
SpanRate = s.SpanRate,
UnderlyingCode = u.UnderlyingCode,
UnderlyingName = u.UnderlyingName
});
if (!string.IsNullOrWhiteSpace(req.UnderlyingCode))
{
query = query.Where(n => n.UnderlyingCode.Contains(req.UnderlyingCode));
}
if (!string.IsNullOrWhiteSpace(req.UnderlyingName))
{
query = query.Where(n => n.UnderlyingName.Contains(req.UnderlyingName));
}
if (string.IsNullOrEmpty(req.sidx))
{
query = query.OrderBy(n => n.UnderlyingCode);
}
return query.ToSearchList(req);
}
///
/// 获取最新分红率
///
public List GetLatestList(List underlyingCodes, DateTime valueDate)
{
var groupSpan =
DbContext.UnderlyingSpanTwo.AsNoTracking()
.Where(O => O.ValueDate <= valueDate)
.GroupBy(s => s.UnderlyingId)
.Select(g => new
{
UnderlyingId = g.Key,
ValueDate = g.Max(s => s.ValueDate)
});
var span = DbContext.UnderlyingSpanTwo.AsNoTracking().Join
(groupSpan, s => new { f1 = s.UnderlyingId, f2 = s.ValueDate }, u => new { f1 = u.UnderlyingId, f2 = u.ValueDate },
(s, u) => new { s, u })
.Select(g => new
{
id = g.s.id,
UnderlyingId = g.u.UnderlyingId,
SpanRate = g.s.SpanRate,
ValueDate = g.u.ValueDate
});
var query = span.AsNoTracking().Join(DbContext.underlying_manager, s => s.UnderlyingId, u => u.id, (s, u) => new UnderlyingSpanTwoDto
{
id = s.id,
SpanRate = s.SpanRate,
UnderlyingCode = u.UnderlyingCode,
UnderlyingName = u.UnderlyingName
});
if (underlyingCodes?.Count() > 0)
{
query = query.Where(n => underlyingCodes.Contains(n.UnderlyingCode));
}
return query.ToList();
}
///
/// 获取历史分红率
///
public IEnumerable GetHisList(string underlyingCode)
{
if (string.IsNullOrEmpty(underlyingCode))
{
return Enumerable.Empty();
}
var query = from m in DbContext.underlying_manager
join n in DbContext.UnderlyingSpanTwo on m.id equals n.UnderlyingId
where m.UnderlyingCode == underlyingCode
orderby n.ValueDate descending
select new UnderlyingSpanTwoDto
{
SpanRate = n.SpanRate,
ValueDate = n.ValueDate
};
return query.ToArray();
}
///
/// 获取最新分红率
///
public UnderlyingSpanTwoDto GetLatestDetail(string underlyingCode)
{
var span = DbContext.UnderlyingSpanTwo.AsNoTracking().Join
(DbContext.underlying_manager, s => s.UnderlyingId, u => u.id, (s, u) => new UnderlyingSpanTwoDto
{
UnderlyingCode = u.UnderlyingCode,
UnderlyingName = u.UnderlyingName,
SpanRate = s.SpanRate,
ValueDate = s.ValueDate
}).Where(s => s.UnderlyingCode == underlyingCode).OrderByDescending(x => x.ValueDate).FirstOrDefault();
if (span == null)
{
var variety = DataCacheProvider.GetVariety(underlyingCode);
var um = DataCacheProvider.GetUnderlyingDataSource().GetData(underlyingCode);
if (um != null && variety != null && !variety.UpLimit.IsNullOrWhiteSpace())
{
span = new UnderlyingSpanTwoDto
{
UnderlyingCode = underlyingCode,
UnderlyingName = um.UnderlyingName,
SpanRate = variety.UpLimitValue
};
}
}
return span;
}
///
/// 保存分红率
///
public UnderlyingSpanTwo SaveData(UnderlyingSpanTwoDto model)
{
if (string.IsNullOrEmpty(model?.UnderlyingCode))
{
throw new ServiceException("标的代码不能为空");
}
var udm = DbContext.underlying_manager.FirstOrDefault(n => n.UnderlyingCode == model.UnderlyingCode);
if (udm == null)
{
throw new ServiceException("标的信息不存在");
}
var valueDate = BLL.valuedateBLL.ValueDate;
if (valueDate < DateTime.Today) valueDate = DateTime.Today;
var span = DbContext.UnderlyingSpanTwo.FirstOrDefault(n => n.UnderlyingId == udm.id && n.ValueDate == valueDate);
AddOrSaveSpanTwo(span, udm.id, valueDate, model.SpanRate);
return span;
}
///
/// 导入Span涨幅度2
///
///
/// 当前文件中的目标期权总条数
/// 成功入库的数量
public void ImportSpanTwoFromExcel(Stream streamIn, out int totalNum, out int successNum)
{
totalNum = 0;
successNum = 0;
var rowIndex = 0;
try
{
var ds = Office.ExcelHelper.ReadExcelAsDataSet(streamIn, new[] { 0 }, 0);
if (ds.Tables.Count < 1 || ds.Tables[0].Rows.Count < 2)
{
throw new ServiceException("读取导入数据失败:数据为空") { Tag = "111" };
}
var table = ds.Tables[0];
var reader = new DataRowReader(table, 0);
rowIndex = 1;
totalNum = table.Rows.Count - rowIndex;
//using (var trans = BeginTransaction())
//{
foreach (var row in table.Rows.Cast().Skip(1))
{
rowIndex++;
if (row.ItemArray.All(n => string.IsNullOrWhiteSpace(n?.ToString())))
{
totalNum--;
continue;
}
reader.SetDataRow(row);
var underlyingCode = reader.GetString("标的代码", true);
var um = DataCacheProvider.GetUnderlyingDataSource().GetData(underlyingCode);
if (um == null)
{
throw new ServiceException("该标的代码在系统中不存在");
}
var valueDate = reader.GetDate("变动日期", false);
var spanRate = reader.GetPercent("Span涨跌幅度2", false);
if (valueDate == null) valueDate = DateTime.Today;
if (spanRate == null) continue;
if(spanRate < 0) throw new ServiceException("只能填大于等于0的数字");
var span = DbContext.UnderlyingSpanTwo.FirstOrDefault(n => n.UnderlyingId == um.id && n.ValueDate == valueDate);
AddOrSaveSpanTwo(span, um.id, (DateTime)valueDate, spanRate);
successNum++;
}
//trans.Commit();
//}
}
catch (ServiceException se)
{
if (se.Tag != null)
{
throw;
}
throw new ServiceException($"第{rowIndex}行,{se.Message}");
}
catch (Exception ex)
{
LogFactory.GetLogger("导入Span涨跌幅2").Error(ex);
throw new ServiceException($"第{rowIndex}行,发生错误:{ex.Message}", ex);
}
}
///
/// 保存Span涨跌幅2
///
///
///
///
private void AddOrSaveSpanTwo(UnderlyingSpanTwo span, int id, DateTime valueDate, double? spanRate)
{
if (span == null)
{
span = new UnderlyingSpanTwo
{
UnderlyingId = id,
ValueDate = valueDate
};
DbContext.UnderlyingSpanTwo.Add(span);
}
var remark = $"从{span.SpanRate}修改为";
if(spanRate < 0)
{
throw new ServiceException("Span涨跌幅2必须大于等于0");
}
span.SpanRate = spanRate;
span.OptId = UserId;
span.OptName = UserName;
span.OptDate = DateTime.Now;
remark = $"{span.OptDate}" + remark + $"{spanRate}";
var spanLog = new Processlog()
{
TypeId = span.UnderlyingId,
ProcessType = "Span2Setting",
ProcessStatus = "保存",
Log = "",
Remark = remark,
OptId = UserId,
CreateTime = DateTime.Now
};
DbContext.CreditProcessLog.Add(spanLog);
DbContext.SaveChanges();
}
}
///
///
///
public class UnderlyingSpanTwoQueryModel : BaseSearchReq
{
public string UnderlyingName { get; set; }
public string UnderlyingCode { get; set; }
}
}