今天被组长训了,因为这个坏味道,封装啊!!!
public static List<LeKeCardInfo> QueryStoreChange(LeKeQueryReq PayREQ)
{
//存储最终的数据
List<LeKeCardInfo> resultList = new List<LeKeCardInfo>();
List<LeKeCardInfo> resultNull = new List<LeKeCardInfo>();
List<D.Consume> consumelist = new List<Consume>();
var where = new Where<D.LeaguerEvent>();
var where1 = new Where<D.Consume>();
var where2 = new Where<D.ExperienceRecord>();
var where3 = new Where<D.TemporaryEvent>();
where.And(a => a.Createdatetime >= PayREQ.StartTime && a.Createdatetime <= PayREQ.EndTime && a.Event != (int)OperateEvent.RemakeCard && a.Event != (int)OperateEvent.ChangeCard);
where1.And(a => a.Createdatetime >= PayREQ.StartTime && a.Createdatetime <= PayREQ.EndTime && a.IsSuccess == 1);
where3.And(a => a.Createdatetime >= PayREQ.StartTime && a.Createdatetime <= PayREQ.EndTime && a.Event != (int)OperateEvent.RemakeCard && a.Event != (int)OperateEvent.ChangeCard);
//终端ID不为空
if (PayREQ.TerminalId > 0)
{
string terminalname = DbCard.GetTerminalName(PayREQ.TerminalId);
where2.And(a => a.LeaguerID == terminalname);
where.And(a => a.TerminalId == PayREQ.TerminalId);
where.And(a => a.TerminalId == PayREQ.TerminalId);
}
//操作员不为空
if (PayREQ.OperatorId > 0)
where.And(a => a.Operator == PayREQ.OperatorId);
else
{
where2.And(a => a.EndTime >= PayREQ.StartTime && a.EndTime <= PayREQ.EndTime);
if (!string.IsNullOrEmpty(PayREQ.CardNum))
where2.And(a => a.LeaguerID == PayREQ.CardNum);
//找出体验表中符合条件的数据
List<D.ExperienceRecord> ExList = MySql.From<D.ExperienceRecord>().Where(where2).ToList();
var conslist = MySql.From<D.Consume>().Where(where1).ToList();
foreach (var e in ExList)
{//找出消费表中体验id为ExList中的数据
var consume = conslist.Find(a => a.ExperienceId == e.Id);
if (consume != null)
consumelist.Add(consume);
}
//级别和名称作为筛选条件,应对异常条件筛选 - 2016年9月27日22:34:19
if (PayREQ.LeaguerLevelId > 0)
{
var test = MySql.From<D.LeaguerEvent>().Where(b => b.LeaguerLevelId == PayREQ.LeaguerLevelId).ToList();
if (test == null || test.Count == 0)
{
return resultNull;
}
}
}
var leaguereventlist = MySql.From<D.LeaguerEvent>().Where(where).ToList();
var temporaryEventList = MySql.From<D.TemporaryEvent>().Where(where3).ToList();
//卡号不为空
if (!string.IsNullOrEmpty(PayREQ.CardNum))
{
//验证卡号异常输入 - 2016年9月27日22:36:04
var test = MySql.From<D.Card>().Where(a => a.CardNo == PayREQ.CardNum).ToList();
if (test == null || test.Count == 0)
{
return resultNull;
}
var card = DbCard.GetCardInfo(PayREQ.CardNum);
if (card == null)
return resultNull;
List<int> id = new List<int>();
if (card.Type == (int)CardType.LeaguerCard)
{
temporaryEventList.Clear();
var leag = MySql.From<D.LeaguerCard>().Where(a => a.CardId == card.Id).ToList();
if (leag == null || leag.Count == 0)
return resultNull;
var leaguerId = from fn in leag
select fn.Id;
id = leaguerId.ToList();
var leaguerEventSelect = leaguereventlist.Where(p => id.Contains(p.LeaguerId)).ToList();
leaguereventlist.Clear();
leaguereventlist = leaguerEventSelect;
}
if (card.Type == (int)CardType.TemporaryCard)
{
leaguereventlist.Clear();
var temp = MySql.From<D.TemporaryCard>().Where(a => a.CardId == card.Id).ToList();
if (temp == null || temp.Count == 0)
return resultNull;
var tempId = from fn in temp
select fn.Id;
id = tempId.ToList();
var tempEventSelect = temporaryEventList.Where(p => id.Contains(p.TemporaryCardId)).ToList();
temporaryEventList.Clear();
temporaryEventList = tempEventSelect;
}
//还有 consumelist
var consumelistSelect = consumelist.Where(p => id.Contains(p.ChildCardId)).ToList();
consumelist.Clear();
consumelist = consumelistSelect;
}
if (!string.IsNullOrEmpty(PayREQ.LeaguerName))
{
temporaryEventList.Clear();
var leag = MySql.From<D.LeaguerCard>().Where(a => a.UserName == PayREQ.LeaguerName).ToList();
if (leag == null || leag.Count == 0)
return resultNull;
var leaguerId = from fn in leag
select fn.Id;
List<int> id = leaguerId.ToList();
var leaguerEventSelect = leaguereventlist.Where(p => id.Contains(p.LeaguerId)).ToList();
leaguereventlist.Clear();
leaguereventlist = leaguerEventSelect;
//还有 consumelist
var consumelistSelect = consumelist.Where(p => id.Contains(p.ChildCardId)).ToList();
consumelist.Clear();
consumelist = consumelistSelect;
}
if (!string.IsNullOrEmpty(PayREQ.MenuName))
{
temporaryEventList.Clear();
var menu = MySql.From<D.Menu>().Where(a => a.Name == PayREQ.MenuName).ToList();
if (menu == null || menu.Count == 0)
return resultNull;
var menuId = from fn in menu
select fn.Id;
var leaguerEventSelect = leaguereventlist.Where(p => menuId.Contains(p.MenuId)).ToList();
leaguereventlist.Clear();
leaguereventlist = leaguerEventSelect;
}
if (PayREQ.LeaguerLevelId > 0)
{
temporaryEventList.Clear();
var leaguerEventSelect = leaguereventlist.Where(a => a.LeaguerLevelId == PayREQ.LeaguerLevelId).ToList();
leaguereventlist.Clear();
leaguereventlist = leaguerEventSelect;
//找出通过卡号、会员名称限制的开卡记录
var consumelistSelect = consumelist.Where(p => p.LeaguerLevelId == PayREQ.LeaguerLevelId).ToList();
consumelist.Clear();
consumelist = consumelistSelect;
}
foreach (var item in leaguereventlist)
{
LeKeCardInfo resultLeaguer = new LeKeCardInfo();
if ((OperateEvent)item.Event == OperateEvent.CancelCard)
{
resultLeaguer = resultList.Find(a => a.LeaguerId == item.LeaguerId && a.opevent == OperateEvent.CancelCard);
if (resultList.Count > 0 && resultLeaguer !=null)
{
resultLeaguer.NowBalance = 0;
resultLeaguer.PreBalance += item.Point;
resultLeaguer.Balance += item.Point;
continue;
}
else
resultLeaguer = new LeKeCardInfo();
resultLeaguer.NowBalance = 0;
}
else
resultLeaguer.NowBalance = item.PreBalance + item.Point;
resultLeaguer.opevent = (OperateEvent)item.Event;
resultLeaguer.LeaguerId = item.LeaguerId;
resultLeaguer.CardNo = DbLeaguer.GetCardNo(item.LeaguerId);
resultLeaguer.OperateTime = item.Createdatetime;
resultLeaguer.cardType = (int)CardType.LeaguerCard;
resultLeaguer.cardTypeName = EnumHelper.GetDescription(CardType.LeaguerCard);
var LeaguerInfo = DbLeaguer.GetLeaguerInfoById(item.LeaguerId);
if (LeaguerInfo == null)
continue;
resultLeaguer.UserName = LeaguerInfo.UserName;
resultLeaguer.Tel = LeaguerInfo.Tel;
resultLeaguer.LeaguerLevel = DbLeaguerLevel.GetLeaguerLevelName(item.LeaguerLevelId);
resultLeaguer.Remark = EnumHelper.GetDescription((OperateEvent)item.Event);
resultLeaguer.PreBalance = item.PreBalance;
resultLeaguer.Balance = item.Point;
resultLeaguer.OperatorName = DbUserInfo.GetOperatorName(item.Operator);
resultLeaguer.TerminalName = DbCard.GetTerminalName(item.TerminalId);
resultList.Add(resultLeaguer);
}
foreach (var item in consumelist)
{
LeKeCardInfo resultLeaguer = new LeKeCardInfo();
resultLeaguer.OperateTime = item.Createdatetime;
resultLeaguer.cardType = (CardType)item.Cardtype;
resultLeaguer.cardTypeName = EnumHelper.GetDescription(resultLeaguer.cardType);
string userName = "-";
string tel = "-";
string leaguerLevel = "-";
if (resultLeaguer.cardType == CardType.LeaguerCard)
{
var LeaguerInfo = DbLeaguer.GetLeaguerInfoById(item.ChildCardId);
if (LeaguerInfo == null)
continue;
userName = LeaguerInfo.UserName;
tel = LeaguerInfo.Tel;
if (PayREQ.LeaguerLevelId > 0)
leaguerLevel = DbLeaguerLevel.GetLeaguerLevelName(PayREQ.LeaguerLevelId);
else
leaguerLevel = DbLeaguerLevel.GetLevelNameByLeaguerId(item.ChildCardId);
}
resultLeaguer.CardNo = DbCard.GetCardNoByChildId(item.ChildCardId, resultLeaguer.cardType);
resultLeaguer.UserName = userName;
resultLeaguer.Tel = tel;
resultLeaguer.LeaguerLevel = leaguerLevel;
resultLeaguer.Remark = "消费";
resultLeaguer.PreBalance = item.PreBalance;
resultLeaguer.Balance = item.ConsumePoint;
resultLeaguer.NowBalance = resultLeaguer.PreBalance - item.ConsumePoint;
//resultLeaguer.OperatorName = DbUserInfo.GetOperatorName(item.Operator); 消费没有操作人
resultLeaguer.TerminalName = DbTerminal.GetLTerminalItemByExperienceId(item.ExperienceId);
//消费的姓名、手机号、会员级别
if (item.Cardtype == (int)CardType.LeaguerCard)
{
var leaguer = DbLeaguer.GetLeaguerInfoById(item.ChildCardId);
resultLeaguer.UserName = leaguer.UserName;
resultLeaguer.Tel = leaguer.Tel;
//resultLeaguer.LeaguerLevel = DbLeaguerLevel.GetLevelNameByLeaguerId(item.ChildCardId);
if (PayREQ.LeaguerLevelId > 0)
leaguerLevel = DbLeaguerLevel.GetLeaguerLevelName(PayREQ.LeaguerLevelId);
else
leaguerLevel = DbLeaguerLevel.GetLevelNameByLeaguerId(item.ChildCardId);
}
resultList.Add(resultLeaguer);
}
if (temporaryEventList != null && temporaryEventList.Count > 0)
{
foreach (var item in temporaryEventList)
{
LeKeCardInfo resultTemp = new LeKeCardInfo();
resultTemp.PreBalance = item.PreBalance;
resultTemp.Balance = item.Point;
if ((OperateEvent)item.Event == OperateEvent.CancelCard)
{
resultTemp.NowBalance = 0;
resultTemp.PreBalance = item.Point;
resultTemp.Balance = item.Point;
}
else
resultTemp.NowBalance = item.PreBalance + item.Point;
resultTemp.UserName = "-";
resultTemp.Tel = "-";
resultTemp.LeaguerLevel = "-";
resultTemp.opevent = (OperateEvent)item.Event;
resultTemp.CardNo = DbTemporaryCard.GetCardNo(item.TemporaryCardId);
resultTemp.OperateTime = item.Createdatetime;
resultTemp.cardType = CardType.TemporaryCard;
resultTemp.cardTypeName = EnumHelper.GetDescription(CardType.TemporaryCard);
resultTemp.Remark = EnumHelper.GetDescription((OperateEvent)item.Event);
resultTemp.OperatorName = DbUserInfo.GetOperatorName(item.Operator);
resultTemp.TerminalName = DbCard.GetTerminalName(item.TerminalId);
resultList.Add(resultTemp);
}
}
return resultList;
}
引以为戒吧……
***************************************************************************************************************************************************************************************
昨天晚上抽了点时间,对这个玩意重构了一下:
Part 1:
#region 定义变量以及where
//存储最终的数据
List<LeKeCardInfo> resultList = new List<LeKeCardInfo>();
List<LeKeCardInfo> resultNull = new List<LeKeCardInfo>();
List<D.Consume> consumeList = new List<Consume>();
var where = new Where<D.LeaguerEvent>();
var where1 = new Where<D.Consume>();
var where2 = new Where<D.ExperienceRecord>();
var where3 = new Where<D.TemporaryEvent>();
where.And(a => a.Createdatetime >= PayREQ.StartTime && a.Createdatetime <= PayREQ.EndTime && a.Event != (int)OperateEvent.RemakeCard && a.Event != (int)OperateEvent.ChangeCard);
where1.And(a => a.Createdatetime >= PayREQ.StartTime && a.Createdatetime <= PayREQ.EndTime && a.IsSuccess == 1);
where2.And(a => a.EndTime >= PayREQ.StartTime && a.EndTime <= PayREQ.EndTime);
where3.And(a => a.Createdatetime >= PayREQ.StartTime && a.Createdatetime <= PayREQ.EndTime && a.Event != (int)OperateEvent.RemakeCard && a.Event != (int)OperateEvent.ChangeCard);
#endregion
Part2:
#region 根据条件拼接where条件()
//终端ID不为空
if (PayREQ.TerminalId > 0)
{
string terminalname = DbCard.GetTerminalName(PayREQ.TerminalId);
where2.And(a => a.LeaguerID == terminalname);
where.And(a => a.TerminalId == PayREQ.TerminalId);
where3.And(a => a.TerminalId == PayREQ.TerminalId);
}
//卡号不为空
if (!string.IsNullOrEmpty(PayREQ.CardNum))
{
var card = DbCard.GetCardInfo(PayREQ.CardNum);
if (card == null)
return resultNull;
List<int> id = new List<int>();
if (card.Type == (int)CardType.LeaguerCard)
{
int leagId = DbLeaguer.GetLeaguerId(card.Id);
where.And(a => a.LeaguerId == leagId);
where1.And(a => a.ChildCardId == leagId && a.Cardtype == (int)CardType.LeaguerCard);
where2.And(a => a.LeaguerID == PayREQ.CardNum);
}
if (card.Type == (int)CardType.TemporaryCard)
{
int tempId = DbTemporaryCard.GetTempId(card.Id);
if (!string.IsNullOrEmpty(PayREQ.LeaguerName) || !string.IsNullOrEmpty(PayREQ.MenuName) || PayREQ.LeaguerLevelId > 0)
return resultNull;
where1.And(a => a.ChildCardId == tempId && a.Cardtype == (int)CardType.TemporaryCard);
where3.And(a => a.TemporaryCardId == tempId);
}
if (card.Type == (int)CardType.TestCard)
return resultNull;
}
//会员名不为空
if (!string.IsNullOrEmpty(PayREQ.LeaguerName))
{
var leag = MySql.From<D.LeaguerCard>().Where(a => a.UserName == PayREQ.LeaguerName).ToList();
if (leag == null || leag.Count == 0)
return resultNull;
var leaguerId = from fn in leag
select fn.Id;
List<int> id = leaguerId.ToList();
where.And(p => id.Contains(p.LeaguerId));
where1.And(a => id.Contains(a.ChildCardId) && a.Cardtype == (int)CardType.LeaguerCard);
}
//套餐名不为空
if (!string.IsNullOrEmpty(PayREQ.MenuName))
{
var menu = MySql.From<D.Menu>().Where(a => a.Name == PayREQ.MenuName).ToList();
if (menu == null || menu.Count == 0)
return resultNull;
var menuId = from fn in menu
select fn.Id;
where.And(p => menuId.Contains(p.MenuId));
}
//会员级别不为空
if (PayREQ.LeaguerLevelId > 0)
{
where.And(a => a.LeaguerLevelId == PayREQ.LeaguerLevelId);
where1.And(a => a.LeaguerLevelId == PayREQ.LeaguerLevelId);
}
#endregion
这部分很难提取出一个新的方法(需要有4个不同的返回值),而且也没有必要,逻辑清晰了,组长说,封装的方法,一定是要常用的,你仅仅就这里用一次,封装没有必要了。
Part3:
#region 获取where查询结果
var leagEventlist = MySql.From<D.LeaguerEvent>().Where(where).ToList();
var consList = MySql.From<D.Consume>().Where(where1).ToList();
var experienceList = MySql.From<D.ExperienceRecord>().Where(where2).ToList();
var tempEventList = MySql.From<D.TemporaryEvent>().Where(where3).ToList();
foreach (var e in experienceList)
{
var consume = consList.Find(a => a.ExperienceId == e.Id);
if (consume != null)
consumeList.Add(consume);
}
#endregion
Part4:
#region 遍历组合返回结果
resultList.AddRange(GetLeagEventList(leagEventlist));
resultList.AddRange(GetTempEventList(tempEventList));
resultList.AddRange(GetConsumeList(consumeList,PayREQ.LeaguerLevelId));
return resultList;
#endregion
Part5:
public static List<LeKeCardInfo> GetLeagEventList(List<LeaguerEvent> leagEventlist)
{
List<LeKeCardInfo> resultList = new List<LeKeCardInfo>();
foreach (var item in leagEventlist)
{
LeKeCardInfo resultLeaguer = new LeKeCardInfo();
if ((OperateEvent)item.Event == OperateEvent.CancelCard)
{
resultLeaguer = resultList.Find(a => a.LeaguerId == item.LeaguerId && a.opevent == OperateEvent.CancelCard);
if (resultList.Count > 0 && resultLeaguer != null)
{
resultLeaguer.NowBalance = 0;
resultLeaguer.PreBalance += item.Point;
resultLeaguer.Balance += item.Point;
continue;
}
else
resultLeaguer = new LeKeCardInfo();
resultLeaguer.NowBalance = 0;
}
else
resultLeaguer.NowBalance = item.PreBalance + item.Point;
resultLeaguer.opevent = (OperateEvent)item.Event;
resultLeaguer.LeaguerId = item.LeaguerId;
resultLeaguer.CardNo = DbLeaguer.GetCardNo(item.LeaguerId);
resultLeaguer.OperateTime = item.Createdatetime;
resultLeaguer.cardType = (int)CardType.LeaguerCard;
resultLeaguer.cardTypeName = EnumHelper.GetDescription(CardType.LeaguerCard);
var LeaguerInfo = DbLeaguer.GetLeaguerInfoById(item.LeaguerId);
if (LeaguerInfo == null)
continue;
resultLeaguer.UserName = LeaguerInfo.UserName;
resultLeaguer.Tel = LeaguerInfo.Tel;
resultLeaguer.LeaguerLevel = DbLeaguerLevel.GetLeaguerLevelName(item.LeaguerLevelId);
resultLeaguer.Remark = EnumHelper.GetDescription((OperateEvent)item.Event);
resultLeaguer.PreBalance = item.PreBalance;
resultLeaguer.Balance = item.Point;
resultLeaguer.OperatorName = DbUserInfo.GetOperatorName(item.Operator);
resultLeaguer.TerminalName = DbCard.GetTerminalName(item.TerminalId);
resultList.Add(resultLeaguer);
}
return resultList;
}
这里还有3个类似的方法被封装,就不展示了.
That's all.