Explorar o código

书签和批注

zhangweicheng %!s(int64=6) %!d(string=hai) anos
pai
achega
e0680dec0f

+ 3 - 1
modules/all_models/bills.js

@@ -71,7 +71,9 @@ let billsSchema = new Schema({
     engineeringContent:String,//工程内容
     serviceContent:String,//服务内容
     claimVisa:String,//签证及索赔依据
-    calcFlag: {type: Number}    // 叶子清单的计算类型。末定义:按定额计算。1:用户输入金额。2:用户输入单价。3:用户输入设计单价。
+    calcFlag: {type: Number},    // 叶子清单的计算类型。末定义:按定额计算。1:用户输入金额。2:用户输入单价。3:用户输入设计单价。
+    bookmarkBackground:String,//书签背景色
+    bookmarkAnnotation:String//批注
 });
 
 mongoose.model("bills", billsSchema);

+ 3 - 1
modules/all_models/ration.js

@@ -83,7 +83,9 @@ let rationSchema = new Schema({
     customQuantity:String,//自定义消耗
     model: Number,// 机型
     adjCoe:Number,
-    remark:String
+    remark:String,
+    bookmarkBackground:String,//书签背景色
+    bookmarkAnnotation:String//批注
 });
 
 let ration = mongoose.model("ration", rationSchema, "ration");

+ 6 - 4
web/building_saas/main/html/main.html

@@ -353,16 +353,16 @@
                                                   <input class="form-check-input" type="radio" name="content_type" id="raion_glj" value="ration_glj">
                                                   <label class="form-check-label" for="raion_glj">工料机</label>
                                               </div>
-                                          <!--    <div class="form-check form-check-inline">
+                                              <div class="form-check form-check-inline">
                                                   <input class="form-check-input" type="radio" name="content_type" id="bookmark" value="bookmark">
                                                   <label class="form-check-label" for="bookmark">书签批注</label>
-                                              </div>-->
+                                              </div>
                                           </div>
                                           <!--搜索分项/清单 出现-->
                                           <div class="col-12"  id="outstandingOptions">
                                               <div class="form-group form-check mb-0">
                                                   <input type="checkbox" class="form-check-input" id ="outstanding">
-                                                  <label class="form-check-label" for="outstanding">超 <input type="number" style="width:50px"> % 时突出显示</label>
+                                                  <label class="form-check-label" for="outstanding">超 <input id="outInp" type="number" style="width:50px"> % 时突出显示</label>
                                               </div>
                                           </div>
                                       </div>
@@ -433,7 +433,7 @@
                                                                   <input type="text" class="form-control" placeholder="描述">
                                                               </div>
                                                           </div>
-                                                          <button  class="btn btn-sm btn-primary">确定</button>
+                                                          <button  class="btn btn-sm btn-primary" id = "bookmarkSettingConfirm">确定</button>
                                                       </form>
                                                   </div>
                                               </div>
@@ -444,6 +444,8 @@
                                       <div class=" container-fluid" id="annotationDiv">
                                           <div class="row">
                                               <div class="col-lg-12" style="padding: 0px" >
+                                                  <input type="hidden" id="bookmarkNodeID">
+                                                  <input type="hidden" id="bookmarkNodeType">
                                                   <textarea class="form-control" id="annotationTextarea"  placeholder = "批注内容"></textarea>
                                               </div>
                                           </div>

+ 1 - 2
web/building_saas/main/js/models/ration_glj.js

@@ -93,8 +93,7 @@ let ration_glj = {
                     glj.basePrice = glj.marketUnitFee;
                     glj.adjustPrice = glj.marketUnitFee;
                     result.push(glj);
-                }
-                else{
+                } else{
                     let rationGljs = this.getGljArrByRation(ration);
                     for (let glj of rationGljs) {
                         let sameGlj = findGlj(glj, result);

+ 189 - 13
web/building_saas/main/js/views/locate_view.js

@@ -52,6 +52,8 @@ let locateObject={
             colHeaderHeight:30
         }
     },
+    bookmarkDatas:[],
+    seletedNodeID:null,//右键设置书签时选中的节点ID临时存储
     //为了兼容旧项目,这里给个默认值
     bookmarkPropertySetting:{
         settingList :[
@@ -102,10 +104,12 @@ let locateObject={
             this.bookmarkSpread = SheetDataHelper.createNewSpread($("#bookmarkSpread")[0]);
             sheetCommonObj.spreadDefaultStyle(this.bookmarkSpread);
             this.initBookmarkSheet();
-           // this.subSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick,this.onSheetDoubleClick);
+            this.bookmarkSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick,this.onSheetDoubleClick);
+            if(!projectReadOnly) this.initBookmarkRightClick();
         }else {
             this.bookmarkSpread.refresh();
         }
+        this.showBookmarkDatas();
     },
     refreshWorkBook: function () {
         if (this.mainSpread) this.mainSpread.refresh();
@@ -124,6 +128,7 @@ let locateObject={
         sheetCommonObj.initSheet( this.bookmarkSheet, this.bookMarkSetting);
         this.bookmarkSheet.setRowCount(0);
         this.bookmarkSheet.name('bookmark');
+        this.bookmarkSheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.bookmarkSelectionChange);
     },
     initOutstanding:function () {
         if(!projectObj.project.property.locateSetting) return;
@@ -154,6 +159,44 @@ let locateObject={
         sheetCommonObj.showData(this.subSheet,this.ration_setting,this.subRationDatas);
         this.subSheet.setRowCount(this.subRationDatas.length);
     },
+    showBookmarkDatas:function(refresh = false){
+        let sheet = this.bookmarkSheet;
+        let sel = sheet.getSelections()[0];
+        let oldData = sel.row<this.bookmarkDatas.length?this.bookmarkDatas[sel.row]:null;
+        this.bookmarkDatas = this.getBookmarkDatas();
+        sheetCommonObj.showData(sheet, this.bookMarkSetting,this.bookmarkDatas);
+        let selectedID = null;
+        let focus = false;
+        if(oldData) selectedID = oldData.ID;
+        if(this.seletedNodeID && refresh == false){
+            selectedID =  this.seletedNodeID;
+            this.seletedNodeID = null;
+            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);
+        sheet.setRowCount(this.bookmarkDatas.length);
+        if(sel.row!=-1) sheet.showRow(sel.row, GC.Spread.Sheets.VerticalPosition.bottom);
+        this.showAnnotation(sel.row,focus);
+    },
+    getBookmarkDatas:function(){
+        let datas = [];
+        let nodes = projectObj.project.mainTree.items;
+        for(let n of nodes){
+            if(!_.isEmpty(n.data.bookmarkBackground)){
+                let tem = {
+                    ID:n.data.ID,
+                    code:n.data.code,
+                    type:n.sourceType,
+                    name:n.data.name,
+                    bookmarkAnnotation:n.data.bookmarkAnnotation,
+                    bgColour:"#"+n.data.bookmarkBackground
+                };
+                datas.push(tem);
+            }
+        }
+        return datas;
+    },
 
     getSubRationDatas:function () {
         let datas = [];
@@ -175,28 +218,25 @@ let locateObject={
         let mainHeight = $(window).height()-$(".header").height()-$(".toolsbar").height()-$("#searchPanel").height();
         let subHeight = 0;
         if(options == "bookmark"){
-            let bookMarkLibResize  = getBookmarkResize();
-            loadHeight(bookMarkLibResize);
+            loadHeight(getBookmarkResize());
         }else {
             $('#locateTopDiv').height(mainHeight);
             $('#locate_result').height(mainHeight);
             $('#locateBottomDiv').height(subHeight);
             $('#locate_sub').height(subHeight - 7);
             if(options == "ration_glj"){
-                let locateLibResize = getLocateLibResize();
-                loadHeight(locateLibResize);
+                loadHeight(getLocateLibResize());
             }
         }
+        if (refreshWorkBook) {
+            me.refreshWorkBook();
+        }
 
         function loadHeight(libResize) {
             SlideResize.loadVerticalHeight(libResize.eleObj.module, libResize.eleObj, libResize.limit, function () {
                 locateObject.refreshWorkBook();
             });
         }
-
-        if (refreshWorkBook) {
-            me.refreshWorkBook();
-        }
     },
     init:function () {
         let me = this;
@@ -368,6 +408,7 @@ let locateObject={
         if(options == "ration_glj"&&sheetName != "locate_sub" ) return;
         let datas = options == "bills"? me.billsDatas:me.rationDatas;
         if( args.sheet.name() == "locate_sub") datas = me.subRationDatas;
+        if(args.sheet.name() == "bookmark") datas = me.bookmarkDatas;
         me.locateNode(datas[args.row].ID);
     },
     gljSelectionChange:function (e,args) {
@@ -378,18 +419,140 @@ let locateObject={
             me.showSubRateDatas();
         }
     },
+    bookmarkSelectionChange:function (e,args) {
+        let me = locateObject;
+        let newSel = args.newSelections[0];
+        let oldSel = args.oldSelections?args.oldSelections[0]:{};
+        if(newSel.row != oldSel.row){
+            me.showAnnotation(newSel.row);
+        }
+    },
+    showAnnotation:function (row,focus = false) {
+        let me = locateObject;
+        let recode =   me.bookmarkDatas[row];
+        if(recode){
+            $("#annotationTextarea").val(recode.bookmarkAnnotation);
+            $("#bookmarkNodeID").val(recode.ID);
+            $("#bookmarkNodeType").val(recode.type);
+            if(focus) $("#annotationTextarea").focus();
+        }
+    },
     locateNode:function (ID) {
         let node =  projectObj.project.mainTree.findNode(ID);
         if(node) projectObj.loadFocusLocation(node.serialNo(),1);
     },
+    updateProjectProperty:function(fieldID,property){
+        let updateData = {type:ModuleNames.project,data:{'ID' : projectObj.project.ID()}};//,'property.locateSetting':outstd
+        updateData.data["property."+fieldID] = property;
+        $.bootstrapLoading.start();
+        projectObj.project.updateNodes([updateData],function () {
+            $.bootstrapLoading.end();
+            projectObj.project.property[fieldID] = property;
+        });
+    },
     updateOutStanding:function (outstanding,outInp) {
         let outstd = {outstanding:outstanding,outInp:outInp};
-        let updateData = {type:ModuleNames.project,data:{'ID' : projectObj.project.ID(),'property.locateSetting':outstd}};
+        this.updateProjectProperty('locateSetting',outstd);
+    },
+    updateBookmarkSetting:function () {
+        let setting = projectObj.project.property.bookmarkSetting?projectObj.project.property.bookmarkSetting:locateObject.bookmarkPropertySetting;
+        for(let s of setting.settingList){
+            s.describe = $("#"+s.background).val();
+        }
+        setting.selected = $("#bookmarkSelected").val();
+        this.updateProjectProperty("bookmarkSetting",setting);
+    },
+    setOrCancelBookmark:function(node){
+        $("#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;
+        $.bootstrapLoading.start();
         projectObj.project.updateNodes([updateData],function () {
-            projectObj.project.property.locateSetting = outstd;
+            $.bootstrapLoading.end();
+            node.data.bookmarkBackground = background;
+            projectObj.mainController.refreshTreeNode([node]);
+            locateObject.seletedNodeID = node.data.ID;
+            //如果没有打开,自动打开书签批注设置
+            $('#locate').is(':visible')?locateObject.init():$("#locateTab").click();
+        });
+    },
+    initBookmarkRightClick:function(){
+        //如果当前行是无组成物的“普通材料”、“绿化苗木”、“外购砼构件”、“商品混凝土”、“商品砂浆”,则右键“添加计算材料”按钮有效。
+        let me = this;
+        $.contextMenu({
+            selector: '#bookmarkSpread',
+            build: function ($trigger, e) {
+                me.rightClickTarget = SheetDataHelper.safeRightClickSelection($trigger, e, me.bookmarkSpread);
+                return me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.viewport ||
+                    me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
+            },
+            items: {
+                "deleteBookmark": {
+                    name: "删除书签批注",
+                    icon: 'fa-remove',
+                    disabled: function () {
+                        return  me.bookmarkDatas.length == 0;
+                    },
+                    callback: function (key, opt) {
+                        me.deleteSelectedBookmark();
+                    }
+                },
+                "deleteAllBookmarks": {
+                    name: "删除所有书签批注",
+                    icon: 'fa-remove',
+                    disabled: function () {
+                        return  me.bookmarkDatas.length == 0;
+                    },
+                    callback: function (key, opt) {
+                        me.deleteBookmarkByDatas(me.bookmarkDatas);
+                    }
+                }
+            }
+        });
+    },
+    deleteSelectedBookmark:function () {
+        let sel = this.bookmarkSheet.getSelections()[0];
+        if(sel.row != -1 && this.bookmarkDatas.length>sel.row){
+            let record = this.bookmarkDatas[sel.row];
+            this.deleteBookmarkByDatas([record]);
+        }
+    },
+    deleteBookmarkByDatas:function(datas){
+        let postDatas = [];
+        for(let d of datas){
+            let tem = {
+                type:d.type,
+                data:{
+                    'ID':d.ID,
+                    'bookmarkAnnotation':null,
+                    'bookmarkBackground':null
+                }
+            };
+            postDatas.push(tem);
+        }
+       this.updateBookmarkNodes(postDatas);
+    },
+    updateBookmarkNodes:function (postDatas,refreshsNode = true) {
+        $.bootstrapLoading.start();
+        projectObj.project.updateNodes(postDatas,function () {
+            $.bootstrapLoading.end();
+            let nodes = [];
+            for(let p of postDatas){
+                let node =  projectObj.project.mainTree.findNode(p.data.ID);
+                if(!node) continue;
+                for(let key in p.data){
+                    if(key == 'ID') continue;
+                    node.data[key] = p.data[key];
+                }
+                nodes.push(node);
+            }
+            locateObject.showBookmarkDatas();
+            if(refreshsNode) projectObj.mainController.refreshTreeNode(nodes);
         });
     }
-
 };
 
 
@@ -439,12 +602,25 @@ $('#outstanding').change(function(){
     me.updateOutStanding(outStd,scMathUtil.roundForObj(outInp,getDecimal('process')));
 });
 
+$("#annotationTextarea").change(function(){
+    let updateData = {type:$("#bookmarkNodeType").val(),data:{'ID' :$("#bookmarkNodeID").val(),'bookmarkAnnotation':$(this).val()}};
+    let node =  projectObj.project.mainTree.findNode($("#bookmarkNodeID").val());
+    if(!node) return;
+    locateObject.updateBookmarkNodes([updateData],false);
+});
+
 $('#bookmarkSettingDropdown').on('shown.bs.dropdown', function showDropdown() {
+    locateObject.initBookmarkSetting();
     let setting = projectObj.project.property.bookmarkSetting?projectObj.project.property.bookmarkSetting:locateObject.bookmarkPropertySetting;
     $("#"+setting.selected).focus();
 });
 
+$("#bookmarkSettingConfirm").click(function () {
+    locateObject.updateBookmarkSetting();
+    $("#bookmarkSettingDropdown").click();
+});
+
+
 function bookmarkSelected() {
-    console.log("hehe");
     $("#bookmarkSelected").val($(this)[0].id);
 }

+ 1 - 1
web/building_saas/main/js/views/project_view.js

@@ -1410,7 +1410,7 @@ var projectObj = {
                     name: '设置/取消书签批注',
                     icon: 'fa-flag',
                     disabled: function () {
-                        if (projectReadOnly) {
+                        if (projectReadOnly || project.mainTree.selected.sourceType == ModuleNames.ration_glj) {
                             return true;
                         }
                         return false