Просмотр исходного кода

Merge branch 'master' of http://192.168.1.41:3000/SmartCost/YangHuCost

zhongzewei 6 лет назад
Родитель
Сommit
12f3023b94
35 измененных файлов с 370 добавлено и 126 удалено
  1. 1 1
      config/config.js
  2. 2 2
      modules/all_models/bills.js
  3. 1 1
      modules/all_models/mix_ratio.js
  4. 4 1
      modules/all_models/project_glj.js
  5. 2 2
      modules/all_models/ration.js
  6. 3 3
      modules/all_models/ration_coe.js
  7. 1 1
      modules/all_models/unit_price.js
  8. 23 3
      modules/main/controllers/ration_controller.js
  9. 0 3
      modules/main/models/project.js
  10. 1 1
      modules/main/models/ration.js
  11. 1 1
      modules/pm/facade/pm_facade.js
  12. 4 1
      modules/pm/models/project_model.js
  13. 14 1
      modules/pm/models/project_property_template.js
  14. 2 2
      modules/ration_glj/facade/glj_calculate_facade.js
  15. 1 1
      modules/reports/util/rpt_pdf_util.js
  16. 4 1
      public/web/gljUtil.js
  17. 0 1
      public/web/slideResize.js
  18. 6 6
      test/unit/reports/test_rpt_test_template.js
  19. BIN
      web/building_saas/img/NextPage.cur
  20. BIN
      web/building_saas/img/PreviousPage.cur
  21. 82 26
      web/building_saas/main/html/main.html
  22. 0 3
      web/building_saas/main/js/models/calc_program.js
  23. 8 2
      web/building_saas/main/js/models/project_glj.js
  24. 19 12
      web/building_saas/main/js/models/ration.js
  25. 1 4
      web/building_saas/main/js/models/ration_coe.js
  26. 33 8
      web/building_saas/main/js/views/glj_view.js
  27. 97 16
      web/building_saas/main/js/views/locate_view.js
  28. 1 1
      web/building_saas/main/js/views/material_calc_view.js
  29. 18 1
      web/building_saas/main/js/views/project_view.js
  30. 26 0
      web/building_saas/main/js/views/side_tools.js
  31. 7 10
      web/building_saas/main/js/views/zmhs_view.js
  32. 2 2
      web/building_saas/pm/js/pm_newMain.js
  33. 2 1
      web/building_saas/report/js/jpc_output.js
  34. 3 7
      web/building_saas/report/js/rpt_main.js
  35. 1 1
      web/building_saas/report/js/rpt_print.js

Разница между файлами не показана из-за своего большого размера
+ 1 - 1
config/config.js


+ 2 - 2
modules/all_models/bills.js

@@ -6,10 +6,10 @@ let subSchema = require("../all_schemas/bills_sub_schemas");
 let deleteSchema = require('../all_schemas/delete_schema');
 let Schema = mongoose.Schema;
 let billsSchema = new Schema({
-    ID: String,
+    ID: {type: String, index: true},
     ParentID: String,
     NextSiblingID: String,
-    projectID: Number,
+    projectID:{type: Number, index: true} ,
     serialNo: Number,
     chapterID: Number,
     billsLibId: Number,

+ 1 - 1
modules/all_models/mix_ratio.js

@@ -23,7 +23,7 @@ let modelSchema = {
         index: true
     },
     // 单价文件表id (因为选择单价文件后配合比数据也需要同步,所以记录单价文件id)
-    unit_price_file_id: Number,
+    unit_price_file_id: {type: Number, index: true},
     // 关联项目工料机的key 不能关联id,因为单价文件导入别的项目后项目工料机id不同
     connect_key: {
         type: String,

+ 4 - 1
modules/all_models/project_glj.js

@@ -18,7 +18,10 @@ let modelSchema = {
     // 工料机总库ID
     glj_id: Number,
     // 标段ID
-    project_id: Number,
+    project_id: {
+        type: Number,
+        index: true
+    },
     // 编码
     code: {
         type: String,

+ 2 - 2
modules/all_models/ration.js

@@ -27,8 +27,8 @@ var rationAssItemSchema = mongoose.Schema({
 // 定额、量价、工料机定额 合并存储
 let rationSchema = new Schema({
     // 公用属性部分
-    ID: String,
-    projectID: Number,
+    ID: {type: String, index: true},
+    projectID: {type: Number, index: true},
     billsItemID: String,
     serialNo: Number,
     code: String,

+ 3 - 3
modules/all_models/ration_coe.js

@@ -17,15 +17,15 @@ var coeSchema = mongoose.Schema({
 
 var coeListSchema = mongoose.Schema({
     libID: Number,                      // 所属定额库ID
-    ID: String,                         // 系数ID(流水号ID)
+    ID: {type: String, index: true},                         // 系数ID(流水号ID)
     name: String,                       // 名称
     content: String,                    // 说明
     original_code:String,               //原人材机编码
     option_codes:String,                //可选人材机编码
     option_list:[Schema.Types.Mixed],//下拉列表选项
     select_code:String,
-    rationID:String,
-    projectID:Number,
+    rationID:{type: String, index: true},
+    projectID:{type: Number, index: true},
     coeID:Number,
     isAdjust:Number, //0不调整,1调整
     seq:Number,//序数,排序用

+ 1 - 1
modules/all_models/unit_price.js

@@ -43,7 +43,7 @@ let modelSchema = {
     // 类型简称
     short_name: String,
     // 单价文件表id
-    unit_price_file_id: Number,
+    unit_price_file_id: {type: Number, index: true},
     // 对应标准库工料机id
     glj_id: Number,
     //是否新增1为是,0为否

+ 23 - 3
modules/main/controllers/ration_controller.js

@@ -8,6 +8,7 @@ let ration_facade = require('../facade/ration_facade');
 let bill_facade = require('../facade/bill_facade');
 let project_facade = require("../facade/project_facade");
 let logger = require("../../../logs/log_helper").logger;
+import GLJController from "../../glj/controllers/glj_controller";
 let controller = {
     insertGLJAsRation:async function (req){
         let data = req.body.data;
@@ -26,7 +27,15 @@ let controller = {
             data = JSON.stringify(data);
         }
         data = JSON.parse(data);
-        return await ration_facade.addNewRation(data,req.session.sessionCompilation);
+        let start = +new Date();
+        let result = await ration_facade.addNewRation(data,req.session.sessionCompilation);
+        //合并取项目工料机数据的情求,用于刷新项目工料机数据,当有添加、替换项目工料机的情况,才需要刷新
+        if(result.ration_gljs && result.ration_gljs.length > 0 && data.newData){
+            result.projectGLJDatas =  await getProjectGLJData(data.newData.projectID);
+        }
+        let end = +new Date();
+        console.log("实际插入时间为-------------------------------"+(end-start));
+        return result
     },
     addMultiRation: async function (req) {
         let data = req.body.data;
@@ -78,12 +87,23 @@ let controller = {
     updateCoeAdjust:async function(req){
         let data = req.body.data;
         data = JSON.parse(data);
-        return await ration_facade.updateCoeAdjust(data,req.session.sessionCompilation);
+        let result = await ration_facade.updateCoeAdjust(data,req.session.sessionCompilation);
+        //合并取项目工料机数据的情求,用于刷新项目工料机数据,当有添加、替换项目工料机的情况,才需要刷新
+        if(result.add.length > 0 || result.replace.length > 0){
+            result.projectGLJDatas =  await getProjectGLJData(data.projectID);
+        }
+        return result
 
     }
+};
 
 
-};
+async function getProjectGLJData(projectID) {
+    let gljController = new GLJController();
+    let responseData = await gljController.getProjectGLJsByProjectID(projectID);
+    return responseData.data;
+}
+
 
 function prepareUpdateNodes(datas,nodes,type) {
     for(let d of datas){

+ 0 - 3
modules/main/models/project.js

@@ -103,10 +103,7 @@ Project.prototype.getData = function(projectID, callback){
     for (itemName in moduleMap){
         functions.push((function(itemName){
             return function (cb) {
-                let startTime = +new Date();
                 moduleMap[itemName].getData(projectID, function(err, moduleName, data){
-                    let endTime = +new Date();
-                    console.log(moduleName+'---------------'+(endTime - startTime));
                     cb(err, {moduleName: moduleName, data: data})
                 })
             }

+ 1 - 1
modules/main/models/ration.js

@@ -18,7 +18,7 @@ class rationModel extends baseModel {
     }
 
     getData (projectID, callback) {
-        ration.find({'$or': [{projectID: projectID, deleteInfo: null}, {projectID: projectID, 'deleteInfo.deleted': {$in: [null, false]}}]}, '-_id', function(err, datas){
+        ration.find({projectID: projectID}, '-_id', function(err, datas){//{'$or': [{projectID: projectID, deleteInfo: null}, {projectID: projectID, 'deleteInfo.deleted': {$in: [null, false]}}]}
             if (!err) {
                 callback(0, projectConsts.RATION, datas);
             } else {

+ 1 - 1
modules/pm/facade/pm_facade.js

@@ -764,7 +764,7 @@ async function getSummaryInfo(projectIDs){
     if(tenders.length > 0){
         for(let tender of tenders){
             tenderIDs.push(tender.ID);
-            IDMapping[tender.ID] = {totalCost: 0, changeMark:tender.changeMark};//property:tender.property
+            IDMapping[tender.ID] = {totalCost: 0, changeMark:tender.changeMark,property:tender.property};//property:tender.property
         }
         //需要获取的清单固定类别综合合价:总造价
         let needFlags = [billsFlags.TOTAL_COST];

+ 4 - 1
modules/pm/models/project_model.js

@@ -28,7 +28,8 @@ import {
     projectFeature,
     displaySetting,
     calcOptions,
-    tenderSetting
+    tenderSetting,
+    bookmarkSetting
 } from './project_property_template';
 import optionSetting from '../../options/models/optionTypes';
 import fixedFlag from '../../common/const/bills_fixed';
@@ -203,6 +204,8 @@ ProjectsDAO.prototype.updateUserProjects = async function (userId, compilationId
                     data.updateData.property.lockBills = false;
                     //工料机单价调整系数
                     data.updateData.property.tenderSetting = tenderSetting;
+                    //书签和批注
+                    data.updateData.property.bookmarkSetting =  bookmarkSetting;
                 }
 
                 newProject = new Projects(data.updateData);

+ 14 - 1
modules/pm/models/project_property_template.js

@@ -139,4 +139,17 @@ const projectFeature = [
     {dispName: '门窗材料及装饰', key: 'doorsWindowsMaterial', value: ''}
 ];
 
-export {defaultDecimal, billsQuantityDecimal, basicInformation, projectFeature,displaySetting,calcOptions,tenderSetting};
+const bookmarkSetting = {
+    settingList :[
+        {background:"E2F2C5",describe:""},
+        {background:"F9E2CF",describe:""},
+        {background:"F2EFD9",describe:""},
+        {background:"F5D1DA",describe:""},
+        {background:"E3E3E3",describe:""},
+        {background:"B6F3F2",describe:""},
+        {background:"ECE0F5",describe:""}
+    ],
+    selected:"E2F2C5"
+};
+
+export {defaultDecimal, billsQuantityDecimal, basicInformation, projectFeature,displaySetting,calcOptions,tenderSetting,bookmarkSetting};

+ 2 - 2
modules/ration_glj/facade/glj_calculate_facade.js

@@ -50,7 +50,7 @@ async function calculateQuantity(query,noNeedCal=null,refreshRationName = false)
          };
          let impactRation = await ration.findOne({ID:query.rationID,projectID:query.projectID});
          let gljList = await ration_glj.find(query);//{projectID:query.projectID,rationID:query.rationID}
-         let coeList = await ration_coe.find({projectID:query.projectID,rationID:query.rationID}).sort('seq').exec();
+         let coeList = await ration_coe.find({rationID:query.rationID}).sort('seq').exec();
          let assList=[], assRation = null, adjustState=[],mixRatioMap = {};
          if(!impactRation){//如果定额不存在或者已删除,返回空
              return null;
@@ -89,7 +89,7 @@ async function calculateQuantity(query,noNeedCal=null,refreshRationName = false)
             let r = await calculateQuantityPerGLJ(gljList[i],gljList,coeList,assList,adjustState,mixRatioMap,noNeedCal);
             if(quantityUpdateCheck(gljList[i],r) == true) result.glj_result.push(r);
         }
-         if(noNeedCal==null){
+         if(noNeedCal==null && result.glj_result.length > 0){
              await ration_glj.bulkWrite(generateUpdateTasks(result.glj_result));
          }
          adjustState= _.sortByOrder(adjustState, ['index'], ['asc']);

+ 1 - 1
modules/reports/util/rpt_pdf_util.js

@@ -154,7 +154,7 @@ function export_pdf_file (pageData, paperSize, fName, callback) {
                 // area[JV.IDX_TOP] = cell[JV.PROP_AREA][JV.PROP_TOP] + i * (height / values.length) + offsetY;
                 // area[JV.IDX_BOTTOM] = cell[JV.PROP_AREA][JV.PROP_TOP] + (i + 1) * (height / values.length) + offsetY;
                 area[JV.IDX_TOP] = cell[JV.PROP_AREA][JV.PROP_TOP] + i * (ah / values.length) + offsetY + restTopH;
-                area[JV.IDX_BOTTOM] = cell[JV.PROP_AREA][JV.PROP_TOP] + (i + 1) * (ah / values.length) + offsetY + restTopH;
+                area[JV.IDX_BOTTOM] = cell[JV.PROP_AREA][JV.PROP_TOP] + (i + 1) * (ah / values.length) + offsetY + restBottomH;
                 if (values[i] === null || values[i] === undefined || values[i] === 'null') {
                     values[i] = "";
                 }

+ 4 - 1
public/web/gljUtil.js

@@ -357,12 +357,15 @@ let gljUtil = {
     },
     //是否从混凝土改成商品混凝土,并且混凝土的定额消耗量不为空,则原混凝土的自定义消耗改成0,插入一条新的商品混凝土自定义消耗量为原自定义或定额消耗
     isAddCommercialForReplace:function (oldType,newType,rationItemQuantity) {
-        return gljUtil.isConcreteType(oldType)&&gljUtil.isCommercialConcreteType(newType)&&rationItemQuantity&&rationItemQuantity!='0';
+        return gljUtil.isConcreteToCommercialConcrete(oldType,newType)&&rationItemQuantity&&rationItemQuantity!='0';
     },
     isMaterialType:function (type) {
        let materialType = [gljType.GENERAL_MATERIAL,gljType.GREEN_SEEDLING,gljType.PURCHASE_COMPONENT,gljType.COMMERCIAL_CONCRETE,gljType.COMMERCIAL_MORTAR];//可以添加材料计算的类型普通材料”、“绿化苗木”、“外购砼构件”、“商品混凝土”、“商品砂浆”
         return materialType.indexOf(type)!= -1
     },
+    isConcreteToCommercialConcrete:function (oldType,newType) {
+        return gljUtil.isConcreteType(oldType)&&gljUtil.isCommercialConcreteType(newType)
+    },
     hasComposition:function (ration_glj,isRationType) {//判断是否有组成物,有则返回true   现在主材类型的工料机也有可能有组成物。
         let type = isRationType==true? ration_glj.subType:ration_glj.type;
         if(gljUtil.notEditType.indexOf(type)!=-1||type==gljType.MAIN_MATERIAL){

+ 0 - 1
public/web/slideResize.js

@@ -118,7 +118,6 @@ const SlideResize = (function() {
             let cache = getLocalCache(`${module}${ele.attr('id')}Width`);
             if (cache) {
                 ele.css('width', cache);
-                console.log(ele)
             }
         }
         for (let resize of resizes) {

+ 6 - 6
test/unit/reports/test_rpt_test_template.js

@@ -39,7 +39,7 @@ let demoPrjId = - 1;
 // let demoRptId = 56; //24
 // let demoRptId = 36; //5.1
 // let demoRptId = 46; //5.5测试
-// let demoRptId = 49; //5.5
+let demoRptId = 49; //5.5
 // let demoRptId = 66; //5.4
 // let demoRptId = 67; //21-2
 // let demoRptId = 31; //21-1
@@ -47,7 +47,7 @@ let demoPrjId = - 1;
 // let demoRptId = 68; //01-2
 // let demoRptId = 71; //21-2
 // let demoRptId = 74; //22
-let demoRptId = 83; //02 预算
+// let demoRptId = 83; //02 预算
 // let demoRptId = 84; //02 清单
 
 let pagesize = "A4";
@@ -71,7 +71,7 @@ let userId_Leng = "5c3ffa9aa0a92732f41216e0"; //小冷User Id (养护的)
 // demoPrjId = 618; //PROD:
 // demoPrjId = 2580; //PROD:
 // demoPrjId = 815; //PROD:
-demoPrjId = 3261; //UAT:
+demoPrjId = 5289; //UAT:
 // demoPrjId = 738; //UAT:
 // demoPrjId = 670; //UAT: 清单项目
 //*/
@@ -136,9 +136,9 @@ test('测试 - 测试模板啦: ', function (t) {
                     if (pageRst) {
                         // fsUtil.writeObjToFile(pageRst, "D:/GitHome/YangHuCost/tmp/testBuiltPageResult_测试模板" + dt.getTime() + ".jsp");
                         // fsUtil.writeObjToFile(pageRst, "D:/GitHome/YangHuCost/tmp/testBuiltPageResult_测试模板.jsp");
-                        rpt_xl_util.exportExcel(pageRst, pagesize, "local_test_rpt_excel", true, null, null, function(uuidName){
-                            console.log("excel uuid: " + uuidName);
-                        });
+                        // rpt_xl_util.exportExcel(pageRst, pagesize, "local_test_rpt_excel", true, null, null, function(uuidName){
+                        //     console.log("excel uuid: " + uuidName);
+                        // });
                         // rpt_pdf_util.export_pdf_file(pageRst, pagesize, 'local_test_rpt_pdf', function(uuidName){
                         //     console.log("pdf uuid: " + uuidName);
                         // });

BIN
web/building_saas/img/NextPage.cur


BIN
web/building_saas/img/PreviousPage.cur


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

@@ -160,7 +160,7 @@
                           </li>
 
                           <li class="nav-item dropdown">
-                              <a class="nav-link dropdown-toggle more" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false" style="display: none;">更多</a>
+                              <a class="nav-link dropdown-toggle more" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false" >更多</a>
                               <div class="dropdown-menu" id="div_more_dropdown_right">
                                   <a class="dropdown-item  right-nav-link"  href="javascript:void(0)" id = 'locateTab' relaPanel="#locate">查找定位</a>
                                   <!--<a class="dropdown-item" data-toggle="tab" href="#sqpz" role="tab">书签批注</a>-->
@@ -352,9 +352,9 @@
                                                   <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">
-                                                  <input class="form-check-input" type="radio" name="inlineRadioOptions" id="bookmark" value="option4">
-                                                  <label class="form-check-label" for="bookmark">书签注</label>
+                                          <!--    <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>
                                           <!--搜索分项/清单 出现-->
@@ -366,32 +366,88 @@
                                           </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 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">确定</button>
+                                                      </form>
+                                                  </div>
+                                              </div>
                                           </div>
+                                          <div class="" id = "bookmarkSpread" style="overflow: hidden"></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" >
+                                                  <textarea class="form-control" id="annotationTextarea"  placeholder = "批注内容"></textarea>
+                                              </div>
+                                          </div>
+                                      </div>
+                                  </div>
                               </div>
 
                               <!--清单指引-->

+ 0 - 3
web/building_saas/main/js/models/calc_program.js

@@ -1870,10 +1870,7 @@ class CalcProgram {
             return;
         };
         $.bootstrapLoading.start();
-        let startTime = +new Date();
         me.project.updateNodes(dataArr, function (data) {
-            let endShowTime = +new Date();
-            console.log(`保存所需时间——${endShowTime - startTime}`);
             for (let node of treeNodes){
                 delete node.changed;
                 delete node.temData;

+ 8 - 2
web/building_saas/main/js/models/project_glj.js

@@ -44,8 +44,7 @@ ProjectGLJ.prototype.loadData = function (callback = null,error=null) {
                 if(error) error();
                 return false;
             }
-            self.datas = response.data;
-            self.calcQuantity();
+            self.refreshByDatas(response.data);
             // 回调函数
             if (callback !== null) {
                 callback(response.data);
@@ -56,6 +55,13 @@ ProjectGLJ.prototype.loadData = function (callback = null,error=null) {
     });
 };
 
+//更新项目工料机数据和缓存
+ProjectGLJ.prototype.refreshByDatas = function(datas){
+    this.datas = datas;
+    this.calcQuantity();
+};
+
+
 ProjectGLJ.prototype.synLoadData = function () {
     return new Promise(function (resolve, reject) {
         projectObj.project.projectGLJ.loadData(function (data) {

+ 19 - 12
web/building_saas/main/js/models/ration.js

@@ -393,7 +393,13 @@ var Ration = {
                 return;
             }
             //设置定额库的优先级, 当是清空子目换算时,使用原定额的定额库ID,其它情况再按: 默认先取选中的定额库,如果没有再取default定额库
-            let selectedLib = (cleanzmhs == true && recodes.length > 0)? recodes[0].node.data.libID : sessionStorage.getItem("stdRationLib");
+            let selectedLib = null;
+            if(cleanzmhs == true && recodes.length > 0){
+                //原定额的定额库是补充工料机库,则用补充的库代替,不是的用原始定额库ID
+                selectedLib = recodes[0].node.data.from == "cpt"?rationLibObj.compleRationLibId:recodes[0].node.data.libID;
+            }else {
+                selectedLib =  sessionStorage.getItem("stdRationLib")
+            }
             selectedLib&&selectedLib!='undefined'?libIDs.unshift(selectedLib):libIDs.unshift(defaultLibID);
             for(let r of recodes){
                 let needInstall = false;
@@ -558,6 +564,7 @@ var Ration = {
             let billItemID = null,serialNo=1,nextID=null;
             let needInstall = false;
             if (selected === null) { return null; }
+            let startTime = +new Date();
             if (selected.sourceType === project.Bills.getSourceType() && selected.depth() > 0) {
                 if(selected.data.type === billType.FB){
                     return null;
@@ -607,18 +614,18 @@ var Ration = {
                         syncNodeOper(data);
                         if(callback) callback(newNode);
                     }else {
-                        project.projectGLJ.loadData(function () {
-                            syncNodeOper(data);
-                            if (newNode.parent.data.calcFlag)        // 删除定额时不用改Flag,反正添加定额时已经改好了。
-                                newNode.parent.updateData.calcFlag = null;
-                            project.calcProgram.calcAndSave(newNode,function () {
-                                if(project.Bills.isFBFX(newNode)) { //判断是否属于分部分项工程 ,是的话才需要做计取安装费计算
-                                    installationFeeObj.calcInstallationFee();
-                                }
-                            });
-                            //如果添加规则中,添加内容为定额子目,则更新相关清单
-                            if(callback) callback(newNode);
+                        if(data.projectGLJDatas) projectObj.project.projectGLJ.refreshByDatas(data.projectGLJDatas);
+                        syncNodeOper(data);
+                        if (newNode.parent.data.calcFlag)  newNode.parent.updateData.calcFlag = null;    // 删除定额时不用改Flag,反正添加定额时已经改好了。
+                        project.calcProgram.calcAndSave(newNode,function () {
+                            let endShowTime = +new Date();
+                            console.log(`插入定额总时间——${endShowTime - startTime}`);
+                            if(project.Bills.isFBFX(newNode)) { //判断是否属于分部分项工程 ,是的话才需要做计取安装费计算
+                                installationFeeObj.calcInstallationFee();
+                            }
                         });
+                        //如果添加规则中,添加内容为定额子目,则更新相关清单
+                        if(callback) callback(newNode);
                     }
                     $.bootstrapLoading.end();
                 });

+ 1 - 4
web/building_saas/main/js/models/ration_coe.js

@@ -197,7 +197,7 @@ var ration_coe = {
                 CommonAjax.post("/ration/updateCoeAdjust",updateData,function (result) {
                     $.bootstrapLoading.end();
                     me.refreshAfterUpdate(result.coe);
-                    zmhs_obj.refreshAfterUpdate(result,true)
+                    zmhs_obj.refreshAfterUpdate(result)
                 })
             });
 
@@ -229,9 +229,6 @@ var ration_coe = {
             }
         };
 
-
-
-
         ration_coe.prototype.updateCustomerCoe = function (data) {
             var updateData = this.getUpdateData('ut_update',data.query,data.doc,'updateCustomerCoe');
             project.pushNow('updateCustomerCoe',[this.getSourceType()],updateData);

+ 33 - 8
web/building_saas/main/js/views/glj_view.js

@@ -1148,12 +1148,37 @@ var gljOprObj = {
             });//doc.rationID=selected.data.ID;
         }
     },
-    doReplaceGLJ: function () {
+    concreteTypeReplaceChecking:function (selectCode, oldData,selected) {//selected为空,表示批量替换   混凝土替换前的检查,是否给出确认提示
+        let allGLJ = gljOprObj.AllRecode;
+        let glj = _.find(allGLJ, function (item) {
+            let i_key = gljOprObj.getIndex(item, gljLibKeyArray);
+            return i_key == selectCode;
+        });
+        if(! glj) return false;
+        if(gljUtil.isConcreteToCommercialConcrete(oldData.type,glj.gljType)){//被替换的是混凝土,替换成商品砼或商品砂浆
+            if(selected){ //如果有选中的,说明是替换,还要判断是否有辅助定额, 批量替换不用判断
+                return selected.data.rationAssList && selected.data.rationAssList.length > 0 ? true:false;
+            }
+            return true;
+        }
+        return false;
+    },
+    replaceGLJConfirm:function(mreplace = false){
         let me = this;
         let oldData = me.sheetData[gljContextMenu.selectedRow];
-        let project = projectObj.project;
         let selectCode = gljOprObj.GLJSelection[0];
-        let selected = projectObj.project.mainTree.selected;
+        let selected = mreplace == true?null:projectObj.project.mainTree.selected;
+        if(me.concreteTypeReplaceChecking(selectCode, oldData,selected)){
+            hintBox.infoBox('操作确认', '请先调整厚度,再替换商品砼。确定要继续吗?', 2, function () {
+                mreplace == true ? $("#mreplace_next_div").modal('show'):me.doReplaceGLJ(selectCode, oldData,selected);
+            }, null,['确定','取消'],false)
+        }else {
+            mreplace == true ? $("#mreplace_next_div").modal('show'):me.doReplaceGLJ(selectCode, oldData,selected);
+        }
+    },
+    doReplaceGLJ: function (selectCode, oldData,selected) {
+        let me = this;
+        let project = projectObj.project;
         project.ration_glj.replaceGLJ(selectCode, oldData, function (result) {
             if (result) {
                 //result.adjustState;
@@ -1185,9 +1210,9 @@ var gljOprObj = {
     },
     doMReplaceGLJ: function () {
         let me = this;
-        let oldData = me.sheetData[gljContextMenu.selectedRow];
         let project = projectObj.project;
-        let selectCode = me.GLJSelection[0];
+        let oldData = me.sheetData[gljContextMenu.selectedRow];
+        let selectCode = gljOprObj.GLJSelection[0];
         project.ration_glj.mReplaceGLJ(selectCode, oldData, function (result,updateMap) {
             if(result == null){
                 return;
@@ -1605,9 +1630,9 @@ $(function () {
         } else if ($('#actionType').val() == 'add') { //添加工料机
             gljOprObj.doAddGLJ();
         } else if ($('#actionType').val() == 'replace') {//替换工料机
-            gljOprObj.doReplaceGLJ();
+            gljOprObj.replaceGLJConfirm(false);
         } else if ($('#actionType').val() == 'm_replace') {//批量替换工料机
-            gljOprObj.doMReplaceGLJ();
+            gljOprObj.replaceGLJConfirm(true);
         }else if($('#actionType').val() == 'addMix'){
             projectGljObject.addMixRatio();
         }
@@ -1619,7 +1644,7 @@ $(function () {
     });
     $('#replace_next_btn').click(function () {
         $("#glj_tree_div").modal('hide');
-        $("#mreplace_next_div").modal('show');
+        gljOprObj.replaceGLJConfirm(true);
     });
     $('#class_selected_conf').click(function () {
         var gljClass = $('#selected_class').val();

+ 97 - 16
web/building_saas/main/js/views/locate_view.js

@@ -42,6 +42,29 @@ let locateObject={
         }
     },
     datas:[],
+    bookMarkSetting:{
+        header:[
+            {headerName: "编码", headerWidth: 120, dataCode: "code", dataType: "String"},
+            {headerName: "书签名称", headerWidth: 200, dataCode: "name", dataType: "String"},
+        ],
+        view: {
+            lockColumns: [0,1],
+            colHeaderHeight:30
+        }
+    },
+    //为了兼容旧项目,这里给个默认值
+    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(){
         if(!this.mainSpread){
             this.mainSpread = SheetDataHelper.createNewSpread($("#locate_result")[0],3);
@@ -74,26 +97,54 @@ let locateObject={
             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.subSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick,this.onSheetDoubleClick);
+        }else {
+            this.bookmarkSpread.refresh();
         }
     },
+    refreshWorkBook: function () {
+        if (this.mainSpread) this.mainSpread.refresh();
+        if (this.subSpread) this.subSpread.refresh();
+        if (this.bookmarkSpread) this.bookmarkSpread.refresh();
+
+    },
     initSubSheet:function () {
         this.subSheet = this.subSpread .getSheet(0);
         sheetCommonObj.initSheet( this.subSheet, this.ration_setting);
         this.subSheet.setRowCount(0);
         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');
+    },
     initOutstanding:function () {
         if(!projectObj.project.property.locateSetting) return;
         let outstd = projectObj.project.property.locateSetting;
         $("#outstanding").prop("checked",outstd.outstanding);
         $("#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) {
         sheetCommonObj.showData(this.mainSpread.getActiveSheet(),setting,datas);
         this.mainSpread.getActiveSheet().setRowCount(datas.length);
@@ -123,16 +174,26 @@ let locateObject={
         let me = this;
         let mainHeight = $(window).height()-$(".header").height()-$(".toolsbar").height()-$("#searchPanel").height();
         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 () {
+        if(options == "bookmark"){
+            let bookMarkLibResize  = getBookmarkResize();
+            loadHeight(bookMarkLibResize);
+        }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);
+            }
+        }
+
+        function loadHeight(libResize) {
+            SlideResize.loadVerticalHeight(libResize.eleObj.module, libResize.eleObj, libResize.limit, function () {
                 locateObject.refreshWorkBook();
             });
         }
+
         if (refreshWorkBook) {
             me.refreshWorkBook();
         }
@@ -144,10 +205,20 @@ let locateObject={
             me.refreshView(options, false);
             me.initMainSpread();
             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 () {
         let options = $("input[name='content_type']:checked").val();
@@ -367,3 +438,13 @@ $('#outstanding').change(function(){
     let outStd = $("#outstanding").prop("checked");
     me.updateOutStanding(outStd,scMathUtil.roundForObj(outInp,getDecimal('process')));
 });
+
+$('#bookmarkSettingDropdown').on('shown.bs.dropdown', function showDropdown() {
+    let setting = projectObj.project.property.bookmarkSetting?projectObj.project.property.bookmarkSetting:locateObject.bookmarkPropertySetting;
+    $("#"+setting.selected).focus();
+});
+
+function bookmarkSelected() {
+    console.log("hehe");
+    $("#bookmarkSelected").val($(this)[0].id);
+}

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

@@ -43,7 +43,7 @@ materialCalcObj = {
             {headerName: "其它\n费用", headerWidth: 60, dataCode: "otherFee", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:"glj.unitPrice"
             {headerName: "运价增\n加率(%)", headerWidth: 60, dataCode: "freightIncreaseRate", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:"glj.unitPrice"
             {headerName: "加权\n系数", headerWidth: 60, dataCode: "weightCoe", hAlign: "right", dataType: "Number",validator:"number"},
-            {headerName: "计算式", headerWidth: 170, dataCode: "exp", hAlign: "right", dataType: "Number",getText:'forExp'},//,decimalField:"glj.unitPrice"
+            {headerName: "计算式", headerWidth: 170, dataCode: "exp", hAlign: "left", dataType: "Number",getText:'forExp'},//,decimalField:"glj.unitPrice"
         ],
         view: {
             lockColumns: ["exp"],

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

@@ -1291,7 +1291,7 @@ var projectObj = {
                         return !project.Ration.canAdd(project.mainTree.selected);
                     },
                     callback: function (key, opt) {
-                        project.Ration.addNewRation(null,rationType.ration,projectObj.selectColAndFocus,true);
+                        project.Ration.addNewRation(null,rationType.ration,projectObj.selectColAndFocus,false);
                        // ProjectController.addRation(project, controller, rationType.ration);
                     }/*,
                     visible: function(key, opt){
@@ -1396,6 +1396,23 @@ var projectObj = {
                         return false;
                     }
                 },
+                "setBookMark": {
+                    name: '设置/取消书签批注',
+                    icon: 'fa-flag',
+                    disabled: function () {
+                        if (projectReadOnly) {
+                            return true;
+                        }
+                        return false
+                    },
+                    callback: function () {
+                        $("#locateTab").click();
+                    },
+                    visible:function(){
+                        return false;
+                    }
+
+                },
                 "delete": {
                     name: '删除',
                     icon: 'fa-remove',

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

@@ -95,6 +95,32 @@ SlideResize.verticalSlide(locateLibResize.eleObj, locateLibResize.limit, functio
     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 = {};
 blockLibTopMid.eleObj = {

+ 7 - 10
web/building_saas/main/js/views/zmhs_view.js

@@ -203,9 +203,9 @@ let zmhs_obj = {
         this.assSheetData = assList;
         return assList;
     },
-    refreshAfterUpdate:function(result,reload){
+    refreshAfterUpdate:function(result){
         let ration_glj = projectObj.project.ration_glj;
-        let calcInstall = false;//是否记安装增加费
+        let calcInstall = false;//是否记安装增加费
         let nodes = projectObj.project.updateNodesCache([{type:ModuleNames.ration,data:result.ration}]);
         if(result.add && result.add.length > 0){//需添加定额工料机的情况
             ration_glj.datas = ration_glj.datas.concat(result.add);
@@ -223,14 +223,11 @@ let zmhs_obj = {
         projectObj.mainController.refreshTreeNode(nodes, false);
 
         let rationID= ration_glj.updateCacheAfterAdjust(result.ration_glj);
-        if(reload == true){//有添加、替换、工料机等需重新加载的情况
-            $.bootstrapLoading.start();
-            projectObj.project.projectGLJ.loadData(function () {
-                $.bootstrapLoading.end();
-                if(result.add && result.add.length > 0) ration_glj.addToMainTree(result.add);//这个方法有再去项目工料机那里取价格,所以要在回调里调用,不像替换工料的情况
-                ration_glj.reCalcWhenGLJChange({rationID:rationID});
-                if(result.delete && result.delete.length > 0 && calcInstall) installationFeeObj.calcInstallationFee();//如果是删除节点的话,
-            });
+        if(result.projectGLJDatas){//有添加、替换、工料机等需重新加载的情况
+            projectObj.project.projectGLJ.refreshByDatas(result.projectGLJDatas);
+            if(result.add && result.add.length > 0) ration_glj.addToMainTree(result.add);//这个方法有再去项目工料机那里取价格,所以要在回调里调用,不像替换工料的情况
+            ration_glj.reCalcWhenGLJChange({rationID:rationID});
+            if(result.delete && result.delete.length > 0 && calcInstall) installationFeeObj.calcInstallationFee();//如果是删除节点的话,
         }else {
             ration_glj.reCalcWhenGLJChange({rationID:rationID});
         }

+ 2 - 2
web/building_saas/pm/js/pm_newMain.js

@@ -341,7 +341,7 @@ const projTreeObj = {
         },
         exportProject: {
             name: "导出建设项目",
-            icon: 'fa-external-link',
+            icon: 'fa-cloud-download',
             disabled: function () {
                 let selectedItem = projTreeObj.tree.selected;
                 return !(selectedItem && selectedItem.data.projType === projectType.project);
@@ -356,7 +356,7 @@ const projTreeObj = {
         },
         importProject:{
             name: "导入建设项目",
-            icon: 'fa-external-link',
+            icon: 'fa-upload',
             disabled: function () {
                 let selectedItem = projTreeObj.tree.selected;
                 if(selectedItem){

+ 2 - 1
web/building_saas/report/js/jpc_output.js

@@ -290,7 +290,8 @@ let JpcCanvasOutput = {
                     // area[JV.IDX_TOP] = cell[JV.PROP_AREA][JV.PROP_TOP] + i * (height / values.length) + me.offsetY;
                     // area[JV.IDX_BOTTOM] = cell[JV.PROP_AREA][JV.PROP_TOP] + (i + 1) * (height / values.length) + me.offsetY;
                     area[JV.IDX_TOP] = cell[JV.PROP_AREA][JV.PROP_TOP] + i * (ah / values.length) + me.offsetY + restTopH;
-                    area[JV.IDX_BOTTOM] = cell[JV.PROP_AREA][JV.PROP_TOP] + (i + 1) * (ah / values.length) + me.offsetY + restTopH;
+                    // area[JV.IDX_BOTTOM] = cell[JV.PROP_AREA][JV.PROP_TOP] + (i + 1) * (ah / values.length) + me.offsetY + restTopH;
+                    area[JV.IDX_BOTTOM] = cell[JV.PROP_AREA][JV.PROP_TOP] + (i + 1) * (ah / values.length) + me.offsetY + restBottomH;
                     if (values[i] === null || values[i] === undefined || values[i] === 'null') {
                         values[i] = "";
                     }

+ 3 - 7
web/building_saas/report/js/rpt_main.js

@@ -598,14 +598,10 @@ let canvasOprObj = {
         if (zTreeOprObj.currentNode) {
             let x = event.offsetX - JpcCanvasOutput.offsetX, canvas = event.originalTarget;
             if (!(canvas)) canvas = event.target; //chrome浏览器不认event.originalTarget,只认event.target或event.currentTarget
-            if (x < FIRST_PAGE_OFFSET) {
-                canvas.style.cursor = "url(/web/building_saas/img/FirstPageSimple.cur), auto";
-            } else if (x < PRE_PAGE_OFFSET) {
-                canvas.style.cursor = "url(/web/building_saas/img/PreviousPageSimple.cur), auto";
-            } else if ((canvas.width - x) < LAST_PAGE_OFFSET) {
-                canvas.style.cursor = "url(/web/building_saas/img/LastPageSimple.cur), auto";
+            if (x < PRE_PAGE_OFFSET) {
+                canvas.style.cursor = "url(/web/building_saas/img/PreviousPage.cur), auto";
             } else if ((canvas.width - x) < NEXT_PAGE_OFFSET) {
-                canvas.style.cursor = "url(/web/building_saas/img/NextPageSimple.cur), auto";
+                canvas.style.cursor = "url(/web/building_saas/img/NextPage.cur), auto";
             } else {
                 canvas.style.cursor = "";
             }

+ 1 - 1
web/building_saas/report/js/rpt_print.js

@@ -298,7 +298,7 @@ function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canv
         // area[JV.IDX_TOP] = top + vidx * (height / values.length);
         // area[JV.IDX_BOTTOM] = top + (vidx + 1) * (height / values.length);
         area[JV.IDX_TOP] = top + vidx * (ah / values.length) + restTopH;
-        area[JV.IDX_BOTTOM] = top + (vidx + 1) * (ah / values.length) + restTopH;
+        area[JV.IDX_BOTTOM] = top + (vidx + 1) * (ah / values.length) + restBottomH;
         inner_draw_text(values[vidx]);
     }
 }