klzhangweiya 1 тиждень тому
батько
коміт
cc4af40f98
14 змінених файлів з 405 додано та 51 видалено
  1. 105 0
      SERVER/ChickenFarmV3/vb-common/vb-common-excel/src/main/java/cn/vber/common/excel/utils/CkCoopCellWriteHandler.java
  2. 137 0
      SERVER/ChickenFarmV3/vb-common/vb-common-excel/src/main/java/cn/vber/common/excel/utils/CkCoopMergeStrategy.java
  3. 40 0
      SERVER/ChickenFarmV3/vb-common/vb-common-excel/src/main/java/cn/vber/common/excel/utils/ExcelUtil.java
  4. 18 4
      SERVER/ChickenFarmV3/vb-modules/vb-breeding/src/main/java/cn/vber/breeding/controller/CoopBatchReportController.java
  5. 4 1
      SERVER/ChickenFarmV3/vb-modules/vb-breeding/src/main/java/cn/vber/breeding/domain/vo/CoopBatchReportVo.java
  6. 0 21
      SERVER/ChickenFarmV3/vb-modules/vb-breeding/src/main/java/cn/vber/breeding/domain/vo/excel/Demo.java
  7. 51 0
      SERVER/ChickenFarmV3/vb-modules/vb-breeding/src/main/java/cn/vber/breeding/domain/vo/report/CoopBatchExportVo.java
  8. 1 21
      SERVER/ChickenFarmV3/vb-modules/vb-breeding/src/main/java/cn/vber/breeding/domain/vo/report/CoopBatchReportDetailResult.java
  9. BIN
      SERVER/ChickenFarmV3/vb-modules/vb-breeding/src/main/resources/excel/reportTemplate_coop.xlsx
  10. BIN
      SERVER/ChickenFarmV3/vb-modules/vb-breeding/src/main/resources/excel/reportTemplate_egg.xlsx
  11. 7 0
      UI/VB.VUE/src/api/reports/_coopBatch.ts
  12. 38 2
      UI/VB.VUE/src/components/reports/ChickenCoopReport.vue
  13. 2 1
      UI/VB.VUE/src/views/report/coop/index.vue
  14. 2 1
      UI/VB.VUE/src/views/report/egg/index.vue

+ 105 - 0
SERVER/ChickenFarmV3/vb-common/vb-common-excel/src/main/java/cn/vber/common/excel/utils/CkCoopCellWriteHandler.java

@@ -0,0 +1,105 @@
+package cn.vber.common.excel.utils;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.idev.excel.write.handler.CellWriteHandler;
+import cn.idev.excel.write.handler.context.CellWriteHandlerContext;
+import cn.idev.excel.write.metadata.style.WriteCellStyle;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.hssf.usermodel.HSSFPalette;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.hssf.util.HSSFColor;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.xssf.usermodel.XSSFCellStyle;
+import org.apache.poi.xssf.usermodel.XSSFColor;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+import java.util.List;
+import java.util.Set;
+import java.util.HashSet;
+
+/**
+ * 鸡舍报表单元格写入处理器
+ * 在数据填充阶段设置单元格样式,确保样式能正确应用
+ *
+ * @author Iwb
+ */
+@Slf4j
+public class CkCoopCellWriteHandler implements CellWriteHandler {
+
+    /**
+     * 需要设置背景色的行索引集合
+     */
+    private final Set<Integer> totalRowIndexes;
+
+    /**
+     * 需要设置背景色的列数
+     */
+    private final int cellNum;
+
+    /**
+     * 背景色的十六进制值
+     */
+    private final String backgroundColorHex;
+
+    public CkCoopCellWriteHandler(List<Integer> totalRows, String coopType) {
+        this.totalRowIndexes = new HashSet<>(totalRows != null ? totalRows : CollUtil.newArrayList());
+        this.cellNum = "coop".equals(coopType) ? 14 : 19;
+        this.backgroundColorHex = "#5B9BD5";
+    }
+
+
+
+    @Override
+    public void afterCellDispose(CellWriteHandlerContext context) {
+        // 获取当前单元格信息
+        Cell cell = context.getCell();
+        int rowIndex = cell.getRowIndex();
+        int columnIndex = cell.getColumnIndex();
+
+        // 判断当前单元格是否在需要设置背景色的范围内
+        if (totalRowIndexes.contains(rowIndex) && columnIndex < cellNum) {
+            // 确保单元格有值,空白单元格可能不显示背景色
+            if (cell.getCellType() == CellType.BLANK) {
+                cell.setCellValue("");
+            }
+
+            // 使用工作簿创建样式并设置背景色
+            Workbook workbook = context.getWriteWorkbookHolder().getWorkbook();
+            CellStyle cellStyle = workbook.createCellStyle();
+
+            // 复制原有样式属性(如果存在)
+            CellStyle originalStyle = cell.getCellStyle();
+            if (originalStyle != null) {
+                cellStyle.cloneStyleFrom(originalStyle);
+            }
+
+            // 应用样式到单元格
+            cell.setCellStyle(cellStyle);
+            // 重要:同时设置WriteCellStyle以防止被模板填充覆盖
+            WriteCellStyle writeCellStyle = new WriteCellStyle();
+            writeCellStyle.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex());
+            writeCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
+            context.getFirstCellData().setWriteCellStyle(writeCellStyle);
+        }
+    }
+
+    /**
+     * 将十六进制颜色值转换为RGB字节数组
+     * @param hex 十六进制颜色值,如 "#5B9BD5"
+     * @return RGB字节数组
+     */
+    private byte[] hexToRgb(String hex) {
+        // 移除可能存在的 # 前缀
+        if (hex.startsWith("#")) {
+            hex = hex.substring(1);
+        }
+
+        // 解析RGB值
+        int r = Integer.parseInt(hex.substring(0, 2), 16);
+        int g = Integer.parseInt(hex.substring(2, 4), 16);
+        int b = Integer.parseInt(hex.substring(4, 6), 16);
+
+        return new byte[] {(byte) r, (byte) g, (byte) b};
+    }
+
+}

+ 137 - 0
SERVER/ChickenFarmV3/vb-common/vb-common-excel/src/main/java/cn/vber/common/excel/utils/CkCoopMergeStrategy.java

@@ -0,0 +1,137 @@
+package cn.vber.common.excel.utils;
+
+import cn.idev.excel.metadata.Head;
+import cn.idev.excel.write.handler.SheetWriteHandler;
+import cn.idev.excel.write.handler.WorkbookWriteHandler;
+import cn.idev.excel.write.handler.context.WorkbookWriteHandlerContext;
+import cn.idev.excel.write.merge.AbstractMergeStrategy;
+import cn.idev.excel.write.metadata.holder.WriteSheetHolder;
+import cn.idev.excel.write.metadata.holder.WriteWorkbookHolder;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.usermodel.XSSFColor;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+@Slf4j
+public class CkCoopMergeStrategy  extends AbstractMergeStrategy implements WorkbookWriteHandler {
+
+    private final List<Integer> totalRows;
+    private final Map<Integer, List<Integer>> coopRows;
+    private final List<CellRangeAddress> cellList = new ArrayList<>();
+    private Integer cellNum;
+    private final AtomicBoolean merged = new AtomicBoolean(false);
+
+    public CkCoopMergeStrategy(List<Integer> totalRows, Map<Integer, List<Integer>> coopRows,String coopType) {
+        this.totalRows = totalRows;
+        this.coopRows = coopRows;
+        this.cellNum = coopType.equals("coop") ? 14 : 19;
+        // 预处理需要合并的区域
+        handleMergeRegions();
+    }
+
+
+    @Override
+    public void afterWorkbookDispose(final WorkbookWriteHandlerContext context) {
+        // 使用原子操作确保合并只执行一次
+        Sheet sheet = context.getWriteContext().writeSheetHolder().getSheet();
+        if (merged.compareAndSet(false, true)) {
+            // 在表格创建完成后统一添加合并区域
+            if (!cellList.isEmpty()) {
+                for (CellRangeAddress item : cellList) {
+                    try {
+                        sheet.addMergedRegion(item);
+                    } catch (Exception e) {
+                        log.warn("添加合并区域失败: {}", e.getMessage());
+                    }
+                }
+            }
+        }
+
+    }
+    /**
+     * 设置指定行1-14列的背景色
+     *
+     * @param sheet Excel工作表
+     * @param rowIndex 行索引
+     * @param hexColor 十六进制颜色值
+     */
+    private void setRowBackgroundColor(Sheet sheet, int rowIndex,int cellNum, String hexColor) {
+        // 获取或创建行
+        Row row = sheet.getRow(rowIndex);
+        if (row == null) {
+            return;
+        }
+
+        // 创建单元格样式
+        CellStyle cellStyle = sheet.getWorkbook().createCellStyle();
+
+        // 设置背景色
+        if (hexColor != null && hexColor.startsWith("#")) {
+            byte[] rgb = new byte[3];
+            rgb[0] = (byte) Integer.parseInt(hexColor.substring(1, 3), 16); // Red
+            rgb[1] = (byte) Integer.parseInt(hexColor.substring(3, 5), 16); // Green
+            rgb[2] = (byte) Integer.parseInt(hexColor.substring(5, 7), 16); // Blue
+
+            XSSFColor xssfColor = new XSSFColor(rgb, null);
+            cellStyle.setFillForegroundColor(xssfColor);
+        } else {
+            // 默认颜色
+            cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
+        }
+
+        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
+
+        // 为1-14列设置样式(对应索引0-13)
+        for (int i = 0; i < cellNum; i++) {
+            row.createCell(i).setCellStyle(cellStyle);
+        }
+    }
+    /**
+     * 预处理需要合并的单元格区域
+     */
+    private void handleMergeRegions() {
+        cellList.clear();
+
+        if (totalRows != null && !totalRows.isEmpty()) {
+            for (Integer rowIndexObj : totalRows) {
+                if (rowIndexObj != null) {
+                    int rowIndex = rowIndexObj;
+                    // 添加到待合并列表中,而不是立即合并
+                    cellList.add(new CellRangeAddress(rowIndex, rowIndex, 0, 2));
+                }
+            }
+        }
+
+        // 处理coopRows的合并区域 (仅合并第一列)
+        if (coopRows != null && !coopRows.isEmpty()) {
+            for ( List<Integer> value : coopRows.values()) {
+                Integer startRow =  value.get(0);
+                Integer endRow =   value.get(1);
+
+                // 确保存在有效的合并范围(起始行小于结束行)
+                if (startRow < endRow) {
+                    // 合并第一列(索引为0)从startRow到endRow
+                    cellList.add(new CellRangeAddress(startRow, endRow, 0, 0));
+                }
+            }
+        }
+    }
+
+    @Override
+    protected void merge(Sheet sheet, Cell cell, Head head, Integer integer) {
+//        if (totalRows != null && !totalRows.isEmpty()) {
+//            for (Integer rowIndexObj : totalRows) {
+//                if (rowIndexObj != null) {
+//                    // 根据当前行,设置1-14列的背景色为指定的16进制值
+//                    setRowBackgroundColor(sheet, rowIndexObj, this.cellNum,"#5B9BD5");
+//
+//                }
+//            }
+//        }
+    }
+}

+ 40 - 0
SERVER/ChickenFarmV3/vb-common/vb-common-excel/src/main/java/cn/vber/common/excel/utils/ExcelUtil.java

@@ -1,5 +1,6 @@
 package cn.vber.common.excel.utils;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.io.resource.ClassPathResource;
 import cn.hutool.core.util.IdUtil;
@@ -19,12 +20,14 @@ import jakarta.servlet.ServletOutputStream;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import org.apache.poi.ss.util.CellRangeAddress;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -275,6 +278,43 @@ public class ExcelUtil {
             throw new RuntimeException("导出Excel异常");
         }
     }
+    public static void exportCkCoop(Map<String, Object> data, String filename, String templatePath, HttpServletResponse response) {
+        try {
+            if (CollUtil.isEmpty(data)) {
+                throw new IllegalArgumentException("数据为空");
+            }
+            var list = (List) data.get("data");
+            var totalRows = (List) data.get("totalRows");
+            var coopRows = (Map) data.get("coopRows");
+            var coopType = (String) data.get("coopType");
+
+            var total =  data.get("totalData");
+            Map<String, Object> totalMap = BeanUtil.beanToMap(total);
+            resetResponse(filename, response);
+            ServletOutputStream os = response.getOutputStream();
+
+            ClassPathResource templateResource = new ClassPathResource(templatePath);
+            ExcelWriter excelWriter = FastExcel.write(os)
+                    .withTemplate(templateResource.getStream())
+                    .autoCloseStream(false)
+                    // 大数值自动转换 防止失真
+                    .registerConverter(new ExcelBigNumberConvert())
+                    .registerWriteHandler(new CkCoopCellWriteHandler(totalRows, coopType))
+                    .registerWriteHandler(new CkCoopMergeStrategy(totalRows, coopRows,coopType))
+                    .build();
+
+            WriteSheet writeSheet = FastExcel.writerSheet().build();
+            FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
+            excelWriter.fill(totalMap, fillConfig, writeSheet);
+            excelWriter.fill(list , fillConfig, writeSheet);
+
+
+
+            excelWriter.finish();
+        } catch (IOException e) {
+            throw new RuntimeException("导出Excel异常");
+        }
+    }
 
     /**
      * 多sheet模板导出 模板格式为 {key.属性}

+ 18 - 4
SERVER/ChickenFarmV3/vb-modules/vb-breeding/src/main/java/cn/vber/breeding/controller/CoopBatchReportController.java

@@ -2,11 +2,15 @@
 
 package cn.vber.breeding.controller;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 
+import cn.hutool.core.util.StrUtil;
 import cn.vber.breeding.domain.bo.statistic.QueryStaBo;
 import cn.vber.breeding.domain.bo.statistic.QueryStaScopeParam;
+import cn.vber.breeding.domain.vo.report.CoopBatchExportVo;
 import cn.vber.breeding.domain.vo.report.CoopBatchReportDetailResult;
 import cn.vber.breeding.domain.vo.report.CoopBatchReportDetailView;
 import cn.vber.breeding.domain.vo.report.CoopBatchReportResultVo;
@@ -125,11 +129,21 @@ public class CoopBatchReportController extends BaseController {
 
     //@SaCheckPermission("breeding:coopBatchReport:export")
     @Log(title = "报表信息", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
+    @GetMapping("/export")
     public void export(QueryStaBo bo, HttpServletResponse response) {
-//        CoopBatchReportResultVo coopBatchReportResultVo = coopBatchReportDetailService.queryReport(bo);
-//
-//        ExcelUtil.exportExcel(list, "报表信息", CoopBatchReportVo.class, response);
+        CoopBatchReportResultVo coopBatchReportResultVo = coopBatchReportDetailService.queryReport(bo);
+        //List<CoopBatchReportDetailResult> data = coopBatchReportResultVo.getData();
+        CoopBatchReportVo totalData = coopBatchReportResultVo.getTotalData();
+        Map<String, Object> map = new HashMap<>();
+        CoopBatchExportVo coopBatchExportVo = new CoopBatchExportVo();
+        var data = coopBatchExportVo.buildData(coopBatchReportResultVo.getData());
+        map.put("data", data.getData());
+        map.put("totalRows", data.getTotalRows());
+        map.put("coopRows", data.getCoopRows());
+        map.put("coopType", bo.getCoopType());
+        map.put("totalData", totalData);
+        String templatePath = StrUtil.format("excel/reportTemplate_{}.xlsx", bo.getCoopType());
+        ExcelUtil.exportCkCoop(map, "报表信息", templatePath, response);
 
     }
 

+ 4 - 1
SERVER/ChickenFarmV3/vb-modules/vb-breeding/src/main/java/cn/vber/breeding/domain/vo/CoopBatchReportVo.java

@@ -161,12 +161,14 @@ public class CoopBatchReportVo implements Serializable {
      */
     @ExcelProperty(value = "日产蛋率")
     private Float eggProductionRate;
+    private String eggProductionRateStr;
 
     /**
      * 日产蛋合格率
      */
     @ExcelProperty(value = "日产蛋合格率")
     private Float eggPassRate;
+    private String eggPassRateStr;
 
     /**
      * 公鸡数
@@ -185,12 +187,13 @@ public class CoopBatchReportVo implements Serializable {
      */
     @ExcelProperty(value = "存活率")
     private Float lifeRate;
-
+    private String lifeRateStr;
     /**
      * 淘汰率
      */
     @ExcelProperty(value = "淘汰率")
     private Float cullRate;
+    private String cullRateStr;
 
     /**
      * 备注

+ 0 - 21
SERVER/ChickenFarmV3/vb-modules/vb-breeding/src/main/java/cn/vber/breeding/domain/vo/excel/Demo.java

@@ -1,21 +0,0 @@
-package cn.vber.breeding.domain.vo.excel;
-
-import lombok.Data;
-
-@Data
-public class Demo {
-
-    private String coopName;
-
-    private Integer count1;
-
-    private Integer count2;
-
-    private Integer count3;
-
-    private Integer count4;
-
-    private Integer count;
-
-
-}

+ 51 - 0
SERVER/ChickenFarmV3/vb-modules/vb-breeding/src/main/java/cn/vber/breeding/domain/vo/report/CoopBatchExportVo.java

@@ -0,0 +1,51 @@
+package cn.vber.breeding.domain.vo.report;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class CoopBatchExportVo {
+    private List<CoopBatchReportDetailView> data;
+
+    private List<Integer> totalRows;
+
+    private Map<Integer, List<Integer>> coopRows;
+
+    public CoopBatchExportVo buildData(List<CoopBatchReportDetailResult> list) {
+        this.data = new ArrayList<>();
+        this.totalRows = new ArrayList<>();
+        this.coopRows = new HashMap<Integer, List<Integer>>();
+        int rowIndex = 2;
+        int index = 1;
+        for (CoopBatchReportDetailResult r : list){
+            CoopBatchReportDetailView total = r.getTotal();
+            total.setCoopName("合计");
+            List<CoopBatchReportDetailView> data1 = r.getData();
+            data1.forEach(item -> item.setCoopName(r.getCoopName()));
+            data1.add(total);
+            this.data.addAll(data1);
+
+            //当前合计的行数
+            int curTotalRows = this.data.size() + rowIndex;
+            this.totalRows.add(curTotalRows);
+            var tmp = new ArrayList<Integer>();
+            //鸡舍开始始行数
+            tmp.add(curTotalRows-data1.size()+1);
+            //鸡舍结束行数
+            tmp.add(curTotalRows-1);
+            this.coopRows.put(index,tmp);
+            index++ ;
+        }
+        return this;
+    }
+}

+ 1 - 21
SERVER/ChickenFarmV3/vb-modules/vb-breeding/src/main/java/cn/vber/breeding/domain/vo/report/CoopBatchReportDetailResult.java

@@ -16,25 +16,5 @@ public class CoopBatchReportDetailResult {
     private CoopBatchReportDetailView total;
 
 
-//    public CoopBatchReportDetailView getTotal() {
-//    	CoopBatchReportDetailView totalResult = new CoopBatchReportDetailView();
-//        List<CoopBatchReportDetailView> views = this.data;
-//        views.forEach((k)->{
-//
-//            totalResult.setLastSave0(totalResult.getLastSave0()+k.getLastSave0());
-//            totalResult.setLastSave1(totalResult.getLastSave1()+k.getLastSave1());
-//            totalResult.setSave0(totalResult.getSave0()+k.getSave0());
-//            totalResult.setSave1(totalResult.getSave1()+k.getSave1());
-//            totalResult.setCull0(totalResult.getCull0()+k.getCull0());
-//            totalResult.setCull1(totalResult.getCull1()+k.getCull1());
-//            totalResult.setIn0(totalResult.getIn0()+k.getIn0());
-//            totalResult.setIn1(totalResult.getIn1()+k.getIn1());
-//            totalResult.setOut0(totalResult.getOut0()+k.getOut0());
-//            totalResult.setOut1(totalResult.getOut1()+k.getOut1());
-//            totalResult.setChicken0(totalResult.getChicken0()+k.getChicken0());
-//            totalResult.setChicken1(totalResult.getChicken1()+k.getChicken1());
-//        });
-//        statisticsHelperService.calcCommon(totalResult);
-//        result.setTotalTmp(totalResult.convertDetailView());
-//    }
+
 }

BIN
SERVER/ChickenFarmV3/vb-modules/vb-breeding/src/main/resources/excel/reportTemplate_coop.xlsx


BIN
SERVER/ChickenFarmV3/vb-modules/vb-breeding/src/main/resources/excel/reportTemplate_egg.xlsx


+ 7 - 0
UI/VB.VUE/src/api/reports/_coopBatch.ts

@@ -67,6 +67,13 @@ class CoopBatchApi {
 			url: "/demo/leave/" + id
 		})
 	}
+
+	export = (data: any, fileName: string) => {
+		return Rs.download("/breeding/coopBatchReport/export", fileName, {
+			loading: false,
+			params: data
+		})
+	}
 }
 
 export default CoopBatchApi

+ 38 - 2
UI/VB.VUE/src/components/reports/ChickenCoopReport.vue

@@ -7,11 +7,13 @@ const props = withDefaults(
 		remote?: boolean
 		queryReportFun?: (v: any) => Promise<any>
 		generateReportFun?: (v: any) => Promise<any>
+		exportReportFun?: (v: any, fileName: string) => Promise<any>
 		reportGenDate?: string
 		coopType?: "coop" | "egg"
 		reportCycle?: "D" | "M" | "Q" | "Y"
 		showQueryButton?: boolean
 		showGenerateButton?: boolean
+		showExportButton?: boolean
 	}>(),
 	{
 		title: "",
@@ -19,10 +21,11 @@ const props = withDefaults(
 		reportCycle: "D",
 		remote: true,
 		showQueryButton: true,
-		showGenerateButton: true
+		showGenerateButton: true,
+		showExportButton: true
 	}
 )
-const emits = defineEmits(["querySuccess", "generateSuccess"])
+const emits = defineEmits(["querySuccess", "generateSuccess", "exportSuccess"])
 const loading = ref(false)
 const title = ref(props.title)
 const formData = ref({
@@ -210,6 +213,36 @@ function onGenerateReport() {
 		})
 }
 
+function onExportReport() {
+	if (!props.exportReportFun) {
+		return
+	}
+	message
+		.confirm("确定导出报表吗?", "提示", {
+			confirmButtonText: "确定",
+			cancelButtonText: "取消",
+			type: "warning"
+		})
+		.then(() => {
+			loading.value = true
+			props
+				.exportReportFun(
+					formData.value,
+					props.coopType == "coop" ? "育成舍报表数据.xlsx" : "产蛋舍报表数据.xlsx"
+				)
+				.then(() => {
+					//onQueryReport()
+					emits("exportSuccess", formData.value)
+				})
+				.catch((err) => {
+					console.log(err)
+				})
+				.finally(() => {
+					loading.value = false
+				})
+		})
+}
+
 function init() {
 	onQueryReport()
 }
@@ -305,6 +338,9 @@ onMounted(init)
 									<el-button v-if="showGenerateButton" type="success" @click="onGenerateReport">
 										生成报表
 									</el-button>
+									<el-button v-if="showExportButton" type="primary" @click="onExportReport">
+										导出报表
+									</el-button>
 								</el-form-item>
 							</el-form>
 						</div>

+ 2 - 1
UI/VB.VUE/src/views/report/coop/index.vue

@@ -9,6 +9,7 @@ import dayjs from "dayjs"
 		<ChickenCoopReport
 			coop-type="coop"
 			:query-report-fun="apis.reports.coopBatchApi.query"
-			:generate-report-fun="apis.reports.coopBatchApi.gen"></ChickenCoopReport>
+			:generate-report-fun="apis.reports.coopBatchApi.gen"
+			:export-report-fun="apis.reports.coopBatchApi.export"></ChickenCoopReport>
 	</div>
 </template>

+ 2 - 1
UI/VB.VUE/src/views/report/egg/index.vue

@@ -9,6 +9,7 @@ import dayjs from "dayjs"
 		<ChickenCoopReport
 			coop-type="egg"
 			:query-report-fun="apis.reports.coopBatchApi.query"
-			:generate-report-fun="apis.reports.coopBatchApi.gen"></ChickenCoopReport>
+			:generate-report-fun="apis.reports.coopBatchApi.gen"
+			:export-report-fun="apis.reports.coopBatchApi.export"></ChickenCoopReport>
 	</div>
 </template>