Ver código fonte

Merge branch 'master' of http://192.168.1.12:3000/SmartCost/ConstructionCost

TonyKang 7 anos atrás
pai
commit
41f2e17d94
40 arquivos alterados com 477 adições e 179 exclusões
  1. 1 1
      modules/all_models/project_glj.js
  2. 1 1
      modules/all_models/unit_price.js
  3. 2 1
      modules/complementary_glj_lib/controllers/gljController.js
  4. 8 4
      modules/complementary_ration_lib/controllers/compleViewController.js
  5. 2 2
      modules/glj/models/unit_price_model.js
  6. 2 1
      modules/main/routes/main_route.js
  7. 2 1
      modules/pm/controllers/pm_controller.js
  8. 6 3
      modules/users/controllers/user_controller.js
  9. 1 1
      modules/users/models/user_model.js
  10. 4 3
      public/web/gljUtil.js
  11. 1 0
      public/web/sheet/sheet_common.js
  12. 1 0
      public/web/sheet/sheet_data_helper.js
  13. 0 1
      web/building_saas/complementary_ration_lib/js/repository_glj.js
  14. 3 4
      web/building_saas/css/main.css
  15. 2 2
      web/building_saas/js/global.js
  16. 112 21
      web/building_saas/main/html/main.html
  17. 9 0
      web/building_saas/main/html/tender_price.html
  18. 31 0
      web/building_saas/main/js/main.js
  19. 81 51
      web/building_saas/main/js/models/calc_base.js
  20. 23 35
      web/building_saas/main/js/models/calc_program.js
  21. 13 1
      web/building_saas/main/js/models/project_glj.js
  22. 4 4
      web/building_saas/main/js/models/quantity_detail.js
  23. 1 1
      web/building_saas/main/js/models/ration.js
  24. 8 4
      web/building_saas/main/js/views/character_content_view.js
  25. 9 0
      web/building_saas/main/js/views/fee_rate_view.js
  26. 1 1
      web/building_saas/main/js/views/installation_fee_view.js
  27. 23 10
      web/building_saas/main/js/views/project_glj_view.js
  28. 27 4
      web/building_saas/main/js/views/side_tools.js
  29. 56 11
      web/building_saas/main/js/views/std_billsGuidance_lib.js
  30. 8 0
      web/building_saas/main/js/views/std_bills_lib.js
  31. 7 0
      web/building_saas/main/js/views/std_ration_lib.js
  32. 1 0
      web/building_saas/main/js/views/sub_fee_rate_views.js
  33. 4 0
      web/building_saas/main/js/views/sub_view.js
  34. 11 1
      web/building_saas/main/js/views/tender_price_view.js
  35. 2 2
      web/common/html/header.html
  36. 2 2
      web/users/html/login.html
  37. 1 1
      web/users/html/user-info.html
  38. 1 1
      web/users/html/user-safe.html
  39. 3 3
      web/users/html/user-set.html
  40. 3 1
      web/users/js/login.js

+ 1 - 1
modules/all_models/project_glj.js

@@ -14,7 +14,7 @@ let Schema = mongoose.Schema;
 let collectionName = 'glj_list';
 let modelSchema = {
     // 自增id
-    id: Number,
+    id: {type:Number,unique: true},
     // 工料机总库ID
     glj_id: Number,
     // 标段ID

+ 1 - 1
modules/all_models/unit_price.js

@@ -11,7 +11,7 @@ let Schema = mongoose.Schema;
 let collectionName = 'unit_price';
 let modelSchema = {
     // 自增ID
-    id: Number,
+    id: {type:Number,unique: true},
     // 基价单价
     base_price: String,
     // 市场单价

+ 2 - 1
modules/complementary_glj_lib/controllers/gljController.js

@@ -32,7 +32,8 @@ class GljController extends BaseController{
         res.render('building_saas/complementary_glj_lib/html/tools-gongliaoji.html',{
             userID: req.session.sessionUser.id,
             gljLibId: gljLibId,
-            compilationId: sessionCompilation._id
+            compilationId: sessionCompilation._id,
+            versionName: req.session.sessionCompilation.name + '免费版'
         });
     }
     getGljDistType (req, res) {

+ 8 - 4
modules/complementary_ration_lib/controllers/compleViewController.js

@@ -20,7 +20,8 @@ class CompleViewController extends BaseController{
             userID: req.session.sessionUser.id,
             redirectGlj: redirectGlj,
             redirectCoe: redirectCoe,
-            redirectInstallation: redirectInstallation
+            redirectInstallation: redirectInstallation,
+            versionName: req.session.sessionCompilation.name + '免费版'
         });
     }
 
@@ -33,7 +34,8 @@ class CompleViewController extends BaseController{
             userID: req.session.sessionUser.id,
             redirectRation: redirectRation,
             redirectCoe: redirectCoe,
-            redirectInstallation: redirectInstallation
+            redirectInstallation: redirectInstallation,
+            versionName: req.session.sessionCompilation.name + '免费版'
         });
     }
 
@@ -46,7 +48,8 @@ class CompleViewController extends BaseController{
             userID: req.session.sessionUser.id,
             redirectRation: redirectRation,
             redirectGlj: redirectGlj,
-            redirectInstallation: redirectInstallation
+            redirectInstallation: redirectInstallation,
+            versionName: req.session.sessionCompilation.name + '免费版'
         });
     }
 
@@ -59,7 +62,8 @@ class CompleViewController extends BaseController{
             userID: req.session.sessionUser.id,
             redirectRation: redirectRation,
             redirectGlj: redirectGlj,
-            redirectCoe: redirectCoe
+            redirectCoe: redirectCoe,
+            versionName: req.session.sessionCompilation.name + '免费版'
         });
     }
 

+ 2 - 2
modules/glj/models/unit_price_model.js

@@ -253,7 +253,7 @@ class UnitPriceModel extends BaseModel {
         let doc={},newValueMap={};
         doc[data.field]=data.newval;
         newValueMap[data.id]=doc;
-        let unitPrice = await this.db.findAndModify({id:data.id},doc);
+        let unitPrice = await this.db.findAndModify({id:data.id,unit_price_file_id:data.unit_price_file_id},doc);
         if(!unitPrice){
             throw "没有找到对应的单价";
         }
@@ -284,7 +284,7 @@ class UnitPriceModel extends BaseModel {
         let parentTask = [];
         let newValueMap = {};
         for(let d of data){//第一次循环生成更新提交的记录,并生成一个新值的映射表,为更新父节点使用
-            let condition = {id:d.unit_price.id};
+            let condition = {id:d.unit_price.id,unit_price_file_id:d.unit_price.unit_price_file_id};
             let doc = {};
             doc[d.field]=d.newval;
             newValueMap[d.unit_price.id] = doc;

+ 2 - 1
modules/main/routes/main_route.js

@@ -19,7 +19,8 @@ module.exports =function (app) {
                     {
                         userAccount: req.session.userAccount,
                         userID: req.session.sessionUser.id,
-                        projectData: projectData
+                        projectData: projectData,
+                        versionName: req.session.sessionCompilation.name + '免费版'
                     });
             } else {
                 res.redirect('/pm');

+ 2 - 1
modules/pm/controllers/pm_controller.js

@@ -201,7 +201,8 @@ module.exports = {
             compilationData: JSON.stringify(sessionCompilation),
             billValuation: JSON.stringify(billValuation),
             rationValuation: JSON.stringify(rationValuation),
-            engineeringList: JSON.stringify(engineering.List)
+            engineeringList: JSON.stringify(engineering.List),
+            versionName: sessionCompilation.name + '免费版'
         };
 
         response.render('building_saas/pm/html/project-management.html', renderData);

+ 6 - 3
modules/users/controllers/user_controller.js

@@ -36,7 +36,8 @@ class UserController extends BaseController {
             userData: userData,
             provinceList: userModel.province,
             companyTypeList: userModel.companyType,
-            companyScaleList: userModel.companyScale
+            companyScaleList: userModel.companyScale,
+            versionName: request.session.sessionCompilation.name + '免费版'
         };
         response.render('users/html/user-info', renderData);
     }
@@ -116,7 +117,8 @@ class UserController extends BaseController {
         let renderData = {
             userData: userData,
             logList: logList,
-            pages: pageData
+            pages: pageData,
+            versionName: request.session.sessionCompilation.name + '免费版'
         };
         response.render('users/html/user-safe', renderData);
     }
@@ -147,7 +149,8 @@ class UserController extends BaseController {
 
         let renderData = {
             preferenceSetting: preferenceSetting,
-            compilationList: compilationList
+            compilationList: compilationList,
+            versionName: request.session.sessionCompilation.name + '免费版'
         };
         response.render('users/html/user-set', renderData);
     }

+ 1 - 1
modules/users/models/user_model.js

@@ -34,7 +34,7 @@ class UserModel extends BaseModel {
      *
      * @var
      */
-    companyScale = ['1-20', '20-50', '50-100', '100+'];
+    companyScale = ['1-50', '50-100', '100-500', '500+'];
 
 
     /**

+ 4 - 3
public/web/gljUtil.js

@@ -181,10 +181,11 @@ let gljUtil = {
         }
         return result;
     },
-    getMarketPrice:function (glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil) {
+    getMarketPrice:function (glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil,tenderCoe) {
         let price_decimal = decimalObj.glj.unitPrice;
         let quantity_decimal = decimalObj.glj.quantity;
         let process_decimal = decimalObj.process;
+        let priceCoe = this.isDef(tenderCoe)?tenderCoe:1;
         if (this.notEditType.indexOf(glj.unit_price.type)!=-1&&glj.ratio_data.length>0) {//对于混凝土、配合比、砂浆、机械台班等有组成物的材料,价格需根据组成物计算得出。
             let p =0;
             for(let ratio of glj.ratio_data){
@@ -197,13 +198,13 @@ let gljUtil = {
                 });
                 if(tem){
                     let priceData=this.getGLJPrice(tem,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,true,_,scMathUtil);
-                    p+=scMathUtil.roundForObj(priceData.marketPrice*scMathUtil.roundForObj(ratio.consumption,quantity_decimal),process_decimal);
+                    p+=scMathUtil.roundForObj(priceData.marketPrice* priceCoe * scMathUtil.roundForObj(ratio.consumption,quantity_decimal),process_decimal);
                 }
             }
             return scMathUtil.roundForObj(p,price_decimal);
         }else {
             let tem_decimal = isRadio==true?process_decimal:price_decimal;
-            return scMathUtil.roundForObj(glj.unit_price.market_price,tem_decimal);
+            return scMathUtil.roundForObj(parseFloat(glj.unit_price.market_price)*priceCoe,tem_decimal);
         }
     },
     getBasePrice:function (glj,projectGLJDatas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil) {

+ 1 - 0
public/web/sheet/sheet_common.js

@@ -14,6 +14,7 @@ var sheetCommonObj = {
         spreadBook.options.allowUserDragDrop = true;
         spreadBook.options.allowContextMenu = false;
         spreadBook.options.allowUserEditFormula = false;
+        spreadBook.options.showDragFillSmartTag = false;
         return spreadBook;
     },
 

+ 1 - 0
public/web/sheet/sheet_data_helper.js

@@ -56,6 +56,7 @@ var SheetDataHelper = {
         spread.options.allowUserDragDrop = false;
         spread.options.allowUndo = false;//that.mainSpread.commandManager().setShortcutKey(undefined, GC.Spread.Commands.Key.z, true, false, false, false); 屏蔽undo
         spread.options. allowUserEditFormula = false;
+        spread.options.showDragFillSmartTag = false;
         spread.getActiveSheet().setRowCount(3);
         return spread;
     },

+ 0 - 1
web/building_saas/complementary_ration_lib/js/repository_glj.js

@@ -6,7 +6,6 @@ var pageOprObj = {
     rationLibName : null,
     rationLibId: null,
     initPage : function(container) {
-        $.bootstrapLoading.start();
         var me = this, rationLibId = getQueryString("repository");//获取定额库参数
         me.rationLibId = rationLibId;
         //getRationLibName

+ 3 - 4
web/building_saas/css/main.css

@@ -21,11 +21,10 @@ body {
     background: #ff6501;
     color: #fff;
     float: left;
-    padding-top: .25rem;
-    padding-bottom: .25rem;
     margin-right: 1rem;
-    font-size: 1.25rem;
-    line-height: inherit
+    font-size: 1rem;
+    line-height:38px;
+    height:38px
 }
 .header .header-logo sup{
     font-size:10px;

+ 2 - 2
web/building_saas/js/global.js

@@ -12,8 +12,8 @@ function autoFlashHeight(){
     $(".main-data-side-q").height($(window).height()-headerHeight-toolsbarHeight-toolsBarHeightQ-$('#qd').find('.bottom-content').find('.p-0').height()-5);
     //$(".main-data-side-d").height($(window).height()-headerHeight-toolsbarHeight-toolsBarHeightD-302);
     $(".main-data-side-d").height($(window).height()-headerHeight-toolsbarHeight-toolsBarHeightD-$('#stdSectionRations').height()-5);
-    $(".main-data-side-zb").height($(window).height()-headerHeight-toolsbarHeight-toolsBarHeightZ);
-    $(".main-data-side-zi").height($(window).height()-headerHeight-toolsbarHeight-toolsBarHeightZ);
+    $(".main-data-side-zb").height(($(window).height()-headerHeight-toolsbarHeight-toolsBarHeightZ) - $('#billsGuidance_items').height() - 5);
+    /*$(".main-data-side-zi").height($(window).height()-headerHeight-toolsbarHeight- toolsBarHeightZ - $(".main-data-side-zb").height());*/
     $('.main-content').width($(window).width()-$('.main-nav').width()-$('.main-side').width()-5);
     $('#glj_tree_div .modal-content').width($(window).width() < 1020 + 20 ? $(window).width() - 20 : 1020);
     //$("#main .main-data-top").height($(window).height()-headerHeight-toolsbarHeight-bottomContentHeight-1);

+ 112 - 21
web/building_saas/main/html/main.html

@@ -67,7 +67,7 @@
                     <a href="javascript:void(0)" class="btn btn-sm" id="downMove" title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a>
                     <a href="javascript:void(0)" class="btn btn-sm" id="upMove" title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a>
                     <span>
-                      <a href="" data-toggle="dropdown"><span data-toggle="tooltip" data-placement="bottom" title="显示至...">显示至...</span></a>
+                      <a href="" data-toggle="dropdown"><span data-toggle="tooltip" data-placement="bottom" title="">显示至...</span></a>
                       <div class="dropdown-menu dropdown-menu-left" style="min-width: 6.5rem">
                       <a class="dropdown-item" href="javascript:void(0);" style="padding: 0rem 1.5rem" id="displayDXFY">大项费用</a>
                       <a class="dropdown-item" href="javascript:void(0);" style="padding: 0rem 1.5rem" id="displayFB1">一级分部</a>
@@ -79,11 +79,11 @@
                       <a class="dropdown-item" href="javascript:void(0);" style="padding: 0rem 1.5rem" id="displayZD">最底层</a>
                     </div>
                     </span>
-                      <a href="javascript:void(0)" class="btn btn-sm" id = 'ZLFB_btn'><i class="fa fa-sign-in " aria-hidden="true"></i><span data-toggle="tooltip" data-placement="bottom" title="整理分部"> 整理分部</span></a>
+                      <a href="javascript:void(0)" class="btn btn-sm" id = 'ZLFB_btn'><i class="fa fa-sign-in " aria-hidden="true"></i><span data-toggle="tooltip" data-placement="bottom" title=""> 整理分部</span></a>
                       <% if (projectData.property.lockBills == true) { %>
-                      <a href="javascript:void(0)" class="btn btn-sm" name="lockBills"  title="解锁清单"> <i class="fa fa-unlock-alt" aria-hidden="true"></i> 解锁清单</a>
+                      <a href="javascript:void(0)" class="btn btn-sm" name="lockBills"  title=""> <i class="fa fa-unlock-alt" aria-hidden="true"></i> 解锁清单</a>
                       <% } else { %>
-                      <a href="javascript:void(0)" class="btn btn-sm" name="lockBills"  title="锁定清单"> <i class="fa fa-lock" aria-hidden="true"></i> 锁定清单</a>
+                      <a href="javascript:void(0)" class="btn btn-sm" name="lockBills"  title=""> <i class="fa fa-lock" aria-hidden="true"></i> 锁定清单</a>
                       <% } %>
                   </div>
                   <div class="side-tabs">
@@ -175,7 +175,85 @@
                                                   <a href="javascript:void(0);" id="itemUp" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a>
                                               </div>
                                           </div>
-                                          <div id="add-rule" style="width: 34%;float: left;background: #EFEFEF; height: 100%;display: none; padding-left: 8px;">
+                                          <div class="col-4" style="width: 33%; float: left; margin: 0; padding:0;">
+                                              <div class="main-data-bottom" id="add-rule" style="display: none;">
+                                                  <div class="container-fluid my-2">
+                                                      <div class="mb-1 row">
+                                                          <label class="col-5 px-0 col-form-label text-right">添加位置:</label>
+                                                          <div class="col-7">
+                                                              <select id="add-position" class="form-control form-control-sm">
+                                                                  <option value="1" selected="selected">添加到项目特征列</option>
+                                                                  <option value="2">添加到清单名称列</option>
+                                                                  <option value="3">添加到工作内容列</option>
+                                                                  <option value="4">分别添加到对应列</option>
+                                                              </select>
+                                                          </div>
+                                                      </div>
+                                                      <div class="mb-1 row">
+                                                          <label class="col-sm-5 px-0 col-form-label text-right">添加内容:</label>
+                                                          <div class="col-sm-7">
+                                                              <select id="add-content" class="form-control form-control-sm">
+                                                                  <option value="">无</option>
+                                                                  <option value="1" selected="selected">项目特征+工作内容</option>
+                                                                  <option value="2">工作内容+项目特征</option>
+                                                                  <option value="3">项目特征</option>
+                                                                  <option value="4">工作内容</option>
+                                                                  <option value="5">定额子目</option>
+                                                              </select>
+                                                          </div>
+                                                      </div>
+                                                      <div class="mb-1 row">
+                                                          <label class="col-5 px-0 col-form-label text-right">显示格式:</label>
+                                                          <div class="col-7">
+                                                              <select id="display-format" class="form-control form-control-sm">
+                                                                  <option value="1" selected="selected">换行分隔</option>
+                                                                  <option value="2">逗号分隔</option>
+                                                                  <option value="3">括号分隔</option>
+                                                              </select>
+                                                          </div>
+                                                      </div>
+                                                      <div class="mb-1 row">
+                                                          <label class="col-5 px-0 col-form-label text-right">特征生成方式:</label>
+                                                          <div class="col-7">
+                                                              <select id="character-format" class="form-control form-control-sm">
+                                                                  <option value="1">特征值</option>
+                                                                  <option value="2" selected="selected">特征:特征值</option>
+                                                              </select>
+                                                          </div>
+                                                      </div>
+                                                      <div class="mb-1 row">
+                                                          <label class="col-5 px-0 col-form-label text-right">子目生成方式:</label>
+                                                          <div class="col-7">
+                                                              <select id="child-display-format" disabled="disabled" class="form-control form-control-sm">
+                                                                  <option value="1" selected="selected">编号+定额名称</option>
+                                                                  <option value="2">序号+定额名称</option>
+                                                              </select>
+                                                          </div>
+                                                      </div>
+                                                      <div class="mb-1 row">
+                                                          <label class="col-5 px-0 col-form-label text-right">序号格式:</label>
+                                                          <div class="col-7">
+                                                              <select id="serial-type" class="form-control form-control-sm">
+                                                                  <option value="">无</option>
+                                                                  <option value="1" selected="selected">1.</option>
+                                                                  <option value="2">a.</option>
+                                                                  <option value="3">A.</option>
+                                                              </select>
+                                                          </div>
+                                                      </div>
+                                                      <p style="text-align: center">
+                                                          <% if (projectData.property.lockBills == true) { %>
+                                                          <button class="btn btn-primary btn-sm disabled" type="button" id="use-to-current">应用到选中清单</button>
+                                                          <button class="btn btn-primary btn-sm disabled" type="button" id="use-to-all">应用到所有清单</button>
+                                                          <% } else { %>
+                                                          <button class="btn btn-primary btn-sm" type="button" id="use-to-current">应用到选中清单</button>
+                                                          <button class="btn btn-primary btn-sm" type="button" id="use-to-all">应用到所有清单</button>
+                                                          <% } %>
+                                                      </p>
+                                                  </div>
+                                              </div>
+                                          </div>
+                                          <!--<div id="add-rule" style="width: 34%;float: left;background: #EFEFEF; height: 100%;display: none; padding-left: 8px;">
                                               <p style="text-align: center">添加规则</p>
                                               <p>
                                                   <label class="title">添加位置:</label>
@@ -236,10 +314,10 @@
                                                   <button class="btn btn-primary btn-sm" type="button" id="use-to-current">应用到选中清单</button>
                                                   <button class="btn btn-primary btn-sm" type="button" id="use-to-all">应用到所有清单</button>
                                                   <% } %>
-                                                  <!--<button class="btn btn-primary btn-sm" type="button" id="use-to-current">应用到选中清单</button>
-                                                  <button class="btn btn-primary btn-sm" type="button" id="use-to-all">应用到所有清单</button>-->
+                                                  &lt;!&ndash;<button class="btn btn-primary btn-sm" type="button" id="use-to-current">应用到选中清单</button>
+                                                  <button class="btn btn-primary btn-sm" type="button" id="use-to-all">应用到所有清单</button>&ndash;&gt;
                                               </p>
-                                          </div>
+                                          </div>-->
                                       </div>
                                   </div>
                               </div>
@@ -251,17 +329,22 @@
                               <!--清单指引-->
                               <div class="tab-pane" id="zy">
                                   <div class="sidebar-tools-bar container-fluid tools-bar-height-z">
-                                      <div class="p-1 d-flex justify-content-center">
-                                          <select class="form-control form-control-sm" id="stdBillsGuidanceLibSelect">
-                                          </select>
-                                          <div class="input-group" id="stdBillsGuidanceSearch">
-                                              <input type="text" class="form-control form-control-sm" placeholder="搜索清单">
-                                              <span class="input-group-btn">
-                                                  <button class="btn btn-secondary btn-sm" type="button"><i class="fa fa-search" aria-hidden="true"></i></button>
-                                              </span>
+                                      <div class="p-1 row">
+                                          <div class="col p-0">
+                                              <select class="form-control form-control-sm" id="stdBillsGuidanceLibSelect"></select>
+                                          </div>
+                                          <div class="col px-1">
+                                              <div class="input-group" id="stdBillsGuidanceSearch">
+                                                  <input type="text" class="form-control form-control-sm" placeholder="输入编码或名称">
+                                                  <span class="input-group-btn">
+                                            <button class="btn btn-secondary btn-sm" type="button"><i class="fa fa-search" aria-hidden="true"></i></button>
+                                        </span>
+                                              </div>
+                                          </div>
+                                          <div class="col p-0">
+                                              <button id="guidanceInsertRation" class="btn btn-primary btn-sm" type="button">插入定额</button>
+                                              <button id="guidanceInsertBills" class="btn btn-primary btn-sm" type="button">插入清单</button>
                                           </div>
-                                          <button id="guidanceInsertRation" class="btn btn-primary btn-sm mx-3" type="button">插入定额</button>
-                                          <button id="guidanceInsertBills" class="btn btn-primary btn-sm mx-3" type="button">插入清单</button>
                                       </div>
                                       <!--搜索结果窗体-->
                                       <div class="side-search-box col-12 p-2" id="billsGuidanceSearchResult" style="display: none;">
@@ -272,12 +355,20 @@
                                           </div>
                                       </div>
                                   </div>
-                                  <div class="row" style="margin-left: 1px;">
+                                  <div class="top-content" style="overflow: hidden">
+                                      <div class="main-data-side-zb" id="billsGuidance_bills">
+                                      </div>
+                                  </div>
+                                  <div class="resize" id="zyResize" style="background: #F1F1F1"></div>
+                                  <div class="bottom-content">
+                                      <div class="main-data-side-zi" id="billsGuidance_items"></div>
+                                  </div>
+                                  <!--<div class="row" style="margin-left: 1px;">
                                       <div id="billsGuidance_bills" class="main-data-side-zb" style="width: 53%; float: left; margin: 0; padding: 0;">
                                       </div>
                                       <div id="billsGuidance_items" class="main-data-side-zi" style="width: 46%; float: left; margin: 0; padding: 0;">
                                       </div>
-                                  </div>
+                                  </div>-->
                               </div>
                               <!--清单规则-->
                               <div class="tab-pane" id="qd">
@@ -286,7 +377,7 @@
                                           <select class="form-control form-control-sm col-6" id="stdBillsLibSelect">
                                           </select>
                                           <div class="input-group col-6" id="stdBillsSearch">
-                                              <input type="text" class="form-control form-control-sm" placeholder="搜索清单">
+                                              <input type="text" class="form-control form-control-sm" placeholder="输入编码或名称">
                                               <span class="input-group-btn">
                                                   <button class="btn btn-secondary btn-sm" type="button"><i class="fa fa-search" aria-hidden="true"></i></button>
                                               </span>

+ 9 - 0
web/building_saas/main/html/tender_price.html

@@ -1,3 +1,12 @@
+<!--<style>
+    input::-webkit-outer-spin-button,
+    input::-webkit-inner-spin-button {
+        -webkit-appearance: none;
+    }
+    input[type="number"]{
+        -moz-appearance: textfield;
+    }
+</style>-->
 <div class="toolsbar px-1">
     <div class="btn-toolbar py-1">
         <div class="input-group input-group-sm mr-2">

+ 31 - 0
web/building_saas/main/js/main.js

@@ -22,6 +22,10 @@ $(function () {
         $(gljOprObj.activeTab).addClass('active');
         autoFlashHeight();
         projectObj.refreshMainSpread();
+        billsGuidance.refreshWorkBook();
+        billsLibObj.refreshBillsSpread();
+        billsLibObj.refreshBillsRelaSpread();
+        rationLibObj.refreshSpread();
     });
 
     $('#tab_report').on('shown.bs.tab', function(e){
@@ -224,6 +228,33 @@ function setDefaultSize(tag,eles,type) {
     }
 }
 
+function disableRightMenu(id,spread,rowChangeFunction) {
+    let me = this;
+    $.contextMenu({
+        selector: '#'+id,
+        build: function ($trigger, e) {
+            let oldRow = spread.getActiveSheet().getSelections()[0].row;
+            var target = SheetDataHelper.safeRightClickSelection($trigger, e, spread);
+            if(rowChangeFunction){
+                if(oldRow != target.row){
+                    rowChangeFunction(target.row)
+                }
+            }
+            return target.hitTestType === GC.Spread.Sheets.SheetArea.viewport || target.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
+        },
+        items: {
+            "disable": {
+                name: "",
+                visible: function () {
+                    return false;
+                },
+                callback: function (key, opt) {
+                }
+            },
+        }
+    });
+}
+
 /*window.onunload=show;  页面唯一性可以用session storage 来做
 
 function show()

+ 81 - 51
web/building_saas/main/js/models/calc_base.js

@@ -376,15 +376,13 @@ let baseFigureTemplate = {
     },
     //统计分部分项下工料机类型为“人工”的总消耗量
     'FBFXRGGR': function (tender) {
-        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
-        const quantityType = tender ? 'tenderQuantity' : 'quantity';
-        //todo 调用subdivisionTenderQuantity
+        const subQuantityType = tender ? 'tenderSubdivisionQuantity' : 'subdivisionQuantity';
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         let rst = 0;
         for(let glj of projGljs){
             if(glj.type === gljType.LABOUR){
-                if(cbTools.isDef(glj.subdivisionQuantity)){
-                    rst = parseFloat(rst + glj.subdivisionQuantity).toDecimal(decimalObj.glj.quantity);
+                if(cbTools.isDef(glj[subQuantityType])){
+                    rst = parseFloat(rst + glj[subQuantityType]).toDecimal(decimalObj.glj.quantity);
                 }
             }
         }
@@ -490,13 +488,14 @@ let baseFigureTemplate = {
     'JSCSXMWJJCLF': function (tender) {
         return (this['JSCSXMZCF'](tender) + this['JSCSXMSBF'](tender)).toDecimal(decimalObj.bills.totalPrice);
     },
-    'JSCSXMRGGR': function () {
+    'JSCSXMRGGR': function (tender) {
+        const techQuantityType = tender ? 'tenderTechQuantity' : 'techQuantity';
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
             if(glj.type === gljType.LABOUR){
-                if(cbTools.isDef(glj.techQuantity)){
-                    rst = parseFloat(rst + glj.techQuantity).toDecimal(decimalObj.glj.quantity);
+                if(cbTools.isDef(glj[techQuantityType])){
+                    rst = parseFloat(rst + glj[techQuantityType]).toDecimal(decimalObj.glj.quantity);
                 }
             }
         }
@@ -536,7 +535,8 @@ let baseFigureTemplate = {
     'RCJJC': function (tender) {//人材机价差
         return (this['RGJC'](tender) + this['CLJC'](tender) + this['JXJC'](tender)).toDecimal(decimalObj.bills.totalPrice);
     },
-    'RGJC': function () {//人工价差
+    'RGJC': function (tender) {//人工价差
+        const quantityType = tender ? 'tenderQuantity' : 'quantity';
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
@@ -544,13 +544,15 @@ let baseFigureTemplate = {
                 //调整价
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
-                let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
-                rst = (rst + parseFloat(glj.quantity * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
+                rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
     },
-    'CLJC': function () {//材料价差
+    'CLJC': function (tender) {//材料价差
+        const quantityType = tender ? 'tenderQuantity' : 'quantity';
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
@@ -558,13 +560,15 @@ let baseFigureTemplate = {
                 //调整价
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
-                let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
-                rst = (rst + parseFloat(glj.quantity * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
+                rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
     },
-    'JXJC': function () {//机械价差
+    'JXJC': function (tender) {//机械价差
+        const quantityType = tender ? 'tenderQuantity' : 'quantity';
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
@@ -572,8 +576,9 @@ let baseFigureTemplate = {
                 //调整价
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
-                let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
-                rst = (rst + parseFloat(glj.quantity * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
+                rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
@@ -581,7 +586,8 @@ let baseFigureTemplate = {
     'FBFXRCJJC': function (tender) {//分部分项人材机价差
         return (this['FBFXRGJC'](tender) + this['FBFXCLJC'](tender) + this['FBFXJXJC'](tender)).toDecimal(decimalObj.bills.totalPrice);
     },
-    'FBFXRGJC': function () {//分部分项人工价差
+    'FBFXRGJC': function (tender) {//分部分项人工价差
+        const quantityType = tender ? 'tenderSubdivisionQuantity' : 'subdivisionQuantity';
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
@@ -589,13 +595,15 @@ let baseFigureTemplate = {
                 //调整价
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
-                let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
-                rst = (rst + parseFloat(glj.subdivisionQuantity * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
+                rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
     },
-    'FBFXCLJC': function () {//分部分项材料价差
+    'FBFXCLJC': function (tender) {//分部分项材料价差
+        const quantityType = tender ? 'tenderSubdivisionQuantity' : 'subdivisionQuantity';
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
@@ -603,13 +611,15 @@ let baseFigureTemplate = {
                 //调整价
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
-                let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
-                rst = (rst + parseFloat(glj.subdivisionQuantity * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
+                rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
     },
-    'FBFXJXJC': function () {//分部分项机械价差
+    'FBFXJXJC': function (tender) {//分部分项机械价差
+        const quantityType = tender ? 'tenderSubdivisionQuantity' : 'subdivisionQuantity';
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
@@ -617,8 +627,9 @@ let baseFigureTemplate = {
                 //调整价
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
-                let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
-                rst = (rst + parseFloat(glj.subdivisionQuantity * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
+                rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
@@ -626,7 +637,8 @@ let baseFigureTemplate = {
     'JSCSXMRCJJC': function (tender) {//技术措施项目人材机价差
         return (this['JSCSXMRGJC'](tender) + this['JSCSXMCLJC'](tender) + this['JSCSXMJXJC'](tender)).toDecimal(decimalObj.bills.totalPrice);
     },
-    'JSCSXMRGJC': function () {//技术措施项目人工价差
+    'JSCSXMRGJC': function (tender) {//技术措施项目人工价差
+        const quantityType = tender ? 'tenderTechQuantity' : 'techQuantity';
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
@@ -634,13 +646,15 @@ let baseFigureTemplate = {
                 //调整价
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
-                let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
-                rst = (rst + parseFloat(glj.techQuantity * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
+                rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
     },
-    'JSCSXMCLJC': function () {//技术措施项目材料价差
+    'JSCSXMCLJC': function (tender) {//技术措施项目材料价差
+        const quantityType = tender ? 'tenderTechQuantity' : 'techQuantity';
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
@@ -648,13 +662,15 @@ let baseFigureTemplate = {
                 //调整价
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
-                let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
-                rst = (rst + parseFloat(glj.techQuantity * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
+                rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
     },
-    'JSCSXMJXJC': function () {//技术措施项目机械价差
+    'JSCSXMJXJC': function (tender) {//技术措施项目机械价差
+        const quantityType = tender ? 'tenderTechQuantity' : 'techQuantity';
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
@@ -662,8 +678,9 @@ let baseFigureTemplate = {
                 //调整价
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
-                let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
-                rst = (rst + parseFloat(glj.techQuantity * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                let dffPrc = parseFloat(marketPrice - adjPrc).toDecimal(decimalObj.glj.unitPrice);
+                rst = (rst + parseFloat(glj[quantityType] * dffPrc).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
@@ -748,82 +765,95 @@ let baseFigureTemplate = {
         }
         return rst;
     },
-    'JDDEJJRGF': function () {//甲定定额基价人工费
+    'JDDEJJRGF': function (tender) {//甲定定额基价人工费
+        const quantityType = tender ? 'tenderQuantity' : 'quantity';
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
             if(glj.type === gljType.LABOUR && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
-                rst = (rst + parseFloat(glj.quantity * glj.unit_price.base_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                rst = (rst + parseFloat(glj[quantityType] * glj.unit_price.base_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
     },
-    'JDDEJJCLF': function () {//甲定定额基价材料费
+    'JDDEJJCLF': function (tender) {//甲定定额基价材料费
+        const quantityType = tender ? 'tenderQuantity' : 'quantity';
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
             if(baseMaterialTypes.includes(glj.type) && glj.ratio_data.length === 0 && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
-                rst = (rst + parseFloat(glj.quantity * glj.unit_price.base_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                rst = (rst + parseFloat(glj[quantityType] * glj.unit_price.base_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
     },
-    'JDDEJJJXF': function () {//甲定定额基价机械费
+    'JDDEJJJXF': function (tender) {//甲定定额基价机械费
+        const quantityType = tender ? 'tenderQuantity' : 'quantity';
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
             if(baseMachineTypes.includes(glj.type) && glj.ratio_data.length === 0 && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
-                rst = (rst + parseFloat(glj.quantity * glj.unit_price.base_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                rst = (rst + parseFloat(glj[quantityType] * glj.unit_price.base_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
     },
-    'JDRGF': function () {//甲定人工费
+    'JDRGF': function (tender) {//甲定人工费
+        const quantityType = tender ? 'tenderQuantity' : 'quantity';
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
             if(glj.type === gljType.LABOUR && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
-                rst = (rst + parseFloat(glj.quantity * glj.unit_price.market_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                rst = (rst + parseFloat(glj[quantityType] * marketPrice).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
     },
-    'JDCLF': function () {//甲定材料费
+    'JDCLF': function (tender) {//甲定材料费
+        const quantityType = tender ? 'tenderQuantity' : 'quantity';
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
             if(baseMaterialTypes.includes(glj.type) && glj.ratio_data.length === 0 && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
-                rst = (rst + parseFloat(glj.quantity * glj.unit_price.market_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                rst = (rst + parseFloat(glj[quantityType] * marketPrice).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
     },
-    'JDJXF': function () {//甲定机械费
+    'JDJXF': function (tender) {//甲定机械费
+        const quantityType = tender ? 'tenderQuantity' : 'quantity';
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
             if(baseMachineTypes.includes(glj.type) && glj.ratio_data.length === 0 && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
-                rst = (rst + parseFloat(glj.quantity * glj.unit_price.market_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                rst = (rst + parseFloat(glj[quantityType] * marketPrice).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
     },
-    'JDZCF': function () {//甲定主材费
+    'JDZCF': function (tender) {//甲定主材费
+        const quantityType = tender ? 'tenderQuantity' : 'quantity';
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
             if(glj.type === gljType.MAIN_MATERIAL && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
-                rst = (rst + parseFloat(glj.quantity * glj.unit_price.market_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                rst = (rst + parseFloat(glj[quantityType] * marketPrice).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;
     },
-    'JDSBF': function () {//甲定设备费
+    'JDSBF': function (tender) {//甲定设备费
+        const quantityType = tender ? 'tenderQuantity' : 'quantity';
         let rst = 0;
         let projGljs = calcBase.project.projectGLJ.datas.gljList;
         for(let glj of projGljs){
             if(glj.type === gljType.EQUIPMENT && (glj.supply === supplyType.JDYG || glj.supply === supplyText.JDYG)){
-                rst = (rst + parseFloat(glj.quantity * glj.unit_price.market_price).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
+                let marketPrice = tender ? calcBase.project.projectGLJ.getTenderMarketPrice(glj) : glj.unit_price.market_price;
+                rst = (rst + parseFloat(glj[quantityType] * marketPrice).toDecimal(decimalObj.bills.totalPrice)).toDecimal(decimalObj.bills.totalPrice);
             }
         }
         return rst;

+ 23 - 35
web/building_saas/main/js/models/calc_program.js

@@ -643,7 +643,7 @@ let calcTools = {
             summaryFees: treeNode.data.summaryFees,
             name:treeNode.data.name,
             rationQuantityCoe: treeNode.data.rationQuantityCoe,
-            quantityCoe: treeNode.data.quantityCoe,
+            quantityCoe: treeNode.data.quantityCoe == null ? {} : treeNode.data.quantityCoe,
             targetUnitFee: treeNode.data.targetUnitFee,
             targetTotalFee: treeNode.data.targetTotalFee
         };
@@ -674,6 +674,7 @@ let calcTools = {
     calcNodeTenderQty: function (treeNode){
         let qCoe = (treeNode.data.rationQuantityCoe == undefined) ? 1 : treeNode.data.rationQuantityCoe;
         treeNode.data.tenderQuantity = (this.uiNodeQty(treeNode) * qCoe).toDecimal(decimalObj.decimal("quantity", treeNode));
+        return treeNode.data.tenderQuantity;
     },
     calcGLJTenderQty: function (treeNode, glj){
         if (treeNode.data.quantityCoe == undefined){
@@ -1506,8 +1507,8 @@ class CalcProgram {
                             rttf = parseFloatPlus(node.data.feesIndex[ft.type].tenderTotalFee).toDecimal(decimalObj.bills.totalPrice);
                         };
                         if (me.project.property.billsCalcMode === leafBillGetFeeType.rationContent) {
-                            buf = (buf + (ruf * parseFloatPlus(node.data.contain)).toDecimal(decimalObj.bills.unitPrice)).toDecimal(decimalObj.process);
-                            btuf = (btuf + (rtuf * parseFloatPlus(node.data.contain)).toDecimal(decimalObj.bills.unitPrice)).toDecimal(decimalObj.process);
+                            buf = (buf + (ruf * parseFloatPlus(node.data.quantity)).toDecimal(decimalObj.bills.unitPrice)).toDecimal(decimalObj.process);
+                            btuf = (btuf + (rtuf * parseFloatPlus(node.data.tenderQuantity)).toDecimal(decimalObj.bills.unitPrice)).toDecimal(decimalObj.process);
                         };
                         sum_rtf = (sum_rtf + rtf).toDecimal(decimalObj.process);
                         sum_rttf = (sum_rttf + rttf).toDecimal(decimalObj.process);
@@ -1571,8 +1572,7 @@ class CalcProgram {
                     let ftObj = {};
                     ftObj.fieldName = 'common';
                     ftObj.unitFee = parseFloatPlus(treeNode.data.feesIndex.common.unitFee);
-                    let q = parseFloatPlus(treeNode.data.quantity);
-                    ftObj.totalFee = (ftObj.unitFee * q).toDecimal(decimalObj.bills.totalPrice);
+                    ftObj.totalFee = (ftObj.unitFee * nQ).toDecimal(decimalObj.bills.totalPrice);
                     calcTools.checkFeeField(treeNode, ftObj);
                 }
             }
@@ -1873,9 +1873,9 @@ class CalcProgram {
     };
 
     // 排除指定项的综合合价计算(用于带循环计算的情况。这里的汇总只到清单级别即可:清单单价取费时,汇总到清单和汇总到定额两个值不一样)
-    getTotalFee(baseNodes, excludeNodes, adj){
+    getTotalFee(baseNodes, excludeNodes, tender){
         let rst = 0;
-        const totalFeeType = adj ? 'common.tenderTotalFee' : 'common.totalFee';
+        const totalFeeType = tender ? 'common.tenderTotalFee' : 'common.totalFee';
         function calcNodes(nodes) {
             for (let node of nodes) {
                 if (!excludeNodes.includes(node)){
@@ -1895,30 +1895,15 @@ class CalcProgram {
     };
 
     // 税前工程造价 ,adj调价
-    getBeforeTaxTotalFee(excludeNodes, adj){
+    getBeforeTaxTotalFee(excludeNodes, tender){
         let baseNodes = [], me = this;
         baseNodes.push(calcTools.getNodeByFlag(fixedFlag.SUB_ENGINERRING));
         baseNodes.push(calcTools.getNodeByFlag(fixedFlag.MEASURE));
         baseNodes.push(calcTools.getNodeByFlag(fixedFlag.OTHER));
         baseNodes.push(calcTools.getNodeByFlag(fixedFlag.CHARGE));
-        return me.getTotalFee(baseNodes, excludeNodes, adj);
+        return me.getTotalFee(baseNodes, excludeNodes, tender);
     };
 
-    /*clearTenders(){
-        let nodes = projectObj.project.mainTree.items;
-        for (let node of nodes) {
-            delete node.data.targetTotalFee;
-            delete node.data.targetUnitFee;
-            if (node.data.feesIndex && node.data.feesIndex.common){
-                delete node.data.feesIndex.common.tenderUnitFee;
-                delete node.data.feesIndex.common.tenderTotalFee;
-            };
-            delete node.data.quantityCoe;
-            delete node.data.rationQuantityCoe;
-        };
-        projectObj.project.property.tenderSetting.gljPriceTenderCoe = 1;
-    };*/
-
     // 反向调价
     calcTenderReverse(treeNode, tender){
         if (treeNode.data.feesIndex.common.tenderUnitFee != treeNode.data.feesIndex.common.unitFee){
@@ -1941,32 +1926,35 @@ class CalcProgram {
             coe = (treeNode.data.targetTotalFee / treeNode.data.feesIndex.common.totalFee).toDecimal(2);//(decimalObj.process);
 
         if (tender == tenderTypes.ttReverseRation){
+            treeNode.data.tenderQuantity = (treeNode.data.quantity * coe).toDecimal(decimalObj.decimal("quantity", treeNode));
             if (treeNode.data.rationQuantityCoe != coe){
                 treeNode.data.rationQuantityCoe = coe;
                 treeNode.changed = true;
             };
+
+            let ttf = (treeNode.data.tenderQuantity * treeNode.data.feesIndex.common.tenderUnitFee).toDecimal(decimalObj.decimal('totalPrice', treeNode));
+            if (treeNode.data.feesIndex.common.tenderTotalFee != ttf){
+                treeNode.data.feesIndex.common.tenderTotalFee = ttf;
+                treeNode.changed = true;
+            };
         }else if (tender == tenderTypes.ttReverseGLJ){
-            let coeObj = treeNode.data.quantityCoe;
-            if (!coeObj){
+            treeNode.data.tenderQuantity = treeNode.data.quantity;
+            let qcObj = treeNode.data.quantityCoe;
+            if (!qcObj){
                 treeNode.data.quantityCoe = {labour: coe, material: coe, machine: coe, main: coe, equipment: coe};
                 treeNode.changed = true;
             }else{
-                for (let pn in coeObj){
-                    if (coeObj[pn] != coe){
-                        coeObj[pn] = coe;
+                for (let pn in qcObj){
+                    if (qcObj[pn] != coe){
+                        qcObj[pn] = coe;
                         treeNode.changed = true;
                     }
                 };
             };
+            projectObj.project.calcProgram.calculate(treeNode, false, false, tenderTypes.ttCalc);  // 再正向算
         };
 
-        treeNode.data.tenderQuantity = (treeNode.data.quantity * coe).toDecimal(decimalObj.decimal("quantity", treeNode));
 
-        let ttf = (treeNode.data.tenderQuantity * treeNode.data.feesIndex.common.tenderUnitFee).toDecimal(decimalObj.decimal('totalPrice', treeNode));
-        if (treeNode.data.feesIndex.common.tenderTotalFee != ttf){
-            treeNode.data.feesIndex.common.tenderTotalFee = ttf;
-            treeNode.changed = true;
-        };
     };
 };
 

+ 13 - 1
web/building_saas/main/js/models/project_glj.js

@@ -266,7 +266,7 @@ ProjectGLJ.prototype.updatePrice = function (recode, updateField, newval,from,cb
         if(glj.unit_price[updateField] == newval){
             return;
         }
-        let data = {id: glj.unit_price.id, field: updateField, newval: newval,project_id:glj.project_id};
+        let data = {id: glj.unit_price.id, field: updateField, newval: newval,project_id:glj.project_id,unit_price_file_id:glj.unit_price.unit_price_file_id};
         let callback = function (data) {
             if (updateField == 'base_price') {
                 glj.unit_price.base_price = newval;
@@ -681,6 +681,18 @@ ProjectGLJ.prototype.getMarketPrice = function (glj,isRadio) {
     return gljUtil.getMarketPrice(glj,proGLJ.datas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil);
 };
 
+ProjectGLJ.prototype.getTenderMarketPrice = function (glj,isRadio) {
+    let proGLJ =  projectObj.project.projectGLJ;
+    let calcOptions=projectInfoObj.projectInfo.property.calcOptions;
+    let decimalObj = projectInfoObj.projectInfo.property.decimal;
+    let labourCoeDatas =  projectObj.project.labourCoe.datas;
+    let tenderCoe = 1;
+    if (projectObj.project.property.tenderSetting && gljUtil.isDef(projectObj.project.property.tenderSetting.gljPriceTenderCoe) ){
+        tenderCoe = parseFloat(projectObj.project.property.tenderSetting.gljPriceTenderCoe);
+    }
+    return gljUtil.getMarketPrice(glj,proGLJ.datas,calcOptions,labourCoeDatas,decimalObj,isRadio,_,scMathUtil,tenderCoe);
+};
+
 ProjectGLJ.prototype.isEstimateType = function(type){
     let typeString = type + "";
     if (typeString.startsWith("2")||typeString=='4'||typeString=='5') {//只有材料、主材、设备类型才显示是否暂估

+ 4 - 4
web/building_saas/main/js/models/quantity_detail.js

@@ -145,7 +145,7 @@ var quantity_detail = {
                         }, function () {
                             doc.refreshQuantity=false;
                             me.doSaveAction(doc,args,batchCallback);
-                        },['确定','取消']);
+                        },['确定','取消'],false);
                         return;
                     }
                 }
@@ -304,7 +304,7 @@ var quantity_detail = {
                             me.updateQuantityRegex(query,doc,args,batchCallback)
                         }, function () {
                             me.cleanQuantityDetail(selected,true);
-                        },['确定','取消']);
+                        },['确定','取消'],false);
                         return;
                     }
                 }
@@ -346,7 +346,7 @@ var quantity_detail = {
                 }, function () {
                     query.refreshQuantity=false;
                     summationUpdate(args,detailList,newval,query);
-                },['确定','取消']);
+                },['确定','取消'],false);
                 return;
             }
             summationUpdate(args,detailList,newval,query);
@@ -612,7 +612,7 @@ var quantity_detail = {
                         me.updateMainTreeNodeQuantity(value,node,editingText);
                     }, function () {
                         projectObj.mainController.refreshTreeNode([node]);
-                    },['确定','取消']);
+                    },['确定','取消'],false);
                     return;
                 }
                 me.updateMainTreeNodeQuantity(value,node,editingText);

+ 1 - 1
web/building_saas/main/js/models/ration.js

@@ -667,7 +667,7 @@ var Ration = {
                     me.doContainUpdate(value,node);
                 }, function () {
                     projectObj.mainController.refreshTreeNode([node]);
-                },['确定','取消']);
+                },['确定','取消'],false);
             }else {
                 me.doContainUpdate(value,node);
             }

+ 8 - 4
web/building_saas/main/js/views/character_content_view.js

@@ -8,7 +8,7 @@ let contentOprObj = {
     setting: {
         header: [
             {headerName:"工作内容",headerWidth:160,dataCode:"content", dataType: "String", hAlign: "left", vAlign: "center"},
-            {headerName:"输出",headerWidth:80,dataCode:"isChecked", cellType:"checkBox", hAlign: "center", vAlign: "center"}
+            {headerName:"输出",headerWidth:40,dataCode:"isChecked", cellType:"checkBox", hAlign: "center", vAlign: "center"}
         ]
     },
     buildSheet: function(container) {
@@ -388,9 +388,9 @@ let characterOprObj = {
     currentCache: [],
     setting: {
         header: [
-            {headerName:"项目特征",headerWidth:160,dataCode:"character", dataType: "String", hAlign: "left", vAlign: "center"},
+            {headerName:"项目特征",headerWidth:120,dataCode:"character", dataType: "String", hAlign: "left", vAlign: "center"},
             {headerName:"特征值",headerWidth:160,dataCode:"eigenvalue", dataType: "String", cellType: "comboBox", hAlign: "left", vAlign: "center"},
-            {headerName:"输出",headerWidth:80,dataCode:"isChecked", cellType:"checkBox", hAlign: "center", vAlign: "center"}
+            {headerName:"输出",headerWidth:40,dataCode:"isChecked", cellType:"checkBox", hAlign: "center", vAlign: "center"}
         ]
     },
     buildSheet: function(container) {
@@ -406,6 +406,7 @@ let characterOprObj = {
         let sheet = workBook.getActiveSheet(), me = characterOprObj;
         const EVENTS = GC.Spread.Sheets.Events;
         workBook.bind(EVENTS.ButtonClicked, me.onButtonClicked);
+        sheet.bind(EVENTS.EnterCell, me.onEnterCell);
         sheet.bind(EVENTS.EditEnded, me.onEditEnded);
         sheet.bind(EVENTS.EditStarting, me.onEditStart);
         sheet.bind(EVENTS.ClipboardPasting, me.onClipboardPasting);
@@ -470,7 +471,7 @@ let characterOprObj = {
     //获得项目特征特征值comboBox
     getComboBox: function (characterItem) {
         let rst = {};
-        let combo = new GC.Spread.Sheets.CellTypes.ComboBox();
+        let combo = sheetCommonObj.getDynamicCombo();
         let comboItems = [], eigenvalues = characterItem.eigenvalue;
         for(let i = 0, len = eigenvalues.length; i < len; i++){
             comboItems.push(eigenvalues[i].value);
@@ -655,6 +656,9 @@ let characterOprObj = {
             me.currentSelectedValue = me.currentCache.length > args.row ?  me.getCurrentSelected(me.currentCache[args.row]) : null;
         }
     },
+    onEnterCell: function (sender, args) {
+        args.sheet.repaint();
+    },
     onEditEnded: function (sender, args) {
         let me = characterOprObj, characterTxt;
         let preObj = me.currentCache.length > 0 ?  me.currentCache[me.currentCache.length - 1] : null;

+ 9 - 0
web/building_saas/main/js/views/fee_rate_view.js

@@ -396,6 +396,11 @@ var feeRateObject={
             }
         });
         this.mainFeeRateSheet.name('mainFeeRateSheet');
+        disableRightMenu("divFee",this.mainFeeRateSpread,this.rightClickCallback);
+    },
+    rightClickCallback:function (row) {
+        let me = feeRateObject;
+        me.onMainFeeRateSelect(row);
     },
     showMainFeeRateData:function () {
         let me = this;
@@ -517,6 +522,10 @@ var feeRateObject={
     onMainFeeRateSelectChanged:function (e, info) {
         let me = feeRateObject;
         let row = info.newSelections[0].row;
+        me.onMainFeeRateSelect(row);
+    },
+    onMainFeeRateSelect:function (row) {
+        let me = this;
         if(row!=-1){
             subRateObject.initSubRateSpread(me.mainFeeRateData[row]);
         }

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

@@ -1426,7 +1426,7 @@ $(function () {
             });
         }, function () {
 
-        },['确定','取消']);
+        },['确定','取消'],false);
     });
 
     $("input[name='install_setting_radios']").each(function(){

+ 23 - 10
web/building_saas/main/js/views/project_glj_view.js

@@ -90,6 +90,7 @@ projectGljObject={
         this.projectGljSpread.bind(GC.Spread.Sheets.Events.RangeChanged, this.onProjectGljRangeChange);
         this.initProjectGljSheet();
         this.initMaterialTreeSheet();
+        disableRightMenu("project_glj_sheet",this.projectGljSpread,this.rightClickCallback);
     },
     initProjectGljSheet:function () {
         this.projectGljSheet = this.projectGljSpread .getSheet(0);
@@ -189,7 +190,7 @@ projectGljObject={
                 gljId = me.projectGljSheetData[srow].id;
                 gljType = me.projectGljSheetData[srow].type;
             }
-        }else if(sheet.name() == 'materialTreeSheet' ){
+        }else if(sheet.name() == 'materialTreeSheet'){
             if(this.materialTree.selected){
                 gljId = this.materialTree.selected.data.id;
                 gljType = this.materialTree.selected.data.type;
@@ -281,7 +282,7 @@ projectGljObject={
     },
     onSelectionChange:function (){
         let me = projectGljObject;
-        me.showMixRatioData();
+        me.projectGljRowChang();
         me.materialTreeSheet.repaint();
     },
     onProjectGljSelectionChange:function (sender, args) {
@@ -289,11 +290,24 @@ projectGljObject={
         let newSel = args.newSelections[0];
         let oldSel = args.oldSelections?args.oldSelections[0]:{};
         if(newSel.row != oldSel.row){
-            me.mixRatioSheet.getSelections()[0].row = -1;
-            me.showMixRatioData();
+           me.projectGljRowChang();
         }
         me.projectGljSheet.repaint();
     },
+    projectGljRowChang:function(row){
+        let me = projectGljObject;
+        me.mixRatioSheet.getSelections()[0].row = -1;
+        me.showMixRatioData();
+    },
+    rightClickCallback:function (row) {
+        let me = projectGljObject;
+        let sheet =  me.projectGljSpread.getActiveSheet();
+        if(sheet.name() == 'projectGljSheet'){
+            me.projectGljRowChang(row);
+        }else if(sheet.name() == 'materialTreeSheet'){
+            me.materialTreeController.setTreeSelected(me.materialTreeController.tree.items[row]);
+        }
+    },
     onProjectGljRangeChange:function (sender,info) {
         let me = projectGljObject;
         let changeInfo=[];
@@ -344,9 +358,9 @@ projectGljObject={
             projectGljSheetData.push(this.getSheetDataByGLJ(glj));
         }
         this.projectGljSheetData = projectGljSheetData;
-        this.projectGljSheet.setRowCount(0);
-        sheetCommonObj.showData(this.projectGljSheet, this.projectGljSetting,this.projectGljSheetData);
         this.projectGljSheet.setRowCount(this.projectGljSheetData.length);
+        sheetCommonObj.showData(this.projectGljSheet, this.projectGljSetting,this.projectGljSheetData);
+        //this.projectGljSheet.setRowCount(this.projectGljSheetData.length);
         sel.row = oldData?_.findIndex(this.projectGljSheetData,{'id':oldData.id}):'';
         this.projectGljSheet.setSelection(sel.row==-1?0:sel.row,sel.col,sel.rowCount,sel.colCount);
     },
@@ -533,6 +547,7 @@ projectGljObject={
             remark:glj.remark
         };
         gljOprObj.setGLJPrice(data,glj);
+
         data.is_main_material = glj.is_main_material == 1?1:0;
         //供货方式为完全甲供时设置甲供数量为总消耗量
         if (data.supply == 2) {
@@ -685,7 +700,7 @@ projectGljObject={
         let parentBasePrice = 0;
         for(let i = 0;i < me.mixRatioData.length;i++){
             let ratio = me.mixRatioData[i];
-            let marketPrice = ratio.unit_price.marketPrice;
+            let marketPrice = ratio.unit_price.market_price;
             let basePrice = ratio.unit_price.base_price;
             // 如果是删除则忽略即将被删除的行数据
             if (scene === 'delete' && affectRow === i) {
@@ -710,9 +725,7 @@ projectGljObject={
             return;
         }
         if (value&&!me.checkData(col,setting,value)) {
-            setTimeout(function () {//为了不与click事件冲突
-                alert('输入的数据类型不对,请重新输入!');
-            },200);
+            alert('输入的数据类型不对,请重新输入!');
             info.sheetName =="materialTreeSheet"?me.materialTreeController.refreshTreeNode([me.materialTree.selected]):me.refreshProjectGljRow(row);
             return ;
         }

+ 27 - 4
web/building_saas/main/js/views/side_tools.js

@@ -14,7 +14,6 @@ sideResizeEles.nav = null;
 slideResize(sideResizeEles, {min: 250, max: $('#zaojiashu').width()-260}, 'width', function(){
     projectObj.refreshMainSpread();
     refreshSubSpread();
-    console.log(sideResizeEles.id);
     if(sideResizeEles.id === 'stdBillsGuidanceTab'){
         billsGuidance.refreshWorkBook();
     }
@@ -26,6 +25,20 @@ slideResize(sideResizeEles, {min: 250, max: $('#zaojiashu').width()-260}, 'width
         billsLibObj.refreshBillsRelaSpread();
     }
 });
+
+//清单指引上下拖动
+let billsGuidanceLibResizeEles = {};
+billsGuidanceLibResizeEles.id = '#zy';
+billsGuidanceLibResizeEles.resize = $('#zyResize');
+billsGuidanceLibResizeEles.nearElement = $('#zy').find('.top-content');
+billsGuidanceLibResizeEles.nearSpread = $('#billsGuidance_bills');
+billsGuidanceLibResizeEles.farElement = $('#zy').find('.bottom-content');
+billsGuidanceLibResizeEles.farSpread = $('#billsGuidance_items');
+billsGuidanceLibResizeEles.nav = null;
+slideResize(billsGuidanceLibResizeEles, {min: 147, max: 680}, 'height', function() {
+    billsGuidance.refreshWorkBook();
+});
+
 //定额库上下拖动
 let rationLibResizeEles = {};
 rationLibResizeEles.id = '#de';
@@ -58,12 +71,22 @@ var sideToolsObj = {
     showSideTools: function (tabPanel, show, id) {
         sideResizeEles.id = id;
         if (show) {
-            sideResizeEles.nearElement.css('width', '66.666667%');
-            sideResizeEles.farElement.css('width', '33.333333%');
+            if(id === 'stdBillsGuidanceTab'){
+                sideResizeEles.nearElement.css('width', '72%');
+                sideResizeEles.farElement.css('width', '28%');
+            }
+            else {
+                sideResizeEles.nearElement.css('width', '66.666667%');
+                sideResizeEles.farElement.css('width', '33.333333%');
+            }
             $('.main-side .tab-pane').hide();
             tabPanel.show();
             loadSize(sideResizeEles, 'width', function(){
-                if(id === 'stdRationTab'){//定额库
+                if(id === 'stdBillsGuidanceTab'){//清单指引
+                    loadSize(billsGuidanceLibResizeEles, 'height', function(){
+                    });
+                }
+                else if(id === 'stdRationTab'){//定额库
                     loadSize(rationLibResizeEles, 'height', function(){
                     });
                 }

+ 56 - 11
web/building_saas/main/js/views/std_billsGuidance_lib.js

@@ -28,7 +28,7 @@ const billsGuidance = (function () {
             headRowHeight: [40],
             defaultRowHeight: 21,
             cols: [{
-                width: 200,
+                width: 160,
                 readOnly: true,
                 head: {
                     titleNames: ["项目编码"],
@@ -45,7 +45,7 @@ const billsGuidance = (function () {
                     font: "Arial"
                 }
             }, {
-                width: 200,
+                width: 220,
                 readOnly: true,
                 head: {
                     titleNames: ["项目名称"],
@@ -61,17 +61,40 @@ const billsGuidance = (function () {
                     hAlign: 0,
                     font: "Arial"
                 }
-            }]
+            },
+               {
+                width: 45,
+                readOnly: true,
+                 head: {
+                     titleNames: ["计量单位"],
+                     spanCols: [1],
+                     spanRows: [1],
+                     vAlign: [1],
+                     hAlign: [1],
+                     font: ["Arial"]
+                 },
+                 data: {
+                     field: "unit",
+                     vAlign: 1,
+                     hAlign: 1,
+                     font: "Arial"
+                 }
+            }
+            ]
         },
         headers: [
-            {name: '项目编码', dataCode: 'code', width: 200, vAlign: 'center', hAlign: 'left', formatter: '@'},
-            {name: '项目名称', dataCode: 'name', width: 200, vAlign: 'center', hAlign: 'left', formatter: '@'}
+            {name: '项目编码', dataCode: 'code', width: 160, vAlign: 'center', hAlign: 'left', formatter: '@'},
+            {name: '项目名称', dataCode: 'name', width: 220, vAlign: 'center', hAlign: 'left', formatter: '@'},
+            {name: '单位', dataCode: 'unit', width: 45, vAlign: 'center', hAlign: 'center', formatter: '@'},
         ],
         events: {
             SelectionChanging: function (sender, info) {
                 billsInitSel(info.newSelections[0].row);
             },
             CellDoubleClick: function (sender, args) {
+                if(!bills.tree){
+                    return;
+                }
                 let node = bills.tree.items[args.row];
                 if(!node){
                     return;
@@ -119,7 +142,7 @@ const billsGuidance = (function () {
             headRowHeight: [40],
             defaultRowHeight: 21,
             cols: [{
-                width: 300,
+                width: 420,
                 readOnly: false,
                 head: {
                     titleNames: ["项目指引"],
@@ -137,7 +160,7 @@ const billsGuidance = (function () {
                 }
             },
             {
-                width: 50,
+                width: 35,
                 readOnly: false,
                 head: {
                     titleNames: ["选择"],
@@ -158,11 +181,11 @@ const billsGuidance = (function () {
         },
         headers: [
             {name: '项目指引', dataCode: 'name', width: 300, vAlign: 'center', hAlign: 'left', formatter: '@'},
-            {name: '选择', dataCode: 'select', width: 50, vAlign: 'center', hAlign: 'center', formatter: '@'},
+            {name: '选择', dataCode: 'select', width: 35, vAlign: 'center', hAlign: 'center', formatter: '@'},
         ],
         events: {
             EditStarting: function (sender, args) {
-                if(guideItem.headers[args.col]['dataCode'] === 'name'){
+                if(!bills.tree || guideItem.headers[args.col]['dataCode'] === 'name'){
                     args.cancel = true;
                 }
             },
@@ -172,7 +195,7 @@ const billsGuidance = (function () {
                 }
             },
             CellDoubleClick: function (sender, args) {
-                if(!bills.tree.selected){
+                if(!bills.tree || !bills.tree.selected){
                     return;
                 }
                 let node = bills.tree.selected.guidance.tree.selected;
@@ -342,6 +365,9 @@ const billsGuidance = (function () {
     //清单表焦点控制
     //@param {Number}row @return {void}
     function billsInitSel(row){
+        if(!bills.tree){
+            return;
+        }
         let guideSheet = guideItem.workBook.getActiveSheet();
         cleanData(guideSheet, guideItem.headers, -1);
         let node = bills.tree.items[row];
@@ -407,6 +433,9 @@ const billsGuidance = (function () {
     //@param {Array}libDats @return {void}
     function initLibs(libDatas){
         libSel.empty();
+        if(!libDatas){
+            return;
+        }
         let selectedLib = sessionStorage.getItem('stdBillsGuidance');
         for(let libData of libDatas){
             let opt = $('<option>').val(libData.id).text(libData.name);
@@ -421,6 +450,12 @@ const billsGuidance = (function () {
     //初始化视图
     //@param {void} @return {void}
     function initViews(){
+        //赋初始高度
+        if($('#billsGuidance_bills').height() === 0 || $('#billsGuidance_items').height() === 0){
+            let height = $(window).height()-$(".header").height()-$(".toolsbar").height()-$(".tools-bar-height-z").height();
+            $('#billsGuidance_bills').height(height / 2);
+            $('#billsGuidance_items').height(height / 2);
+        }
         let modules = [bills, guideItem];
         initWorkBooks(modules);
 
@@ -514,7 +549,7 @@ const billsGuidance = (function () {
         //插入清单
         $('#guidanceInsertBills').click(function () {
             //插入清单
-            if(!bills.tree.selected){
+            if(!bills.tree || !bills.tree.selected){
                 return;
             }
             if(bills.tree.selected.children.length === 0){
@@ -528,6 +563,9 @@ const billsGuidance = (function () {
         });
         //搜索
         $('#stdBillsGuidanceSearch>span>button').click(function () {
+            if(!bills.tree){
+                return;
+            }
             let billsSheet = bills.workBook.getActiveSheet();
             billsLibObj.clearHighLight(bills.workBook);
             let keyword = $('#stdBillsGuidanceSearch>input').val();
@@ -582,6 +620,13 @@ const billsGuidance = (function () {
             $('#billsGuidanceSearchResultCount').text('搜索结果:' + result.length);
             $('#billsGuidanceSearchResult').show();
         });
+        //搜索框回车
+        $('#stdBillsGuidanceSearch>input').bind('keypress', function (event) {
+            if(event.keyCode === 13){
+                $(this).blur();
+                $('#stdBillsGuidanceSearch>span>button').click();
+            }
+        });
         // 关闭搜索结果
         $('#closeSearchBillsGuidance').click(function () {
             $('#billsGuidanceSearchResult').hide();

+ 8 - 0
web/building_saas/main/js/views/std_bills_lib.js

@@ -125,6 +125,7 @@ var billsLibObj = {
         if(projectInfoObj.projectInfo.property.lockBills == true){
             return false;
         }
+        $.bootstrapLoading.start();
         //设置清单备注
         if(node.parent && node.parent.data.recharge){
             node.data.comments = node.parent.data.recharge;
@@ -480,6 +481,13 @@ $('#stdBillsLibSelect').change(function () {
         billsLibObj.loadStdBills(billsLibId);
     }
 });
+//搜索框回车
+$('#stdBillsSearch>input').bind('keypress', function (event) {
+    if(event.keyCode === 13){
+        $(this).blur();
+        $('#stdBillsSearch>span>button').click();
+    }
+});
 
 // 关闭搜索结果
 $('#closeSearchStdBills').click(function () {

+ 7 - 0
web/building_saas/main/js/views/std_ration_lib.js

@@ -330,6 +330,13 @@ $('#stdRationLibSelect').change(function () {
         rationLibObj.loadStdRation(rationLibId);
     }
 });
+//回车键搜索
+$('#rationSearchKeyword').bind('keypress', function (event) {
+    if(event.keyCode === 13){
+        $(this).blur();
+        $('#rationSearch').click();
+    }
+});
 $('#rationSearch').click(function () {
     var keyword = $('#rationSearchKeyword').val(), rationLibID = $('#stdRationLibSelect').val();
     var getResultHtml = function (result) {

+ 1 - 0
web/building_saas/main/js/views/sub_fee_rate_views.js

@@ -96,6 +96,7 @@ var subRateObject={
         console.log(subRateObject.datas);
         console.log(subRateObject.valueMap);
         subRateObject.showSubRateData();
+        disableRightMenu("subRate",this.subRateSpread);
     },
     showSubRateData:function () {
         this.subRateSheet.setRowCount(0);

+ 4 - 0
web/building_saas/main/js/views/sub_view.js

@@ -11,6 +11,8 @@ characterOprObj.buildSheet($("#itemSpread")[0]);
 $("#tzjnrCon").hide();
 $("#subSpread").show();
 var subSpread = sheetCommonObj.createSpread($("#subSpread")[0], 4);
+subSpread.options.allowUserDragDrop = false;
+subSpread.options.allowUserDragFill = false;
 subSpread.getSheet(2).name('JSCX');
 
 pageCCOprObj.active = false;
@@ -36,6 +38,7 @@ $("#linkGLJ").click(function(){
     $("#subItems").children().hide();//控制显示subSpread,隐藏特征及内容spread
     $("#subSpread").show();
     pageCCOprObj.active = false;
+    subSpread.options.allowUserDragFill = false;
     refreshSubSpread();
     subSpread.setActiveSheetIndex(0);
     gljOprObj.activeTab='#linkGLJ';
@@ -57,6 +60,7 @@ $("#linkAZZJF").click(function(){
 $("#linkGCLMX").click(function(){
     $("#subItems").children().hide();
     $("#subSpread").show();
+    subSpread.options.allowUserDragFill = true;
     pageCCOprObj.active = false;
     refreshSubSpread();
     subSpread.setActiveSheetIndex(1);

+ 11 - 1
web/building_saas/main/js/views/tender_price_view.js

@@ -53,6 +53,11 @@ let tender_obj={
         this.tenderSheet.bind(GC.Spread.Sheets.Events.EditStarting,this.onEditStarting);
         this.tenderController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, this.treeSelectedChanged);
        // this.tenderController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, this.onSelectionChange);
+        disableRightMenu("tenderSpread", this.tenderSpread,this.rightClickCallback);
+    },
+    rightClickCallback:function (row) {
+        let me = tender_obj;
+        me.tenderController.setTreeSelected(me.tenderController.tree.items[row]);
     },
     createTenderTreeSetting:function () {
        return sheetCommonObj.transferToTreeSetting(this.tenderSetting,this.tenderTreeSetting,MainTreeCol);
@@ -176,7 +181,12 @@ let tender_obj={
     cleanCacheCoes: function (){
         for(let node of tender_obj.tenderTree.items){
             if (node.data.rationQuantityCoe) node.data.rationQuantityCoe = null;
-            if (node.data.quantityCoe) node.data.quantityCoe = null;
+            let qcObj = node.data.quantityCoe;
+            if (qcObj){
+                for (let pn in qcObj){
+                    qcObj[pn] = null;
+                };
+            };
         };
     },
 

+ 2 - 2
web/common/html/header.html

@@ -1,5 +1,5 @@
 <nav class="navbar navbar-expand-lg p-0 d-flex">
-    <a class="header-logo px-2" href="/pm" style="text-decoration: none;">纵横云计价</a>
+    <a class="header-logo px-2" href="/pm" style="text-decoration: none;">纵横云计价<sup><%= versionName %></sup></a>
     <ul class="nav navbar-nav px-1" id="header-menu" style="display: none;">
         <li class="nav-item">
             <a class="nav-link" href="#" aria-expanded="false" data-toggle="modal" data-target="#poj-set"><i class="fa fa-cube"></i> 项目属性</a>
@@ -41,7 +41,7 @@
             <div class="dropdown-menu dropdown-menu-right">
                 <a class="dropdown-item" href="/user/info" target="_blank">账号资料</a>
                 <a class="dropdown-item" href="user-buy.html" target="_blank">产品购买</a>
-                <a class="dropdown-item" href="/user/preferences" target="_blank">偏好设置</a>
+                <a class="dropdown-item" href="/user/preferences" target="_blank">登录设置</a>
             </div>
         </div>
         <a class="btn btn-link btn-sm <% if (unreadCount > 0) { %>new-msg<% } %>" id="notify-info" data-toggle="modal" data-target="#msg" href="javacript:void(0);">

+ 2 - 2
web/users/html/login.html

@@ -42,8 +42,8 @@
         <div class="modal-dialog modal-lg" role="document">
             <div class="modal-content">
                 <div class="modal-header">
-                    <h4 class="modal-title">选择登录版本</h4>
-                    <p class="m-0 text-warning"><i class="fa fa-exclamation-triangle"></i> <b>偏好设置</b> 中可以修改您的登录习惯。</p>
+                    <h5 class="modal-title">选择登录版本</h5>
+                    <p class="m-0 text-warning"><i class="fa fa-exclamation-triangle"></i> <b>登录设置</b> 中可以修改您的登录习惯。</p>
                 </div>
                 <div class="modal-body">
                     <div class="row" id="version-area">

+ 1 - 1
web/users/html/user-info.html

@@ -31,7 +31,7 @@
                             <a class="nav-link" href="/user/buy">产品购买</a>
                         </li>
                         <li class="nav-item">
-                            <a class="nav-link" href="/user/preferences">偏好设置</a>
+                            <a class="nav-link" href="/user/preferences">登录设置</a>
                         </li>
                     </ul>
                 </div>

+ 1 - 1
web/users/html/user-safe.html

@@ -37,7 +37,7 @@
                             <a class="nav-link" href="/user/buy">产品购买</a>
                         </li>
                         <li class="nav-item">
-                            <a class="nav-link" href="/user/preferences">偏好设置</a>
+                            <a class="nav-link" href="/user/preferences">登录设置</a>
                         </li>
                     </ul>
                 </div>

+ 3 - 3
web/users/html/user-set.html

@@ -5,7 +5,7 @@
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     <meta http-equiv="x-ua-compatible" content="ie=edge">
-    <title>偏好设置-Smartcost</title>
+    <title>登录设置-Smartcost</title>
     <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
     <link rel="stylesheet" href="/web/building_saas/css/main.css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
@@ -32,14 +32,14 @@
                                 <a class="nav-link" href="/user/buy">产品购买</a>
                             </li>
                             <li class="nav-item">
-                                <a class="nav-link active" href="/user/preferences">偏好设置</a>
+                                <a class="nav-link active" href="/user/preferences">登录设置</a>
                             </li>
                         </ul>
                     </div>
                 </div>
                 <div class="col-lg-10">
                     <div class="col-lg-4">
-                        <legend class="my-3">偏好设置</legend>
+                        <legend class="my-3">登录设置</legend>
                         <form method="post" action="/user/save-preferences">
                             <div class="form-group">
                                 <label class="form-control-label">登录时选择版本</label>

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

@@ -248,13 +248,15 @@ function cleanError() {
 function setVersion(versionData) {
     let html = '';
     for (let version of versionData) {
-        let description = version.description ? version.description : 'With supporting text below as a natural lead-in to additional content.';
+        let description = version.description ? version.description : '介绍内容';
         let tmpHtml = '<div class="col-sm-6">' +
             '<div class="card card-block">' +
+            '<div class="card-body">' +
             '<h3 class="card-title">'+ version.name +'</h3>' +
             '<p class="card-text">' + description + '</p>' +
             '<a class="btn btn-primary" href="/boot/'+ version._id.toString() +'">开始使用</a>' +
             '</div>' +
+            '</div>' +
             '</div>';
         html += tmpHtml;
     }