Explorar o código

feat: 信息价类别总表、信息价总表导出excel功能

vian hai 1 ano
pai
achega
f33725f259

+ 22 - 0
modules/price_info_class/controllers/index.js

@@ -1,6 +1,8 @@
 import BaseController from "../../common/base/base_controller";
 const facade = require('../facade/index');
 const config = require("../../../config/config.js");
+const excel = require('node-xlsx');
+const fs = require('fs');
 
 class PriceInfoClassController extends BaseController {
     async main(req, res) {
@@ -37,6 +39,26 @@ class PriceInfoClassController extends BaseController {
         }
     }
 
+    async exportClassData(request, response) {
+        try {
+            const excelData = await facade.exportExcelData();
+            const buffer = excel.build([{ name: "材料信息价类别总表", data: excelData }]);
+            const filePath = './public/exportPriceClass.xlsx';
+            fs.writeFileSync(filePath, buffer, 'binary');
+            const stats = fs.statSync(filePath);
+            // 下载相关header
+            response.set({
+                'Content-Type': 'application/octet-stream',
+                'Content-Disposition': 'attachment; filename=infoPriceClass.xlsx',
+                'Content-Length': stats.size
+            });
+            fs.createReadStream(filePath).pipe(response);
+            fs.unlink(filePath);
+        } catch (error) {
+            response.end(error);
+        }
+    }
+
 
 }
 

+ 18 - 1
modules/price_info_class/facade/index.js

@@ -102,8 +102,25 @@ async function editClassData(postData) {
     }
 }
 
+// 导出excel数据
+async function exportExcelData() {
+    const items = await priceInfoClassModel.find({}).sort({ class: 1 }).lean();
+    // 整理数据
+    let classData = [];
+    for (const tmp of items) {
+        const item = [tmp.class || '', tmp.classCode || '', tmp.name || '', tmp.specs || '', tmp.unit || ''];
+        classData.push(item);
+    }
+    const excelData = [['class', '别名编码', '材料名称', '规格型号', '单位']];
+    excelData.push.apply(excelData, classData);
+
+    return excelData;
+}
+
+
 module.exports = {
     setIDForData,
     getPagingData,
-    editClassData
+    editClassData,
+    exportExcelData
 }

+ 2 - 0
modules/price_info_class/routes/index.js

@@ -10,6 +10,8 @@ module.exports = function (app) {
     router.get("/main", priceInfoClassController.auth, priceInfoClassController.init, priceInfoClassController.main);
     router.post("/getPagingData", priceInfoClassController.auth, priceInfoClassController.init, priceInfoClassController.getPagingData);
     router.post("/editClassData", priceInfoClassController.auth, priceInfoClassController.init, priceInfoClassController.editClassData);
+    router.get("/export", priceInfoClassController.auth, priceInfoClassController.init, priceInfoClassController.exportClassData);
+
 
     app.use("/priceInfoClass", router);
 };

+ 1 - 1
modules/price_info_lib/facade/index.js

@@ -664,7 +664,7 @@ const getSummaryMap = (items) => {
 }
 
 // 匹配总表
-// 按规则匹配信息价的编码、别名编码、计算式(只匹配珠海建筑,要单独标记珠海地区);
+// 按规则匹配信息价的编码、别名编码、计算式(只匹配珠海建筑,要单独标记珠海地区); 
 // 匹配规则:名称+规格型号+单位,与总表一致则自动填入编码、别名编码、计算式(珠海建筑);
 const matchSummary = async (compilationID, libID, areaID) => {
     const updateBulks = [];

+ 22 - 4
modules/price_info_summary/controllers/index.js

@@ -1,10 +1,8 @@
 import BaseController from "../../common/base/base_controller";
-import CompilationModel from '../../users/models/compilation_model';
-const multiparty = require('multiparty');
-const excel = require('node-xlsx');
-const fs = require('fs');
 const facade = require('../facade/index');
 const config = require("../../../config/config.js");
+const excel = require('node-xlsx');
+const fs = require('fs');
 
 class PriceInfoSummaryController extends BaseController {
     async main(req, res) {
@@ -52,6 +50,26 @@ class PriceInfoSummaryController extends BaseController {
         }
     }
 
+    async exportSummaryData(request, response) {
+        try {
+            const excelData = await facade.exportExcelData();
+            const buffer = excel.build([{ name: "材料信息价总表", data: excelData }]);
+            const filePath = './public/exportPriceSummary.xlsx';
+            fs.writeFileSync(filePath, buffer, 'binary');
+            const stats = fs.statSync(filePath);
+            // 下载相关header
+            response.set({
+                'Content-Type': 'application/octet-stream',
+                'Content-Disposition': 'attachment; filename=infoPriceSummary.xlsx',
+                'Content-Length': stats.size
+            });
+            fs.createReadStream(filePath).pipe(response);
+            fs.unlink(filePath);
+        } catch (error) {
+            response.end(error);
+        }
+    }
+
 }
 
 module.exports = {

+ 16 - 0
modules/price_info_summary/facade/index.js

@@ -57,8 +57,24 @@ async function saveInSummary(documents) {
     await priceInfoSummaryModel.insertMany(documents);
 }
 
+// 导出excel数据
+async function exportExcelData() {
+    const items = await priceInfoSummaryModel.find({}).sort({ classCode: 1 }).lean();
+    // 整理数据
+    let classData = [];
+    for (const tmp of items) {
+        const item = [tmp.code || '', tmp.classCode || '', tmp.expString || '', tmp.name || '', tmp.specs || '', tmp.unit || ''];
+        classData.push(item);
+    }
+    const excelData = [['主从对应码', '别名编码', '计算式', '材料名称', '规格型号', '单位']];
+    excelData.push.apply(excelData, classData);
+
+    return excelData;
+}
+
 module.exports = {
     getPagingData,
     editSummaryData,
     saveInSummary,
+    exportExcelData,
 }

+ 1 - 0
modules/price_info_summary/routes/index.js

@@ -11,6 +11,7 @@ module.exports = function (app) {
     router.post("/getPagingData", priceInfoSummaryController.auth, priceInfoSummaryController.init, priceInfoSummaryController.getPagingData);
     router.post("/editSummaryData", priceInfoSummaryController.auth, priceInfoSummaryController.init, priceInfoSummaryController.editSummaryData);
     router.post("/saveInSummary", priceInfoSummaryController.auth, priceInfoSummaryController.init, priceInfoSummaryController.saveInSummary);
+    router.get("/export", priceInfoSummaryController.auth, priceInfoSummaryController.init, priceInfoSummaryController.exportSummaryData);
 
     app.use("/priceInfoSummary", router);
 };

+ 1 - 0
web/maintain/price_info_class/html/main.html

@@ -18,6 +18,7 @@
             <span class="header-logo px-2">材料信息价类别总表</span>
             <a class="lock" data-locked="true" href="javascript:void(0);" title="解锁"><i
                 class="fa fa-unlock-alt"></i></a>
+                <a id="export" class="btn btn-success btn-sm" href="javascript:void(0);" title="导出" style="margin-left: 10px;"><i class="fa fa-sign-out fa-rotate-270"></i>导出</a>
         </nav>
     </div>
     <div class="search">

+ 6 - 1
web/maintain/price_info_class/js/index.js

@@ -17,5 +17,10 @@ $(document).ready(() => {
             const searchStr = $(this).val();
             SUMMARY_BOOK.handleSearch(searchStr);
         }
-    })
+    });
+
+    // 点击导出按钮
+    $('#export').click(() => {
+        window.location.href = '/priceInfoClass/export';
+    });
 });

+ 1 - 0
web/maintain/price_info_summary/html/main.html

@@ -18,6 +18,7 @@
             <span class="header-logo px-2">材料信息价总表</span>
             <a class="lock" data-locked="true" href="javascript:void(0);" title="解锁"><i
                 class="fa fa-unlock-alt"></i></a>
+                <a id="export" class="btn btn-success btn-sm" href="javascript:void(0);" title="导出" style="margin-left: 10px;"><i class="fa fa-sign-out fa-rotate-270"></i>导出</a>
         </nav>
     </div>
     <div class="search">

+ 6 - 1
web/maintain/price_info_summary/js/index.js

@@ -17,5 +17,10 @@ $(document).ready(() => {
             const searchStr = $(this).val();
             SUMMARY_BOOK.handleSearch(searchStr);
         }
-    })
+    });
+
+    // 点击导出按钮
+    $('#export').click(() => {
+        window.location.href = '/priceInfoSummary/export';
+    });
 });