Browse Source

feat: 导出清单分类库excel

vian 3 năm trước cách đây
mục cha
commit
d6b10b7145

+ 25 - 0
modules/std_billsGuidance_lib/controllers/libController.js

@@ -11,6 +11,9 @@ import BaseController from '../../common/base/base_controller';
 import moment from 'moment';
 const billsGuidanceFacade = require('../facade/facades');
 let logger = require('../../../logs/log_helper').logger;
+const fs = require("fs");
+// excel解析
+const excel = require("node-xlsx");
 let callback = function (req, res, err, msg, data) {
     res.json({error: err, message: msg, data: data});
 };
@@ -138,6 +141,28 @@ class BillsGuideLibController extends BaseController{
         }
     }
 
+    async exportClassExcel(req, res) {
+        try{
+            const excelData = await billsGuidanceFacade.getClassExcelData(req.query.libID);
+            const buffer = excel.build([{name: "清单分类库", data: excelData}], {'!cols': [{wch:6}, {wch:12},{wch:14},{wch:24}, {wch:45}]});
+            const filePath = './public/export.xlsx';
+            fs.writeFileSync(filePath, buffer, 'binary');
+            const stats = fs.statSync(filePath);
+            // 下载相关header
+            res.set({
+                'Content-Type': 'application/octet-stream',
+                'Content-Disposition': 'attachment; filename=billClass.xlsx',
+                'Content-Length': stats.size
+            });
+            fs.createReadStream(filePath).pipe(res);
+            fs.unlink(filePath);
+        }
+        catch(err){
+            console.log(err);
+            response.end(error);
+        }
+    }
+
     async testItems(req, res){
         try{
             let data = JSON.parse(req.body.data);

+ 22 - 0
modules/std_billsGuidance_lib/facade/facades.js

@@ -40,6 +40,7 @@ module.exports = {
     getBillMaterials,
     editBillMaterials,
     generateClassData,
+    getClassExcelData,
     testItems
 };
 
@@ -540,6 +541,27 @@ async function generateClassData(libID) {
     }
 }
 
+// 获取分类excel数据
+async function getClassExcelData(libID) {
+    const lib = await billsGuideLibModel.findOne({ ID: libID }, '-_id compilationId').lean();
+    if (!lib) {
+        throw new Error('无有效精灵库');
+    }
+    const classData = await billClassModel.find({ compilationID: lib.compilationId }).lean();
+    const excelData = [['类别', '编码', '清单名称', '必填特征排列组合', '类别别名']];
+    classData.forEach(item => {
+        const excelItem = [
+            item.class,
+            item.code,
+            item.name,
+            item.itemCharacter,
+            item.classCode
+        ];
+        excelData.push(excelItem);
+    });
+    return excelData;
+}
+
 async function testItems(libID) {
     let items = await billsGuideItemsModel.find({libID: libID});
     //删除垃圾数据

+ 1 - 0
modules/std_billsGuidance_lib/routes/routes.js

@@ -26,6 +26,7 @@ module.exports = function (app) {
     router.post('/getBillMaterials', billsGuideLibController.auth, billsGuideLibController.init, billsGuideLibController.getBillMaterials);
     router.post('/editBillMaterials', billsGuideLibController.auth, billsGuideLibController.init, billsGuideLibController.editBillMaterials);
     router.post('/generateClassData', billsGuideLibController.auth, billsGuideLibController.init, billsGuideLibController.generateClassData);
+    router.get('/exportClassExcel', billsGuideLibController.auth, billsGuideLibController.init, billsGuideLibController.exportClassExcel);
     //test
     //router.post('/testItems', billsGuideLibController.auth, billsGuideLibController.init, billsGuideLibController.testItems);
 

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

@@ -77,6 +77,7 @@
                     <th width="160">添加时间</th>
                     <th width="70">操作</th>
                     <%- manager.isTemporary ? '' : '<th width="120">生成清单分类</th>' %>
+                    <%- manager.isTemporary ? '' : '<th width="120">导出分类excel</th>' %>
                   </tr>
                 </thead>
                 <tbody>

+ 5 - 0
web/maintain/billsGuidance_lib/js/main.js

@@ -62,6 +62,11 @@ const billsGuidanceMain = (function () {
             <a class="btn btn-secondary btn-sm generate-class lock-btn-control disabled" href="javascript:void(0);" data-id="${lib.ID}" title="生成清单分类"><i class="fa fa-sign-in fa-rotate-90"></i>生成</a>
             </td>
             ` : '' }
+            ${ isTemporary !== 'true' ? `
+            <td style="text-align: center;">
+            <a class="btn btn-success btn-sm export lock-btn-control disabled" href="/billsGuidance/api/exportClassExcel?libID=${lib.ID}" download="清单类别库.xlsx" title="导出清单分类excel"><i class="fa fa-sign-out fa-rotate-270"></i>导出</a>
+            </td>
+            ` : '' }
             </tr>`;
         tbody.append(tr);
     }