最近跟随团队一起学习了《Head First 设计模式》,收获良多。同时,自己手头正好有一个比较复杂的需求
<SRO20250822194301提供企业对账单生成功能,解决对账难问题> ,基于需求,自己在实现的功能中也运用了部分设计模式去实现。所以这里想拆解一下功能代码,谈一谈用到的设计模式。
整体代码结构如图:

一、工厂模式
需求中提到了要生成日账单和月账单,2025年10月1日后既有日账单也有月账单,2025年10月1日之前只有月账单。同样是月账单,但生成数据也存在逻辑上的差异性,2025年10月1日之前的月账单是从各业务表汇总而来。但2025年10月1日后的月账单则是从日账单上汇总而来。所以,这里拆分了日账单以及月账单和历史月账单。同理,稽查的逻辑也不一致,相同的处理。我选择了工厂模式根据时间和业务类型动态创建不同的Domain对象:
- 日报/月报判断
- 历史数据版本识别(2025年10月1日前后的不同逻辑)
public class EnterpriseDataFactory
{
public static EnterpriseBaseDataCreateDomain Create(EnterpriseDataCreateParam param)
{
if (param.IsDaily)
{
if (string.IsNullOrWhiteSpace(param.BusCustID) && string.IsNullOrWhiteSpace(param.CompanyID))
{
return new EnterpriseDailyDataCreateDomain(param);
}
else
{
return new EnterpriseMonthlyHistoryDataCreateDomain(param);
}
}
else
{
if (param.BeginTime >= new DateTime(2025, 10, 1))
{
return new EnterpriseMonthlyDataCreateDomain(param);
}
else
{
return new EnterpriseMonthlyHistoryDataCreateDomain(param);
}
}
}
public static EnterpriseBaseDataAuditDomain Audit(EnterpriseDataAuditParam param)
{
if (param.IsDaily)
{
return new EnterpriseDailyDataAuditDomain(param);
}
else
{
if (param.BeginTime >= new DateTime(2025, 10, 1))
{
return new EnterpriseMonthlyDataAuditDomain(param);
}
else
{
return new EnterpriseMonthlyHistoryDataAuditDomain(param);
}
}
}二、模板方法模式
定义了账单生成抽象类EnterpriseBaseDataCreateDomain以及账单稽查抽象类EnterpriseBaseDataAuditDomain。在抽象类中定义了数据处理的骨架算法 CreateEnterpriseData() 和 AuditEnterpriseData(),子类只需要实现具体的业务逻辑 CreateSingleEnterpriseData() 和AuditSingleEnterpriseData()
public abstract class EnterpriseBaseDataCreateDomain
{
protected IAccountDao accountReadDao = DaoService.GetInstance(SqlMap.TeldAccountReadMap).GetDao();
protected IEnterpriseDao drDao = DaoService.GetInstance(SqlMap.DRMap).GetDao();
protected IRechargeDao rechargeRRCReadDao = DaoService.GetInstance(SqlMap.DrRrcRead).GetDao();
protected IRefundDao refundRRCReadDao = DaoService.GetInstance(SqlMap.DrRrcRead).GetDao();
protected EnterpriseDataCreateParam _param { get; set; }
protected StringBuilder sb = new StringBuilder();
protected EnterpriseBaseDataCreateDomain(EnterpriseDataCreateParam param)
{
this._param = param;
}
///
/// 初始化通用数据
///
protected virtual void InitializeData()
{
}
public void CreateEnterpriseData()
{
InitializeData();
var businessUnits = new List();
var edBusinessUnits = accountReadDao.GetEDBusinessUnits(new BaseEnterpriseSearchDto()
{
BusCustID = _param.BusCustID,
CompanyID = _param.CompanyID
});
if (edBusinessUnits != null && edBusinessUnits.Count > 0)
{
businessUnits.AddRange(edBusinessUnits);
}
var hdBusinessUnits = accountReadDao.GetHDBusinessUnits(new BaseEnterpriseSearchDto()
{
BusCustID = _param.BusCustID,
CompanyID = _param.CompanyID
});
if (hdBusinessUnits != null && hdBusinessUnits.Count > 0)
{
businessUnits.AddRange(hdBusinessUnits);
}
if (!string.IsNullOrWhiteSpace(_param?.BusCustID))
{
businessUnits = businessUnits?.Where(x => x.BusUnitID == _param?.BusCustID).ToList();
}
if (!string.IsNullOrWhiteSpace(_param?.CompanyID))
{
businessUnits = businessUnits?.Where(x => x.SubBusUnitID == _param?.CompanyID).ToList();
}
LogExtension.Action("RMSTG-EnterpriseDataCreateTask", () => $@"处理数量{businessUnits?.Count ?? 0}");
foreach (var businessUnit in businessUnits ?? new List())
{
LogExtension.Action("RMSTG-EnterpriseDataCreateTask", () => $@"处理信息{JsonConvert.SerializeObject(businessUnit)}");
var enterpriseDataCreateParam = new EnterpriseDataCreateParam()
{
BusCustID = businessUnit.BusUnitID,
CompanyID = businessUnit.SubBusUnitID,
BeginTime = _param.BeginTime,
EndTime = _param.EndTime,
BillType = _param.BillType,
IsForse = _param.IsForse
};
try
{
CreateSingleEnterpriseData(enterpriseDataCreateParam);
}
catch (Exception ex)
{
LogExtension.Exception("RMSTG-EnterpriseDataCreateTask", $"单条执行异常,参数:{JsonConvert.SerializeObject(enterpriseDataCreateParam)},异常信息{JsonConvert.SerializeObject(ex)}");
}
}
}
///
/// 生成
///
protected abstract void CreateSingleEnterpriseData(EnterpriseDataCreateParam param); public abstract class EnterpriseBaseDataAuditDomain
{
protected IAccountDao accountReadDao = DaoService.GetInstance(SqlMap.TeldAccountReadMap).GetDao();
protected IEnterpriseDao drDao = DaoService.GetInstance(SqlMap.DRMap).GetDao();
protected EnterpriseDataAuditParam _param { get; set; }
public EnterpriseBaseDataAuditDomain(EnterpriseDataAuditParam param)
{
this._param = param;
}
public void AuditEnterpriseData()
{
var baseEnterpriseSearchDto = new BaseEnterpriseSearchDto()
{
BusCustID = _param.BusCustID,
CompanyID = _param.CompanyID,
BillType = _param.BillType,
BillBeginDate = _param.BeginTime,
BillEndDate = _param.EndTime
};
var enterpriseAccountList = drDao.SelectEnterpriseAccount(baseEnterpriseSearchDto);
foreach (var enterpriseAccountInfo in enterpriseAccountList ?? new List())
{
LogExtension.Action("RMSTG-EnterpriseDataAuditTask", () => $@"处理信息{JsonConvert.SerializeObject(enterpriseAccountInfo)}");
try
{
AuditSingleEnterpriseData(enterpriseAccountInfo);
}
catch (Exception ex)
{
LogExtension.Exception("RMSTG-EnterpriseDataAuditTask", $"参数:{JsonConvert.SerializeObject(enterpriseAccountInfo)},异常信息{JsonConvert.SerializeObject(ex)}");
}
}
}
///
/// 稽查
///
protected abstract void AuditSingleEnterpriseData(EnterpriseAccountEntity enterpriseAccountEntity);
protected void PushEnterpriseDataToKafka(BaseEnterpriseSearchDto baseEnterpriseSearchDto)
{
//推送延迟队列
var task = TaskBuilder.BuildAsynTask("RMSTG-PushEnterpriseDataToKafka", "RMSTG-PushEnterpriseDataToKafka", 3);
task.Data.Put("Message", JsonConvert.SerializeObject(baseEnterpriseSearchDto));
ITaskSender sender = HSFService.Proxy();
sender.Send(task);
}
}三、策略模式
需求里面账单的稽查存在三种维度的核算,即现金、信用、订单收款。这里分别介绍下不同维度下的策略。
现金账户稽查策略
策略核心:期末余额 - 期初余额 = 充值金额 - 退款金额 - 消费金额
//现金核对稽查
if (enterpriseAccountEntity.CashAuditStatus != YesOrNoEnum.YES.ToString("D"))
{
var cashLeft = (enterpriseAccountEntity.CashClosingBalance ?? 0.00m) - (enterpriseAccountEntity.CashOpeningBalance ?? 0.00m);
var payAmount = enterprisePaymentDetailList?.Where(x => x.PaymentAccountType == "3").Sum(x => x.PayAmount) ?? 0.00m;
var cashRight = (enterpriseAccountEntity.CashRechargeAmount ?? 0.00m) - (enterpriseAccountEntity.CashRefundAmount ?? 0.00m) - payAmount;
if (cashLeft == cashRight)
{
enterpriseAccountEntity.CashAuditStatus = YesOrNoEnum.YES.ToString("D");
}
else
{
sb.AppendLine($"===现金账户稽查存在差异===");
sb.AppendLine($"现金账户期末-现金账户期初:{cashLeft.ToString("#0.00")}元");
sb.AppendLine($"充值金额-退款金额-现金消费金额:{cashRight.ToString("#0.00")}元");
}
} 信用账户稽查策略
策略核心::期末余额 - 期初余额 = 还款金额 - 消费金额
//信用核对稽查
if (enterpriseAccountEntity.CreditAuditStatus != YesOrNoEnum.YES.ToString("D"))
{
var creditLeft = (enterpriseAccountEntity.CreditClosingBalance ?? 0.00m) - (enterpriseAccountEntity.CreditOpeningBalance ?? 0.00m);
var payAmount = enterprisePaymentDetailList?.Where(x => x.PaymentAccountType == "2").Sum(x => x.PayAmount) ?? 0.00m;
var creditRight = (enterpriseAccountEntity.CreditRepaymentAmount ?? 0.00m) - payAmount;
if (creditLeft == creditRight)
{
enterpriseAccountEntity.CreditAuditStatus = YesOrNoEnum.YES.ToString("D");
}
else
{
sb.AppendLine($"===信用账户稽查存在差异===");
sb.AppendLine($"信用账户期末-信用账户期初:{creditLeft.ToString("#0.00")}元");
sb.AppendLine($"账单还款-信用消费金额:{creditRight.ToString("#0.00")}元");
}
} 订单收款稽查策略
策略核心:多类型下订单金额=消费金额
//订单收款稽核
if (enterpriseAccountEntity.PaymentAuditStatus != YesOrNoEnum.YES.ToString("D"))
{
var enterpriseChargeList = drDao.SelectEnterpriseCharge(baseSingleEnterpriseSearchDto);
var enterpriseEcommerceList = drDao.SelectEnterpriseEcommerce(baseSingleEnterpriseSearchDto);
var chargeNormalLeft = enterpriseChargeList?.FirstOrDefault().NormalChargeAmount ?? 0.00m;
var chargeNormalRight = enterprisePaymentDetailList?.Where(x => x.IndustryType == "1" && x.BaseType == "1" && x.OrderType == "0").Sum(x => x.PayAmount) ?? 0.00m;
var chargeAdjustLeft = enterpriseChargeList?.FirstOrDefault().AdjustChargeAmount ?? 0.00m;
var chargeAdjustRight = enterprisePaymentDetailList?.Where(x => x.IndustryType == "1" && x.BaseType == "1" && x.OrderType == "3").Sum(x => x.PayAmount) ?? 0.00m;
var resouceUsageNormalLeft = enterpriseChargeList?.FirstOrDefault().NormalResouceUsageAmount ?? 0.00m;
var resouceUsageNormalRight = enterprisePaymentDetailList?.Where(x => x.IndustryType == "1" && x.BaseType == "5" && x.OrderType == "0").Sum(x => x.PayAmount) ?? 0.00m;
var resouceUsageAdjustLeft = enterpriseChargeList?.FirstOrDefault().AdjustResouceUsageAmount ?? 0.00m;
var resouceUsageAdjustRight = enterprisePaymentDetailList?.Where(x => x.IndustryType == "1" && x.BaseType == "5" && x.OrderType == "3").Sum(x => x.PayAmount) ?? 0.00m;
var disChargeLeft = enterpriseChargeList?.FirstOrDefault().DisChargeAmount ?? 0.00m;
var disChargeRight = enterprisePaymentDetailList?.Where(x => x.IndustryType == "1" && x.BaseType == "16").Sum(x => x.PayAmount) ?? 0.00m;
var ecommerceNormalLeft = enterpriseEcommerceList?.FirstOrDefault().NormalEcommerceAmount ?? 0.00m;
var ecommerceNormalRight = enterprisePaymentDetailList?.Where(x => x.IndustryType == "2" && x.OrderType == "0").Sum(x => x.PayAmount) ?? 0.00m;
var ecommerceAdjustLeft = enterpriseEcommerceList?.FirstOrDefault().RefundEcommerceAmount ?? 0.00m;
var ecommerceAdjustRight = enterprisePaymentDetailList?.Where(x => x.IndustryType == "2" && x.OrderType == "3").Sum(x => x.PayAmount) ?? 0.00m;
var ecologyNormalLeft = enterpriseEcommerceList?.FirstOrDefault().NormalEcologyAmount ?? 0.00m;
var ecologyNormalRight = enterprisePaymentDetailList?.Where(x => x.IndustryType == "3" && x.OrderType == "0").Sum(x => x.PayAmount) ?? 0.00m;
var ecologyAdjustLeft = enterpriseEcommerceList?.FirstOrDefault().RefundEcologyAmount ?? 0.00m;
var ecologyAdjustRight = enterprisePaymentDetailList?.Where(x => x.IndustryType == "3" && x.OrderType == "3").Sum(x => x.PayAmount) ?? 0.00m;
if (chargeNormalLeft == chargeNormalRight && chargeAdjustLeft == chargeAdjustRight
&& resouceUsageNormalLeft == resouceUsageNormalRight && resouceUsageAdjustLeft == resouceUsageAdjustRight
&& disChargeLeft == disChargeRight && ecommerceNormalLeft == ecommerceNormalRight
&& ecommerceAdjustLeft == ecommerceAdjustRight && ecologyNormalLeft == ecologyNormalRight && ecologyAdjustLeft == ecologyAdjustRight)
{
enterpriseAccountEntity.PaymentAuditStatus = YesOrNoEnum.YES.ToString("D");
}
else
{
sb.AppendLine($"===订单收款稽查存在差异===");
//充电
sb.AppendLine($"正常充电订单金额:{chargeNormalLeft.ToString("#0.00")}元");
sb.AppendLine($"正常充电订单消费汇总金额:{chargeNormalRight.ToString("#0.00")}元");
sb.AppendLine($"调整充电订单金额:{chargeAdjustLeft.ToString("#0.00")}元");
sb.AppendLine($"调整充电订单消费汇总金额:{chargeAdjustRight.ToString("#0.00")}元");
//超时占用
sb.AppendLine($"正常超时占用订单金额:{resouceUsageNormalLeft.ToString("#0.00")}元");
sb.AppendLine($"正常超时占用订单消费汇总金额:{resouceUsageNormalRight.ToString("#0.00")}元");
sb.AppendLine($"调整超时占用订单金额:{resouceUsageAdjustLeft.ToString("#0.00")}元");
sb.AppendLine($"调整超时占用订单消费汇总金额:{resouceUsageAdjustRight.ToString("#0.00")}元");
//放电
sb.AppendLine($"正常放电订单金额:{disChargeLeft.ToString("#0.00")}元");
sb.AppendLine($"正常放电订单消费汇总金额:{disChargeRight.ToString("#0.00")}元");
//电商
sb.AppendLine($"正常电商订单订单金额:{ecommerceNormalLeft.ToString("#0.00")}元");
sb.AppendLine($"正常电商订单消费汇总金额:{ecommerceNormalRight.ToString("#0.00")}元");
sb.AppendLine($"退货电商订单订单金额:{ecommerceAdjustLeft.ToString("#0.00")}元");
sb.AppendLine($"退货电商订单消费汇总金额:{ecommerceAdjustRight.ToString("#0.00")}元");
//生态
sb.AppendLine($"正常生态订单订单金额:{ecologyNormalLeft.ToString("#0.00")}元");
sb.AppendLine($"正常生态订单消费汇总金额:{ecologyNormalRight.ToString("#0.00")}元");
sb.AppendLine($"退货生态订单订单金额:{ecologyAdjustLeft.ToString("#0.00")}元");
sb.AppendLine($"退货生态订单消费汇总金额:{ecologyAdjustRight.ToString("#0.00")}元");
}
}
四、单一职责模式
EnterpriseDataDomain这个类只做一件事:将企业稽查成功的账单数据推送到 Kafka,所有的逻辑都围绕这个核心职责展开。
public class EnterpriseDataDomain
{
protected IAccountDao accountReadDao = DaoService.GetInstance(SqlMap.TeldAccountReadMap).GetDao();
protected IEnterpriseDao drDao = DaoService.GetInstance(SqlMap.DRMap).GetDao();
public void PushEnterpriseDataToKafka(BaseEnterpriseSearchDto param)
{
var enterpriseAccountList = drDao.SelectEnterpriseAccount(param);
foreach (var enterpriseAccountEntity in enterpriseAccountList ?? new List())
{
if (!enterpriseAccountEntity.AuditSuccessDate.HasValue)
{
continue;
}
if (enterpriseAccountEntity.BillType == EnterpriseBillType.Monthly.ToString("D") && enterpriseAccountEntity.BillDate >= new DateTime(2025, 10, 1))
{
continue;
}
string busCustName = accountReadDao.GetBusinessUnitsName(enterpriseAccountEntity.BusCustID);
string companyName = accountReadDao.GetBusinessUnitsName(enterpriseAccountEntity.CompanyID);
var baseSingleEnterpriseSearchDto = new BaseEnterpriseSearchDto()
{
BusCustID = enterpriseAccountEntity.BusCustID,
CompanyID = enterpriseAccountEntity.CompanyID,
BillType = enterpriseAccountEntity.BillType,
BillBeginDate = enterpriseAccountEntity.BillDate.Value.Date,
BillEndDate = enterpriseAccountEntity.BillDate.Value.AddDays(1).Date
};
if (baseSingleEnterpriseSearchDto.BillType == EnterpriseBillType.Daily.ToString("D"))
{
baseSingleEnterpriseSearchDto.BillEndDate = enterpriseAccountEntity.BillDate.Value.AddDays(1).Date;
}
if (baseSingleEnterpriseSearchDto.BillType == EnterpriseBillType.Monthly.ToString("D"))
{
baseSingleEnterpriseSearchDto.BillEndDate = enterpriseAccountEntity.BillDate.Value.AddMonths(1).Date;
}
var enterprisePaymentDetailList = drDao.SelectEnterprisePaymentDetail(baseSingleEnterpriseSearchDto);
var enterpriseChargeInfo = drDao.SelectEnterpriseCharge(baseSingleEnterpriseSearchDto)?.FirstOrDefault();
var enterpriseEcommerceInfo = drDao.SelectEnterpriseEcommerce(baseSingleEnterpriseSearchDto)?.FirstOrDefault();
EnterpriseDetailBigDataForKafka enterpriseDetailBigDataForKafka = new EnterpriseDetailBigDataForKafka();
enterpriseDetailBigDataForKafka.ID = $"{enterpriseAccountEntity.BillType}-{enterpriseAccountEntity.BusCustID}-{enterpriseAccountEntity.CompanyID}-{enterpriseAccountEntity.BillDate.Value.ToString("yyyyMMdd")}";
enterpriseDetailBigDataForKafka.BusCustID = enterpriseAccountEntity.BusCustID;
enterpriseDetailBigDataForKafka.BusCustName = busCustName;
enterpriseDetailBigDataForKafka.CompanyID = enterpriseAccountEntity.CompanyID;
enterpriseDetailBigDataForKafka.CompanyName = companyName;
enterpriseDetailBigDataForKafka.BillDate = enterpriseAccountEntity.BillDate;
enterpriseDetailBigDataForKafka.BillType = enterpriseAccountEntity.BillType;
enterpriseDetailBigDataForKafka.AuditSuccessDate = enterpriseAccountEntity.AuditSuccessDate;
enterpriseDetailBigDataForKafka.VehicleCount = enterpriseAccountEntity.VehicleCount;
enterpriseDetailBigDataForKafka.CashAccountBookID = enterpriseAccountEntity.CashAccountBookID;
enterpriseDetailBigDataForKafka.CashRechargeAmount = enterpriseAccountEntity.CashRechargeAmount?.ToString("#0.00");
enterpriseDetailBigDataForKafka.CashRefundAmount = enterpriseAccountEntity.CashRefundAmount?.ToString("#0.00");
enterpriseDetailBigDataForKafka.CashOpeningBalance = enterpriseAccountEntity.CashOpeningBalance?.ToString("#0.00");
enterpriseDetailBigDataForKafka.CashClosingBalance = enterpriseAccountEntity.CashClosingBalance?.ToString("#0.00");
enterpriseDetailBigDataForKafka.CreditAccountBookID = enterpriseAccountEntity.CreditAccountBookID;
enterpriseDetailBigDataForKafka.CreditRepaymentAmount = enterpriseAccountEntity.CreditRepaymentAmount?.ToString("#0.00");
enterpriseDetailBigDataForKafka.CreditOpeningBalance = enterpriseAccountEntity.CreditOpeningBalance?.ToString("#0.00");
enterpriseDetailBigDataForKafka.CreditClosingBalance = enterpriseAccountEntity.CreditClosingBalance?.ToString("#0.00");
//免费充电订单
enterpriseDetailBigDataForKafka.FreeChargeAmount = enterpriseChargeInfo?.FreeChargeAmount?.ToString("#0.00");
enterpriseDetailBigDataForKafka.FreeChargeEAmount = enterpriseChargeInfo?.FreeChargeEAmount?.ToString("#0.00");
enterpriseDetailBigDataForKafka.FreeChargeSAmount = enterpriseChargeInfo?.FreeChargeSAmount?.ToString("#0.00");
enterpriseDetailBigDataForKafka.FreeChargePower = enterpriseChargeInfo?.FreeChargePower?.ToString("#0.000");
enterpriseDetailBigDataForKafka.FreeChargeCount = enterpriseChargeInfo?.FreeChargeCount;
//正常充电订单
enterpriseDetailBigDataForKafka.NormalChargeAmount = enterpriseChargeInfo?.NormalChargeAmount?.ToString("#0.00");
enterpriseDetailBigDataForKafka.NormalChargeEAmount = enterpriseChargeInfo?.NormalChargeEAmount?.ToString("#0.00");
enterpriseDetailBigDataForKafka.NormalChargeSAmount = enterpriseChargeInfo?.NormalChargeSAmount?.ToString("#0.00");
enterpriseDetailBigDataForKafka.NormalChargeCount = enterpriseChargeInfo?.NormalChargeCount;
//正常超时占用
enterpriseDetailBigDataForKafka.NormalResouceUsageAmount = enterpriseChargeInfo?.NormalResouceUsageAmount?.ToString("#0.00");
enterpriseDetailBigDataForKafka.NormalResouceUsageCount = enterpriseChargeInfo?.NormalResouceUsageCount;
//调整充电订单
enterpriseDetailBigDataForKafka.AdjustChargeAmount = enterpriseChargeInfo?.AdjustChargeAmount?.ToString("#0.00");
enterpriseDetailBigDataForKafka.AdjustChargeEAmount = enterpriseChargeInfo?.AdjustChargeEAmount?.ToString("#0.00");
enterpriseDetailBigDataForKafka.AdjustChargeSAmount = enterpriseChargeInfo?.AdjustChargeSAmount?.ToString("#0.00");
enterpriseDetailBigDataForKafka.AdjustChargeCount = enterpriseChargeInfo?.AdjustChargeCount;
//调整超时占用
enterpriseDetailBigDataForKafka.AdjustResouceUsageAmount = enterpriseChargeInfo?.AdjustResouceUsageAmount?.ToString("#0.00");
enterpriseDetailBigDataForKafka.AdjustResouceUsageCount = enterpriseChargeInfo?.AdjustResouceUsageCount;
//正常放电订单
enterpriseDetailBigDataForKafka.DisChargeAmount = enterpriseChargeInfo?.DisChargeAmount?.ToString("#0.00");
enterpriseDetailBigDataForKafka.DisChargeCount = enterpriseChargeInfo?.DisChargeCount;
enterpriseDetailBigDataForKafka.DisChargePower = enterpriseChargeInfo?.DisChargePower?.ToString("#0.000");
//正常电商||生态
enterpriseDetailBigDataForKafka.NormalEcommerceAmount = enterpriseEcommerceInfo?.NormalEcommerceAmount?.ToString("#0.00");
enterpriseDetailBigDataForKafka.NormalEcommerceCount = enterpriseEcommerceInfo?.NormalEcommerceCount;
enterpriseDetailBigDataForKafka.NormalEcologyAmount = enterpriseEcommerceInfo?.NormalEcologyAmount?.ToString("#0.00");
enterpriseDetailBigDataForKafka.NormalEcologyCount = enterpriseEcommerceInfo?.NormalEcologyCount;
//退货电商||生态
enterpriseDetailBigDataForKafka.RefundEcommerceAmount = enterpriseEcommerceInfo?.RefundEcommerceAmount?.ToString("#0.00");
enterpriseDetailBigDataForKafka.RefundEcommerceCount = enterpriseEcommerceInfo?.RefundEcommerceCount;
enterpriseDetailBigDataForKafka.RefundEcologyAmount = enterpriseEcommerceInfo?.RefundEcologyAmount?.ToString("#0.00");
enterpriseDetailBigDataForKafka.RefundEcologyCount = enterpriseEcommerceInfo?.RefundEcologyCount;
//正常充电消费
enterpriseDetailBigDataForKafka.NormalChargeCashAmount= enterprisePaymentDetailList?.Where(x => x.IndustryType == "1" && x.BaseType == "1" && x.OrderType == "0"&& x.PaymentAccountType=="3").Sum(x => x.PayAmount)?.ToString("#0.00");
enterpriseDetailBigDataForKafka.NormalChargeCreditAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "1" && x.BaseType == "1" && x.OrderType == "0" && x.PaymentAccountType == "2").Sum(x => x.PayAmount)?.ToString("#0.00");
enterpriseDetailBigDataForKafka.NormalChargeCouponAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "1" && x.BaseType == "1" && x.OrderType == "0" && x.PaymentAccountType == "1").Sum(x => x.PayAmount)?.ToString("#0.00");
enterpriseDetailBigDataForKafka.NormalChargeV2GAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "1" && x.BaseType == "1" && x.OrderType == "0" && (x.PaymentAccountType == "7" || x.PaymentAccountType == "8")).Sum(x => x.PayAmount)?.ToString("#0.00");
//调整充电消费
enterpriseDetailBigDataForKafka.AdjustChargeCashAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "1" && x.BaseType == "1" && x.OrderType == "3" && x.PaymentAccountType == "3").Sum(x => x.PayAmount)?.ToString("#0.00");
enterpriseDetailBigDataForKafka.AdjustChargeCreditAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "1" && x.BaseType == "1" && x.OrderType == "3" && x.PaymentAccountType == "2").Sum(x => x.PayAmount)?.ToString("#0.00");
enterpriseDetailBigDataForKafka.AdjustChargeCouponAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "1" && x.BaseType == "1" && x.OrderType == "3" && x.PaymentAccountType == "1").Sum(x => x.PayAmount)?.ToString("#0.00");
enterpriseDetailBigDataForKafka.AdjustChargeV2GAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "1" && x.BaseType == "1" && x.OrderType == "3" && (x.PaymentAccountType == "7" || x.PaymentAccountType == "8")).Sum(x => x.PayAmount)?.ToString("#0.00");
//正常超时占用消费
enterpriseDetailBigDataForKafka.NormalResouceUsageCashAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "1" && x.BaseType == "5" && x.OrderType == "0" && x.PaymentAccountType == "3").Sum(x => x.PayAmount)?.ToString("#0.00");
enterpriseDetailBigDataForKafka.NormalResouceUsageCreditAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "1" && x.BaseType == "5" && x.OrderType == "0" && x.PaymentAccountType == "2").Sum(x => x.PayAmount)?.ToString("#0.00");
enterpriseDetailBigDataForKafka.NormalResouceUsageCouponAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "1" && x.BaseType == "5" && x.OrderType == "0" && x.PaymentAccountType == "1").Sum(x => x.PayAmount)?.ToString("#0.00");
enterpriseDetailBigDataForKafka.NormalResouceUsageV2GAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "1" && x.BaseType == "5" && x.OrderType == "0" && (x.PaymentAccountType == "7" || x.PaymentAccountType == "8")).Sum(x => x.PayAmount)?.ToString("#0.00");
//调整超时占用消费
enterpriseDetailBigDataForKafka.AdjustResouceUsageCashAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "1" && x.BaseType == "5" && x.OrderType == "3" && x.PaymentAccountType == "3").Sum(x => x.PayAmount)?.ToString("#0.00");
enterpriseDetailBigDataForKafka.AdjustResouceUsageCreditAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "1" && x.BaseType == "5" && x.OrderType == "3" && x.PaymentAccountType == "2").Sum(x => x.PayAmount)?.ToString("#0.00");
enterpriseDetailBigDataForKafka.AdjustResouceUsageCouponAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "1" && x.BaseType == "5" && x.OrderType == "3" && x.PaymentAccountType == "1").Sum(x => x.PayAmount)?.ToString("#0.00");
enterpriseDetailBigDataForKafka.AdjustResouceUsageV2GAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "1" && x.BaseType == "5" && x.OrderType == "3" && (x.PaymentAccountType == "7" || x.PaymentAccountType == "8")).Sum(x => x.PayAmount)?.ToString("#0.00");
//正常电商消费
enterpriseDetailBigDataForKafka.NormalEcommerceCashAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "2" && x.OrderType == "0" && x.PaymentAccountType == "3").Sum(x => x.PayAmount)?.ToString("#0.00");
enterpriseDetailBigDataForKafka.NormalEcommerceCreditAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "2" && x.OrderType == "0" && x.PaymentAccountType == "2").Sum(x => x.PayAmount)?.ToString("#0.00");
enterpriseDetailBigDataForKafka.NormalEcommerceThirdAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "2" && x.OrderType == "0" && x.PaymentAccountType == "5").Sum(x => x.PayAmount)?.ToString("#0.00");
//退货电商消费
enterpriseDetailBigDataForKafka.RefundEcommerceCashAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "2" && x.OrderType == "3" && x.PaymentAccountType == "3").Sum(x => x.PayAmount)?.ToString("#0.00");
enterpriseDetailBigDataForKafka.RefundEcommerceCreditAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "2" && x.OrderType == "3" && x.PaymentAccountType == "2").Sum(x => x.PayAmount)?.ToString("#0.00");
enterpriseDetailBigDataForKafka.RefundEcommerceThirdAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "2" && x.OrderType == "3" && x.PaymentAccountType == "5").Sum(x => x.PayAmount)?.ToString("#0.00");
//正常生态消费
enterpriseDetailBigDataForKafka.NormalEcologyCashAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "3" && x.OrderType == "0" && x.PaymentAccountType == "3").Sum(x => x.PayAmount)?.ToString("#0.00");
enterpriseDetailBigDataForKafka.NormalEcologyCreditAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "3" && x.OrderType == "0" && x.PaymentAccountType == "2").Sum(x => x.PayAmount)?.ToString("#0.00");
enterpriseDetailBigDataForKafka.NormalEcologyThirdAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "3" && x.OrderType == "0" && x.PaymentAccountType == "5").Sum(x => x.PayAmount)?.ToString("#0.00");
//退货生态消费
enterpriseDetailBigDataForKafka.RefundEcologyCashAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "3" && x.OrderType == "3" && x.PaymentAccountType == "3").Sum(x => x.PayAmount)?.ToString("#0.00");
enterpriseDetailBigDataForKafka.RefundEcologyCreditAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "3" && x.OrderType == "3" && x.PaymentAccountType == "2").Sum(x => x.PayAmount)?.ToString("#0.00");
enterpriseDetailBigDataForKafka.RefundEcologyThirdAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "3" && x.OrderType == "3" && x.PaymentAccountType == "5").Sum(x => x.PayAmount)?.ToString("#0.00");
//正常放电订单
enterpriseDetailBigDataForKafka.NormalDisChargeV2GAmount = enterprisePaymentDetailList?.Where(x => x.IndustryType == "1" && x.BaseType == "16" && (x.PaymentAccountType == "7" || x.PaymentAccountType == "8")).Sum(x => x.PayAmount)?.ToString("#0.00");
enterpriseDetailBigDataForKafka.Creator = enterpriseAccountEntity.Creator;
enterpriseDetailBigDataForKafka.CreatorName = enterpriseAccountEntity.CreatorName;
enterpriseDetailBigDataForKafka.CreateTime = enterpriseAccountEntity.CreateTime;
enterpriseDetailBigDataForKafka.LastModifier = enterpriseAccountEntity.LastModifier;
enterpriseDetailBigDataForKafka.LastModifierName = enterpriseAccountEntity.LastModifierName;
enterpriseDetailBigDataForKafka.LastModifyTime = enterpriseAccountEntity.LastModifyTime;
SDKToKafkaUtil.Current.Push(enterpriseDetailBigDataForKafka);
LogExtension.Action("RMSTG-PushEnterpriseDataToKafka", $"推送kafka成功,唯一标识:{enterpriseDetailBigDataForKafka?.ID}");
}
}