瀏覽代碼

feat:订单页增加导出excel功能,暂存,未完成,目前请求失败

Zhenghanjv 9 月之前
父節點
當前提交
e0d6edbbe4

+ 1 - 0
Edge.Core/Edge.Core.csproj

@@ -15,6 +15,7 @@
     <PackageReference Include="AutoMapper" Version="13.0.1" />
     <PackageReference Include="Castle.Core" Version="5.1.1" />
     <PackageReference Include="DFS.Infrastructure" Version="6.2.1" />
+    <PackageReference Include="EPPlus" Version="7.5.3" />
     <PackageReference Include="Microsoft.AspNetCore.Diagnostics" Version="2.2.0" />
     <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.2.7" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />

+ 1 - 1
HengshanPaymentTerminal/HengshanPayTermHandler.cs

@@ -786,7 +786,7 @@ namespace HengshanPaymentTerminal
                 //list.AddRange(qrCodeBytes);
                 //byte[] sendBytes = content2data(list.ToArray(), null);
 
-                SendQrCode sendQrCode = new SendQrCode(item.NozzleNum, smallProgram, getFrame(null));
+                SendQrCode sendQrCode = new SendQrCode((int)item.CloundNozzleId, smallProgram, getFrame(null));
                 byte[] commandAndNozzle = { sendQrCode.Handle, (byte)sendQrCode.NozzleNum };
 
                 Thread.Sleep(5000);

+ 1 - 1
HengshanPaymentTerminal/MessageEntity/Outgoing/SendQrCode.cs

@@ -34,7 +34,7 @@ namespace HengshanPaymentTerminal.MessageEntity.Outgoing
         {
             List<Byte> list = new List<Byte>();
             byte[] commandAndNozzle = { this.Handle, (byte)this.NozzleNum };
-            string qrCode = this.SmallProgram + "/" + this.NozzleNum;
+            string qrCode = this.SmallProgram + "?id=" + this.NozzleNum;
             byte[] qrCodeBytes = Encoding.ASCII.GetBytes(qrCode);
             list.AddRange(commandAndNozzle);
             list.Add((byte)qrCodeBytes.Length);

+ 8 - 0
src/FccLife.Web/Controller/OrderInfoController.cs

@@ -24,5 +24,13 @@ namespace FccLite.Web.Controller
             OrderInfoOutput orderInfoOutput = await _orderInfoService.GetPage(orderInfoPageInput);
             return Ok(orderInfoOutput);
         }
+
+        [HttpPost("downloadOrderAfterPayOrderExcel")]
+        public async Task<IActionResult> DownloadOrderAfterPayOrderExcel(OrderInfoPageInput orderInfoPageInput)
+        {
+            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");
+        }
     }
 }

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

@@ -37,23 +37,6 @@ namespace FccLite.Web.Repositories.FccOrderInfo
                         orderby qo.AuthorizationTime descending
                         select new OrderInfo(qo, stationName, qm.Name);
 
-
-
-         
-
-            //IQueryable<Edge.Core.Domain.FccOrderInfo.FccOrderInfo> query = _dbContext.FccOrderInfos.AsQueryable();
-
-            //query = query.Where(order => order.IsDelete == 0);
-            //query = query.WhereIf(orderInfoPageInput.oilName != null && !"".Equals(orderInfoPageInput.oilName),order => order.OilName.Equals(orderInfoPageInput.oilName));
-            //query = query.WhereIf(orderInfoPageInput.nozzleNum != null, order => order.NozzleNum == orderInfoPageInput.nozzleNum);
-            ////query = query.WhereIf(orderInfoPageInput.ttc != null, order => order.Ttc == orderInfoPageInput.ttc);
-            //if (orderInfoPageInput.startCheckTime != null && orderInfoPageInput.endCheckTime != null)
-            //{
-            //    query = query.Where(order => order.EndTime != null && (order.EndTime >= orderInfoPageInput.startCheckTime && order.EndTime <= orderInfoPageInput.endCheckTime));
-            //}
-            //query = query.WhereIf(orderInfoPageInput.paymentType != null, order => order.PayType == orderInfoPageInput.paymentType);
-            //query = query.WhereIf(orderInfoPageInput.phoneNumberOruserName != null, order => order.UserName.Equals(orderInfoPageInput.phoneNumberOruserName) || order.PhoneNumber.Equals(orderInfoPageInput.phoneNumberOruserName));
-            //query = query.OrderByDescending(order => order.EndTime);
             return await query.Skip((orderInfoPageInput.page - 1) * orderInfoPageInput.pageSize).Take(orderInfoPageInput.pageSize).ToListAsync();
         }
     }

+ 8 - 0
src/FccLife.Web/Services/FccOrderInfo/IOrderInfoService.cs

@@ -1,5 +1,6 @@
 using Edge.Core.Domain.FccOrderInfo.Input;
 using Edge.Core.Domain.FccOrderInfo.Output;
+using Microsoft.AspNetCore.Mvc;
 
 namespace FccLite.Web.Services.FccOrderInfo
 {
@@ -11,5 +12,12 @@ namespace FccLite.Web.Services.FccOrderInfo
         /// <param name="orderInfoOutput">过滤条件</param>
         /// <returns></returns>
         Task<OrderInfoOutput> GetPage(OrderInfoPageInput orderInfoPageInput);
+
+        /// <summary>
+        /// 下载后支付订单excel
+        /// </summary>
+        /// <param name="orderInfoPageInput"></param>
+        /// <returns></returns>
+        Task<byte[]> DownloadAfterPayOrderExcel(OrderInfoPageInput orderInfoPageInput);
     }
 }

+ 61 - 0
src/FccLife.Web/Services/FccOrderInfo/OrderInfoService.cs

@@ -2,6 +2,8 @@
 using Edge.Core.Domain.FccOrderInfo.Output;
 using FccLite.Web.Repositories.FccOrderInfo;
 using FccLite.Web.Repositories.FccStationInfo;
+using Microsoft.AspNetCore.Mvc;
+using OfficeOpenXml;
 
 namespace FccLite.Web.Services.FccOrderInfo
 {
@@ -9,12 +11,21 @@ namespace FccLite.Web.Services.FccOrderInfo
     {
         private readonly IOrderInfoReposity _orderInfoReposity;
         private readonly IStationRepository _stationRepository;
+
+        private readonly string[] tableTitle = { "流水号","油站", "油机号", "油枪", "油品", "单价", "升数", "金额", "挂枪时间", "交易时间", "支付方式", "支付状态", "支付用户" };
+        private readonly Dictionary<int, string> _afterPayType = new Dictionary<int, string>
+        {
+            {0,"未支付" },
+            {1,"已支付" }
+        };
+
         public OrderInfoService(IOrderInfoReposity orderInfoReposity,IStationRepository stationRepository) 
         {
             _orderInfoReposity = orderInfoReposity;
             _stationRepository = stationRepository;
         }
 
+        
 
         public async Task<OrderInfoOutput> GetPage(OrderInfoPageInput orderInfoPageInput)
         {
@@ -28,5 +39,55 @@ namespace FccLite.Web.Services.FccOrderInfo
                 List = orderInfos
             };
         }
+
+
+        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++)
+            {
+                excelWorksheet.Cells[1, index].Value = tableTitle[index];
+            }
+
+            using (var range = excelWorksheet.Cells[1, 1, 1, tableTitle.Length])
+            {
+                range.Style.Font.Bold = true;
+            }
+
+            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;
+
+                allVolume += order.Volume;
+                allAmount += order.Amount;
+                row++;
+            }
+            excelWorksheet.Cells[row, 7].Value = allVolume;
+            excelWorksheet.Cells[row, 8].Value = allAmount;
+
+            return package.GetAsByteArray();
+            //using (var package = new ExcelPackage())
+            //{
+
+            //}
+        }
     }
 }

文件差異過大導致無法顯示
+ 524 - 462
src/FccWeb/admin.ui.plus-master/package-lock.json


+ 1 - 0
src/FccWeb/admin.ui.plus-master/package.json

@@ -36,6 +36,7 @@
     "jsplumb": "^2.15.6",
     "lodash": "^4.17.21",
     "mitt": "^3.0.0",
+    "moment": "^2.30.1",
     "nprogress": "^0.2.0",
     "path": "^0.12.7",
     "pinia": "^2.1.4",

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

@@ -183,3 +183,13 @@ export const getOrderFilter =(data:any)=>{
 	})
 }
 
+//导出excel
+export const downloadAfterpayOrder = (data:any) => {
+	return request({
+		url:'/qrFueling/order/downloadOrderAfterPayOrderExcel',
+		method:'post',
+		data:data,
+		responseType:'blob'
+	})
+}
+

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

@@ -12,7 +12,11 @@ import VueGridLayout from 'vue-grid-layout'
 import globalProperties from '/@/globalProperties'
 // import ECharts   from '/@/components/echart/index.vue'
 import DataVVue3 from '@kjgl77/datav-vue3'
-
+// 一次性解决时区和日期格式问题
+import moment from 'moment'
+Date.prototype.toISOString = function(){
+    return moment(this).format('YYYY-MM-DDTHH:mm:ss')
+}
 
 
 const app = createApp(App)

+ 39 - 8
src/FccWeb/admin.ui.plus-master/src/views/admin/order/index.vue

@@ -50,6 +50,7 @@
                         <el-row>
                             <el-button type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
                             <el-button type="primary" icon="ele-RefreshRight" @click="onReset"> 重置 </el-button>
+                            <el-button type="primary" icon="ele-Search" @click="downloadExcel"> 导出EXCEL </el-button>
                         </el-row>
                     </el-row>
                 </el-card>
@@ -96,9 +97,10 @@
 
 <script setup lang="ts" name="partsManagement/oilGun">
 import { onMounted, reactive, watch, computed } from "vue";
-import { getOrderInfoPage,getOrderFilter } from "/@/api/api";
+import { getOrderInfoPage,getOrderFilter,downloadAfterpayOrder } from "/@/api/api";
 import { OrderInfoFilter } from "/@/api/admin/orderDto/QRBookDto";
 import { nextTick } from 'vue';
+import { formatDate } from '/@/utils/formatTime'
 
 /**页面对象 */
 const Data = reactive({
@@ -117,8 +119,6 @@ const Data = reactive({
         startCheckTime: null,
         /**加油结束的时间 */
         endCheckTime: null,
-        /**油站 */
-        StationName: null,
         // 支付方式类型
         paymentType:null,
         // 用户手机号码or用户名称
@@ -195,11 +195,6 @@ const onQuery = async () => {
             // 如果选择“全部”,不传递paymentType参数
             filterParams.paymentType = null; 
         }
-    
-        // if(Data.Filter.payUserName=order.userName||order.phoneNumber){
-        //     filterParams.phoneNumberOruserName = Data.Filter.payUserName
-        // }
-
         const orders = await getOrderInfoPage(filterParams);
         console.log('后端返回的原始数据:', orders);
         console.log('后端返回的总记录数:', orders.total);
@@ -251,6 +246,33 @@ const onReset = () => {
     onQuery();
 };
 
+/** 下载excel */
+const downloadExcel = async () => {
+    return
+    Data.loading = true;
+    try {
+        let filterParams = {
+            page: Data.pageInput.page,
+            pageSize: Data.pageInput.pageSize,
+           ...Data.Filter
+        };
+        // 根据选中的支付方式设置筛选参数
+        if (Data.selectedPayment && Data.selectedPayment!== '0') {
+            filterParams.paymentType = parseInt(Data.selectedPayment);
+        } else {
+            // 如果选择“全部”,不传递paymentType参数
+            filterParams.paymentType = null; 
+        }
+        const orders = await downloadAfterpayOrder(filterParams);
+        
+    } catch (error) {
+        console.error('查询订单数据时出错:', error);
+    } finally {
+        Data.loading = false;
+        await nextTick();
+    }
+}
+
 /** 页数修改 */
 const onSizeChange = (pageSize) => {
     Data.pageInput.pageSize = pageSize;
@@ -271,6 +293,12 @@ const toView = ((data: any) => {
 
 // 挂载时
 onMounted(async () => {
+    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")]
+
     const response = await getOrderFilter();
     console.log("支付方式请求结果", response);
     // 确保response.payments是一个数组
@@ -307,9 +335,12 @@ watch(() => Data.Filter.oilName,(val) => {
 
 /** 过滤条件监听——时间 */
 watch(() => Data.time1,(val) => {
+    console.log("时间变化",val)
     if(val?.length === 0) 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"))
 })
 
 /** 过滤条件监听——支付方式 */

部分文件因文件數量過多而無法顯示