using BaseOUDAL; using System.ComponentModel; using System.Data; using System.Reflection; using System.Text.RegularExpressions; using YieldChain.Helpers; using YieldChain.Security; using YLErp.Model; using YLErp.Modules.ClientModule; using YLErp.Office.ExcelModule; namespace YLErp.Modules.TradeModule.QueryModule { public class DatatraceQueryService : YLBaseService { public DatatraceQueryService(OptUserInfo userInfo) : base(userInfo) { } public DatatraceQueryService(YLBaseService baseService) : base(baseService) { } #region 客户信息变更 public byte[] ExportClientInfoChange(TradeChangeReq req) { SearchListResult searchListResult = GetClientInfoChangeRep(req); foreach (var item in searchListResult.rows) { if (!string.IsNullOrEmpty(item.DataInfo)) { item.DataInfo = item.DataInfo.Substring(0, item.DataInfo.Length - 1).Replace(";", ";\r\n") + ";"; item.DataInfo = item.DataInfo.Replace("“ ”", "空"); } } var templateFile = OtcAppContext.MapPath("~/App_Docs/导出模板/变更记录模板_客户信息变更.xlsx"); return ExcelGenerator.UseTemplateGenerator(templateFile).AddVariable(new { list = searchListResult.rows }).GenerateBytes(); } public SearchListResult GetClientInfoChangeRep(TradeChangeReq req) { SearchListResult searchListResult = new SearchListResult(); var ClientAuditLogList = new SearchListResult(); if (req.Ids == null || req.Ids.Count == 0) { ClientAuditLogList = GetClientInfoChangeRepList(req); } else { ClientAuditLogList = GetClientInfoChangeRepListByIds(req); } if (ClientAuditLogList.rows != null && ClientAuditLogList.rows.Count() > 0) { List clientInfoChangeReps = new List(); foreach (var item in ClientAuditLogList.rows) { var client = new ClientDataService(OptUser).GetClientById(item.ClientId); if (client != null) { var dataChanges = ReplaceDataChanges(client, item.Changes); var newDataChange = new ClientInfoChangeRep { ClientId = item.ClientId, Changes = item.Changes, ClientName = client.Name, ClientNumber = client.Number, DataInfo = dataChanges, OptName = item.OptName, OptDate = item.OptDate, OptType = (item.OptType.Contains("删除人员信息") || item.OptType.Contains("销户")) ? "信息删除" : "信息修改", IsClosed = client.ProcessStatus.Contains("已销户"), id = item.id }; if (dataChanges != null && !string.IsNullOrEmpty(dataChanges)) { clientInfoChangeReps.Add(newDataChange); } else { if (item.OptType.Contains("删除人员信息") || item.OptType.Contains("销户")) { clientInfoChangeReps.Add(newDataChange); } } } } searchListResult.rows = clientInfoChangeReps; searchListResult.total = ClientAuditLogList.total; searchListResult.page = ClientAuditLogList.page; searchListResult.Sum = ClientAuditLogList.Sum; searchListResult.records = ClientAuditLogList.records; } return searchListResult; } public SearchListResult GetClientInfoChangeRepListByIds(TradeChangeReq req) { using (var clientDB = new ClientDBContext()) { var query = clientDB.ClientAuditLog.Where(a => req.Ids.Contains(a.id)).OrderByDescending(a => a.OptDate).AsQueryable(); return query.ToSearchList(req); } } public SearchListResult GetClientInfoChangeRepList(TradeChangeReq req) { using (var clientDB = new ClientDBContext()) { var query = clientDB.ClientAuditLog.Where(a => a.OptType == "编辑客户" || a.OptType == "编辑产品投资人" || a.OptType == "编辑客户人员" || a.OptType == "上传文件" || a.OptType == "修改上传文件" || a.OptType == "删除人员信息" || a.OptType == "销户").AsQueryable(); if (req.OptDateStart != default) { query = query.Where(a => req.OptDateStart <= a.OptDate); } if (req.OptDateEnd != default) { var endDay = req.OptDateEnd.AddDays(1); query = query.Where(a => endDay > a.OptDate); } if (req.OptTypes != null && req.OptTypes.Count > 0) { if (req.OptTypes.Any(a => a == "信息修改")) { query = query.Where(a => a.OptType == "编辑客户" || a.OptType == "编辑产品投资人" || a.OptType == "编辑客户人员" || a.OptType == "上传文件" || a.OptType == "修改上传文件"); } else if (req.OptTypes.Any(a => a == "信息删除")) { query = query.Where(a => a.OptType == "删除人员信息" || a.OptType == "销户"); } } if (!string.IsNullOrEmpty(req.ClientNumber)) { query = from q in query join c in clientDB.client on q.ClientId equals c.id where c.Number.Contains(req.ClientNumber) select q; } if (req.ClientIds != null && req.ClientIds.Count > 0) { query = query.Where(a => req.ClientIds.Any(b => b == a.ClientId)); } if (req.OptNames != null) { query = query.Where(a => req.OptNames.Any(b => b == a.OptName)); } query = query.OrderByDescending(a => a.OptDate); return query.ToSearchList(req); } } #endregion #region 交易信息变更 public SearchListResult GetTradeInfoChangeRepList(TradeChangeReq req) { var query = DbContext.TradeAuditLog.Where(a => a.OptType == "修改交易" || a.OptType == "修改备注").AsQueryable(); if (req.OptDateStart != default) { query = query.Where(a => req.OptDateStart <= a.OptDate); } if (req.OptDateEnd != default) { var endDay = req.OptDateEnd.AddDays(1); query = query.Where(a => endDay > a.OptDate); } if (req.ClientIds != null && req.ClientIds.Count > 0) { query = from q in query join t in DbContext.trade on q.TradeId equals t.id where req.ClientIds.Any(a => a == t.ClientId) select q; } if (req.AssetIds != null && req.AssetIds.Count > 0) { query = from q in query join t in DbContext.trade on q.TradeId equals t.id where req.AssetIds.Any(a => a == t.AssetId) select q; } if (!string.IsNullOrEmpty(req.TradeNumber)) { query = from q in query join t in DbContext.trade on q.TradeId equals t.id where t.TradeNumber.Contains(req.TradeNumber) select q; } if (req.OptNames != null) { query = query.Where(a => req.OptNames.Any(b => b == a.OptName)); } query = from q in query join t in DbContext.trade on q.TradeId equals t.id where t.TradeNumber.IndexOf("XX") < 0 orderby q.OptDate descending select q; return query.ToSearchList(req); } public SearchListResult GetTradeInfoChangeRepListByIds(TradeChangeReq req) { var query = DbContext.TradeAuditLog.Where(a => req.Ids.Any(b => b == a.id)).OrderByDescending(b => b.OptDate).AsQueryable(); return query.ToSearchList(req); } public SearchListResult GetTradeInfoChangeRep(TradeChangeReq req) { SearchListResult searchListResult = new SearchListResult(); var TradeAuditLogList = new SearchListResult(); if (req.Ids == null || req.Ids.Count == 0) { TradeAuditLogList = GetTradeInfoChangeRepList(req); } else { TradeAuditLogList = GetTradeInfoChangeRepListByIds(req); } if (TradeAuditLogList.rows != null && TradeAuditLogList.rows.Count() > 0) { List tradeInfoChangeReps = new List(); foreach (var item in TradeAuditLogList.rows) { var trade = DbContext.trade.Where(a => a.id == item.TradeId).FirstOrDefault(); if (trade != null) { //旧值为空的改新值的过滤掉,暂时不考虑分页 var dataChanges = ReplaceDataChanges(trade, item.Changes); var tradeInfoChanges = new TradeInfoChangeRep { TradeId = item.TradeId, Changes = item.Changes, TradeNumber = trade.TradeNumber, TradeStatus = trade.TradeStatus, ClientName = trade.ClientName, UserAssetUnitName = trade.AssetBookName, DataInfo = dataChanges, OptName = item.OptName, OptDate = item.OptDate, OptType = "信息修改", id = item.id }; if (dataChanges != null) { tradeInfoChangeReps.Add(tradeInfoChanges); } } } searchListResult.rows = tradeInfoChangeReps; searchListResult.total = TradeAuditLogList.total; searchListResult.page = TradeAuditLogList.page; searchListResult.Sum = TradeAuditLogList.Sum; searchListResult.records = TradeAuditLogList.records; } return searchListResult; } public byte[] ExportTradeInfoChange(TradeChangeReq req) { SearchListResult searchListResult = GetTradeInfoChangeRep(req); foreach (var item in searchListResult.rows) { if (!string.IsNullOrEmpty(item.DataInfo)) { item.DataInfo = item.DataInfo.Substring(0, item.DataInfo.Length - 1).Replace(";", ";\r\n") + ";"; item.DataInfo = item.DataInfo.Replace("“ ”", "空"); } } var templateFile = OtcAppContext.MapPath("~/App_Docs/导出模板/变更记录模板_交易信息变更.xlsx"); return ExcelGenerator.UseTemplateGenerator(templateFile).AddVariable(new { list = searchListResult.rows }).GenerateBytes(); } #endregion #region 交易删除信息 /// /// 查询交易变更记录 /// /// /// public SearchListResult GetTradeInfoDeleteRepList(TradeChangeReq req) { var tempQuery = DbContext.TradeAuditLog.Where(a => a.OptType == "删除交易").AsQueryable(); if (req.Ids == null || req.Ids.Count == 0) { if (req.OptDateStart != default) { tempQuery = tempQuery.Where(a => req.OptDateStart <= a.OptDate); } if (req.OptDateEnd != default) { var endDay = req.OptDateEnd.AddDays(1); tempQuery = tempQuery.Where(a => endDay > a.OptDate); } if (req.ClientIds != null && req.ClientIds.Count > 0) { tempQuery = from q in tempQuery join t in DbContext.trade on q.TradeId equals t.id where req.ClientIds.Any(a => a == t.ClientId) select q; } if (req.AssetIds != null && req.AssetIds.Count > 0) { tempQuery = from q in tempQuery join t in DbContext.trade on q.TradeId equals t.id where req.AssetIds.Any(a => a == t.AssetId) select q; } if (!string.IsNullOrEmpty(req.TradeNumber)) { tempQuery = from q in tempQuery join t in DbContext.trade on q.TradeId equals t.id where t.TradeNumber.Contains(req.TradeNumber) select q; } if (req.OptNames != null) { tempQuery = tempQuery.Where(a => req.OptNames.Any(b => b == a.OptName)); } } else { tempQuery = DbContext.TradeAuditLog.Where(a => req.Ids.Any(b => b == a.id)); } var list = new List(); var query = from t in DbContext.trade join ta in tempQuery on t.id equals ta.TradeId orderby ta.OptDate descending select ta; var tempList = query.ToSearchList(req); foreach (var item in tempList.rows) { TradeChangeList info = new TradeChangeList(); var ta = DbContext.trade.Where(a => a.id == item.TradeId).FirstOrDefault(); ObjectHelper.MapValues(info, ta); if (ta != null) { info.OptType = item.OptType; info.OptId = item.OptId; info.OptName = item.OptName; info.OptDate = item.OptDate; info.TradeAuditId = (int)item.id; } list.Add(info); } return new SearchListResult(tempList, list); } public byte[] ExportTradeInfoDelete(TradeChangeReq req) { SearchListResult searchListResult = GetTradeInfoDeleteRepList(req); var templateFile = OtcAppContext.MapPath("~/App_Docs/导出模板/变更记录模板_交易删除.xlsx"); return ExcelGenerator.UseTemplateGenerator(templateFile).AddVariable(new { list = searchListResult.rows }).GenerateBytes(); } #endregion #region 资金信息删除 public byte[] ExportClientCashDelete(TradeChangeReq req) { SearchListResult searchListResult = GetClientCashDeleteSearch(req); var templateFile = OtcAppContext.MapPath("~/App_Docs/导出模板/变更记录模板_资金删除.xlsx"); return ExcelGenerator.UseTemplateGenerator(templateFile).AddVariable(new { list = searchListResult.rows }).GenerateBytes(); } public SearchListResult GetClientCashDeleteSearch(TradeChangeReq req) { var query = from source in DbContext.Clientcashincashout_remove join trade in DbContext.trade on source.TradeId equals trade.id into trades from trade in trades.DefaultIfEmpty() select new ClientCashInCashOutExtend { id = source.id, Direction = source.Direction, TradeNumber = trade == null ? "" : trade.TradeNumber, TradeType = trade == null ? "" : trade.TradeType, Number = source.Number, ClientId = source.ClientId, Money = source.Direction == "出金" ? -source.Money : source.Money, HappenDate = source.HappenDate, State = source.State, OptId = source.OptId, OptName = source.OptName, OptDate = source.OptDate, ValidState = source.ValidState, TradeId = source.TradeId, Action = source.Action, SerialNumber = source.SerialNumber, Comments = source.Comments, ClientNumber = source.ClientNumber }; if (req.Ids == null || req.Ids.Count == 0) { if (req.OptDateStart != default) { query = query.Where(a => req.OptDateStart <= a.OptDate); } if (req.OptDateEnd != default) { var endDay = req.OptDateEnd.AddDays(1); query = query.Where(a => endDay > a.OptDate); } if (req.ClientIds != null && req.ClientIds.Count > 0) { query = query.Where(a => req.ClientIds.Contains(a.ClientId ?? 0)); } if (!string.IsNullOrEmpty(req.ClientNumber)) { query = query.Where(a => a.ClientNumber.Contains(req.ClientNumber)); } if (req.OptNames != null) { query = query.Where(a => req.OptNames.Contains(a.OptName)); } if (req.HappenDateStart != default) { query = query.Where(a => req.HappenDateStart <= a.HappenDate); } if (req.HappenDateEnd != default) { var endDay = req.HappenDateEnd.AddDays(1); query = query.Where(a => endDay > a.HappenDate); } if (!string.IsNullOrEmpty(req.Number)) { query = query.Where(a => a.Number.Contains(req.Number)); } if (!string.IsNullOrEmpty(req.TradeNumber)) { query = query.Where(a => a.TradeNumber.Contains(req.TradeNumber)); } #region 根据方向类型查询处理,结合Direction,TradeAction,InOut处理 //a.Direction != "应收"代表根据direction来做逻辑判断 if (!string.IsNullOrEmpty(req.DirectionTypes)) { if (req.DirectionTypeList.Contains("收入") && !req.DirectionTypeList.Contains("支出")) { query = query.Where(a => a.Money > 0); } else if (req.DirectionTypeList.Contains("支出") && !req.DirectionTypeList.Contains("收入")) { query = query.Where(a => a.Money < 0); } } #endregion } else { query = query.Where(a => req.Ids.Contains(a.id)); } if (string.IsNullOrEmpty(req.sidx)) { req.sidx = "OptDate,id"; req.sord = "desc"; } else if (req.sidx == "DirectionType") { req.sidx = "Direction"; } var retListResult = query.ToSearchList(req); foreach (var item in retListResult.rows) { if (item.ClientId > 0) { item.ClientName = DataCacheProvider.GetClientDataSource().GetData(item.ClientId.Value)?.Name; } } return retListResult; } #endregion #region 资金信息变更 private SearchListResult GetClientCashChangeRepList(TradeChangeReq req) { var query = from log in DbContext.clientcash_log.Where(a => a.OptType.Contains("修改")) join cash in DbContext.ClientCashInCashOut on log.CashId equals cash.id join trade in DbContext.trade on cash.TradeId equals trade.id into trade from td in trade.DefaultIfEmpty() where cash.ValidState != ConsGlobal.InValid select new ClientCashChangeList { id = log.id, OptType = log.OptType, OptName = log.OptName, OptDate = log.OptDate, Changes = log.Changes, Explain = log.Explain, HappenDateReal = cash.HappenDate, Number = cash.Number, ClientId = cash.ClientId, ClientName = cash.ClientName, ClientNumber = cash.ClientNumber, Direction = cash.Direction, Money = cash.Money.ToString(), MoneyReal = cash.Money, CurrencyCode = cash.CurrencyCode, TradeNumber = td == null ? "" : td.TradeNumber, Comments = cash.Comments, AssetId = td == null ? 0 : td.AssetId, TradeId = td == null ? 0 : td.id, Action = cash.Action, CashState = cash.State }; if (req.Ids == null || req.Ids.Count == 0) { if (req.OptDateStart != default) { query = query.Where(a => req.OptDateStart <= a.OptDate); } if (req.OptDateEnd != default) { var endDay = req.OptDateEnd.AddDays(1); query = query.Where(a => endDay > a.OptDate); } if (req.ClientIds != null && req.ClientIds.Count > 0) { query = query.Where(a => req.ClientIds.Contains(a.ClientId ?? 0)); } if (!string.IsNullOrEmpty(req.ClientNumber)) { query = query.Where(a => a.ClientNumber.Contains(req.ClientNumber)); } if (req.AssetIds != null && req.AssetIds.Count > 0) { query = query.Where(a => req.AssetIds.Contains(a.AssetId)); } if (req.OptNames != null) { query = query.Where(a => req.OptNames.Contains(a.OptName)); } if (req.HappenDateStart != default) { query = query.Where(a => req.HappenDateStart <= a.HappenDateReal); } if (req.HappenDateEnd != default) { var endDay = req.HappenDateEnd.AddDays(1); query = query.Where(a => endDay > a.HappenDateReal); } if (!string.IsNullOrEmpty(req.Number)) { query = query.Where(a => a.Number.Contains(req.Number)); } if (!string.IsNullOrEmpty(req.TradeNumber)) { query = query.Where(a => a.TradeNumber.Contains(req.TradeNumber)); } #region 根据方向类型查询处理,结合Direction,TradeAction,InOut处理 //Direction和TradeAction是或的关系 //Direction和InOut是或的关系 //TradeAction和InOut是与的关系(InTradeAction若有值和In为一组,判断为收取;OutTradeAction若有值和Out为一组,判断为支付) if (!string.IsNullOrEmpty(req.Direction) && !string.IsNullOrEmpty(req.TradeAction)) { query = query.Where(a => a.Direction != null && req.Directions.Contains(a.Direction) || a.Action != null && req.TradeActionList.Contains(a.Action)); } else { if (!string.IsNullOrEmpty(req.Direction)) { query = query.Where(a => a.Direction != null && req.Directions.Contains(a.Direction)); } if (!string.IsNullOrEmpty(req.TradeAction)) { query = query.Where(a => a.Action != null && req.TradeActionList.Contains(a.Action)); } } //a.Direction != "应收"代表根据direction来做逻辑判断 if (!string.IsNullOrEmpty(req.InOut)) { if (req.InOut.Contains("应收") && !req.InOut.Contains("应付")) { query = query.Where(a => a.MoneyReal > 0 || a.Direction != "应收"); } else if (!req.InOut.Contains("应收") && req.InOut.Contains("应付")) { query = query.Where(a => a.MoneyReal < 0 || a.Direction != "应收"); } //当同时有应收和应付字段的时候,需要判断应收有哪些action,应付有哪些action else if (req.InOut.Contains("应收") && req.InOut.Contains("应付") && !string.IsNullOrEmpty(req.InTradeAction) && !string.IsNullOrEmpty(req.OutTradeAction)) { query = query.Where(a => a.MoneyReal < 0 && req.OutTradeAction.Contains(a.Action) || a.MoneyReal > 0 && req.InTradeAction.Contains(a.Action) || a.Direction != "应收"); } } #endregion } else { query = query.Where(a => req.Ids.Contains(a.id)); } if (string.IsNullOrEmpty(req.sidx)) { req.sidx = "OptDate,id"; req.sord = "desc"; } else if (req.sidx == "DirectionType") { req.sidx = "Direction"; } else if (req.sidx == "HappenDate") { req.sidx = "HappenDateReal"; } return query.ToSearchList(req); } public SearchListResult GetClientCashChangeRep(TradeChangeReq req) { if (!string.IsNullOrWhiteSpace(req.DirectionTypes)) { UpdateTradeChangeReq(req); } var searchListResult = GetClientCashChangeRepList(req); var removeListId = new List(); if (searchListResult.rows != null && searchListResult.rows.Count() > 0) { foreach (var item in searchListResult.rows) { item.HappenDate = (item.HappenDateReal ?? DateTime.MinValue).ToString("yyyy-MM-dd hh:mm:ss"); item.DirectionType = GetDirection(item.Direction, item.Action, item.MoneyReal ?? 0); item.EncryptTradeId = item.TradeId > 0 ? DataProtect.Encrypt(item.TradeId.ToString()) : ""; item.DataInfo = ReplaceDataChanges(item, item.Changes); if (string.IsNullOrEmpty(item.DataInfo)) { removeListId.Add(item.id); } else { var cash_update = DbContext.clientcashincashout_update.FirstOrDefault(n => n.ClientcashincashoutId == item.CashId && n.ValidState != "InValid"); if (cash_update != null) { item.CashState = cash_update.State; } } } if (removeListId.Count > 0) { searchListResult.rows = searchListResult.rows.Where(n => !removeListId.Contains(n.id)); } } return searchListResult; } public void CoverDataChanges(ClientCashChangeList obj, string dataChanges) { if (!(string.IsNullOrEmpty(dataChanges) || dataChanges.Equals("[]") || dataChanges.LastIndexOf("]") == -1 || dataChanges.StartsWith("[") && !dataChanges.EndsWith("]"))) { string ARROW = "->"; object[] dataChangeArr = JsonHelper.Deserialize(dataChanges); if (dataChangeArr.Length > 0) { string oldDirection = null; double? oldMoney = null; foreach (object objArr in dataChangeArr) { string[] objStrArr = JsonHelper.Deserialize(objArr.ToJson()); string dataStr = string.Empty; if (!string.IsNullOrEmpty(objStrArr[0])) { dataStr = objStrArr[0]; } dataStr = dataStr?.Trim(); if (objStrArr.Length == 4) { switch (dataStr) { case "HappenDate": obj.HappenDate = $"{objStrArr[2]}{ARROW}{objStrArr[3]}"; break; case "Direction": oldDirection = (string)objStrArr[2].Replace("\"", ""); break; case "Money": if (double.TryParse((string)objStrArr[2], out double value)) { oldMoney = value; } obj.Money = $"{objStrArr[2]}{ARROW}{objStrArr[3]}"; break; case "Comments": obj.Comments = $"{objStrArr[2]}{ARROW}{objStrArr[3]}"; break; } } } var DirectionType = GetDirection(oldDirection ?? obj.Direction, obj.Action, oldMoney ?? obj.MoneyReal ?? 0); if (DirectionType != obj.DirectionType) { obj.DirectionType = $"{DirectionType}{ARROW}{obj.DirectionType}"; } } } } public string GetDirection(string Direction, string Action, double money) { string ret = ""; if (Direction == "出金" || Direction == "入金") { ret += Direction; } else if (Direction == "其他收入" || Direction == "其他支出") { ret += "其他"; } else if (Action == "系统操作-期权费") { ret += "权利金"; } else if ((Action == "系统操作-平仓费" || Action == "系统操作-行权费")) { ret += "平仓/行权"; } else if (Action == "系统操作-票息") { ret += "票息"; } else if (Action == "系统操作-互换") { ret += "互换"; } if (Direction == "出金" || Direction == "入金") { ret += ""; } else if (money > 0) { ret += "收入"; } else { ret += "支出"; } return ret; } public byte[] ExportClientCashChange(TradeChangeReq req) { SearchListResult searchListResult = GetClientCashChangeRep(req); var templateFile = OtcAppContext.MapPath("~/App_Docs/导出模板/变更记录模板_资金修改.xlsx"); return ExcelGenerator.UseTemplateGenerator(templateFile).AddVariable(new { list = searchListResult.rows }).GenerateBytes(); } #endregion /// /// 页面交易方向查询条件更新 /// /// public void UpdateTradeChangeReq(TradeChangeReq req) { var directionList = new List(); var tradeActionList = new List(); var inTradeActionList = new List(); var outTradeActionList = new List(); var inOutList = new List(); void addWhenNotContains(List list, string str) { if (!list.Contains(str)) { list.Add(str); } } if (req.DirectionTypeList.Contains("出金")) { addWhenNotContains(directionList, "出金"); } if (req.DirectionTypeList.Contains("入金")) { addWhenNotContains(directionList, "入金"); } if (req.DirectionTypeList.Contains("其他收入")) { addWhenNotContains(directionList, "其他收入"); } if (req.DirectionTypeList.Contains("其他支出")) { addWhenNotContains(directionList, "其他支出"); } if (req.DirectionTypeList.Contains("权利金支出")) { addWhenNotContains(tradeActionList, ClientCashInCashOut.系统操作_期权费); addWhenNotContains(inOutList, "应付"); addWhenNotContains(outTradeActionList, ClientCashInCashOut.系统操作_期权费); } if (req.DirectionTypeList.Contains("权利金收入")) { addWhenNotContains(tradeActionList, ClientCashInCashOut.系统操作_期权费); addWhenNotContains(inOutList, "应收"); addWhenNotContains(inTradeActionList, ClientCashInCashOut.系统操作_期权费); } if (req.DirectionTypeList.Contains("平仓/行权收入")) { addWhenNotContains(tradeActionList, ClientCashInCashOut.系统操作_平仓费); addWhenNotContains(tradeActionList, ClientCashInCashOut.系统操作_行权费); addWhenNotContains(inOutList, "应收"); addWhenNotContains(inTradeActionList, ClientCashInCashOut.系统操作_平仓费); addWhenNotContains(inTradeActionList, ClientCashInCashOut.系统操作_行权费); } if (req.DirectionTypeList.Contains("平仓/行权支出")) { addWhenNotContains(tradeActionList, ClientCashInCashOut.系统操作_平仓费); addWhenNotContains(tradeActionList, ClientCashInCashOut.系统操作_行权费); addWhenNotContains(inOutList, "应付"); addWhenNotContains(outTradeActionList, ClientCashInCashOut.系统操作_平仓费); addWhenNotContains(outTradeActionList, ClientCashInCashOut.系统操作_行权费); } if (req.DirectionTypeList.Contains("票息收入")) { addWhenNotContains(tradeActionList, ClientCashInCashOut.系统操作_票息); addWhenNotContains(inOutList, "应收"); addWhenNotContains(inTradeActionList, ClientCashInCashOut.系统操作_票息); } if (req.DirectionTypeList.Contains("票息支出")) { addWhenNotContains(tradeActionList, ClientCashInCashOut.系统操作_票息); addWhenNotContains(inOutList, "应付"); addWhenNotContains(outTradeActionList, ClientCashInCashOut.系统操作_票息); } if (req.DirectionTypeList.Contains("互换收入")) { addWhenNotContains(tradeActionList, ClientCashInCashOut.系统操作_互换); addWhenNotContains(inOutList, "应收"); addWhenNotContains(inTradeActionList, ClientCashInCashOut.系统操作_互换); } if (req.DirectionTypeList.Contains("互换支出")) { addWhenNotContains(tradeActionList, ClientCashInCashOut.系统操作_互换); addWhenNotContains(inOutList, "应付"); addWhenNotContains(outTradeActionList, ClientCashInCashOut.系统操作_互换); } req.Direction = string.Join(",", directionList); req.TradeAction = string.Join(",", tradeActionList); req.InTradeAction = string.Join(",", inTradeActionList); req.OutTradeAction = string.Join(",", outTradeActionList); req.InOut = string.Join(",", inOutList); } public string ReplaceDataChanges(object obj, string dataChanges) { var filesNameList = new List { "TraderId", "AssetId" }; if (string.IsNullOrEmpty(dataChanges) || dataChanges.Equals("[]") || dataChanges.LastIndexOf("]") == -1 || dataChanges.StartsWith("[") && !dataChanges.EndsWith("]")) { return null; } else { if (dataChanges.Contains("],")) { object[] dataChangeArr = JsonHelper.Deserialize(dataChanges); if (dataChangeArr.Length > 0) { string dataInfo = string.Empty; foreach (object objArr in dataChangeArr) { string[] objStrArr = JsonHelper.Deserialize(objArr.ToJson()); if (!filesNameList.Contains(objStrArr[0])) { if (objStrArr[1].Contains("补偿支付") || objStrArr[1].Contains("补偿方式")) { objStrArr[2] = GetFormatValue("补偿支付", objStrArr[2]); objStrArr[3] = GetFormatValue("补偿支付", objStrArr[3]); } else { objStrArr[2] = GetFormatValue(objStrArr[1], objStrArr[2]); objStrArr[3] = GetFormatValue(objStrArr[1], objStrArr[3]); } dataInfo += SplicingDataChange(objStrArr, obj); } } return dataInfo; } } else { if (dataChanges.Contains("\r\n")) { string[] dataChangeArr = dataChanges.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); if (dataChangeArr.Length > 0) { string dataInfo = string.Empty; foreach (string item in dataChangeArr) { object[] objStrArr = JsonHelper.Deserialize(item); if (objStrArr[2] != null && objStrArr[2].ToString() != "\"\"" && objStrArr[2].ToString() != "“ ”" && filesNameList.Contains(objStrArr[0].ToString())) { objStrArr[2] = GetFormatValue(objStrArr[1].ToString(), objStrArr[2].ToString()); if (objStrArr[3] != null) { objStrArr[3] = GetFormatValue(objStrArr[1].ToString(), objStrArr[3].ToString()); } var stringArr = objStrArr.Select(a => a == null ? "" : a.ToString()).ToArray(); dataInfo += SplicingDataChange(stringArr, obj); } } return dataInfo; } } else { string[] dataChangeArr = null; if (dataChanges.StartsWith("[") && dataChanges.EndsWith("]") && !dataChanges.StartsWith("[[")) { dataChangeArr = JsonHelper.Deserialize(dataChanges); } else { dataChangeArr = JsonHelper.Deserialize(dataChanges.Substring(1, dataChanges.Length - 2)); } if (dataChangeArr != null && dataChangeArr.Length > 0/** && !string.IsNullOrEmpty(dataChangeArr[2]) && dataChangeArr[2] != "\"\"" && dataChangeArr[2] != "“ ”" **/&& !filesNameList.Contains(dataChangeArr[0])) { dataChangeArr[2] = GetFormatValue(dataChangeArr[1], dataChangeArr[2]); if (dataChangeArr[3] != null) { dataChangeArr[3] = GetFormatValue(dataChangeArr[1], dataChangeArr[3]); } return SplicingDataChange(dataChangeArr, obj); } } } return null; } } /// /// 根据类属性名称获取 DisplayName /// /// /// /// public string ContainProperty(object instance, string propertyName) { if (instance != null && !string.IsNullOrEmpty(propertyName)) { PropertyInfo _findedPropertyInfo = instance.GetType().GetProperty(propertyName); if (_findedPropertyInfo != null) if (_findedPropertyInfo.GetCustomAttribute() != null) return _findedPropertyInfo.GetCustomAttribute().DisplayName; } return null; } /// /// 拼接字符串 (客户编号:01->02) /// /// /// /// public string SplicingDataChange(string[] dataChangeArr, object obj) { string ARROW = "->"; string empty = "“ ”"; string dataInfo = string.Empty; string dataStr = string.Empty; if (!string.IsNullOrEmpty(dataChangeArr[1])) { dataStr = dataChangeArr[1]; } else if (!string.IsNullOrEmpty(dataChangeArr[0])) { dataStr = ContainProperty(obj, dataChangeArr[0]); if (string.IsNullOrEmpty(dataStr)) { dataStr = dataChangeArr[0]; } } else { return string.Empty; } dataStr = dataStr?.Trim(); if (dataStr == "SalesCommission" || dataStr == "提成信息") { return string.Empty; } if (dataStr.IndexOf("ExtendInfo") >= 0) { var extendInfoArr = string.IsNullOrEmpty(dataChangeArr[2]) ? null : (dataChangeArr[2].StartsWith("[") ? JsonHelper.Deserialize(dataChangeArr[2]) : JsonHelper.Deserialize(JsonHelper.Deserialize(dataChangeArr[2])) ); var extendInfoArr1 = string.IsNullOrEmpty(dataChangeArr[3]) ? null : (dataChangeArr[3].StartsWith("[") ? JsonHelper.Deserialize(dataChangeArr[3]) : JsonHelper.Deserialize(JsonHelper.Deserialize(dataChangeArr[3])) ); string itemStr1 = string.Empty; if (extendInfoArr != null) { foreach (var item in extendInfoArr) { Dictionary itemDics = JsonHelper.Deserialize>(item.ToJson()); var secondValue = ""; foreach (var item2 in extendInfoArr1) { Dictionary itemDics2 = JsonHelper.Deserialize>(item2.ToJson()); if (itemDics2["name"] == itemDics["name"]) { secondValue = itemDics2["value"]; break; } } itemStr1 += $"{itemDics["name"]}:{itemDics["value"]}{ARROW}{secondValue};"; } if (itemStr1.Length > 0) { itemStr1 = itemStr1.Substring(0, itemStr1.Length - 1); } return itemStr1; } } if (dataStr.IndexOf(".") > 0) { dataStr = dataStr.Split('.')[1]; if (Regex.Match(dataStr, @"^[A-Za-z]+$").Success) { return string.Empty; } } if (!string.IsNullOrEmpty(dataStr)) { if (dataChangeArr.Length > 2) { var firstValue = dataChangeArr[2] == "true" ? "是" : (dataChangeArr[2] == "false" ? "否" : dataChangeArr[2]); var secondValue = dataChangeArr[3] == "true" ? "是" : (dataChangeArr[3] == "false" ? "否" : dataChangeArr[3]); if (dataChangeArr[1] == "成交方式") { if (firstValue == "是") { firstValue = "名义本金"; } else { firstValue = "成交数量"; } if (secondValue == "是") { secondValue = "名义本金"; } else { secondValue = "成交数量"; } } if (!string.IsNullOrEmpty(firstValue) && !string.IsNullOrEmpty(secondValue)) { if (firstValue.Contains("YLErp") || secondValue.Contains("YLErp")) { return string.Empty; } dataInfo += $"{dataStr}:{firstValue}{ARROW}{secondValue};"; } else if (!string.IsNullOrEmpty(firstValue) && string.IsNullOrEmpty(secondValue)) { if (firstValue.Contains("YLErp")) { return string.Empty; } dataInfo += $"{dataStr}:{firstValue}{ARROW}{empty};"; } else if (string.IsNullOrEmpty(firstValue) && !string.IsNullOrEmpty(secondValue)) { if (secondValue.Contains("YLErp")) { return string.Empty; } dataInfo += $"{dataStr}:{empty}{ARROW}{secondValue};"; } } else { if (!string.IsNullOrEmpty(dataChangeArr[1])) { dataInfo += $"{dataStr}:{dataChangeArr[1]};"; } else { dataInfo += $"{dataStr}:{empty};"; } } } return dataInfo; } /// /// 格式化值 /// /// /// public string GetFormatValue(string filesName, string value) { var returnValue = value; double fomartDoubleValue; if (!string.IsNullOrEmpty(filesName)) { switch (filesName) { case "敲入敲出状态": switch (value) { case "KnockedIn": returnValue = "敲入"; break; case "KnockedOut": returnValue = "敲出"; break; } break; case "追保方向": switch (value) { case "0": returnValue = "单向追保"; break; case "1": returnValue = "双向追保"; break; case "2": returnValue = "对手方单向追保"; break; case "3": returnValue = "其他"; break; }; break; case "业务类型": switch (value) { case "OP": returnValue = "期权业务"; break; case "SW": returnValue = "掉期业务"; break; }; break; case "机构类型": switch (value) { case "F": returnValue = "金融机构"; break; case "P": returnValue = "产品"; break; case "C": returnValue = "一般法人"; break; }; break; case "业务部门编号": switch (value) { case "O": returnValue = "做市交易部"; break; case "S": returnValue = "衍生品发展部"; break; case "C": returnValue = "协同销售部"; break; }; break; case "期权费率": case "单笔保底收益": double.TryParse(value, out fomartDoubleValue); returnValue = fomartDoubleValue.OtcFormat(OtcFormatFlag.umprice); break; case "中央对手方清算": case "是否中央对手方清算": switch (value) { case "N": case "\"N\"": returnValue = "否"; break; case "I": case "\"I\"": returnValue = "计划中央对手方清算"; break; case "Y": case "\"Y\"": returnValue = "是"; break; }; break; case "补偿支付": switch (value) { case "AtHit": case "\"AtHit\"": returnValue = "立即"; break; case "AtEnd": case "\"AtEnd\"": returnValue = "递延"; break; }; break; case "敲入观察周期": var valueArr = value.Split("|"); if (valueArr[0] != null) { returnValue = "每" + valueArr[0].Replace("D", "日").Replace("W", "周").Replace("M", "月").Replace("Y", "年"); } break; case "行权方式": case "ExerciseMode": switch (value) { case "American": case "\"American\"": returnValue = "美式"; break; case "European": case "\"European\"": returnValue = "欧式"; break; } break; case "客户等级": switch (value) { case "1": returnValue = "重点"; break; case "2": returnValue = "主要"; break; case "3": returnValue = "一般"; break; case "4": returnValue = "不重要"; break; case "5": returnValue = "S级"; break; } break; case "证件有效期": case "IdCardEffectiveDateStr": switch (value) { case "30001231": case "\"30001231\"": returnValue = "长期有效"; break; } break; } } return returnValue; } } }