243 lines
9.1 KiB
C#
243 lines
9.1 KiB
C#
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)
|
|
{
|
|
}
|
|
|
|
/// <summary>
|
|
/// 导入预付金率
|
|
/// </summary>
|
|
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<OtcOptionTradeFullEx>();
|
|
|
|
foreach (var row in table.Rows.Cast<DataRow>())
|
|
{
|
|
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<client_variety_marginrate> 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; }
|
|
}
|
|
}
|
|
}
|