Bläddra i källkod

feat: 信息价按地区导入关键字

vian 1 år sedan
förälder
incheckning
d8343c459c

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

@@ -97,6 +97,17 @@ class PriceInfoController extends BaseController {
         }
     }
 
+    async getAreas(req, res) {
+        try {
+            const { compilationID } = JSON.parse(req.body.data);
+            const data = await facade.getAreas(compilationID);
+            res.json({ error: 0, message: 'getAreas success', data });
+        } catch (err) {
+            console.log(err);
+            res.json({ error: 1, message: err.toString() });
+        }
+    }
+
     async processChecking(req, res) {
         try {
             const { key } = JSON.parse(req.body.data);
@@ -136,6 +147,8 @@ class PriceInfoController extends BaseController {
             try {
                 const libID = fields.libID !== undefined && fields.libID.length > 0 ?
                     fields.libID[0] : null;
+                const areaID = fields.areaID !== undefined && fields.areaID.length > 0 ?
+                    fields.areaID[0] : null;
                 const importType = fields.importType !== undefined && fields.importType.length > 0 ?
                     fields.importType[0] : null;
                 if (!libID || !importType) {
@@ -158,7 +171,7 @@ class PriceInfoController extends BaseController {
                     throw 'excel没有对应数据。';
                 }
                 // 提取excel数据并入库
-                importType === 'originalData' ? await facade.importExcelData(libID, sheet[0].data) : await facade.importKeyData(libID, sheet[0].data, sheet[1].data);
+                importType === 'originalData' ? await facade.importExcelData(libID, sheet[0].data) : await facade.importKeyData(libID, areaID, sheet[0].data, sheet[1].data);
                 // 删除文件
                 if (uploadFullName && fs.existsSync(uploadFullName)) {
                     fs.unlink(uploadFullName);

+ 10 - 6
modules/price_info_lib/facade/index.js

@@ -242,19 +242,23 @@ async function importExcelData(libID, sheetData) {
 主表:主从对应码	别名编码	材料名称	规格	单位	含税价(元)	除税价(元)	月份备注	计算式
 副表:主从对应码	关键字	单位	关键字效果	组别	选项号
  */
-async function importKeyData(libID, mainData, subData) {
+async function importKeyData(libID, areaID, mainData, subData) {
     const lib = await priceInfoLibModel.findOne({ ID: libID }).lean();
     if (!lib) {
         throw new Error('库不存在');
     }
-    const zh = await priceInfoAreaModel.findOne({ name: { $regex: '珠海' } }).lean();
+    /* const zh = await priceInfoAreaModel.findOne({ name: { $regex: '珠海' } }).lean();
     if (!zh) {
         throw new Error('该库不存在珠海地区');
+    } */
+    const area = await priceInfoAreaModel.findOne({ ID: areaID }).lean();
+    if (!area) {
+        throw new Error('不存在该地区');
     }
     // 删除珠海地区所有材料
-    await priceInfoItemModel.deleteMany({ libID, areaID: zh.ID });
+    await priceInfoItemModel.deleteMany({ libID, areaID });
 
-    const classItems = await priceInfoClassModel.find({ libID, areaID: zh.ID }).lean();
+    const classItems = await priceInfoClassModel.find({ libID, areaID }).lean();
     // 分类树前四位编码 - 分类节点ID映射表
     let otherClassID = '';
     const classMap = {};
@@ -303,7 +307,7 @@ async function importKeyData(libID, mainData, subData) {
             classID,
             ID: uuidV1(),
             compilationID: lib.compilationID,
-            areaID: zh.ID,
+            areaID,
             period: lib.period,
             classCode: rowData[1] || '',
             name: rowData[2] || '',
@@ -425,7 +429,7 @@ async function importKeyData(libID, mainData, subData) {
 
 // 获取费用定额的地区数据
 async function getAreas(compilationID) {
-    return await priceInfoAreaModel.find({ compilationID }, '-_id ID name serialNo').lean();
+    return await priceInfoAreaModel.find({ compilationID }, '-_id ID name serialNo').sort({ serialNo: 1 }).lean();
 }
 
 async function updateAres(updateData) {

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

@@ -15,6 +15,7 @@ module.exports = function (app) {
     router.post("/deleteLib", priceInfoController.auth, priceInfoController.init, priceInfoController.deleteLib);
     router.post("/processChecking", priceInfoController.auth, priceInfoController.init, priceInfoController.processChecking);
     router.post("/crawlData", priceInfoController.auth, priceInfoController.init, priceInfoController.crawlData);
+    router.post("/getAreas", priceInfoController.auth, priceInfoController.init, priceInfoController.getAreas);
     router.post("/importExcel", priceInfoController.auth, priceInfoController.init, priceInfoController.importExcel);
 
     router.post("/editArea", priceInfoController.auth, priceInfoController.init, priceInfoController.editArea);

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

@@ -35,7 +35,7 @@
                             <tbody id="showArea">
                                 <% for(let lib of libs){ %>
                                 <tr class="libTr">
-                                    <td id="<%= lib.ID%>"><a
+                                    <td id="<%= lib.ID%>" data-compilationid="<%= lib.compilationID%>"><a
                                             href="/priceInfo/edit/?libID=<%= lib.ID%>&locked=true"><%= lib.name%></a>
                                     </td>
                                     <td><%= lib.period %></td>
@@ -215,6 +215,13 @@
                     导入操作会覆盖数据,请谨慎操作!!
                 </div>
                 <form>
+                    <div id="import-area" class="form-group" style="margin-bottom: 4px !important;">
+                        <label>地区</label>
+                        <select id="import-parent-area" class="form-control-sm" name="parentArea" style="width: 100px;">
+                        </select>
+                        <select id="import-sub-area" class="form-control-sm" name="subArea" style="width: 100px">
+                        </select>
+                    </div>
                     <div class="form-group">
                         <label>请选择Excel格式文件</label>
                         <input class="form-control-file" type="file" accept=".xlsx,.xls" name="import_data" />

+ 82 - 6
web/maintain/price_info_lib/js/main.js

@@ -1,3 +1,6 @@
+const matched = window.location.search.match(/filter=(.+)/);
+const compilationID = matched && matched[1] || '';
+
 // 节流
 function throttle(fn, time) {
     let canRun = true;
@@ -37,6 +40,7 @@ let curLib = {};
 function setCurLib(libID) {
     curLib.id = libID;
     curLib.name = $(`#${libID}`).text();
+    curLib.compilationID = $(`#${libID}`).data('compilationid');
 }
 
 // 点击编辑按钮
@@ -79,13 +83,82 @@ function handleDeleteConfirm() {
     }
 }
 
+// 获取地区
+let curAreas = [];
+let curAreaMap = {};
+const getAreas = async () => {
+    const areas = await ajaxPost('/priceInfo/getAreas', { compilationID: curLib.compilationID });
+    return areas;
+}
+
+// 获取地区下拉选项映射,key为父地区、value为子地区
+const getAreaMap = async () => {
+    curAreas = await getAreas();
+    const areaMap = {};
+    curAreas.forEach(item => {
+        const { name } = item;
+        if (name) {
+            let [parent, sub] = name.split('-');
+            if (!sub) {
+                sub = parent;
+            }
+            if (!areaMap[parent]) {
+                areaMap[parent] = [sub];
+            } else {
+                areaMap[parent].push(sub);
+            }
+        }
+    });
+    return areaMap;
+}
+
+// 根据地区选项获取地区ID
+const getAreaIDByOption = ($parent, $sub) => {
+    const parentArea = $parent.val();
+    const subArea = $sub.val();
+    const areaItem = curAreas.find(item => [parentArea, `${parentArea}-${subArea}`].includes(item.name));
+    console.log(areaItem);
+    return areaItem?.ID;
+}
+
+// 设置地区下拉项
+const setAreaOption = ($parent, $sub, areaMap) => {
+    $parent.unbind();
+    const parentAreas = Object.keys(areaMap);
+    $parent.empty();
+    const parentOptionsHtml = parentAreas.map(parentArea => `<option value="${parentArea}">${parentArea}</option>`).join('');
+    $parent.append(parentOptionsHtml);
+    const setSubs = (subsArea) => {
+        $sub.empty();
+        const subOptionsHtml = subsArea.map(subArea => `<option value="${subArea}">${subArea}</option>`).join('');
+        $sub.append(subOptionsHtml);
+    }
+    setSubs(areaMap[parentAreas[0]] || []);
+    $parent.change(() => {
+        const curParent = $parent.val();
+        setSubs(areaMap[curParent] || []);
+        getAreaIDByOption();
+    });
+}
+
 let importType = 'originalData';
 
 // 点击导入按钮
-function handleImportClick(libID, type) {
-    setCurLib(libID);
-    importType = type;
-    $('#import').modal('show');
+async function handleImportClick(libID, type) {
+    try {
+        setCurLib(libID);
+        importType = type;
+        if (importType === 'keys') {
+            $('#import-area').show();
+            const areaMap = await getAreaMap();
+            setAreaOption($('#import-parent-area'), $('#import-sub-area'), areaMap);
+        } else {
+            $('#import-area').hide();
+        }
+        $('#import').modal('show');
+    } catch (error) {
+        alert(error.message);
+    }
 }
 
 // 点击导出按钮
@@ -98,6 +171,10 @@ function handleImportConfirm() {
     $.bootstrapLoading.start();
     const self = $(this);
     try {
+        const areaID = getAreaIDByOption($('#import-parent-area'), $('#import-sub-area'));
+        if (!areaID) {
+            throw '请选择地区!';
+        }
         const formData = new FormData();
         const file = $("input[name='import_data']")[0];
         if (file.files.length <= 0) {
@@ -105,6 +182,7 @@ function handleImportConfirm() {
         }
         formData.append('file', file.files[0]);
         formData.append('libID', curLib.id);
+        formData.append('areaID', areaID);
         formData.append('importType', importType);
         $.ajax({
             url: '/priceInfo/importExcel',
@@ -200,8 +278,6 @@ function processChecking(key, cb) {
     }
 }
 
-const matched = window.location.search.match(/filter=(.+)/);
-const compilationID = matched && matched[1] || '';
 // 爬取数据确认
 function handleCrawlConfirm() {
     const from = $('#period-start').val();