瀏覽代碼

feat:1、云端mqtt发送订单支付信息带上用户名、手机号、支付方式;2、fcc发送订单带上泵码;3、FCC订单页导出excel

Zhenghanjv 3 月之前
父節點
當前提交
c448ccea4b

+ 14 - 0
Edge.Core/Core/database/MysqlDbContext.cs

@@ -65,6 +65,20 @@ namespace Edge.Core.Core.database
                 .HasForeignKey(nozzle => nozzle.MachineId)
                 .OnDelete(DeleteBehavior.Restrict);
 
+            //modelBuilder.Entity<FccOrderInfo>(entity =>
+            //{
+                
+            //    entity.Property(order => order.EndTime).IsRequired(false);
+            //    entity.Property(order => order.PaymentTime).IsRequired(false);
+            //    entity.Property(order => order.PayType).IsRequired(false);
+            //    entity.Property(order => order.CloundOrderId).IsRequired(false);
+            //    entity.Property(order => order.AmountPayable).IsRequired(false);
+            //    entity.Property(order => order.RefundAmount).IsRequired(false);
+            //    entity.Property(order => order.UserName).IsRequired(false);
+            //    entity.Property(order => order.PhoneNumber).IsRequired(false);
+            //    entity.Property(order => order.PaymentName).IsRequired(false);
+            //    entity.Property(order => order.PumpCode).IsRequired(false);
+            //});
 
             base.OnModelCreating(modelBuilder);
         }

+ 5 - 0
Edge.Core/Domain/FccOrderInfo/FccOrderInfo.cs

@@ -111,6 +111,11 @@ namespace Edge.Core.Domain.FccOrderInfo
         /// 支付类型名称
         /// </summary>
         public string PaymentName { get; set; }
+
+        /// <summary>
+        /// 泵码
+        /// </summary>
+        public decimal? PumpCode { get; set; }
     }
 
 }

+ 1 - 1
Edge.Core/Domain/FccStationInfo/FccStationInfo.cs

@@ -70,7 +70,7 @@ namespace Edge.Core.Domain.FccStationInfo
         public string WebSocketPort { get; set; }
 
         /// <summary>
-        /// 支付方式,逗号隔开
+        /// 支付方式【id+支付名称,id+支付名称】
         /// </summary>
         public string PaymentType { get; set; }
 

+ 1 - 1
Edge.Core/Domain/FccStationInfo/Output/StationInfoOutput.cs

@@ -99,7 +99,7 @@ namespace Edge.Core.Domain.FccStationInfo.Output
         public string WebSocketPort { get; set; }
 
         /// <summary>
-        /// 支付方式,逗号隔开
+        /// 支付方式,【id+支付名称,id+支付名称】
         /// </summary>
         public string PaymentType { get; set; }
     }

+ 2 - 2
Edge.Core/MqttClient/MqttClientService.cs

@@ -88,8 +88,8 @@ namespace Edge.Core.MqttClient
         {
             Logger.Info($"mqtt disconnect",JsonConvert.SerializeObject(args));
 
-            Thread.Sleep(3000);
-            Start();
+            //Thread.Sleep(3000);
+            //Start();
             OnDisconnect?.Invoke(this, args);
             return Task.CompletedTask;
         }

+ 58 - 22
HengshanPaymentTerminal/HengshanPayTermHandler.cs

@@ -76,10 +76,12 @@ namespace HengshanPaymentTerminal
 
         public Dictionary<int, List<int>> PumpSiteNozzleNoDict { get; private set; }
 
-        public MysqlDbContext MysqlDbContext { get; private set; }
+        //public MysqlDbContext MysqlDbContext { get; private set; }
 
         public StationInfo stationInfo { get; set; }
 
+        public Dictionary<long,string> stationPayment = new Dictionary<long,string>();
+
         public List<DetailsNozzleInfoOutput> nozzleInfoList { get; private set; }
 
         public TcpClient? client { get; set; }
@@ -437,7 +439,7 @@ namespace HengshanPaymentTerminal
             CommIdentity = context.Processor.Communicator.Identity;
             _context = context;
 
-            this.MysqlDbContext = new MysqlDbContext();
+            //this.MysqlDbContext = new MysqlDbContext();
             this.httpClientUtil = new HttpClientUtils();
 
             this.serverPort = CommIdentity.Replace("*:", "").ToInt();
@@ -706,15 +708,32 @@ namespace HengshanPaymentTerminal
         /// </summary>
         private async void GetInfo()
         {
-            Edge.Core.Domain.FccStationInfo.FccStationInfo? fccStationInfo = MysqlDbContext.FccStationInfos.FirstOrDefault();
-            if(fccStationInfo != null) stationInfo = new StationInfo(fccStationInfo);
-            Edge.Core.Domain.FccMachineInfo.FccMachineInfo? fccMachineInfo = await MysqlDbContext.FccMachineInfos.FirstOrDefaultAsync(machine => machine.Port == serverPort);
+            MysqlDbContext mysqlDbContext = new MysqlDbContext();
+            Edge.Core.Domain.FccStationInfo.FccStationInfo? fccStationInfo = mysqlDbContext.FccStationInfos.FirstOrDefault();
+            if(fccStationInfo != null)
+            {
+                stationInfo = new StationInfo(fccStationInfo);
+                string paymentType = stationInfo.PaymentType;
+                string[] paymentGround = paymentType.Split(",");
+                foreach (var item in paymentGround)
+                {
+                    string[] payment = item.Split("+");
+                    if (payment.Length == 2)
+                    {
+                        if (long.TryParse(payment[0], out long id))
+                        {
+                            stationPayment.Add(id, payment[1]);
+                        }
+                    }
+                }
+            }
+            Edge.Core.Domain.FccMachineInfo.FccMachineInfo? fccMachineInfo = await mysqlDbContext.FccMachineInfos.FirstOrDefaultAsync(machine => machine.Port == serverPort);
             if(fccMachineInfo == null)
             {
                 nozzleInfoList = new List<DetailsNozzleInfoOutput>();
             } else
             {
-                nozzleInfoList = MysqlDbContext.NozzleInfos.Where(nozzle => nozzle.MachineId == fccMachineInfo.Id).Select(n => new DetailsNozzleInfoOutput(n)).ToList();
+                nozzleInfoList = mysqlDbContext.NozzleInfos.Where(nozzle => nozzle.MachineId == fccMachineInfo.Id).Select(n => new DetailsNozzleInfoOutput(n)).ToList();
             }
             
         }
@@ -749,7 +768,7 @@ namespace HengshanPaymentTerminal
                 case MQTT_TYPE.PAID:
                     {
                         MqttPaidRequest? mqttPaidRequest = JsonConvert.DeserializeObject<MqttPaidRequest>(mqttRequest.data);
-                        await SendActuallyPaid(mqttPaidRequest);
+                        await SendActuallyPaid(mqttPaidRequest, mqttRequest.UserName, mqttRequest.UserPhoneNumber);
                         break;
                     }
                 case MQTT_TYPE.REFUND:
@@ -826,8 +845,9 @@ namespace HengshanPaymentTerminal
         /// 发送实付金额给油机
         /// </summary>
         /// <param name="orderInfo"></param>
-        public async Task SendActuallyPaid(MqttPaidRequest? request) 
+        public async Task SendActuallyPaid(MqttPaidRequest? request,string? userName,string? phoneNumber) 
         {
+            MysqlDbContext mysqlDbContext = new MysqlDbContext();
             if (request == null)
             {
                 logger.Error($"mqtt get paid request is null");
@@ -842,16 +862,27 @@ namespace HengshanPaymentTerminal
             };
             await httpClientUtil.SendRecievePaidNotice(JsonConvert.SerializeObject(onGetPaidInfo));
 
-            FccOrderInfo? fccOrderInfo = MysqlDbContext.FccOrderInfos.FirstOrDefault(order => order.CloundOrderId == request.Id);
+            FccOrderInfo? fccOrderInfo = mysqlDbContext.FccOrderInfos.FirstOrDefault(order => 
+            order.NozzleNum == request.NozzleId 
+            && order.Ttc.ToString() == request.TransactionNumber
+            && order.PumpCode == request.FuelItemPumpTotalizerVolume);
             if (fccOrderInfo == null)
             {
                 logger.Error($"[mqtt paid order notice]:can not find order by clounid:{request.Id}");
                 return;
             }
+            fccOrderInfo.CloundOrderId = request.Id;
             fccOrderInfo.AmountPayable = request.ActualPaymentAmount;
             fccOrderInfo.PaymentTime = request.TransactionTime;
-            fccOrderInfo.PaymentStatus = 1;
-            MysqlDbContext.SaveChanges();
+            if(request.PaymentMethod != null)
+            {
+                fccOrderInfo.PayType = (int)request.PaymentMethod;
+                fccOrderInfo.PaymentName = stationPayment[request.PaymentMethod ?? 0] ?? "未知类型";
+            }
+            fccOrderInfo.UserName = userName??"";
+            fccOrderInfo.PhoneNumber = phoneNumber ?? string.Empty;
+
+            mysqlDbContext.SaveChanges();
 
             //SendActuallyPaid sendActuallyPaid = new SendActuallyPaid(orderInfo.NozzleNum, orderInfo.Ttc, orderInfo.AmountPayable ?? orderInfo.Amount, getFrame(null));
             //byte[] commandAndNozzle = { sendActuallyPaid.Handle, (byte)sendActuallyPaid.NozzleNum };
@@ -874,6 +905,7 @@ namespace HengshanPaymentTerminal
         /// <returns></returns>
         public async Task SendAuthorizationAsync(MqttAuthorizationRequest? request)
         {
+            MysqlDbContext mysqlDbContext = new MysqlDbContext();
             if(request == null)
             {
                 logger.Error($"mqtt authorization request is null");
@@ -883,7 +915,7 @@ namespace HengshanPaymentTerminal
             //添加订单到数据库
             DateTime authorizationTime = request.AuthorizationTime ?? DateTime.Now;
             FccOrderInfo fccOrderInfo = request.ToComponent(authorizationTime);
-            MysqlDbContext.FccOrderInfos.Add(fccOrderInfo);
+            mysqlDbContext.FccOrderInfos.Add(fccOrderInfo);
 
             //发送授权申请到油机
             SendAuthorization sendAuthorization = new SendAuthorization((int)request.NozzleId, authorizationTime, 1,request.OriginalAmount, getFrame(null));
@@ -934,7 +966,7 @@ namespace HengshanPaymentTerminal
             logger.Info($"send authorization result response:{JsonConvert.SerializeObject(httpResponseMessage.Content)}");
 
             //更新订单
-            MysqlDbContext.SaveChanges();
+            mysqlDbContext.SaveChanges();
         }
 
         /// <summary>
@@ -943,6 +975,7 @@ namespace HengshanPaymentTerminal
         /// <param name="request"></param>
         public async Task SendUnAuthorizartion(MqttUnAhorizationRequest? request)
         {
+            MysqlDbContext mysqlDbContext = new MysqlDbContext();
             if (request == null)
             {
                 logger.Error($"mqtt unauthorization request is null");
@@ -955,7 +988,7 @@ namespace HengshanPaymentTerminal
             bool ttsIntResult = int.TryParse(request.TransactionNumber, out ttc);
             if (request.AuthorizationTime == null || !ttsIntResult)
             {
-                FccOrderInfo? fccOrderInfo = MysqlDbContext.FccOrderInfos.FirstOrDefault(order => order.CloundOrderId == request.Id);
+                FccOrderInfo? fccOrderInfo = mysqlDbContext.FccOrderInfos.FirstOrDefault(order => order.CloundOrderId == request.Id);
                 if(fccOrderInfo != null)
                 {
                     ttc = fccOrderInfo.Ttc;
@@ -1023,6 +1056,7 @@ namespace HengshanPaymentTerminal
         /// <returns></returns>
         private async Task OnRecieveOrderRefund(MqttRefundRequest? request)
         {
+            MysqlDbContext mysqlDbContext = new MysqlDbContext();
             if (request == null)
             {
                 logger.Error($"mqtt OnRecieveOrderRefund request is null");
@@ -1036,7 +1070,7 @@ namespace HengshanPaymentTerminal
             };
             await httpClientUtil.SendRecieveRefundNotice(JsonConvert.SerializeObject(onGetRefundInfo));
 
-            FccOrderInfo? fccOrderInfo = MysqlDbContext.FccOrderInfos.FirstOrDefault(order => order.CloundOrderId == request.Id);
+            FccOrderInfo? fccOrderInfo = mysqlDbContext.FccOrderInfos.FirstOrDefault(order => order.CloundOrderId == request.Id);
             if (fccOrderInfo == null)
             {
                 logger.Error($"[mqtt refund order notice]:can not find order by clounid:{request.Id}");
@@ -1044,7 +1078,7 @@ namespace HengshanPaymentTerminal
             }
             fccOrderInfo.AmountPayable = request.ActualPaymentAmount;
             fccOrderInfo.PaymentStatus = 2;
-            MysqlDbContext.SaveChanges();
+            mysqlDbContext.SaveChanges();
 
         }
 
@@ -1298,16 +1332,17 @@ namespace HengshanPaymentTerminal
         /// <returns></returns>
         public FccOrderInfo UpLoadOrder(OrderFromMachine order)
         {
+            MysqlDbContext mysqlDbContext = new MysqlDbContext();
             //接收到油机发送过来的订单信息
             OrderFromMachine orderFromMachine = (OrderFromMachine)order;
-            string? oilName = MysqlDbContext.OilInfos.Where(oil => orderFromMachine.oilCode.Equals(oil.Code)).Select(oil => oil.Name).FirstOrDefault();
+            string? oilName = mysqlDbContext.OilInfos.Where(oil => orderFromMachine.oilCode.Equals(oil.Code)).Select(oil => oil.Name).FirstOrDefault();
             FccOrderInfo orderByMessage = orderFromMachine.ToComponent(oilName);
 
             /** 根据枪号+流水号+授权时间来确定订单,因为冷启动后流水号会从头开始计算
              * 后支付时直接将数据库直接插入
              * 预支付时由于是云端先创建订单,发起授权响应成功后会插入数据库,响应成功时会回复授权时间,枪号,流水号
              */
-            FccOrderInfo? fccOrderInfo = MysqlDbContext.FccOrderInfos
+            FccOrderInfo? fccOrderInfo = mysqlDbContext.FccOrderInfos
                 .Where(order =>
                     order.NozzleNum == orderFromMachine.nozzleNum && order.Ttc == orderFromMachine.ttc
                     && order.AuthorizationTime == orderFromMachine.dispenserTime)
@@ -1315,15 +1350,15 @@ namespace HengshanPaymentTerminal
             if (fccOrderInfo == null)
             {
                 logger.Info($"receive order from machine,find order from database is null");
-                MysqlDbContext.FccOrderInfos.Add(orderByMessage);
-                MysqlDbContext.SaveChanges();
+                mysqlDbContext.FccOrderInfos.Add(orderByMessage);
+                mysqlDbContext.SaveChanges();
                 return orderByMessage;
             }
             else
             {
                 logger.Info($"receive order from machine,padding data right now");
                 orderFromMachine.PaddingAuthorizationOrderData(fccOrderInfo);
-                MysqlDbContext.SaveChanges();
+                mysqlDbContext.SaveChanges();
                 return fccOrderInfo;
             }
             
@@ -1331,6 +1366,7 @@ namespace HengshanPaymentTerminal
 
         private async void CreateTransaction(FccOrderInfo fccOrderInfo)
         {
+            MysqlDbContext mysqlDbContext = new MysqlDbContext();
             CreateTransaction createTransaction = new CreateTransaction(fccOrderInfo);
             logger.Info($"create transaction, {JsonConvert.SerializeObject(createTransaction)}");
             HttpResponseMessage httpResponseMessage = await httpClientUtil.CreateTransaction(JsonConvert.SerializeObject(createTransaction));
@@ -1343,7 +1379,7 @@ namespace HengshanPaymentTerminal
             
             fccOrderInfo.CloundOrderId = response?.data?.Id;
             fccOrderInfo.UploadState = response?.data == null ? 0 : 1;
-            MysqlDbContext.SaveChanges();
+            mysqlDbContext.SaveChanges();
         }
 
         /// <summary>

+ 6 - 0
HengshanPaymentTerminal/Http/Request/HttpRequest.cs

@@ -413,6 +413,7 @@ namespace HengshanPaymentTerminal.Http.Request
             this.TransactionNumber = fccOrderInfo.Ttc.ToString();
             this.MiniProgramID = null;
             this.PaymentMethod = null;
+            this.FuelItemPumpTotalizerVolume = fccOrderInfo.PumpCode;
         }
 
         /// <summary>
@@ -469,6 +470,11 @@ namespace HengshanPaymentTerminal.Http.Request
         /// 支付方式
         /// </summary>
         public int? PaymentMethod { get; set; }
+
+        /// <summary>
+        /// 泵码
+        /// </summary>
+        public decimal? FuelItemPumpTotalizerVolume {  get; set; }
     }
 
     /// <summary>

+ 23 - 6
HengshanPaymentTerminal/MessageEntity/Incoming/OrderFromMachine.cs

@@ -1,5 +1,6 @@
 using Castle.Components.DictionaryAdapter.Xml;
 using Edge.Core.Domain.FccOrderInfo;
+using Edge.Core.Domain.FccStationInfo.Output;
 using Edge.Core.Parser.BinaryParser.MessageEntity;
 using Microsoft.EntityFrameworkCore.Metadata.Internal;
 using System;
@@ -61,6 +62,11 @@ namespace HengshanPaymentTerminal.MessageEntity.Incoming
         /// </summary>
         public decimal volume { get; set; }
 
+        /// <summary>
+        /// 泵码
+        /// </summary>
+        public decimal pumpCode { get; set; }
+
         public override byte[] ToCommonByteArray()
         {
             byte[] content = new byte[] { 0x55, this.Handle, (byte)this.nozzleNum, ((byte)RESULT.OVER) };
@@ -94,29 +100,40 @@ namespace HengshanPaymentTerminal.MessageEntity.Incoming
             uint volumeInt = Bytes2Number<uint>(datas, 34, 3);
             this.volume = volumeInt / 100m;
 
+            int punpCodeInt = Bytes2Number<int>(datas, 37, 4);
+            this.pumpCode = punpCodeInt / 100m;
+
+
+
             return this;
         }
 
         public FccOrderInfo ToComponent(string? oilName)
         {
-            
+
             return new FccOrderInfo
             {
                 Ttc = this.ttc,
                 AuthorizationTime = this.dispenserTime,
                 EndTime = this.endTime,
+                PaymentTime = null,
                 NozzleNum = this.nozzleNum,
-                //PayType = 0x21,
+                OilName = oilName ?? "",
                 PaymentStatus = 0,
+                //PayType = 0x21,
+                CloundOrderId = null,
                 Amount = this.amount,
                 Volume = this.volume,
                 //AmountPayable = this.amount,
-                Price = this.price,
                 UploadState = 0,
                 IsDelete = 0,
-                PaymentTime = null,
-                OilName = oilName ?? "",
-                CloundOrderId = null
+                Price = this.price,
+                //RefundAmount = 0,
+                UserName = "",
+                PhoneNumber = "",
+                PaymentName = "",
+                PumpCode = this.pumpCode
+
             };
         }
 

+ 25 - 0
HengshanPaymentTerminal/Mqtt/Request/MqttRequest.cs

@@ -25,6 +25,10 @@ namespace HengshanPaymentTerminal.Mqtt.Request
         /// </summary>
         public string data { get; set; }
 
+        public string? UserName { get; set; }
+
+        public string? UserPhoneNumber { get; set; }
+
     }
 
     /// <summary>
@@ -497,6 +501,17 @@ namespace HengshanPaymentTerminal.Mqtt.Request
         /// 单价
         /// </summary>
         public decimal? Price { get; set; }
+
+        public decimal? FuelItemPumpTotalizerVolume {  get; set; }
+        ///// <summary>
+        ///// 用户名
+        ///// </summary>
+        //public string? UserName { get; set; }
+
+        ///// <summary>
+        ///// 手机号
+        ///// </summary>
+        //public string? UserPhoneNumber { get; set; }
     }
 
     /// <summary>
@@ -638,5 +653,15 @@ namespace HengshanPaymentTerminal.Mqtt.Request
         /// 单价
         /// </summary>
         public decimal? Price { get; set; }
+
+        ///// <summary>
+        ///// 用户名
+        ///// </summary>
+        //public string? UserName {  get; set; }
+
+        ///// <summary>
+        ///// 手机号
+        ///// </summary>
+        //public string? UserPhoneNumber { get; set; }
     }
 }

+ 1 - 1
src/FccLife.Web/Controller/OrderInfoController.cs

@@ -30,7 +30,7 @@ namespace FccLite.Web.Controller
         {
             logger.Info($"download after pay order excel:{JsonConvert.SerializeObject(orderInfoPageInput)}");
             byte[] fileBytes = await _orderInfoService.DownloadAfterPayOrderExcel(orderInfoPageInput);
-            return File(fileBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $"{orderInfoPageInput.startCheckTime}-{orderInfoPageInput.endCheckTime}订单报表.xlsx");
+            return File(fileBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "orders.xlsx");
         }
     }
 }

+ 4 - 0
src/FccLife.Web/Program.cs

@@ -17,6 +17,7 @@ using FccLite.Web.Services.FccOrderInfo;
 using FccLite.Web.Repositories.FccOrderInfo;
 using FccLite.Web.Services.FccMachineInfo;
 using FccLite.Web.Repositories.FccMachineInfo;
+using OfficeOpenXml;
 
 var builder = WebApplication.CreateBuilder(args);
  DefaultDispatcher processorsDispatcher = null;
@@ -48,6 +49,9 @@ builder.Services.AddScoped<IMachineRepository, MachineReposity>();
 builder.Services.AddScoped<IHttpClient, HttpClientService>();
 builder.Services.AddScoped<IHttpClientUtil, HttpClientUtils>();
 
+//excel
+ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
+
 //swagger
 builder.Services.AddSwaggerGen(c =>
 {

+ 7 - 0
src/FccLife.Web/Repositories/FccOrderInfo/IOrderInfoReposity.cs

@@ -12,5 +12,12 @@ namespace FccLite.Web.Repositories.FccOrderInfo
         /// <param name="orderInfoPageInput"></param>
         /// <returns></returns>
         Task<IEnumerable<OrderInfo>> GetPage(OrderInfoPageInput orderInfoPageInput);
+
+        /// <summary>
+        /// 过滤查询订单
+        /// </summary>
+        /// <param name="orderInfoPageInput"></param>
+        /// <returns></returns>
+        Task<IEnumerable<OrderInfo>> GetOrderFilter(OrderInfoPageInput orderInfoPageInput);
     }
 }

+ 20 - 0
src/FccLife.Web/Repositories/FccOrderInfo/OrderInfoReposity.cs

@@ -39,5 +39,25 @@ namespace FccLite.Web.Repositories.FccOrderInfo
 
             return await query.Skip((orderInfoPageInput.page - 1) * orderInfoPageInput.pageSize).Take(orderInfoPageInput.pageSize).ToListAsync();
         }
+
+        public async Task<IEnumerable<OrderInfo>> GetOrderFilter(OrderInfoPageInput orderInfoPageInput)
+        {
+            Edge.Core.Domain.FccStationInfo.FccStationInfo? fccStationInfo = await _dbContext.FccStationInfos.FirstOrDefaultAsync();
+            var stationName = fccStationInfo?.Name ?? "";
+
+            var query = from qo in _dbContext.FccOrderInfos
+                        join qn in _dbContext.NozzleInfos on qo.NozzleNum equals qn.ExternalNum
+                        join qm in _dbContext.FccMachineInfos on qn.MachineId equals qm.Id
+                        where qo.IsDelete == 0
+                        where string.IsNullOrEmpty(orderInfoPageInput.oilName) || qo.OilName == orderInfoPageInput.oilName
+                        where orderInfoPageInput.nozzleNum == null || qo.NozzleNum == orderInfoPageInput.nozzleNum
+                        where orderInfoPageInput.paymentType == null || qo.PayType == orderInfoPageInput.paymentType
+                        where (orderInfoPageInput.startCheckTime == null || orderInfoPageInput.endCheckTime == null || qo.EndTime == null)
+                                || qo.EndTime >= orderInfoPageInput.startCheckTime && qo.EndTime <= orderInfoPageInput.endCheckTime
+                        where string.IsNullOrEmpty(orderInfoPageInput.phoneNumberOruserName) || qo.UserName == orderInfoPageInput.phoneNumberOruserName || qo.PhoneNumber == orderInfoPageInput.phoneNumberOruserName
+                        orderby qo.AuthorizationTime descending
+                        select new OrderInfo(qo, stationName, qm.Name);
+            return await query.ToListAsync();
+        }
     }
 }

+ 49 - 41
src/FccLife.Web/Services/FccOrderInfo/OrderInfoService.cs

@@ -9,6 +9,7 @@ namespace FccLite.Web.Services.FccOrderInfo
 {
     public class OrderInfoService : IOrderInfoService
     {
+        static NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
         private readonly IOrderInfoReposity _orderInfoReposity;
         private readonly IStationRepository _stationRepository;
 
@@ -29,10 +30,8 @@ namespace FccLite.Web.Services.FccOrderInfo
 
         public async Task<OrderInfoOutput> GetPage(OrderInfoPageInput orderInfoPageInput)
         {
-            //Edge.Core.Domain.FccStationInfo.FccStationInfo? fccStationInfo = await _stationRepository.GetFirstStation();
             IEnumerable<OrderInfo> enumerable = await _orderInfoReposity.GetPage(orderInfoPageInput);
             List<OrderInfo> orderInfos = enumerable.ToList();
-            //List<OrderInfo> orderInfos = enumerable.Select(order => new OrderInfo(order,fccStationInfo?.Name ?? "","")).ToList();
             return new OrderInfoOutput()
             {
                 Total = orderInfos.Count,
@@ -43,51 +42,60 @@ namespace FccLite.Web.Services.FccOrderInfo
 
         public async Task<byte[]> DownloadAfterPayOrderExcel(OrderInfoPageInput orderInfoPageInput)
         {
-            OrderInfoOutput orderInfoOutput = await GetPage(orderInfoPageInput);
-            var package = new ExcelPackage();
-            ExcelWorksheet excelWorksheet = package.Workbook.Worksheets.Add("Sheet1");
-
-            for (global::System.Int32 index = 1; index <= tableTitle.Length; index++)
+            IEnumerable<OrderInfo> enumerable = await _orderInfoReposity.GetOrderFilter(orderInfoPageInput);
+            try
             {
-                excelWorksheet.Cells[1, index].Value = tableTitle[index];
-            }
+                var package = new ExcelPackage();
+                ExcelWorksheet excelWorksheet = package.Workbook.Worksheets.Add("Sheet1");
 
-            using (var range = excelWorksheet.Cells[1, 1, 1, tableTitle.Length])
-            {
-                range.Style.Font.Bold = true;
-            }
+                for (int index = 0; index < tableTitle.Length; index++)
+                {
+                    excelWorksheet.Cells[1, index+1].Value = tableTitle[index];
+                }
 
-            int row = 2;
-            decimal allVolume = 0;
-            decimal allAmount = 0;
-            foreach (var order in orderInfoOutput.List)
-            {
-                excelWorksheet.Cells[row, 1].Value = order.Ttc;
-                excelWorksheet.Cells[row, 2].Value = order.StationName;
-                excelWorksheet.Cells[row, 3].Value = order.MachineName;
-                excelWorksheet.Cells[row, 4].Value = order.NozzleNum;
-                excelWorksheet.Cells[row, 5].Value = order.OilName;
-                excelWorksheet.Cells[row, 6].Value = order.Price;
-                excelWorksheet.Cells[row, 7].Value = order.Volume;
-                excelWorksheet.Cells[row, 8].Value = order.Amount;
-                excelWorksheet.Cells[row, 9].Value = order.EndTime;
-                excelWorksheet.Cells[row, 10].Value = order.PaymentName;
-                excelWorksheet.Cells[row, 11].Value = order.PaymentName;
-                excelWorksheet.Cells[row, 12].Value = _afterPayType[order.PaymentStatus] ?? "未知状态";
-                excelWorksheet.Cells[row, 13].Value = order.UserName;
+                using (var range = excelWorksheet.Cells[1, 1, 1, tableTitle.Length])
+                {
+                    range.Style.Font.Bold = true;
+                }
 
-                allVolume += order.Volume;
-                allAmount += order.Amount;
-                row++;
-            }
-            excelWorksheet.Cells[row, 7].Value = allVolume;
-            excelWorksheet.Cells[row, 8].Value = allAmount;
+                int row = 2;
+                decimal allVolume = 0;
+                decimal allAmount = 0;
+                foreach (var order in enumerable)
+                {
+                    excelWorksheet.Cells[row, 1].Value = order.Ttc;
+                    excelWorksheet.Cells[row, 2].Value = order.StationName;
+                    excelWorksheet.Cells[row, 3].Value = order.MachineName;
+                    excelWorksheet.Cells[row, 4].Value = order.NozzleNum;
+                    excelWorksheet.Cells[row, 5].Value = order.OilName;
+                    excelWorksheet.Cells[row, 6].Value = order.Price;
+                    excelWorksheet.Cells[row, 7].Value = order.Volume;
+                    excelWorksheet.Cells[row, 8].Value = order.Amount;
+                    excelWorksheet.Cells[row, 9].Value = order.EndTime != null ? order.EndTime?.ToString("yyyy-MM-dd HH:mm:ss") : "";
+                    excelWorksheet.Cells[row, 10].Value = order.PaymentTime != null ? order.PaymentTime?.ToString("yyyy-MM-dd HH:mm:ss") : "";
+                    excelWorksheet.Cells[row, 11].Value = order.PaymentName;
 
-            return package.GetAsByteArray();
-            //using (var package = new ExcelPackage())
-            //{
+                    string payTypeStr = "未知状态";
+                    _afterPayType.TryGetValue(order.PaymentStatus, out payTypeStr);
+                    excelWorksheet.Cells[row, 12].Value = payTypeStr;
+
+                    excelWorksheet.Cells[row, 13].Value = order.UserName;
+
+                    allVolume += order.Volume;
+                    allAmount += order.Amount;
+                    row++;
+                }
+                excelWorksheet.Cells[row, 7].Value = allVolume;
+                excelWorksheet.Cells[row, 8].Value = allAmount;
+
+                return package.GetAsByteArray();
+            } catch(Exception e)
+            {
+                Console.WriteLine(e);
+                Logger.Error(e.Message);
+            }
 
-            //}
+            return new byte[0];
         }
     }
 }

+ 5 - 5
src/FccWeb/admin.ui.plus-master/src/api/api.ts

@@ -1,3 +1,4 @@
+import axios from 'axios'
 import request from './request'    // 引入封装的axios
 
 /** ----- 站点 ----- */
@@ -185,11 +186,10 @@ export const getOrderFilter =(data:any)=>{
 
 //导出excel
 export const downloadAfterpayOrder = (data:any) => {
-	return request({
-		url:'/qrFueling/order/downloadOrderAfterPayOrderExcel',
-		method:'post',
-		data:data,
-		responseType:'blob'
+	const send = axios.create({
+		timeout: 5000, // 超时
+		baseURL: '/api',
 	})
+	return send.post('/qrFueling/order/downloadOrderAfterPayOrderExcel', data, { responseType: 'arraybuffer' })
 }
 

+ 27 - 10
src/FccWeb/admin.ui.plus-master/src/views/admin/order/index.vue

@@ -32,7 +32,7 @@
                             </el-col> 
                             <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
                                 <el-form-item label="加油时间">
-                                    <el-date-picker v-model="Data.time1" type="datetimerange" value-format="YYYY-MM-DD HH:mm:ss" range-separator="To" start-placeholder="开始日期" end-placeholder="结束日期" />
+                                    <el-date-picker v-model="Data.time1" type="datetimerange" value-format="YYYY-MM-DD HH:mm:ss" range-separator="To" start-placeholder="开始日期" end-placeholder="结束日期" clearable=false />
                                 </el-form-item>
                             </el-col>   
                             <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
@@ -243,12 +243,12 @@ const onReset = () => {
     Data.time1 = "";
     // 重置时选择“全部”
     Data.selectedPayment = '0'; 
-    onQuery();
+    initTime()
 };
 
 /** 下载excel */
 const downloadExcel = async () => {
-    return
+    // return
     Data.loading = true;
     try {
         let filterParams = {
@@ -263,8 +263,19 @@ const downloadExcel = async () => {
             // 如果选择“全部”,不传递paymentType参数
             filterParams.paymentType = null; 
         }
-        const orders = await downloadAfterpayOrder(filterParams);
+        const stream = await downloadAfterpayOrder(filterParams);
+        const url = window.URL.createObjectURL(new Blob([stream.data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }))
+        const link = document.createElement('a');
+        link.href = url;
+        
+        link.setAttribute('download',
+        `${formatDate(filterParams.startCheckTime,"YYYY-mm-dd")}-${formatDate(filterParams.startCheckTime,"YYYY-mm-dd")}订单报表.xlsx`)
         
+        document.body.appendChild(link);
+        link.click();
+        // 下载完成后移除链接,并释放内存
+        link.remove();
+        window.URL.revokeObjectURL(url);
     } catch (error) {
         console.error('查询订单数据时出错:', error);
     } finally {
@@ -291,14 +302,19 @@ const toView = ((data: any) => {
     console.log('查看')
 })
 
-// 挂载时
-onMounted(async () => {
+const initTime = () => {
     const now = new Date();
     const todayStart = new Date(now.getFullYear(),now.getMonth(),now.getDate());
     var todayEnd = new Date(now.getFullYear(),now.getMonth(),now.getDate());
     todayEnd.setHours(23,59,59,999);
     Data.time1 = [formatDate(todayStart,"YYYY-mm-dd HH:MM:SS"),formatDate(todayEnd,"YYYY-mm-dd HH:MM:SS")]
 
+    Data.Filter.startCheckTime = todayStart;
+    Data.Filter.endCheckTime = todayEnd;
+}
+// 挂载时
+onMounted(async () => {
+    initTime();
     const response = await getOrderFilter();
     console.log("支付方式请求结果", response);
     // 确保response.payments是一个数组
@@ -335,12 +351,13 @@ watch(() => Data.Filter.oilName,(val) => {
 
 /** 过滤条件监听——时间 */
 watch(() => Data.time1,(val) => {
-    console.log("时间变化",val)
-    if(val?.length === 0) return
+    debugger
+    if(val == null || val?.length === 0) {
+        initTime()
+        return
+    }
     Data.Filter.startCheckTime = new Date(val?.[0].toString());
     Data.Filter.endCheckTime = new Date(val?.[1].toString());
-
-    console.log("时间变化后",formatDate(Data.Filter.startCheckTime,"YYYY-mm-dd HH:MM:SS"),formatDate(Data.Filter.endCheckTime,"YYYY-mm-dd HH:MM:SS"))
 })
 
 /** 过滤条件监听——支付方式 */