Sfoglia il codice sorgente

广东18 定额工作内容

zhongzewei 6 anni fa
parent
commit
f96cc2c53d

+ 1 - 0
config/gulpConfig.js

@@ -69,6 +69,7 @@ module.exports = {
         //'lib/lodash/lodash.js',
         // 'test/tmp_data/test_ration_calc/ration_calc_base.js',
         'web/building_saas/main/js/models/main_consts.js',
+        'web/over_write/config/compilation_config.js',
         'public/web/common_util.js',
         'web/building_saas/glj/js/project_glj.js',
         'web/building_saas/glj/js/composition.js',

+ 2 - 0
modules/all_models/ration.js

@@ -69,6 +69,8 @@ let rationSchema = new Schema({
     ruleText: String,                            // 计算规则
     prefix: {type: String, default: ''},                              //定额是补充、借用时用  补 借
     referenceRationID:String,//如果是通过模板关联子目生成的定额,这里记录对应的主定额ID
+    // 工作内容 (选择自清单)
+    jobContentText: String,
 
     //工料机特有属性
     projectGLJID:Number,  //项目工料机ID

+ 0 - 21
modules/complementary_glj_lib/models/gljModel.js

@@ -45,27 +45,6 @@ class GljDao {
         let me = this;
         let rst = {stdGljs: [], complementaryGljs: []};
         //批量获取异步
-       /* let functions = [];
-        let count = await stdGljModel.find({repositoryId: stdGljLibId, $or: [{deleted: null}, {deleted: false}]}).count();
-        let findCount = Math.ceil(count/500);
-        for(let i = 0, len = findCount; i < len; i++){
-            functions.push((function(flag) {
-                return function (cb) {
-                    stdGljModel.find({repositoryId: stdGljLibId, deleted: null}, cb).skip(flag).sort({ID: 1}).limit(500);
-                }
-            })(i*500));
-        }
-        async.parallel(functions,  function (err, results) {
-            if(err){
-                callback(err, null);
-            }
-            else{
-                for(let stdGljs of results){
-                    rst.stdGljs = rst.stdGljs.concat(stdGljs);
-                }
-                callback(0, rst);
-            }
-        });*/
         async.parallel([
            async function (cb) {
                try{

+ 1 - 1
public/web/common_ajax.js

@@ -173,7 +173,7 @@ async function ajaxPost(url, data) {
             cache: false,
             timeout: 50000,
             success: function(result){
-                if (result.error === 0 || result.err ===0) {
+                if (!result.error || !result.err) {
                     resolve(result.data);
                 } else {
                     alert('error: ' + result.message);

+ 0 - 1
public/web/sheet/sheet_common.js

@@ -852,7 +852,6 @@ var sheetCommonObj = {
         ComboCellForActiveCell.prototype.paintValue = function (ctx, value, x, y, w, h, style, options) {
             let sheet = options.sheet;
             if (options.row === sheet.getActiveRowIndex() && options.col === sheet.getActiveColumnIndex() && (!forLocked || forLocked && !sheet.getCell(options.row, options.col).locked())) {
-
                 GC.Spread.Sheets.CellTypes.ComboBox.prototype.paintValue.apply(this, arguments);
 
             } else {

+ 1 - 1
public/web/tree_sheet/tree_sheet_helper.js

@@ -202,7 +202,7 @@ var TREE_SHEET_HELPER = {
                         cell.locked(true);
                     }else {
                         if (Object.prototype.toString.apply(colSetting.readOnly) === "[object Function]") {
-                            cell.locked(colSetting.readOnly(node));
+                            cell.locked(colSetting.readOnly(node, colSetting.data.field));
                         } else {
                             cell.locked(true);
                         }

+ 2 - 0
web/building_saas/main/html/main.html

@@ -42,6 +42,7 @@
         let projectReadOnly = JSON.parse('<%- projectReadOnly %>');
         let projectCooperate = JSON.parse('<%- projectCooperate %>');
         let projectOptins =  JSON.parse('<%- options %>');
+        const overWriteUrl = '<%- overWriteUrl %>';
         console.log(projectCooperate);
         const G_SHOW_BLOCK_LIB = true;
 //        const G_SHOW_BLOCK_LIB = false;
@@ -2146,6 +2147,7 @@
     <!-- inject:js -->
     <!--<script type="text/javascript" src="/test/tmp_data/test_ration_calc/ration_calc_base.js"></script>-->
     <script type="text/javascript" src="/web/building_saas/main/js/models/main_consts.js"></script>
+    <script type="text/javascript" src="/web/over_write/config/compilation_config.js"></script>
     <script type="text/javascript" src="/public/web/common_util.js"></script>
     <script type="text/javascript" src="/web/building_saas/glj/js/project_glj.js"></script>
     <script type="text/javascript" src="/web/building_saas/glj/js/composition.js"></script>

+ 9 - 0
web/building_saas/main/js/models/ration.js

@@ -120,6 +120,12 @@ var Ration = {
             let pEngineer = projectObj.project.projectInfo.property.projectEngineering;//量价默认使用后台设置的单位工程取费专业
             newData[project.masterField.ration] = billsID;
             newData['type'] = rType;
+            // 插入定额的时候,定额工作内容默认取清单的第一个工作内容
+            if (_compilationConfig.dynamicRationWorkContent) {
+                let billsNode = projectObj.project.mainTree.nodes['id_' + billsID];
+                let contentText = contentOprObj.getDefaultContent(billsNode);
+                newData.jobContentText = contentText;
+            }
             if (rType == rationType.volumePrice){
                 newData['subType'] =  priceType?priceType:gljType.GENERAL_MATERIAL;   // 如果priceType 没传,默认的量价类型为材料
             };
@@ -446,6 +452,7 @@ var Ration = {
             })
         };
         ration.prototype.addMultiRation = function (items, callback) {
+            console.log('addMultiRation');
             let me = this;
             let project = projectObj.project, sheetController = projectObj.mainController;
             let engineering = projectObj.project.projectInfo.property.engineering;
@@ -558,6 +565,7 @@ var Ration = {
 
 
         ration.prototype.addNewRation = function (itemQuery,rationType,callback=null,isEmpty=false,priceType,needCalcAndSave=true) {//priceType 是量价类型
+            console.log('addNewRation');
             let me = this;
             let project = projectObj.project, sheetController = projectObj.mainController;
             let engineering = projectObj.project.projectInfo.property.engineering;
@@ -645,6 +653,7 @@ var Ration = {
 
         };
         ration.prototype.addNewRationFast = function (rationType,callback) {
+            console.log('addNewRationFast');
             let me = this;
             let project = projectObj.project, sheetController = projectObj.mainController;
             let engineering = projectObj.project.projectInfo.property.engineering;

+ 82 - 0
web/building_saas/main/js/views/character_content_view.js

@@ -179,6 +179,60 @@ let contentOprObj = {
         const setting = projectObj.project.property.addRule !== undefined ? projectObj.project.property.addRule : getAddRuleSetting();
         pageCCOprObj.setCharacterBySetting(selectedNode, setting, callback, contentOprObj);
     },
+    // 获取默认清单工作内容文本
+    getDefaultContent: function (billsNode) {
+        if (!billsNode || !Array.isArray(billsNode.data.jobContent)) {
+            return '';
+        }
+        return billsNode.data.jobContent[0].content;
+    },
+    // 从清单节点获取工作内容文本数据
+    getContentTexts: function (billsNode) {
+        if (!billsNode || !Array.isArray(billsNode.data.jobContent)) {
+            return [];
+        }
+        let contents = billsNode.data.jobContent.map(data => data.content);
+        // 去重
+        return [...new Set(contents)];
+    },
+    // 对于定额工作内容与清单工作内容相关联的费用定额来说
+    // 操作工作内容后,需要处理定额的工作内容
+    // 若清单的工作内容修改后,定额的工作内容在清单工作内容中找不到,则把定额的工作内容设置为''
+    getUpdateRations: function (billsNode) {
+        // 获取清单工作内容文本数组
+        let contents = this.getContentTexts(billsNode);
+        // 查看清单下的定额,哪些定额需要更新(工作内容无法匹配)
+        let projectID = projectObj.project.ID(),
+            updates = [];
+        for (let rNode of billsNode.children) {
+            if (!rNode.data.jobContentText) {
+                continue;
+            }
+            // 匹配不到,定额工作内容置空
+            if (!contents.includes(rNode.data.jobContentText)) {
+                updates.push({
+                    updateType: 'ut_update',
+                    updateData: {
+                        ID: rNode.data.ID,
+                        projectID,
+                        jobContentText: ''
+                    }
+                });
+            }
+        }
+        return updates.length
+            ? {
+                project_id: projectID,
+                user_id: userID,
+                date: new Date(),
+                operation: 'updateBills',
+                update_data: [{
+                    moduleName: 'ration',
+                    data: updates
+                }]
+            }
+            : null;
+    },
     onEditStart(sender, args){
         if(projectObj.project.projectInfo.property.lockBills && projectObj.project.withinBillsLocked(projectObj.project.mainTree.selected)){
             args.cancel = true;
@@ -911,6 +965,9 @@ let characterOprObj = {
 };
 
 let pageCCOprObj = {
+    // 记录清单节点-工作内容文本数组的映射关系
+    // 定额-动态工作内容下拉项需要
+    contentCache: {},
     currentFindSet: null,
     mainActiveCell: null,//mainSpread焦点单元格
     nameCache: '',
@@ -1210,6 +1267,31 @@ let pageCCOprObj = {
             if(callback){
                 callback();
             }
+            // 操作工作内容时更新定额显示(工作内容下拉)
+            if (_compilationConfig.dynamicRationWorkContent &&
+                oprObj === contentOprObj) {
+                let updateData = contentOprObj.getUpdateRations(node);
+                if (updateData) {
+                    ajaxPost('/project/save', updateData).then(() => {
+                        updateData.update_data[0].data.forEach(rData => {
+                            let thisUpdate = rData.updateData;
+                            let rationNode = projectObj.project.mainTree.nodes['id_' + thisUpdate.ID];
+                            if (rationNode) {
+                                rationNode.data.jobContentText = thisUpdate.jobContentText;
+                            }
+                        });
+                        TREE_SHEET_HELPER.massOperationSheet(projectObj.mainController.sheet, function () {
+                            TREE_SHEET_HELPER.refreshTreeNodeData(projectObj.mainController.setting,
+                                projectObj.mainController.sheet, node.children, false);
+                        });
+                    });
+                } else {
+                    TREE_SHEET_HELPER.massOperationSheet(projectObj.mainController.sheet, function () {
+                        TREE_SHEET_HELPER.refreshTreeNodeData(projectObj.mainController.setting,
+                            projectObj.mainController.sheet, node.children, false);
+                    });
+                }
+            }
         });
 
     },

+ 17 - 3
web/building_saas/main/js/views/main_tree_col.js

@@ -1,7 +1,6 @@
 /**
  * Created by Mai on 2017/7/25.
  */
-
 let MainTreeCol = {
     getText: {
         subType: function (node) {
@@ -260,7 +259,13 @@ let MainTreeCol = {
                return calcTools.isRationItem(node);
             }
         },
-        forContentCharacter: function (node) {
+        forContentCharacter: function (node, field) {
+            // 定额工作内容下拉
+            if (_compilationConfig.dynamicRationWorkContent &&
+                node.sourceType === projectObj.project.Ration.getSourceType() &&
+                field === 'jobContentText') {
+                return false;
+            }
             return !MainTreeCol.readOnly.bills(node) || (node.data.type !== billType.BILL && node.data.type !== billType.FX);
         },
         forRuleText: function (node) {
@@ -295,7 +300,16 @@ let MainTreeCol = {
         units: function () {
             this.unit;
         },
-
+        jobContent: function (node) {
+            // 定额工作内容下拉
+            if (_compilationConfig.dynamicRationWorkContent &&
+                node.sourceType === projectObj.project.Ration.getSourceType()) {
+                let combo = sheetCommonObj.getDynamicCombo();
+                combo._maxDropDownItems = 10;
+                combo.items(contentOprObj.getContentTexts(node.parent));
+                return combo;
+            }
+        },
         feeRate: function () {
             return feeRateObject.getFeeRateEditCellType();
         },

+ 53 - 0
web/over_write/config/compilation_config.js

@@ -0,0 +1,53 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Zhong
+ * @date 2019/8/14
+ * @version
+ */
+
+/*
+* 不同运行环境下(CommonJS、浏览器)的费用定额功能模块配置
+* 如果运行环境使用了CommonJS,通过module.exports工厂函数返回内容
+* 否则将工厂函数返回内容挂载在浏览器宿主对象
+* @param  {Object}root 浏览器宿主对象
+ *        {String}overWriteUrl 费用定额重写路径(eg:/web/over_write/js/chongqing_2018.js)
+ *        {Function}factory 工厂函数
+* @return {Object}
+* */
+(function (root, overWriteUrl, factory) {
+    if (typeof module !== 'undefined') {
+        module.exports = factory(overWriteUrl);
+    } else {
+        root._compilationConfig = factory(overWriteUrl);
+    }
+}(window, overWriteUrl, function (url) {
+    if (!url) {
+        return {};
+    }
+    const COMPILATION_MAP = {
+        chongqing_2018: 1,
+        neimenggu_2017: 2,
+        jiangxi_2017: 3,
+        guangdong_2018: 4,
+        gansu_2013: 5
+    };
+    // 费用定额定制需求配置
+    let config = {
+        // 定额工作内容列可下拉选择(0关闭、1开启)(广东)
+        dynamicRationWorkContent: 0
+    };
+    // 提取重写路径中的关键信息 eg: chongqing_2018
+    let compilation = url.split('/').pop().slice(0, -3),
+        compilationNum = COMPILATION_MAP[compilation];
+    if (!compilationNum) {
+        return {};
+    }
+    // 广东18
+    if (compilationNum === COMPILATION_MAP.guangdong_2018) {
+        config.dynamicRationWorkContent = 1;
+    }
+    return config;
+}));

+ 18 - 0
web/over_write/js/guangdong_2018.js

@@ -0,0 +1,18 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Zhong
+ * @date 2019/8/15
+ * @version
+ */
+
+if (typeof module !== 'undefined') {
+
+} else {
+    // 广东接口排版规则,添加内容默认项目特征
+    $(function () {
+        $('#add-content').val('3');
+    });
+}