Browse Source

Merge branch '1.0.0_online' of http://192.168.1.41:3000/SmartCost/ConstructionCost into 1.0.0_online

zhongzewei 6 years ago
parent
commit
a9870b08d3

+ 4 - 1
modules/all_models/bills.js

@@ -75,7 +75,10 @@ let billsSchema = new Schema({
     economicType:String,//工程经济指标类别
     economicType:String,//工程经济指标类别
     quantityIndexType:String,//工程量指标类别
     quantityIndexType:String,//工程量指标类别
     quantityIndexUnit:String,//工程量指标单位
     quantityIndexUnit:String,//工程量指标单位
-    quantityIndexCoe:Number//单位转换系数
+    quantityIndexCoe:Number,//单位转换系数
+    bookmarkBackground:String,//书签背景色
+    bookmarkAnnotation:String//批注
+
 });
 });
 
 
 mongoose.model("bills", billsSchema);
 mongoose.model("bills", billsSchema);

+ 3 - 1
modules/all_models/ration.js

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

+ 84 - 26
web/building_saas/main/html/main.html

@@ -526,10 +526,10 @@
                                                   <input class="form-check-input" type="radio" name="content_type" id="raion_glj" value="ration_glj">
                                                   <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>
                                                   <label class="form-check-label" for="raion_glj">人材机</label>
                                               </div>
                                               </div>
-                                              <!--<div class="form-check form-check-inline">
-                                                  <input class="form-check-input" type="radio" name="inlineRadioOptions" id="bookmark" value="option4">
-                                                  <label class="form-check-label" for="bookmark">书签注</label>
-                                              </div>-->
+                                              <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="col-12"  id="outstandingOptions">
@@ -540,32 +540,90 @@
                                           </div>
                                           </div>
                                       </div>
                                       </div>
                                   </div>
                                   </div>
-                                  <!--上下结构-->
-                                  <div class="top-content" id="locateTopDiv" style="overflow: hidden">
-                                      <div class="" id="locate_result" >
+                                  <div id="aboutLocateDiv">
+                                      <!--上下结构-->
+                                      <div class="top-content" id="locateTopDiv" style="overflow: hidden">
+                                          <div class="" id="locate_result" >
+                                          </div>
+                                      </div>
+                                      <div class="resize-y" id="locate_resize"></div>
+                                      <div class="bottom-content" id="locateBottomDiv">
+                                          <div class="" id="locate_sub"></div>
                                       </div>
                                       </div>
                                   </div>
                                   </div>
-                                  <div class="resize-y" id="locate_resize"></div>
-                                  <div class="bottom-content" id="locateBottomDiv">
-                                      <div class="" id="locate_sub"></div>
-                                  </div>
-                                <!--  <div class="main-data-side-y">
-                                      <table class="table table-sm table-bordered">
-                                          <tr><th>编码</th><th>项目名称</th><th>工程量</th><th>单位</th><th>综合单价</th><th>综合合价</th></tr>
-                                      </table>
-                                  </div>
-                                  <div class="sidebar-bottom container-fluid">
-                                      <div class="row">
-                                          <div class="col-lg-12">
-                                              <table class="table table-sm table-bordered">
-                                                  <tr><th>定额编号</th><th>定额名称</th></tr>
-                                                  <tr><td>AA0047</td><td>人工沟槽 较硬岩 槽深4m以内</td></tr>
-                                                  <tr><td>AA0005</td><td>人工挖沟槽土方 槽深4m以内</td></tr>
-                                              </table>
+                                  <div id="aboutBookmarkDiv" style="display: none">
+                                      <!--上下结构-->
+                                      <div id="bookmarkTopDiv">
+                                          <div class="sidebar-tools-bar container-fluid tools-bar-height-q">
+                                              <div class="p-1 row" style="padding-top:0px!important">
+                                                  <div class="dropdown" id="bookmarkSettingDropdown">
+                                                      <button class="btn btn-sm btn-primary dropdown-toggle" type="button" data-toggle="dropdown">
+                                                          书签设置
+                                                      </button>
+                                                      <form class="dropdown-menu p-2" id = "bookmarkSettingForm" onsubmit="return false;">
+                                                          <input type="hidden" id="bookmarkSelected">
+                                                          <div id="bookmarkSettingList">
+                                                              <div class="input-group input-group-sm mb-2" style="width:200px">
+                                                                  <div class="input-group-prepend">
+                                                                      <span class="input-group-text annotate-color-1">&nbsp;&nbsp;&nbsp;&nbsp;</span>
+                                                                  </div>
+                                                                  <input type="text" class="form-control" placeholder="描述">
+                                                              </div>
+                                                              <div class="input-group input-group-sm mb-2">
+                                                                  <div class="input-group-prepend">
+                                                                      <span class="input-group-text annotate-color-2">&nbsp;&nbsp;&nbsp;&nbsp;</span>
+                                                                  </div>
+                                                                  <input type="text" class="form-control" id="E2F2C5" placeholder="描述">
+                                                              </div>
+                                                              <div class="input-group input-group-sm mb-2">
+                                                                  <div class="input-group-prepend">
+                                                                      <span class="input-group-text annotate-color-3">&nbsp;&nbsp;&nbsp;&nbsp;</span>
+                                                                  </div>
+                                                                  <input type="text" class="form-control" placeholder="描述">
+                                                              </div>
+                                                              <div class="input-group input-group-sm mb-2">
+                                                                  <div class="input-group-prepend">
+                                                                      <span class="input-group-text annotate-color-4">&nbsp;&nbsp;&nbsp;&nbsp;</span>
+                                                                  </div>
+                                                                  <input type="text" class="form-control" placeholder="描述">
+                                                              </div>
+                                                              <div class="input-group input-group-sm mb-2">
+                                                                  <div class="input-group-prepend">
+                                                                      <span class="input-group-text annotate-color-5">&nbsp;&nbsp;&nbsp;&nbsp;</span>
+                                                                  </div>
+                                                                  <input type="text" class="form-control" placeholder="描述">
+                                                              </div>
+                                                              <div class="input-group input-group-sm mb-2">
+                                                                  <div class="input-group-prepend">
+                                                                      <span class="input-group-text annotate-color-6">&nbsp;&nbsp;&nbsp;&nbsp;</span>
+                                                                  </div>
+                                                                  <input type="text" class="form-control" placeholder="描述">
+                                                              </div>
+                                                              <div class="input-group input-group-sm mb-2">
+                                                                  <div class="input-group-prepend">
+                                                                      <span class="input-group-text annotate-color-7">&nbsp;&nbsp;&nbsp;&nbsp;</span>
+                                                                  </div>
+                                                                  <input type="text" class="form-control" placeholder="描述">
+                                                              </div>
+                                                          </div>
+                                                          <button  class="btn btn-sm btn-primary" id = "bookmarkSettingConfirm">确定</button>
+                                                      </form>
+                                                  </div>
+                                              </div>
                                           </div>
                                           </div>
+                                          <div class="" id = "bookmarkSpread" style="overflow: hidden"></div>
                                       </div>
                                       </div>
-                                  </div>-->
-
+                                      <div class="resize-y" id="bookmark_resize"></div>
+                                      <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>
+                                      </div>
+                                  </div>
                               </div>
                               </div>
 
 
                               <!--清单指引-->
                               <!--清单指引-->

+ 277 - 21
web/building_saas/main/js/views/locate_view.js

@@ -42,6 +42,31 @@ let locateObject={
         }
         }
     },
     },
     datas:[],
     datas:[],
+    bookMarkSetting:{
+        header:[
+            {headerName: "编码", headerWidth: 120, dataCode: "code", dataType: "String"},
+            {headerName: "书签名称", headerWidth: 200, dataCode: "name", dataType: "String"},
+        ],
+        view: {
+            lockColumns: [0,1],
+            colHeaderHeight:30
+        }
+    },
+    bookmarkDatas:[],
+    seletedNodeID:null,//右键设置书签时选中的节点ID临时存储
+    //为了兼容旧项目,这里给个默认值
+    bookmarkPropertySetting:{
+        settingList :[
+            {background:"E2F2C5",describe:""},
+            {background:"F9E2CF",describe:""},
+            {background:"F2EFD9",describe:"hehe"},
+            {background:"F5D1DA",describe:""},
+            {background:"E3E3E3",describe:""},
+            {background:"B6F3F2",describe:""},
+            {background:"ECE0F5",describe:""}
+        ],
+        selected:"E2F2C5"
+    },
     initMainSpread:function(){
     initMainSpread:function(){
         if(!this.mainSpread){
         if(!this.mainSpread){
             this.mainSpread = SheetDataHelper.createNewSpread($("#locate_result")[0],3);
             this.mainSpread = SheetDataHelper.createNewSpread($("#locate_result")[0],3);
@@ -74,13 +99,22 @@ let locateObject={
             this.subSpread.refresh();
             this.subSpread.refresh();
         }
         }
     },
     },
-    refreshWorkBook: function () {
-        if (this.mainSpread) {
-            this.mainSpread.refresh();
-        }
-        if (this.subSpread) {
-            this.subSpread.refresh();
+    initBookmarkSpread:function(){
+        if(!this.bookmarkSpread){
+            this.bookmarkSpread = SheetDataHelper.createNewSpread($("#bookmarkSpread")[0]);
+            sheetCommonObj.spreadDefaultStyle(this.bookmarkSpread);
+            this.initBookmarkSheet();
+            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();
+        if (this.subSpread) this.subSpread.refresh();
+        if (this.bookmarkSpread) this.bookmarkSpread.refresh();
     },
     },
     initSubSheet:function () {
     initSubSheet:function () {
         this.subSheet = this.subSpread .getSheet(0);
         this.subSheet = this.subSpread .getSheet(0);
@@ -88,12 +122,33 @@ let locateObject={
         this.subSheet.setRowCount(0);
         this.subSheet.setRowCount(0);
         this.subSheet.name('locate_sub');
         this.subSheet.name('locate_sub');
     },
     },
+    initBookmarkSheet:function () {
+        this.bookmarkSheet = this.bookmarkSpread .getSheet(0);
+        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 () {
     initOutstanding:function () {
         if(!projectObj.project.property.locateSetting) return;
         if(!projectObj.project.property.locateSetting) return;
         let outstd = projectObj.project.property.locateSetting;
         let outstd = projectObj.project.property.locateSetting;
         $("#outstanding").prop("checked",outstd.outstanding);
         $("#outstanding").prop("checked",outstd.outstanding);
         $("#outInp").val(parseFloat(outstd.outInp));
         $("#outInp").val(parseFloat(outstd.outInp));
     },
     },
+    initBookmarkSetting:function () {
+        $("#bookmarkSettingList").empty();
+        let setting = projectObj.project.property.bookmarkSetting?projectObj.project.property.bookmarkSetting:this.bookmarkPropertySetting;
+        for(let s of setting.settingList){
+            let b = `<div class="input-group input-group-sm mb-2" style="width:200px">
+                          <div class="input-group-prepend">
+                              <span class="input-group-text " style="background: #${s.background}">&nbsp;&nbsp;&nbsp;&nbsp;</span>
+                          </div>
+                          <input type="text" class="form-control" id="${s.background}"  placeholder="描述" value="${s.describe}">
+                     </div>`;
+            $("#bookmarkSettingList").append(b);
+            $("#"+s.background).bind('focus', bookmarkSelected);
+        }
+    },
     showMainData:function (datas,setting) {
     showMainData:function (datas,setting) {
         sheetCommonObj.showData(this.mainSpread.getActiveSheet(),setting,datas);
         sheetCommonObj.showData(this.mainSpread.getActiveSheet(),setting,datas);
         this.mainSpread.getActiveSheet().setRowCount(datas.length);
         this.mainSpread.getActiveSheet().setRowCount(datas.length);
@@ -103,7 +158,44 @@ let locateObject={
         sheetCommonObj.showData(this.subSheet,this.ration_setting,this.subRationDatas);
         sheetCommonObj.showData(this.subSheet,this.ration_setting,this.subRationDatas);
         this.subSheet.setRowCount(this.subRationDatas.length);
         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 () {
     getSubRationDatas:function () {
         let datas = [];
         let datas = [];
         let sheet = this.mainSpread.getActiveSheet();
         let sheet = this.mainSpread.getActiveSheet();
@@ -123,19 +215,26 @@ let locateObject={
         let me = this;
         let me = this;
         let mainHeight = $(window).height()-$(".header").height()-$(".toolsbar").height()-$("#searchPanel").height();
         let mainHeight = $(window).height()-$(".header").height()-$(".toolsbar").height()-$("#searchPanel").height();
         let subHeight = 0;
         let subHeight = 0;
-        $('#locateTopDiv').height(mainHeight);
-        $('#locate_result').height(mainHeight);
-        $('#locateBottomDiv').height(subHeight);
-        $('#locate_sub').height(subHeight - 7);
-        if(options == "ration_glj"){
-            let locateLibResize = getLocateLibResize();
-            SlideResize.loadVerticalHeight(locateLibResize.eleObj.module, locateLibResize.eleObj, locateLibResize.limit, function () {
-                locateObject.refreshWorkBook();
-            });
+        if(options == "bookmark"){
+            loadHeight(getBookmarkResize());
+        }else {
+            $('#locateTopDiv').height(mainHeight);
+            $('#locate_result').height(mainHeight);
+            $('#locateBottomDiv').height(subHeight);
+            $('#locate_sub').height(subHeight - 7);
+            if(options == "ration_glj"){
+                loadHeight(getLocateLibResize());
+            }
         }
         }
         if (refreshWorkBook) {
         if (refreshWorkBook) {
             me.refreshWorkBook();
             me.refreshWorkBook();
         }
         }
+
+        function loadHeight(libResize) {
+            SlideResize.loadVerticalHeight(libResize.eleObj.module, libResize.eleObj, libResize.limit, function () {
+                locateObject.refreshWorkBook();
+            });
+        }
     },
     },
     init:function () {
     init:function () {
         let me = this;
         let me = this;
@@ -144,9 +243,20 @@ let locateObject={
             me.refreshView(options, false);
             me.refreshView(options, false);
             me.initMainSpread();
             me.initMainSpread();
             me.initSubSpread();
             me.initSubSpread();
+            me.initBookmarkSpread();
         };
         };
-        if(options == "bills") me.initOutstanding();
-        options == "bills"?$("#outstandingOptions").show(0,callback):$("#outstandingOptions").hide(0,callback);
+        if(options == 'bookmark'){
+            $("#aboutLocateDiv").hide();
+            $("#outstandingOptions").hide();
+            me.initBookmarkSetting();
+            $("#aboutBookmarkDiv").show(0,callback);
+        }else {
+            $("#aboutBookmarkDiv").hide();
+            $("#aboutLocateDiv").show(0,function () {
+                if(options == "bills") me.initOutstanding();
+                options == "bills"?$("#outstandingOptions").show(0,callback):$("#outstandingOptions").hide(0,callback);
+            });
+        }
 
 
     },
     },
     findRecodes:function () {
     findRecodes:function () {
@@ -297,6 +407,7 @@ let locateObject={
         if(options == "ration_glj"&&sheetName != "locate_sub" ) return;
         if(options == "ration_glj"&&sheetName != "locate_sub" ) return;
         let datas = options == "bills"? me.billsDatas:me.rationDatas;
         let datas = options == "bills"? me.billsDatas:me.rationDatas;
         if( args.sheet.name() == "locate_sub") datas = me.subRationDatas;
         if( args.sheet.name() == "locate_sub") datas = me.subRationDatas;
+        if(args.sheet.name() == "bookmark") datas = me.bookmarkDatas;
         me.locateNode(datas[args.row].ID);
         me.locateNode(datas[args.row].ID);
     },
     },
     gljSelectionChange:function (e,args) {
     gljSelectionChange:function (e,args) {
@@ -307,18 +418,140 @@ let locateObject={
             me.showSubRateDatas();
             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) {
     locateNode:function (ID) {
         let node =  projectObj.project.mainTree.findNode(ID);
         let node =  projectObj.project.mainTree.findNode(ID);
         if(node) projectObj.loadFocusLocation(node.serialNo(),1);
         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) {
     updateOutStanding:function (outstanding,outInp) {
         let outstd = {outstanding:outstanding,outInp: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.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);
         });
         });
     }
     }
-
 };
 };
 
 
 
 
@@ -367,3 +600,26 @@ $('#outstanding').change(function(){
     let outStd = $("#outstanding").prop("checked");
     let outStd = $("#outstanding").prop("checked");
     me.updateOutStanding(outStd,scMathUtil.roundForObj(outInp,getDecimal('process')));
     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() {
+    $("#bookmarkSelected").val($(this)[0].id);
+}

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

@@ -927,7 +927,6 @@ var projectObj = {
                 // that.project.initCalcFields();
                 // that.project.initCalcFields();
                 let str = JSON.stringify(that.project.projSetting.main_tree_col);
                 let str = JSON.stringify(that.project.projSetting.main_tree_col);
                 that.project.projSetting.mainGridSetting = JSON.parse(str);
                 that.project.projSetting.mainGridSetting = JSON.parse(str);
-                console.log(that.project.projSetting.mainGridSetting);
                 that.project.projSetting.mainGridSetting.frozenCols = 4;
                 that.project.projSetting.mainGridSetting.frozenCols = 4;
                 TREE_SHEET_HELPER.initSetting($('#billsSpread')[0], that.project.projSetting.mainGridSetting);
                 TREE_SHEET_HELPER.initSetting($('#billsSpread')[0], that.project.projSetting.mainGridSetting);
                 that.project.projSetting.mainGridSetting.setAutoFitRow = MainTreeCol.getEvent("setAutoFitRow");
                 that.project.projSetting.mainGridSetting.setAutoFitRow = MainTreeCol.getEvent("setAutoFitRow");
@@ -1460,6 +1459,20 @@ var projectObj = {
                         return false;
                         return false;
                     },
                     },
                 },
                 },
+                "setBookMark": {
+                    name: '设置/取消书签批注',
+                    icon: 'fa-flag',
+                    disabled: function () {
+                        if (projectReadOnly || project.mainTree.selected.sourceType == ModuleNames.ration_glj) {
+                            return true;
+                        }
+                        return false
+                    },
+                    callback: function () {
+                        locateObject.setOrCancelBookmark(project.mainTree.selected)
+                    }
+
+                },
                 "delete": {
                 "delete": {
                     name: '删除',
                     name: '删除',
                     icon: 'fa-remove',
                     icon: 'fa-remove',

+ 25 - 0
web/building_saas/main/js/views/side_tools.js

@@ -98,6 +98,31 @@ SlideResize.verticalSlide(locateLibResize.eleObj, locateLibResize.limit, functio
     locateObject.refreshWorkBook();
     locateObject.refreshWorkBook();
 });
 });
 
 
+function getBookmarkResize() {
+    let resizeObj = {};
+    resizeObj.eleObj = {
+        module: 'bookmark',
+        resize: $('#bookmark_resize'),
+        top: $('#bookmarkTopDiv'),
+        topSpread: $('#bookmarkSpread'),
+        bottom: $('#annotationDiv'),
+        bottomSpread: $('#annotationTextarea')
+    };
+    resizeObj.limit = {
+        min: 150,
+        max: `$(window).height()-$('.header').height()-$('.toolsbar').height()-$('#searchPanel').height()-100-5`,//5: resize.height()
+        notTopSpread: 35,
+        notBottomSpread: 15,
+        totalHeight: `$(window).height()-$('.header').height()-$('.toolsbar').height()-$('#searchPanel').height()-5`//5: resize.height()
+    };
+    return resizeObj;
+}
+
+let bookMarkLibResize = getBookmarkResize();
+SlideResize.verticalSlide(bookMarkLibResize.eleObj, bookMarkLibResize.limit, function () {
+    locateObject.refreshWorkBook();
+});
+
 // 块模板库上下拖动(上中)
 // 块模板库上下拖动(上中)
 let blockLibTopMid = {};
 let blockLibTopMid = {};
 blockLibTopMid.eleObj = {
 blockLibTopMid.eleObj = {

File diff suppressed because it is too large
+ 2 - 2
web/users/html/login.html


+ 1 - 1
web/users/js/login.js

@@ -42,7 +42,7 @@ $(document).ready(function () {
         captchaObj.appendTo('#captcha-box');
         captchaObj.appendTo('#captcha-box');
         captchaObj.onSuccess(function () {
         captchaObj.onSuccess(function () {
             $(".btn-area").slideDown("fast");
             $(".btn-area").slideDown("fast");
-            $('#login').click();
+            // $('#login').click();
             captchaObj.getValidate();
             captchaObj.getValidate();
         });
         });