zeweizhong 6 роки тому
батько
коміт
db4f793b5a

+ 29 - 0
web/building_saas/css/custom.css

@@ -344,4 +344,33 @@ input.text-right{
 /*占位底色*/
 .occupied {
     background: #f1f1f1;
+}
+/*书签批注*/
+.annotate-color-1::before{
+    color: #E2F2C5 !important;
+    -webkit-text-stroke:.5px #ced4da;
+}
+.annotate-color-2::before{
+    color: #F9E2CF !important;
+    -webkit-text-stroke:.5px #ced4da;
+}
+.annotate-color-3::before{
+    color:#F2EFD9 !important;
+    -webkit-text-stroke:.5px #ced4da;
+}
+.annotate-color-4::before{
+    color:#F5D1DA !important;
+    -webkit-text-stroke:.5px #ced4da;
+}
+.annotate-color-5::before{
+    color:#E3E3E3 !important;
+    -webkit-text-stroke:.5px #ced4da;
+}
+.annotate-color-6::before{
+    color:#B6F3F2 !important;
+    -webkit-text-stroke:.5px #ced4da;
+}
+.annotate-color-7::before{
+    color:#ECE0F5 !important;
+    -webkit-text-stroke:.5px #ced4da;
 }

Різницю між файлами не показано, бо вона завелика
+ 1008 - 0
web/building_saas/main/js/models/exportStdInterface_gd18.js


+ 207 - 0
web/building_saas/main/js/models/importStdInterfaceBase.js

@@ -0,0 +1,207 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Zhong
+ * @date 2019/6/28
+ * @version
+ */
+
+const XML_IMPORT_BASE = (() => {
+    // 清单类型
+    const BILLS_TYPE ={
+        DXFY: 1, //大项费用
+        FB: 2,   //分部
+        FX: 3,   //分项
+        BILLS: 4, //清单
+        BX: 5    //补项
+    };
+    // 项目类型
+    const PROJECT_TYPE = {
+        PROJECT: 'Project',
+        ENGINEERING: 'Engineering',
+        TENDER: 'Tender'
+    };
+    // 人材机调整法
+    const ADJUST_TYPE = {
+        INFO: 'priceInfo',  //造价信息差额调整法
+        COE: 'priceCoe'     //价格指数调整法
+    };
+
+    const CONFIG = Object.freeze({
+        BILLS_TYPE,
+        PROJECT_TYPE,
+        ADJUST_TYPE
+    });
+
+    /*
+    * 读取文件转换为utf-8编码的字符串
+    * @param {Blob}file
+    * @return {Promise}
+    * */
+    function readAsTextSync(file) {
+        return new Promise((resolve, reject) => {
+            let fr = new FileReader();
+            fr.readAsText(file);    // 默认utf-8,如果出现乱码,得看导入文件是什么编码
+            fr.onload = function () {
+                resolve(this.result);
+            };
+            fr.onerror = function () {
+                reject('读取文件失败,请重试。');
+            }
+        });
+    }
+
+    /*
+     * 根据字段数组获得所要字段的值 eg: 要获取标段下的单项工程: ['标段', '单项工程'];
+     * @param {Object}source 源数据
+     *        {Array}fields 字段数组
+     * @return {String}
+     * @example getValue(source, ['标段', '_文件类型'])
+     * */
+    function getValue(source, fields) {
+        let cur = source;
+        for (let field of fields) {
+            if (!cur[field]) {
+                return '';
+            }
+            cur = cur[field];
+        }
+        return cur || '';
+    }
+    // 获取数据类型
+    function _plainType(v) {
+        return Object.prototype.toString.call(v).slice(8, -1);
+    }
+    /*
+     * 获取某字段的值,强制返回数组
+     * @param {Object}source 数据源
+     *        {Array}fields 取的字段
+     * @return {Array}
+     * @example arrayValue(source, ['标段', '单项工程'])
+     * */
+    function arrayValue(source, fields) {
+        let target = getValue(source, fields);
+        if (_plainType(target) === 'Object') {
+            target = [target];
+        } else if (_plainType(target) !== 'Array') {
+            target = []
+        }
+        return target;
+    }
+    // 获取费用
+    function getFee(fees, fields) {
+        if (!Array.isArray(fees) || !fees.length) {
+            return '0';
+        }
+        let feeData = fees.find(fee => fee.fieldName === fields[0]);
+        return feeData[fields[1]] || '0';
+    }
+    // 获取固定ID
+    function getFlag(data) {
+        return data.flags && data.flags[0] && data.flags[0].flag || 0;
+    }
+    /*
+     * 递归获取相关数据,eg:获取组织措施清单下的所有子清单,该子清单们可能由分类及公式措施项各种组合组成。(参考调用处)
+     * @param {Object}src(数据源) {Array}fields(二维数组,数组里的成员由需要取的字段组成)
+     *         eg: ['组织措施分类'], ['公式计算措施项'],该层数据可能由组织措施分类 或 公式计算措施项组成 (同层不可同时存在)
+     *        {Function} 获得源数据后,需要提取的数据方法
+     * @return {Array}
+     * */
+    function getItemsRecur(src, fields, extractFuc) {
+        let itemsSrc = [],
+            curField = [''];
+        for (let field of fields) {
+            itemsSrc = arrayValue(src, field);
+            if (itemsSrc.length) {
+                curField = field;
+                break;
+            }
+        }
+        return itemsSrc.map(itemSrc => {
+            let obj = extractFuc(itemSrc, curField);
+            obj.items = getItemsRecur(itemSrc, fields, extractFuc);
+            return obj;
+        });
+    }
+    /*
+    * 转换计算基数
+    * 1.有子项数据,则清空基数
+    * 2.行代号引用转换为ID引用
+    * 3.对应字典代号转换,对应字典里找不到则设置成金额
+    * @param {Array}billsData 清单数据
+    *        {Object}CalcBaseMap 基数映射
+    * @return {void}
+    * */
+    function transformCalcBase(billsData, CalcBaseMap) {
+        //行代号 - ID映射
+        let rowCodeMap = {};
+        billsData.forEach(data => {
+            if (data.rowCode) {
+                rowCodeMap[data.rowCode] = data.ID;
+            }
+        });
+        for (let bills of billsData) {
+            if (!bills.calcBase) {
+                continue;
+            }
+            let sub = billsData.find(data => data.ParentID === bills.ID);
+            //有子项数据,则清空基数,费率
+            if (sub) {
+                bills.calcBase = '';
+                bills.feeRate = '';
+                continue;
+            }
+            //提取基数
+            bills.calcBase = bills.calcBase.replace(/\s/g, '');
+            let bases = bills.calcBase.split(/[\+\-\*\/]/g);
+            //提取操作符
+            let oprs = bills.calcBase.match(/[\+\-\*\/]/g);
+            //转换后的基数
+            let newBase = [];
+            let illegal = false;    //不合法
+            for (let base of bases) {
+                if (rowCodeMap[base]) { //行引用
+                    newBase.push(`@${rowCodeMap[base]}`);
+                } else if (CalcBaseMap[base]) { //基数字典
+                    newBase.push(CalcBaseMap[base]);
+                } else {    //都没匹配到,说明软件无法识别此基数
+                    illegal = true;
+                    break;
+                }
+            };
+            if (illegal) {
+                let fee = getFee(bills.fees, ['common', 'totalFee']);
+                let feeRate = bills.feeRate && parseFloat(bills.feeRate) !== 0 ? parseFloat(bills.feeRate) : 0;
+                if (fee && parseFloat(fee) !== 0 && feeRate) {
+                    bills.calcBase = scMathUtil.roundForObj(parseFloat(fee) * 100 / feeRate, 2);
+                } else {
+                    bills.calcBase = fee !== '0' ? fee : '';
+                }
+            } else {
+                let newCalcBase = '';
+                for (let i = 0; i < newBase.length; i++) {
+                    newCalcBase += newBase[i];
+                    if (oprs && oprs[i]) {
+                        newCalcBase += oprs[i];
+                    }
+                }
+                bills.calcBase = newCalcBase;
+            }
+        }
+    }
+    // 获取必要的清单模板
+    async function getNeedfulTemplate(templateLibID) {
+        return await ajaxPost('/template/bills/api/getNeedfulTemplate',
+            {templateLibID});
+    }
+
+
+    const UTIL = Object.freeze({
+        getValue,
+        arrayValue,
+        getFee,
+        transformCalcBase
+    });
+})();

+ 19 - 9
web/building_saas/main/js/views/locate_view.js

@@ -67,6 +67,11 @@ let locateObject={
         ],
         selected:"E2F2C5"
     },
+    getDescribeByColor: function (color) {
+        const setting = projectObj.project.property.bookmarkSetting ? projectObj.project.property.bookmarkSetting : locateObject.bookmarkPropertySetting;
+        const item = setting.settingList.find(item => item.background === color);
+        return item && item.describe ? item.describe : '描述';
+    },
     initMainSpread:function(){
         if(!this.mainSpread){
             this.mainSpread = SheetDataHelper.createNewSpread($("#locate_result")[0],3);
@@ -96,6 +101,7 @@ let locateObject={
             this.initSubSheet();
             this.subSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick,this.onSheetDoubleClick);
         }else {
+            console.log(this.subSpread.getSheet(0).getActiveRowIndex());
             this.subSpread.refresh();
         }
     },
@@ -173,10 +179,11 @@ let locateObject={
             focus = true;
         }
         sel.row = selectedID?_.findIndex(this.bookmarkDatas,{'ID':selectedID}):0;
-        sheet.setSelection(sel.row==-1?0:sel.row,sel.col,sel.rowCount,sel.colCount);
+        const locatedRow = sel.row === -1 ? 0 : sel.row;
+        sheet.setSelection(locatedRow,sel.col,sel.rowCount,sel.colCount);
         sheet.setRowCount(this.bookmarkDatas.length);
-        if(sel.row!=-1) sheet.showRow(sel.row, GC.Spread.Sheets.VerticalPosition.bottom);
-        this.showAnnotation(sel.row,focus);
+        sheet.showRow(locatedRow, GC.Spread.Sheets.VerticalPosition.bottom)
+        this.showAnnotation(locatedRow,focus);
     },
     getBookmarkDatas:function(){
         let datas = [];
@@ -419,6 +426,7 @@ let locateObject={
         }
     },
     bookmarkSelectionChange:function (e,args) {
+        console.log('change');
         let me = locateObject;
         let newSel = args.newSelections[0];
         let oldSel = args.oldSelections?args.oldSelections[0]:{};
@@ -434,6 +442,8 @@ let locateObject={
             $("#bookmarkNodeID").val(recode.ID);
             $("#bookmarkNodeType").val(recode.type);
             if(focus) $("#annotationTextarea").focus();
+        } else {
+            $("#annotationTextarea").val('');
         }
     },
     locateNode:function (ID) {
@@ -461,13 +471,13 @@ let locateObject={
         setting.selected = $("#bookmarkSelected").val();
         this.updateProjectProperty("bookmarkSetting",setting);
     },
-    setOrCancelBookmark:function(node){
+    // background为null则为取消书签批注
+    setOrCancelBookmark:function(node, background){
         $("#bookmark").prop("checked", true);
-        let setting = projectObj.project.property.bookmarkSetting?projectObj.project.property.bookmarkSetting:locateObject.bookmarkPropertySetting;
-        let background = null;
-        if(_.isEmpty(node.data.bookmarkBackground)) background = setting.selected;
-        let updateData = {type:node.sourceType,data:{'ID' : node.data.ID,bookmarkBackground:background}};
-        if(background == null) updateData.data.bookmarkAnnotation = null;
+        const updateData = {type: node.sourceType, data: {ID: node.data.ID, bookmarkBackground: background}};
+        if(!background) {
+            updateData.data.bookmarkAnnotation = null;
+        }
         $.bootstrapLoading.start();
         projectObj.project.updateNodes([updateData],function () {
             $.bootstrapLoading.end();

+ 96 - 24
web/building_saas/main/js/views/project_view.js

@@ -1219,7 +1219,7 @@ var projectObj = {
                             }
                             if(isFlag(selected.data)&&selected.data.flagsIndex.fixed.flag==fixedFlag.SUB_ENGINERRING){//焦点行是分部分项工程
                                 if(selected.children.length>0){
-                                   return selected.children[0].data.type==billType.FX ||selected.children[0].data.type==billType.BX;//焦点行是分部分项工程,且子项是分项或补项
+                                    return selected.children[0].data.type==billType.FX ||selected.children[0].data.type==billType.BX;//焦点行是分部分项工程,且子项是分项或补项
                                 }else {
                                     return false
                                 }
@@ -1303,13 +1303,13 @@ var projectObj = {
                         ProjectController.addBills(project, controller);
                         projectObj.selectColAndFocus(project.mainTree.selected);
                     },
-                     visible: function(key, opt){
-                         if(project.mainTree.selected){
-                             return  project.Bills.isFBFX(project.mainTree.selected)==true?false:true;
-                         }else {
-                             return false;
-                         }
-                     }
+                    visible: function(key, opt){
+                        if(project.mainTree.selected){
+                            return  project.Bills.isFBFX(project.mainTree.selected)==true?false:true;
+                        }else {
+                            return false;
+                        }
+                    }
                 },
                 "spr1": '--------',
                 "insertRation": {
@@ -1326,12 +1326,12 @@ var projectObj = {
                     },
                     callback: function (key, opt) {
                         project.Ration.addNewRation(null,rationType.ration,projectObj.selectColAndFocus,false);
-                       // ProjectController.addRation(project, controller, rationType.ration);
+                        // ProjectController.addRation(project, controller, rationType.ration);
                     }/*,
-                    visible: function(key, opt){
-                        var selected = project.mainTree.selected;
-                        return canInsertRationNode(selected);
-                    }*/
+                     visible: function(key, opt){
+                     var selected = project.mainTree.selected;
+                     return canInsertRationNode(selected);
+                     }*/
                 },
                 "insertLJ": {
                     name: "插入量价",//插入量价不需要自动定位到编号列
@@ -1343,9 +1343,9 @@ var projectObj = {
                         return !project.Ration.canAdd(project.mainTree.selected);
                     },
                     callback: function (key, opt) {
-                       /* project.Ration.addNewRation(null,rationType.volumePrice,function (newNode) {
-                            projectObj.selectColAndFocus(newNode,null);
-                        },true);*/
+                        /* project.Ration.addNewRation(null,rationType.volumePrice,function (newNode) {
+                         projectObj.selectColAndFocus(newNode,null);
+                         },true);*/
                     },
                     items:{
                         insertLabour:{
@@ -1356,7 +1356,7 @@ var projectObj = {
                             }
                         },
                         insertMaterial:{
-                           name:"材料" ,
+                            name:"材料" ,
                             icon: 'fa-sign-in',
                             callback:function(key){
                                 project.Ration.insertVolumePrice(gljType.GENERAL_MATERIAL);
@@ -1463,18 +1463,90 @@ var projectObj = {
                     },
                 },
                 "setBookMark": {
-                    name: '设置/取消书签批注',
+                    name: '设置书签批注',
                     icon: 'fa-flag',
                     disabled: function () {
-                        if (projectReadOnly || project.mainTree.selected.sourceType == ModuleNames.ration_glj) {
+                        if (projectReadOnly || !project.mainTree.selected || project.mainTree.selected.sourceType == ModuleNames.ration_glj) {
                             return true;
                         }
                         return false
                     },
-                    callback: function () {
-                        locateObject.setOrCancelBookmark(project.mainTree.selected)
+                    items: {
+                        cancelMark: {
+                            name: '取消书签批注',
+                            icon: 'fa-remove',
+                            disabled: function () {
+                                const selected = project.mainTree.selected;
+                                return !(selected && selected.data.bookmarkBackground);
+                            },
+                            callback: function () {
+                                locateObject.setOrCancelBookmark(project.mainTree.selected, null);
+                            }
+                        },
+                        markE2F2C5: {
+                            name: function () {
+                                return locateObject.getDescribeByColor('E2F2C5');
+                            },
+                            icon: 'fa-square annotate-color-1',
+                            callback: function () {
+                                locateObject.setOrCancelBookmark(project.mainTree.selected, 'E2F2C5');
+                            }
+                        },
+                        markF9E2CF: {
+                            name: function () {
+                                return locateObject.getDescribeByColor('F9E2CF');
+                            },
+                            icon: 'fa-square annotate-color-2',
+                            callback: function () {
+                                locateObject.setOrCancelBookmark(project.mainTree.selected, 'F9E2CF');
+                            }
+                        },
+                        markF2EFD9: {
+                            name: function () {
+                                return locateObject.getDescribeByColor('F2EFD9');
+                            },
+                            icon: 'fa-square annotate-color-3',
+                            callback: function () {
+                                locateObject.setOrCancelBookmark(project.mainTree.selected, 'F2EFD9');
+                            }
+                        },
+                        markF5D1DA: {
+                            name: function () {
+                                return locateObject.getDescribeByColor('F5D1DA');
+                            },
+                            icon: 'fa-square annotate-color-4',
+                            callback: function () {
+                                locateObject.setOrCancelBookmark(project.mainTree.selected, 'F5D1DA');
+                            }
+                        },
+                        markE3E3E3: {
+                            name: function () {
+                                return locateObject.getDescribeByColor('E3E3E3');
+                            },
+                            icon: 'fa-square annotate-color-5',
+                            callback: function () {
+                                locateObject.setOrCancelBookmark(project.mainTree.selected, 'E3E3E3');
+                            }
+                        },
+                        markB6F3F2: {
+                            name: function () {
+                                return locateObject.getDescribeByColor('B6F3F2');
+                            },
+                            icon: 'fa-square annotate-color-6',
+                            callback: function () {
+                                locateObject.setOrCancelBookmark(project.mainTree.selected, 'B6F3F2');
+                            }
+                        },
+                        markECE0F5: {
+                            name: function () {
+                                return locateObject.getDescribeByColor('ECE0F5');
+                            },
+                            icon: 'fa-square annotate-color-7',
+                            callback: function () {
+                                locateObject.setOrCancelBookmark(project.mainTree.selected, 'ECE0F5');
+                            }
+                        },
                     }
-
                 },
                 "delete": {
                     name: '删除',
@@ -1570,8 +1642,8 @@ var projectObj = {
                         return projectReadOnly;
                     },
                     visible: function(key, opt){
-                         let  selected = project.mainTree.selected;
-                         return selected.sourceType==ModuleNames.bills&&project.Bills.isEngineerEst(selected);//当焦点行是“专业工程暂估价”时,右键可见并有效。
+                        let  selected = project.mainTree.selected;
+                        return selected.sourceType==ModuleNames.bills&&project.Bills.isEngineerEst(selected);//当焦点行是“专业工程暂估价”时,右键可见并有效。
                     },
                     callback: function () {
                         let node = project.mainTree.selected;//project.Bills.getNodeByFlag(project.mainTree.selected,fixedFlag.ENGINEERING_ESITIMATE);