浏览代码

清单指引编辑器、清单编号悬浮提示

zhongzewei 6 年之前
父节点
当前提交
b8bc455046

+ 1 - 0
modules/bills_lib/models/bills_lib_interfaces.js

@@ -1853,6 +1853,7 @@ billsLibDao.prototype.getJobContent = function(gJobData, callback){
     let billsLibId = gJobData.billsLibId;
     JobContent.find({billsLibId: billsLibId, deleted: false}, '-_id').sort({code: 1}).exec(function(err, result){
         if(err){
+            console.log(err);
             callback(1, 'Error', null);
         }
         else {

+ 1 - 1
modules/std_billsGuidance_lib/facade/facades.js

@@ -127,7 +127,7 @@ async function getLibWithBills(libID){
     if(!billsLib){
         throw '引用的清单规则库不存在!';
     }
-    let bills = await stdBillsModel.find({billsLibId: billsLib.billsLibId}, '-_id code name ID NextSiblingID ParentID');
+    let bills = await stdBillsModel.find({billsLibId: billsLib.billsLibId}, '-_id code name ID NextSiblingID ParentID jobs items');
     return {guidanceLib: guidanceLib[0], bills};
 }
 

+ 3 - 2
public/web/sheet/sheet_data_helper.js

@@ -131,8 +131,9 @@ var SheetDataHelper = {
                     $(div).css("position", "absolute")
                         .css("border", "1px #C0C0C0 solid")
                         .css("box-shadow", "1px 2px 5px rgba(0,0,0,0.4)")
-                        .css("font", "9pt Arial")
-                        .css("background", "white")
+                        .css("font", "0.9rem Calibri")
+                        .css("background", "Black")
+                        .css("color", "White")
                         .css("padding", 5);
 
                     this._toolTipElement = div;

+ 110 - 0
public/web/tree_sheet/tree_sheet_helper.js

@@ -311,6 +311,14 @@ var TREE_SHEET_HELPER = {
                 hitinfo.sheet.repaint();
             }
         };
+        TreeNodeCellType.prototype.processMouseEnter = function(hitinfo){
+            if(hitinfo.sheet.name() === 'stdBillsGuidance_bills'){
+                TREE_SHEET_HELPER.delayShowTips(hitinfo,setting);
+            }
+        };
+        TreeNodeCellType.prototype.processMouseLeave = function (hitinfo) {
+            TREE_SHEET_HELPER.hideTipsDiv();
+        };
 
         let TipCellType = function () {};
         TipCellType.prototype = new GC.Spread.Sheets.CellTypes.Text();
@@ -371,5 +379,107 @@ var TREE_SHEET_HELPER = {
             TREE_SHEET_HELPER.refreshTreeNodeData(setting, sheet, tree.roots, true);
             TREE_SHEET_HELPER.refreshNodesVisible(tree.roots, sheet, true);
         });
+    },
+    showTipsDiv:function (text,setting,hitinfo) {
+        if (text && text !== '') {
+            if(text) text = replaceAll(/[\n]/,'<br>',text);
+            if(!this._fixedTipElement){
+                let div = $('#fixedTip')[0];
+                if (!div) {
+                    div = document.createElement("div");
+                    $(div).css("padding", 5)
+                        .attr("id", 'fixedTip');
+                    $(div).hide();
+                    document.body.insertBefore(div, null);
+                }
+                this._fixedTipElement = div;
+            }
+            $(this._fixedTipElement).width('');
+            $(this._fixedTipElement).html(text);
+            if (!this._toolTipElement) {
+                let div = $('#autoTip')[0];
+                if (!div) {
+                    div = document.createElement("div");
+                    $(div).css("position", "absolute")
+                        .css("border", "1px #C0C0C0 solid")
+                        .css("box-shadow", "1px 2px 5px rgba(0,0,0,0.4)")
+                        .css("font", "0.9rem Calibri")
+                        .css("background", "white")
+                        .css("padding", 5)
+                    $(div).attr("id", 'autoTip');
+                    $(div).hide();
+                    document.body.insertBefore(div, null);
+                }
+                this._toolTipElement = div;
+                $(this._toolTipElement).width('');
+                //实时读取位置信息
+                if(hitinfo.sheet && hitinfo.sheet.getParent().qo){
+                    setting.pos = SheetDataHelper.getObjPos(hitinfo.sheet.getParent().qo);
+                }
+                $(this._toolTipElement).html(`<span>${text}</span><div class="triangle-border tb-border_up"></div><div class="triangle-border tb-background_up"></div>`);
+                //清单指引、清单库做特殊处理
+                if($(hitinfo.sheet.name === 'stdBillsGuidance_bills')){
+                    $(this._toolTipElement).html(`<span>${text}</span>`);
+                    let divWidth = $(this._fixedTipElement).width(),
+                        divHeight = $(this._fixedTipElement).height();
+                    if(divWidth > 600){
+                        divWidth = 590;
+                        $(this._toolTipElement).width(divWidth);
+                    }
+                    let top = setting.pos.y  + hitinfo.y - divHeight / 2 < 0 ? 0 : setting.pos.y  + hitinfo.y - divHeight / 2;
+                    $(this._toolTipElement).css("top", top).css("left", hitinfo.x + 20);
+                } else {
+                    //计算显示的初始位置
+                    /*   显示在单元格上方,三角形指向下的版本
+                     let top = setting.pos.y + hitinfo.cellRect.y -$(this._toolTipElement).height() -26;
+                     let left =  setting.pos.x + hitinfo.cellRect.x;
+                     $(this._toolTipElement).css("top", top).css("left", left);*/
+                    //显示在下方,三角形指
+                    let top = setting.pos.y  + hitinfo.cellRect.y+26;
+                    let left =  setting.pos.x + hitinfo.cellRect.x;
+                    $(this._toolTipElement).css("top", top).css("left", left);
+
+                }
+                $(this._toolTipElement).show("fast");
+                TREE_SHEET_HELPER.tipDiv = 'show';//做个标记
+            }
+        }
+    },
+    hideTipsDiv:function () {
+        TREE_SHEET_HELPER.tipTimeStamp = +new Date();//这个是为了造价书清单编号树节点的那个延时显示而打的时间戳,防止已经要隐藏的提示框,延时显示
+        let me = TREE_SHEET_HELPER;
+        TREE_SHEET_HELPER.tipDiv = 'hide';
+        if (me._toolTipElement) {
+            $(me._toolTipElement).hide();
+            me._toolTipElement = null;
+        }
+        TREE_SHEET_HELPER.tipDivCheck();//延时检查:当tips正在show的时候,就调用了hide方法,会导致tips一直存在,所以设置一个超时处理
+    },
+    tipDivCheck(){
+        setTimeout(function () {
+            let tips = $('#autoTip');
+            if(TREE_SHEET_HELPER.tipDiv == 'show'){
+                return;
+            } else if(TREE_SHEET_HELPER.tipDiv == 'hide'&&tips){
+                tips.hide();
+                TREE_SHEET_HELPER._toolTipElement = null;
+            }
+        },600)
+    },
+    delayShowTips:function(hitinfo,setting,tips){//延时显示
+        let delayTimes = 500; //延时时间
+        let now_timeStamp = +new Date();
+        TREE_SHEET_HELPER.tipTimeStamp = now_timeStamp;
+        setTimeout(function () {
+            if(now_timeStamp - TREE_SHEET_HELPER.tipTimeStamp == 0){//鼠标停下的时候才显示
+                let tag = hitinfo.sheet.getTag(hitinfo.row, hitinfo.col);
+                if(tips && tips !=""){ //有tips的话优先显示tips
+                    tag = tips;
+                }
+                if(tag&&tag!=''){
+                    TREE_SHEET_HELPER.showTipsDiv(tag,setting,hitinfo);
+                }
+            }
+        },delayTimes);
     }
 };

+ 11 - 0
web/maintain/billsGuidance_lib/css/main.css

@@ -306,3 +306,14 @@ div.resize{
     width: 100%;
     cursor: s-resize;
 }
+.message-box {
+    position:absolute;
+    background:#000;
+    padding:8px 10px;
+    line-height: 18px;
+    border-radius:4px;
+    text-align:left;
+    font:0.9rem Calibri;
+    box-shadow:2px 2px 6px #ccc;
+    color:#fff;
+}

+ 2 - 0
web/maintain/billsGuidance_lib/html/zhiyin.html

@@ -11,6 +11,8 @@
     <link rel="stylesheet" href="/web/maintain/billsGuidance_lib/css/main.css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
     <link rel="stylesheet" href="/lib/jquery-contextmenu/jquery.contextMenu.css" type="text/css">
+    <script>
+    </script>
 </head>
 
 <body>

+ 105 - 5
web/maintain/billsGuidance_lib/js/billsGuidance.js

@@ -15,6 +15,10 @@ const billsGuidance = (function () {
 
     //自执行函数全局变量定义
     const libID = getQueryString('libID');
+    //总工作内容数据
+    let stdBillsJobData = [];
+    //总项目特征数据
+    let stdBillsFeatureData = [];
     const bills = {
         dom: $('#billsSpread'),
         workBook: null,
@@ -30,6 +34,7 @@ const billsGuidance = (function () {
             cols: [{
                 width: 200,
                 readOnly: true,
+                showHint: true,
                 head: {
                     titleNames: ["项目编码"],
                     spanCols: [1],
@@ -273,6 +278,7 @@ const billsGuidance = (function () {
             module.workBook = new GC.Spread.Sheets.Workbook(module.dom[0], {sheetCount: 1});
             let sheet = module.workBook.getActiveSheet();
             if(module === bills){
+                sheet.name('stdBillsGuidance_bills');
                 //默认初始可控制焦点在清单表中
                 module.workBook.focus();
                 sheet.options.isProtected = true;
@@ -508,7 +514,7 @@ const billsGuidance = (function () {
             if (setting.pos && text && text !== '') {
                 //固定不显示的div,存储文本获取固定div宽度,toolTipElement由于显示和隐藏,获取宽度不正确
                 if(!this._fixedTipElement){
-                    let div = $('#fixedTip')[0];
+                    let div = $('#fixedTip1')[0];
                     if (!div) {
                         div = document.createElement("div");
                         $(div).css("padding", 5)
@@ -521,7 +527,7 @@ const billsGuidance = (function () {
                 $(this._fixedTipElement).width('');
                 $(this._fixedTipElement).html(text);
                 if (!this._toolTipElement) {
-                    let div = $('#autoTip')[0];
+                    let div = $('#autoTip1')[0];
                     if (!div) {
                         div = document.createElement("div");
                         $(div).css("position", "absolute")
@@ -530,7 +536,7 @@ const billsGuidance = (function () {
                             .css("font", "0.9rem Calibri")
                             .css("background", "white")
                             .css("padding", 5)
-                            .attr("id", 'autoTip');
+                            .attr("id", 'autoTip1');
                         $(div).hide();
                         document.body.insertBefore(div, null);
                     }
@@ -679,6 +685,84 @@ const billsGuidance = (function () {
             })
         });
     }
+    //清单设置悬浮提示信息
+    //@param {Array}billsNodes(清单节点) {Array}jobs(总的工作内容数据) {Array}items(总的项目特征数据)
+    function setBillsHint(billsNodes, jobs, items) {
+        let jobsMapping = {},
+            itemsMapping = {};
+        for(let job of jobs){
+            jobsMapping[job.id] = job;
+        }
+        for(let item of items){
+            itemsMapping[item.id] = item;
+        }
+        let tagInfo = [];
+        for(let billsNode of billsNodes){
+            let hintArr = [];
+            let billsItems = billsNode.data.items;
+            if(billsItems.length > 0){
+                //项目特征
+                hintArr.push('项目特征:');
+            }
+            let itemCount = 1,
+                jobCount = 1;
+            for(let billsItem of billsItems){
+                let itemData = itemsMapping[billsItem.id];
+                if(itemData){
+                    //特征值
+                    let eigens = [];
+                    for(let eigen of itemData.itemValue){
+                        eigens.push(eigen.value);
+                    }
+                    eigens = eigens.join(';');
+                    hintArr.push(`${itemCount}.${itemData.content}${eigens === '' ? '' : ': ' + eigens}`);
+                    itemCount ++;
+                }
+            }
+            //工作内容
+            let billsJobs = billsNode.data.jobs;
+            if(billsJobs.length > 0){
+                hintArr.push('工作内容:');
+            }
+            for(let billsJob of billsJobs){
+                let jobData = jobsMapping[billsJob.id];
+                if(jobData){
+                    hintArr.push(`${jobCount}.${jobData.content}`);
+                    jobCount ++;
+                }
+            }
+            /*if(billsNode.data.ruleText && billsNode.data.ruleText !== ''){
+             hintArr.push('工程量计算规则:');
+             hintArr.push(billsNode.data.ruleText);
+             }
+             if(billsNode.data.recharge && billsNode.data.recharge !== ''){
+             hintArr.push('补注:');
+             hintArr.push(billsNode.data.recharge);
+             }*/
+            if(hintArr.length > 0){
+                tagInfo.push({row: billsNode.serialNo(), value: hintArr.join('\n')});
+            }
+        }
+        let sheet = bills.workBook.getActiveSheet();
+        renderSheetFunc(sheet, function () {
+            for(let tagI of tagInfo){
+                sheet.setTag(tagI.row, 0, tagI.value);
+            }
+        });
+    }
+    //初始化清单的工作内容和项目特征
+    //@param {Number}billsLibId {Function}callback @return {void}
+    function initJobAndCharacter(billsLibId, callback){
+        CommonAjax.post('/stdBillsEditor/getJobContent', {billsLibId: billsLibId}, function (datas) {
+            stdBillsJobData = datas;
+            CommonAjax.post('/stdBillsEditor/getItemCharacter', {billsLibId: billsLibId}, function (datas) {
+                stdBillsFeatureData = datas;
+                if(callback){
+                    callback();
+                }
+            });
+        });
+    }
     //获取指引库信息及关联的清单
     //@param {Number}libID {Function}callback @return {Object}
     function getLibWithBills(libID, callback){
@@ -686,7 +770,7 @@ const billsGuidance = (function () {
             initRationLibs(rstData.guidanceLib.compilationId);
             bills.cache = rstData.bills;
             initLibName(rstData.guidanceLib.name);
-            initTree(bills, bills.workBook.getActiveSheet(), bills.treeSetting, bills.cache);
+            /*initTree(bills, bills.workBook.getActiveSheet(), bills.treeSetting, bills.cache);
             //每一棵项目指引树挂在清单节点上
             for(let node of bills.tree.items){
                 node.guidance = {tree: null, controller: null};
@@ -695,7 +779,20 @@ const billsGuidance = (function () {
             billsInitSel(0);
             if(callback){
                 callback(rstData);
-            }
+            }*/
+            let initDataCallback = function () {
+                initTree(bills, bills.workBook.getActiveSheet(), bills.treeSetting, bills.cache);
+                //每一棵项目指引树挂在清单节点上
+                for(let node of bills.tree.items){
+                    node.guidance = {tree: null, controller: null};
+                }
+                //默认初始节点
+                billsInitSel(0);
+                if(callback){
+                    callback(rstData);
+                }
+            };
+            initJobAndCharacter(rstData.guidanceLib.billsLibId, initDataCallback);
         }, function (msg) {
             window.location.href = '/billsGuidance/main';
         });
@@ -707,6 +804,9 @@ const billsGuidance = (function () {
         module.controller = TREE_SHEET_CONTROLLER.createNew(module.tree, sheet, treeSetting);
         module.tree.loadDatas(datas);
         module.controller.showTreeData();
+        if(module === bills){
+            setBillsHint(bills.tree.items, stdBillsJobData, stdBillsFeatureData);
+        }
     }
     //更新项目指引
     //@param {Array}updateDatas {Function}callback @return {void}

+ 5 - 0
web/maintain/billsGuidance_lib/js/global.js

@@ -74,3 +74,8 @@ function removeLocalCache(key) {
     }
     return storage.removeItem(key);
 }
+
+function replaceAll(FindText, RepText,str) {
+    let regExp = new RegExp(FindText, "g");
+    return str.replace(regExp, RepText);
+};