using BaseOUDAL;
using System.Data;
using YLErp.Commons;
using YLErp.Modules.TradeModule.OrderModule;
namespace YLErp.Modules.MarginModule
{
public class MarginRateService : YLBaseService
{
public MarginRateService(OptUserInfo userInfo) : base(userInfo)
{
}
///
/// 导入预付金率
///
public void ImportMarginRate(Stream streamIn, out int totalNum, out int successNum)
{
totalNum = 0;
successNum = 0;
var rowIndex = 0;
try
{
var ds = Office.ExcelHelper.ReadExcelAsDataSet(streamIn, new[] { 0 }, 1);
if (ds.Tables.Count < 1 || ds.Tables[0].Rows.Count < 1)
{
throw new ServiceException("读取导入数据失败:数据为空") { Tag = "111" };
}
var table = ds.Tables[0];
var reader = new DataRowReader(table);
rowIndex = 0;
totalNum = table.Rows.Count - rowIndex;
var structureTradeList = new List();
foreach (var row in table.Rows.Cast())
{
rowIndex++;
if (row.ItemArray.All(n => string.IsNullOrWhiteSpace(n?.ToString())))
{
totalNum--;
continue;
}
reader.SetDataRow(row);
using (var trans = BeginTransaction())
{
//映射导入数据到交易对象
var maginRate = MapMarginRate(reader);
saveMarginRate(maginRate, true);
successNum++;
trans.Commit();
}
}
//generateSettleDocument(trade_Cashes);
//生成确认书
//new ConfirmationGenerateService(this).Generate(tradeIds, "PDF");
}
catch (ServiceException se)
{
if (se.Tag != null)
{
throw;
}
throw new ServiceException($"已成功导入{successNum}条;\n第{rowIndex}行,{se.Message}");
}
catch (Exception ex)
{
LogFactory.GetLogger("导入互换交易").Error(ex);
throw new ServiceException($"已成功导入{successNum}条,\n第{rowIndex}行,发生错误:{ex.Message}", ex);
}
}
private client_variety_marginrate MapMarginRate(DataRowReader reader)
{
var marginRate = new client_variety_marginrate()
{
ClientName = reader.GetString("客户名称", false),
VarietyCode = reader.GetString("品种代码", true),
ValueDate = reader.GetDate("起效日期", true) ?? DateTime.Now,
HighMarginRate = reader.GetPercent("PFE系数", false) ?? 0,
LowMarginRate = reader.GetPercent("VR系数", false) ?? 0
};
var client = new Client();
if (!string.IsNullOrWhiteSpace(marginRate.ClientName))
{
client = DataCacheProvider.GetClientDataSource().AsQueryable().Where(o => o.Name == marginRate.ClientName).FirstOrDefault();
if (client == null)
{
throw new ServiceException("未找到客户:" + marginRate.ClientName);
}
marginRate.ClientId = client.id;
}
if (string.IsNullOrWhiteSpace(marginRate.VarietyCode))
{
throw new ServiceException("品种代码必填");
}
var variety = DbContext.variety.Where(o => o.VarietyCode == marginRate.VarietyCode || o.VarietyName == marginRate.VarietyCode).FirstOrDefault();
if (variety == null)
{
throw new ServiceException("未找到品种:" + marginRate.VarietyCode);
}
marginRate.VarietyId = variety.id;
return marginRate;
}
public void saveMarginRate(client_variety_marginrate marginrate, bool canCover = false)
{
if (marginrate == null)
{
throw new ServiceException("无数据");
}
if (marginrate.HighMarginRate < 0 || marginrate.LowMarginRate < 0)
{
throw new ServiceException("预付金率数据格式错");
}
if (marginrate.VarietyId == 0)
{
throw new ServiceException("品种代码必填");
}
var dbMarginRate = new client_variety_marginrate();
if (marginrate.id != 0)
{
dbMarginRate = DbContext.client_variety_marginrate.Find(marginrate.id);
if (dbMarginRate == null)
{
throw new ServiceException("未找到该记录");
}
dbMarginRate.ClientId = marginrate.ClientId;
dbMarginRate.VarietyId = marginrate.VarietyId;
dbMarginRate.HighMarginRate = marginrate.HighMarginRate;
dbMarginRate.LowMarginRate = marginrate.LowMarginRate;
dbMarginRate.ValueDate = marginrate.ValueDate;
dbMarginRate.OptId = UserId;
dbMarginRate.OptName = UserName;
dbMarginRate.OptDate = DateTime.Now;
if (DbContext.client_variety_marginrate.Any(o =>
o.VarietyId == dbMarginRate.VarietyId
&& o.ClientId == dbMarginRate.ClientId
&& o.ValueDate == dbMarginRate.ValueDate
&& o.id != marginrate.id))
{
throw new ServiceException("同一客户同一品种不支持在同一天有多条记录");
}
}
else
{
dbMarginRate = DbContext.client_variety_marginrate.Where(o =>
o.VarietyId == marginrate.VarietyId
&& o.ClientId == marginrate.ClientId
&& o.ValueDate == marginrate.ValueDate).FirstOrDefault();
if (dbMarginRate == null)
{
marginrate.OptId = UserId;
marginrate.OptName = UserName;
marginrate.OptDate = DateTime.Now;
DbContext.client_variety_marginrate.Add(marginrate);
}
else if (canCover)
{
dbMarginRate.HighMarginRate = marginrate.HighMarginRate;
dbMarginRate.LowMarginRate = marginrate.LowMarginRate;
dbMarginRate.OptId = UserId;
dbMarginRate.OptName = UserName;
dbMarginRate.OptDate = DateTime.Now;
}
else
{
throw new ServiceException("同一客户同一品种不支持在同一天有多条记录");
}
}
DbContext.SaveChanges();
}
public SearchListResult SearchList(MarginRateReq req)
{
var query = from source in DbContext.client_variety_marginrate select source;
if (req.ClientId > 0)
{
query = query.Where(o => o.ClientId == req.ClientId);
}
if (req.VarietyId > 0)
{
query = query.Where(o => o.VarietyId == req.VarietyId);
}
if (string.IsNullOrEmpty(req.sidx))
{
req.sidx = "id";
req.sord = "desc";
}
return query.ToSearchList(req);
}
public double GetMarginRate(int clientId, int varietyId, DateTime searchDate, bool useThrowException = true)
{
var marginRates = DbContext.client_variety_marginrate.Where(o => o.VarietyId == varietyId && o.ValueDate < searchDate).OrderByDescending(o => o.ValueDate);
var marginRate = marginRates.Any(o => o.ClientId == clientId) ? marginRates.FirstOrDefault(o => o.ClientId == clientId) : marginRates.FirstOrDefault(o => o.ClientId == 0);
if (marginRate == null)
{
if (useThrowException)
{
throw new Exception($"ClientId:{clientId} - VarietyId:{varietyId} 未找到对应的预付金率");
}
else
{
return 0;
}
}
else
{
var credit = DbContext.credit.Where(o => o.ClientId == clientId && o.CreditStartDate <= searchDate).FirstOrDefault();
if (credit == null || credit.PFECredit == null || credit.PFECredit == 0)
{
return marginRate.HighMarginRate;
}
return marginRate.LowMarginRate;
}
}
public class MarginRateReq : BaseSearchReq
{
public int ClientId { get; set; }
public int VarietyId { get; set; }
}
}
}