浏览代码

1.修改添加规则逻辑
2.修复添加规则bug

olym 7 年之前
父节点
当前提交
aab1a2aaa9

+ 9 - 0
modules/main/controllers/bills_controller.js

@@ -49,6 +49,15 @@ module.exports = {
         billsData.updateCharacterContent(findSet, updateObj, txtObj, function (err, message) {
             callback(req, res, err, message, null);
         });
+    },
+    updateBill: async function(request, response) {
+        const data = JSON.parse(request.body.data);
+        const findSet = data.findSet;
+        const updateData = data.updateData;
+        const result = await billsData.updateBill(findSet, updateData);
+        const message = !result ? '修改失败' : '修改成功';
+        const err = !result ? 1 : 0;
+        callback(request, response, err, message, null);
     }
 
 };

+ 20 - 2
modules/main/models/bills.js

@@ -60,7 +60,9 @@ let billsSchema = new Schema({
     fees: [subSchema.feesSchema],
     // 标记字段
     flags: [subSchema.flagsSchema],
-    deleteInfo: deleteSchema
+    deleteInfo: deleteSchema,
+    // 添加规则
+    addRule: subSchema.addRuleSchema,
 });
 
 let bills = db.model("bills", billsSchema);
@@ -143,6 +145,22 @@ class billsModel extends baseModel {
            }
        });
     };
-};
+    async updateBill(findSet, updateData) {
+        let update = {};
+        if (!updateData instanceof Array) {
+            return false;
+        }
+
+        for (const tmp of updateData) {
+            update[tmp.field] = tmp.value;
+        }
+
+        if (Object.keys(update).length <= 0) {
+            return false;
+        }
+
+        return bills.update(findSet, update);
+    };
+}
 
 module.exports = new billsModel();

+ 16 - 1
modules/main/models/bills_sub_schemas.js

@@ -44,5 +44,20 @@ let itemCharacterSchema = new Schema({
     eigenvalue: [eigenvalueSchema],//特征值
     isChecked: Boolean //是否勾选(输出)
 }, {_id: false});
+// 添加规则字段
+let addRuleSchema = new Schema({
+    // 添加位置
+    position: Number,
+    // 添加内容
+    addContent: Number,
+    // 显示格式
+    displayFormat: Number,
+    // 特征生成方式
+    characterFormat: Number,
+    // 子目生成方式
+    childDisplayFormat: Number,
+    // 序号格式
+   serialType: Number,
+}, {_id: false});
 
-module.exports = {feesSchema: feesSchema, flagsSchema: flagsSchema, jobContentSchema: jobContentSchema, itemCharacterSchema: itemCharacterSchema};
+module.exports = {feesSchema: feesSchema, flagsSchema: flagsSchema, jobContentSchema: jobContentSchema, itemCharacterSchema: itemCharacterSchema, addRuleSchema};

+ 3 - 1
modules/main/routes/bills_route.js

@@ -9,7 +9,9 @@ module.exports = function (app) {
     billsRouter.post('/getData', billsController.getData);
     billsRouter.post('/getItemTemplate', billsController.getItemTemplate);
     billsRouter.post('/allocIDs', billsController.allocIDs);
-    billsRouter.post('/updateCharacterContent', billsController.updateCharacterContent)//特征及内容更新 zhong 2017-9-1
+    billsRouter.post('/updateCharacterContent', billsController.updateCharacterContent);//特征及内容更新 zhong 2017-9-1
+    // 批量更新bill数据
+    billsRouter.post('/updateBill', billsController.updateBill);
     app.use('/bills', billsRouter);
 };
 

+ 190 - 110
web/building_saas/main/js/views/character_content_view.js

@@ -742,26 +742,71 @@ let pageCCOprObj = {
         CommonAjax.post(url, postData, function (rstData) {
             //更新节点数据
             if(updateCol){
-                if (!oprObj.hasOwnProperty("getID")) {
-                    // 已当前选中行更新数据
-                    let selectedNode = projectObj.mainController.tree.selected;
-                    selectedNode.data[updateObj.field] = updateObj.updateArr;
-                    selectedNode.data[txtObj.field] = txtObj.text;
-                    me.showData(oprObj.workBook.getSheet(0), oprObj.setting, oprObj.currentCache);//刷新特征及内容Spread
+                // 已当前选中行更新数据
+                let selectedNode = projectObj.mainController.tree.selected;
+                selectedNode.data[updateObj.field] = updateObj.updateArr;
+                selectedNode.data[txtObj.field] = txtObj.text;
+                me.showData(oprObj.workBook.getSheet(0), oprObj.setting, oprObj.currentCache);//刷新特征及内容Spread
 
-                    let activeCell = projectObj.mainSpread.getActiveSheet().getSelections()[0];
-                    projectObj.mainSpread.getActiveSheet().setValue(activeCell.row, updateCol, txtObj.text + ''); //刷新输出显示
-                    projectObj.mainSpread.getActiveSheet().autoFitRow(activeCell.row);
-                } else {
-                    // 以节点更新数据
-                    const row = oprObj.getID() - 1;
-                    projectObj.mainSpread.getActiveSheet().setValue(row, updateCol, txtObj.text + ''); //刷新输出显示
-                    projectObj.mainSpread.getActiveSheet().autoFitRow(row);
-                }
+                let activeCell = projectObj.mainSpread.getActiveSheet().getSelections()[0];
+                projectObj.mainSpread.getActiveSheet().setValue(activeCell.row, updateCol, txtObj.text + ''); //刷新输出显示
+                projectObj.mainSpread.getActiveSheet().autoFitRow(activeCell.row);
             }
         });
     },
     /**
+     * 更新bill数据
+     *
+     * @param {Object} findSet - 更新条件
+     * @param {Object} updateData - 更新数据
+     * @param {Function} callback - 回调函数
+     * @return {void}
+     */
+    updateBill: function(findSet, updateData, callback) {
+        if (!updateData instanceof Array || updateData.length <= 0) {
+            return;
+        }
+        let url = '/bills/updateBill';
+        let postData = { findSet, updateData };
+        CommonAjax.post(url, postData, function (response) {
+            callback(response);
+        });
+    },
+    /**
+     * 刷新节点数据
+     *
+     * @param {Object} node - 节点数据
+     * @param {Object} refreshData - 刷新的数据
+     * @param {Object} defaultData - 默认数据
+     * @return {void}
+     */
+    refreshView: function(node, refreshData, defaultData) {
+        // 更新清单行特征列或内容列
+        let updateCol = [
+            { name: 'character', col: 4 },
+            { name: 'content', col: 5 },
+            { name: 'name', col: 2 }
+        ];
+        if (updateCol === '') {
+            return;
+        }
+        const row = node.getID() - 1;
+        // 刷新输出显示
+        for (const tmp of updateCol) {
+            // 没有默认的数据则跳过刷新
+            if (defaultData[tmp.name] === undefined) {
+                continue;
+            }
+            // 不存在更新的数据则全部用默认数据替代
+            if (refreshData[tmp.name] === undefined) {
+                projectObj.mainSpread.getActiveSheet().setValue(row, tmp.col, defaultData[tmp.name] + '');
+            } else {
+                projectObj.mainSpread.getActiveSheet().setValue(row, tmp.col, refreshData[tmp.name] + '');
+            }
+        }
+        projectObj.mainSpread.getActiveSheet().autoFitRow(row);
+    },
+    /**
      * 根据配置设置清单项目特征
      *
      * @param {Object} node - 选中的node节点
@@ -770,91 +815,46 @@ let pageCCOprObj = {
      */
     setCharacterBySetting: function(node, setting) {
         let contentArray = [];
-        // 特征部分
-        const itemCharacter = node.data.itemCharacter;
-        // 内容数据
-        const itemJob = node.data.jobContent;
+        let self = this;
 
-        if (itemCharacter === undefined || itemCharacter.length <= 0 || itemJob === undefined || itemJob.length <= 0) {
-            return;
-        }
         // 保存的条件数据
         const findSet = { ID: node.data.ID, projectID: node.data.projectID };
-        const baseData = { findSet, itemJob, itemCharacter };
-        let characterArray = [];
-        for (const tmp of itemCharacter) {
-            if (tmp.eigenvalue === undefined || tmp.eigenvalue.length <= 0 || !tmp.isChecked) {
-                continue;
-            }
-            // 获取选中的特征值
-            let selectedEigen = '';
-            for (const eigen of tmp.eigenvalue) {
-                if (eigen.isSelected) {
-                    selectedEigen = eigen.value;
-                }
-            }
-            // 匹配设置的序号格式
-            const serialNo = this.formatSerialNumber(setting.serialType, tmp.serialNo);
-            let characterString = '';
-            // 特征生成方式
-            switch (setting.characterFormat) {
-                case '1':
-                    // 特征值
-                    characterString = serialNo + selectedEigen;
-                    break;
-                case '2':
-                    // 特征:特征值
-                    characterString = serialNo + tmp.character + ': ' + selectedEigen;
-                    break;
-            }
-            characterArray.push(characterString);
-        }
+        // 获取默认数据
+        const defaultData = this.getDataBySetting(node, {
+            serialType: "1",
+            characterFormat: "2",
+        });
+        // console.log(defaultData);return false;
+        defaultData.character = defaultData.character.join("\r\n");
+        defaultData.content = defaultData.content.join("\r\n");
 
-        // 内容部分
-        let jobArray = [];
-        for (const tmp of itemJob) {
-            if (!tmp.isChecked) {
-                continue;
-            }
-            // 匹配设置的序号格式
-            const serialNo = this.formatSerialNumber(setting.serialType, tmp.serialNo);
-            jobArray.push(serialNo + tmp.content)
-        }
+        // 获取当前设置数据
+        const currentData = this.getDataBySetting(node, setting);
 
         // 组合数据
         let content = '';
-        const jobContent = jobArray.join("\r\n");
-        const characterContent = characterArray.join("\r\n");
-        let nodeNameList = node.data.name.split("\n");
-        const nameContent = nodeNameList[0] !== undefined ? nodeNameList[0] : '';
-        // 存入对象,生成数据时用
-        let defaultContentInfo = {
-            jobContent,
-            characterContent,
-            nameContent
-        };
         switch (setting.addContent) {
             case "1":
                 // 项目特征+工作内容
                 contentArray.push('[项目特征]');
-                contentArray.push.apply(contentArray, characterArray);
+                contentArray.push.apply(contentArray, currentData.character);
                 contentArray.push('[工作内容]');
-                contentArray.push.apply(contentArray, jobArray);
+                contentArray.push.apply(contentArray, currentData.content);
                 break;
             case "2":
                 // 工作内容+项目特征
                 contentArray.push('[工作内容]');
-                contentArray.push.apply(contentArray, jobArray);
+                contentArray.push.apply(contentArray, currentData.content);
                 contentArray.push('[项目特征]');
-                contentArray.push.apply(contentArray, characterArray);
+                contentArray.push.apply(contentArray, currentData.character);
                 break;
             case "3":
                 // 项目特征
-                contentArray.push.apply(contentArray, characterArray);
+                contentArray.push.apply(contentArray, currentData.character);
                 break;
             case "4":
                 // 工作内容
-                contentArray.push.apply(contentArray, jobArray);
+                contentArray.push.apply(contentArray, currentData.content);
                 break;
             case "5":
                 // 定额子目
@@ -880,53 +880,57 @@ let pageCCOprObj = {
                 content = '(' + contentArray.join(',') + ')';
                 break;
         }
-        // 还原数据
-        this.restoreData(node, setting.position, baseData, defaultContentInfo);
         // 添加到对应位置
-        let saveObj = {};
+        let saveObj = [];
+        let refreshData = {};
+        saveObj.push({ field: 'addRule', value: setting });
         switch (setting.position) {
             case "1":
                 // 添加到项目特征列
-                saveObj = {field: 'itemCharacterText', text: content};
-                // 更新到数据库
-                pageCCOprObj.updateCharacterContent(findSet, {field: 'itemCharacter', updateArr: itemCharacter},
-                    saveObj, node);
+                saveObj.push({field: 'itemCharacterText', value: content});
+                // 还原名称及内容
+                saveObj.push({field: 'name', value: defaultData.name});
+                saveObj.push({field: 'jobContentText', value: defaultData.content});
+                // 刷新数据
+                refreshData = {'character': content};
                 break;
             case "2":
                 // 添加到清单名称列
-                const column = this.mainActiveCell.col !== undefined ? this.mainActiveCell.col : -1;
-                let colSetting = projectObj.mainController.setting.cols[column];
-                if (colSetting !== undefined) {
-                    content = node.data.name + "\r\n" + content;
-                    projectObj.project.Bills.updateField(node.source, 'name', content, true);
-                    projectObj.mainController.refreshTreeNode([node], false);
-                }
+                content = defaultData.name + "\r\n" + content;
+                saveObj.push({field: 'name', value: content});
+                // 还原特征及内容
+                saveObj.push({field: 'itemCharacterText', value: defaultData.character});
+                saveObj.push({field: 'jobContentText', value: defaultData.content});
+                // 刷新数据
+                refreshData = {'name': content};
                 break;
             case "3":
                 // 添加到工作内容列
-                saveObj =  {field: 'jobContentText', text: content};
-                // 更新到数据库
-                pageCCOprObj.updateCharacterContent(findSet, {field: 'jobContent', updateArr: itemJob},
-                    saveObj, node);
+                saveObj.push({field: 'jobContentText', value: content});
+                // 还原名称以及特征
+                saveObj.push({field: 'itemCharacterText', value: defaultData.character});
+                saveObj.push({field: 'name', value: defaultData.name});
+                // 刷新数据
+                refreshData = {'content': content};
                 break;
             case "4":
                 // 分别添加到对应列
-                if (Object.keys(defaultContentInfo).length <= 0) {
+                if (Object.keys(defaultData).length <= 0) {
                     return;
                 }
-                // 名称
-                projectObj.project.Bills.updateField(node.source, 'name', defaultContentInfo.nameContent, true);
-                projectObj.mainController.refreshTreeNode([node], false);
                 // 特征
-                saveObj = {field: 'itemCharacterText', text: defaultContentInfo.characterContent};
-                pageCCOprObj.updateCharacterContent(findSet, {field: 'itemCharacter', updateArr: itemCharacter},
-                    saveObj, node);
+                saveObj.push({field: 'itemCharacterText', value: defaultData.character});
                 // 内容
-                saveObj = {field: 'jobContentText', text: defaultContentInfo.jobContent};
-                pageCCOprObj.updateCharacterContent(findSet, {field: 'jobContent', updateArr: itemJob},
-                    saveObj, node);
+                saveObj.push({field: 'jobContentText', value: defaultData.content});
+                // 名称
+                saveObj.push({field: 'name', value: defaultData.name});
+                refreshData = {};
                 break;
         }
+        // 更新到数据库
+        pageCCOprObj.updateBill(findSet, saveObj, function(response) {
+            self.refreshView(node, refreshData, defaultData);
+        });
 
     },
     /**
@@ -952,6 +956,9 @@ let pageCCOprObj = {
                 // 英文字母(大写)
                 serialNo = letter[serialNo - 1] !== undefined ? letter[serialNo - 1].toUpperCase() + '. ' : '';
                 break;
+            default:
+                serialNo = '';
+                break;
         }
         return serialNo;
     },
@@ -974,13 +981,86 @@ let pageCCOprObj = {
                 continue;
             }
             const serialNo = this.formatSerialNumber(setting.serialType, count.toString());
-            result.push(serialNo +  tmp.data.code + ':' + tmp.data.name);
+            setting.childDisplayFormat === "1" ? result.push(tmp.data.code + ':' + tmp.data.name) : result.push(serialNo + tmp.data.name);
             count++;
         }
 
         return result;
     },
+    /**
+     * 获取默认数据
+     *
+     * @param {Object} node - 节点数据
+     * @param {Object} setting - 设置
+     * @return {Object}
+     */
+    getDataBySetting: function(node, setting) {
+        let result = {};
+        try {
+            if (node.data === undefined) {
+                throw '数据错误';
+            }
+            const itemCharacter = node.data.itemCharacter;
+            const itemJob = node.data.jobContent;
+            if (itemCharacter === undefined || itemCharacter.length <= 0 || itemJob === undefined || itemJob.length <= 0) {
+                throw '内部数据错误';
+            }
+            // 默认名称
+            let nodeNameList = node.data.name.split("\r\n");
+            const nameContent = nodeNameList[0] !== undefined ? nodeNameList[0] : '';
+            result['name'] = nameContent;
 
+            // 特征
+            let characterArray = [];
+            let count = 1;
+            for (const tmp of itemCharacter) {
+                if (tmp.eigenvalue === undefined || tmp.eigenvalue.length <= 0 || !tmp.isChecked) {
+                    continue;
+                }
+                // 获取选中的特征值
+                let selectedEigen = '';
+                for (const eigen of tmp.eigenvalue) {
+                    if (eigen.isSelected) {
+                        selectedEigen = eigen.value;
+                    }
+                }
+                // 匹配设置的序号格式
+                const serialNo = this.formatSerialNumber(setting.serialType, count.toString());
+                let characterString = '';
+                // 特征生成方式
+                switch (setting.characterFormat) {
+                    case '1':
+                        // 特征值
+                        characterString = serialNo + selectedEigen;
+                        break;
+                    case '2':
+                        // 特征:特征值
+                        characterString = serialNo + tmp.character + ': ' + selectedEigen;
+                        break;
+                }
+                characterArray.push(characterString);
+                count++;
+            }
+            result['character'] = characterArray;
+
+            // 内容部分
+            let jobArray = [];
+            count = 1;
+            for (const tmp of itemJob) {
+                if (!tmp.isChecked) {
+                    continue;
+                }
+                // 匹配设置的序号格式
+                const serialNo = this.formatSerialNumber(setting.serialType, count.toString());
+                jobArray.push(serialNo + tmp.content);
+                count++;
+            }
+            result['content'] = jobArray;
+        } catch (error) {
+            result = {};
+        }
+        return result;
+    },
     /**
      * 还原数据
      *
@@ -1005,16 +1085,16 @@ let pageCCOprObj = {
                 projectObj.mainController.refreshTreeNode([node], false);
                 // 还原工作内容
                 pageCCOprObj.updateCharacterContent(baseData.findSet, {field: 'jobContent', updateArr: baseData.itemJob},
-                    {field: 'jobContentText', text: defaultContentInfo.jobContent}, node);
+                    {field: 'jobContentText', text: contentOprObj.lastTextCache}, node);
                 break;
             case "2":
                 // 添加到清单名称
                 // 还原特征
                 pageCCOprObj.updateCharacterContent(baseData.findSet, {field: 'itemCharacter', updateArr: baseData.itemCharacter},
-                    {field: 'itemCharacterText', text: defaultContentInfo.characterContent}, node);
+                    {field: 'itemCharacterText', text: characterOprObj.lastTextCache}, node);
                 // 还原工作内容
                 pageCCOprObj.updateCharacterContent(baseData.findSet, {field: 'jobContent', updateArr: baseData.itemJob},
-                    {field: 'jobContentText', text: defaultContentInfo.jobContent}, node);
+                    {field: 'jobContentText', text: contentOprObj.lastTextCache}, node);
                 break;
             case "3":
                 // 添加到工作内容列
@@ -1023,7 +1103,7 @@ let pageCCOprObj = {
                 projectObj.mainController.refreshTreeNode([node], false);
                 // 还原特征
                 pageCCOprObj.updateCharacterContent(baseData.findSet, {field: 'itemCharacter', updateArr: baseData.itemCharacter},
-                    {field: 'jobContentText', text: defaultContentInfo.characterContent}, node);
+                    {field: 'itemCharacterText', text: characterOprObj.lastTextCache}, node);
                 break;
         }
     },

+ 39 - 0
web/building_saas/main/js/views/sub_view.js

@@ -104,6 +104,10 @@ $("#linkTZJNR").click(function () {
     pageCCOprObj.active = true;
     refreshSubSpread();
     let selectedNode = projectObj.mainController.tree.selected;
+    if (selectedNode.data.addRule !== undefined) {
+        setRule(selectedNode.data.addRule);
+    }
+
     pageCCOprObj.mainActiveCell = projectObj.mainSpread.getActiveSheet().getSelections()[0];
     if(selectedNode && selectedNode.sourceType === projectObj.project.Bills.getSourceType()){
         pageCCOprObj.setCacheAndShow(selectedNode);
@@ -189,6 +193,11 @@ $("#add-content").change(function() {
             serialTypeEle.val('');
             serialTypeEle.attr('disabled', 'disabled');
             break;
+        case '1':
+        case '2':
+        case '3':
+            characterFormatEle.removeAttr('disabled');
+            break;
         case '4':
             // 当“添加内容”是“定额子目”或“工作内容”,则“特征生成方式”灰显,不需选择;否则有效可选。
             characterFormatEle.attr('disabled', 'disabled');
@@ -210,6 +219,7 @@ $("#child-display-format").change(function() {
         serialTypeEle.val("");
         serialTypeEle.attr('disabled', 'disabled');
     } else {
+        serialTypeEle.val(1);
         serialTypeEle.removeAttr('disabled');
     }
 });
@@ -228,6 +238,8 @@ function getAddRuleSetting() {
     const displayFormat = $("#display-format").val();
     // 特征生成方式
     const characterFormat = $("#character-format").val();
+    // 子目生成方式
+    const childDisplayFormat = $("#child-display-format").val();
 
     // 序号格式
     const serialType = $("#serial-type").val();
@@ -237,11 +249,38 @@ function getAddRuleSetting() {
         addContent,
         position,
         displayFormat,
+        childDisplayFormat,
     };
 
     return setting;
 }
 
+/**
+ * 根据配置设置规则
+ *
+ * @param {Object} setting - 数据库中读取的数据
+ * @return {void}
+ */
+function setRule(setting) {
+    if (Object.keys(setting).length <= 0) {
+        return;
+    }
+    $("#add-position").val(setting.position);
+    $("#add-position").change();
+
+    $("#add-content").val(setting.addContent);
+    $("#add-content").change();
+
+    $("#display-format").val(setting.displayFormat);
+
+    $("#character-format").val(setting.characterFormat);
+
+    $("#child-display-format").val(setting.childDisplayFormat);
+    $("#child-display-format").change();
+
+    $("#serial-type").val(setting.serialType);
+}
+
 function activeSubSheetIs(idx){
     let rst = subSpread.getActiveSheetIndex() == idx;
     return rst;