Browse Source

feat: 导出信息价库

vian 11 months ago
parent
commit
e70cf17044

+ 1 - 0
.gitignore

@@ -6,3 +6,4 @@ dist/
 tmp/
 modules/reports/util/pdf_base_files/*.ttf
 modules/reports/util/pdf_base_files/*.ttc
+package-lock.json

+ 2 - 2
modules/all_models/std_price_info_items.js

@@ -29,7 +29,7 @@ const keywordSchema = new Schema({
 const priceInfoItems = new Schema({
     ID: String,
     libID: String,
-    classID: String, // 分类
+    classID: { type: String, index: true }, // 分类
     code: {
         type: String,
         default: ''
@@ -83,6 +83,6 @@ const priceInfoItems = new Schema({
         default: []
     }
 }, { versionKey: false });
-priceInfoItems.index({ areaID:1,period:1});
+priceInfoItems.index({ areaID: 1, period: 1 });
 
 mongoose.model('std_price_info_items', priceInfoItems, 'std_price_info_items');

+ 51 - 1
modules/price_info_lib/controllers/index.js

@@ -32,7 +32,11 @@ class PriceInfoController extends BaseController {
         const listItem = `
             <li class="nav-item">
                 <a class="nav-link" href="javascript:void(0);" aria-haspopup="true" aria-expanded="false" data-toggle="modal" data-target="#crawl">导入材料价格信息</a>
-            </li>`
+            </li>
+            <li class="nav-item" style="display: none">
+            <a class="nav-link" href="javascript:void(0);" aria-haspopup="true" aria-expanded="false" id="export-compilation-price">导出编办材料价格信息</a>
+        </li>
+            `
         const renderData = {
             title: '材料信息价库',
             userAccount: req.session.managerData.username,
@@ -344,6 +348,52 @@ class PriceInfoController extends BaseController {
         }
     }
 
+    async exportInfoPriceByLib(request, response) {
+        const libID = request.query.libID;
+        try {
+            const { jsonStr, period, name } = await facade.exportInfoPriceByLib(libID);
+            const filePath = './public/exportInfoPriceByLib.json';
+            fs.writeFileSync(filePath, jsonStr, 'utf8');
+            const stats = fs.statSync(filePath);
+            // 下载相关header
+            response.set({
+                'Content-Type': 'application/octet-stream',
+                'Content-Disposition': `attachment; filename=${encodeURI(name)}.json`,
+                'Content-Length': stats.size
+            });
+            fs.createReadStream(filePath).pipe(response);
+            fs.unlink(filePath);
+        } catch (error) {
+            response.end(error);
+        }
+    }
+
+    async exportInfoPriceByCompilation(request, response) {
+        const compilationID = request.query.compilationID;
+        try {
+            const compilationModel = new CompilationModel();
+            const compilation = await compilationModel.getCompilationById(compilationID);
+            if (!compilation) {
+                throw new Error('不存在此编办!');
+            }
+            const { jsonStr } = await facade.exportInfoPriceByCompilation(compilationID);
+            const filePath = './public/exportInfoPriceByCompilation.json';
+            fs.writeFileSync(filePath, jsonStr, 'utf8');
+            const stats = fs.statSync(filePath);
+            const fileName = `${compilation.name}信息价`;
+            // 下载相关header
+            response.set({
+                'Content-Type': 'application/octet-stream',
+                'Content-Disposition': `attachment; filename=${encodeURI(fileName)}.json`,
+                'Content-Length': stats.size
+            });
+            fs.createReadStream(filePath).pipe(response);
+            fs.unlink(filePath);
+        } catch (error) {
+            response.end(error);
+        }
+    }
+
 }
 
 module.exports = {

+ 34 - 0
modules/price_info_lib/facade/index.js

@@ -13,6 +13,9 @@ const importLogsModel = mongoose.model('import_logs');
 const priceInfoIndexModel = mongoose.model('std_price_info_index');
 const priceInfoSummaryModel = mongoose.model('std_price_info_summary');
 const { getWordArray, alias } = require('../../../public/cut_word/segmentit');
+const SMS = require('../../users/models/sms');
+
+const sms = new SMS();
 
 async function getLibs(query) {
     return await priceInfoLibModel.find(query).lean();
@@ -594,6 +597,35 @@ async function exportExcelData(libID, areaID) {
     return excelData;
 }
 
+// 按库导出信息价库完整数据,不需要带上地区
+async function exportInfoPriceByLib(libID) {
+    const lib = await priceInfoLibModel.findOne({ ID: libID }).lean();
+    if (!lib) {
+        throw new Error('不存在该信息价库!');
+    }
+    const { compilationID } = lib;
+    const priceLibs = await priceInfoLibModel.find({ ID: libID }, '-_id').lean();
+    const priceClasses = await priceInfoClassModel.find({ libID }, '-_id').lean();
+    const priceItems = await priceInfoItemModel.find({ libID }, '-_id').lean();
+    const exportData = { compilationID, priceLibs, priceClasses, priceItems };
+    const str = JSON.stringify(exportData);
+    exportData.md5 = sms.md5(str);
+    return { jsonStr: JSON.stringify(exportData), period: lib.period, name: lib.name };
+}
+
+// 按编办导出信息价库完整数据,需要带上地区
+async function exportInfoPriceByCompilation(compilationID) {
+    const areas = await priceInfoAreaModel.find({ compilationID }, '-_id').lean();
+    const priceLibs = await priceInfoLibModel.find({ compilationID }, '-_id').lean();
+    const libIDs = priceLibs.map(lib => lib.ID);
+    const priceClasses = await priceInfoClassModel.find({ libID: { $in: libIDs } }, '-_id').lean();
+    const priceItems = await priceInfoItemModel.find({ libID: { $in: libIDs } }, '-_id').lean();
+    const exportData = { compilationID, areas, priceLibs, priceClasses, priceItems };
+    const str = JSON.stringify(exportData);
+    exportData.md5 = sms.md5(str);
+    return { jsonStr: JSON.stringify(exportData), period: lib.period, name: lib.name };
+}
+
 const getMatchSummaryKey = (item) => {
     const props = ['name', 'specs', 'unit'];
     return props.map(prop => {
@@ -745,6 +777,8 @@ module.exports = {
     editPriceData,
     editClassData,
     exportExcelData,
+    exportInfoPriceByLib,
+    exportInfoPriceByCompilation,
     matchSummary,
     getPriceEmptyData,
     getRecommendPriceSummaryData,

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

@@ -31,6 +31,8 @@ module.exports = function (app) {
     router.post("/getRecommendPriceSummaryData", priceInfoController.auth, priceInfoController.init, priceInfoController.getRecommendPriceSummaryData);
 
     router.get("/export", priceInfoController.auth, priceInfoController.init, priceInfoController.exportPriceData);
+    router.get("/exportInfoPriceByLib", priceInfoController.auth, priceInfoController.init, priceInfoController.exportInfoPriceByLib);
+    router.get("/exportInfoPriceByCompilation", priceInfoController.auth, priceInfoController.init, priceInfoController.exportInfoPriceByCompilation);
 
     app.use("/priceInfo", router);
 };

+ 3 - 1
web/maintain/price_info_lib/html/main.html

@@ -27,7 +27,7 @@
                                     <th width="160">期数</th>
                                     <th width="160">费用定额</th>
                                     <th width="160">添加时间</th>
-                                    <th width="70">操作</th>
+                                    <th width="90">操作</th>
                                     <th width="150">原始数据</th>
                                     <th width="60">主从表</th>
                                     <th width="60">关键字</th>
@@ -49,6 +49,8 @@
                                         <a class="text-danger lock-btn-control disabled" href="javascript:void(0);"
                                             onclick='handleDeleteClick("<%= lib.ID%>")' title="删除"><i
                                                 class="fa fa-remove"></i></a>
+                                        <a class="export-data lock-btn-control disabled" href="javascript:void(0);"
+                                            onclick='handleExportInfoPriceByLib("<%= lib.ID%>")' title="导出数据"><i class="fa fa-sign-out fa-rotate-270"></i></a>
                                         <a class="lock" data-locked="true" href="javascript:void(0);" title="解锁"><i
                                                 class="fa fa-unlock-alt"></i></a>
                                     </td>

+ 19 - 1
web/maintain/price_info_lib/js/main.js

@@ -242,7 +242,6 @@ async function handleExportClick(libID) {
 
 // 导出确认
 function handleExportConfirm() {
-    debugger;
     const areaID = getAreaIDByOption($('#export-parent-area'), $('#export-sub-area'));
     if (!areaID) {
         alert('请选择地区!');
@@ -252,6 +251,21 @@ function handleExportConfirm() {
     window.location.href = `/priceInfo/export?libID=${curLib.id}&areaID=${areaID}`;
 }
 
+// 导出信息价库数据
+function handleExportInfoPriceByLib(libID) {
+    setCurLib(libID);
+    window.location.href = `/priceInfo/exportInfoPriceByLib?libID=${libID}`;
+}
+
+// 导出编办信息价数据
+function handleExportInfoPriceByCompilation() {
+    if (!compilationID) {
+        alert('请选择编办!');
+        return;
+    }
+    window.location.href = `/priceInfo/exportInfoPriceByCompilation?compilationID=${compilationID}`;
+}
+
 const { ProcessStatus, CRAWL_LOG_KEY } = window.PRICE_INFO_CONST;
 
 const CHECKING_TIME = 5000;
@@ -369,6 +383,10 @@ $(document).ready(function () {
     });
     $('#edit').on('hidden.bs.modal', () => $('#rename-error').hide());
     $('#crawl').on('hidden.bs.modal', () => $('#crawl-error').hide());
+
+    $('#export-compilation-price').click(() => {
+        handleExportInfoPriceByCompilation();
+    })
 });
 
 $.ajax({