【读书活动感悟分享】极客充电队——《Head First 设计模式》设计模式在工作中的运用_文章

【读书活动感悟分享】极客充电队——《Head First 设计模式》设计模式在工作中的运用

马风震
发表于 2025-11-14 11:58:22

         最近跟随团队一起学习了《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}");
         }
     }






86 0

评论


意见反馈