Преглед изворни кода

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

TonyKang пре 6 година
родитељ
комит
60f0e4f306
54 измењених фајлова са 1718 додато и 784 уклоњено
  1. 4 2
      config/gulpConfig.js
  2. 11 0
      lib/jquery-editable-select/jquery.editable-select.min.css
  3. 7 0
      lib/jquery-editable-select/jquery.editable-select.min.js
  4. 6 0
      modules/all_models/compilation.js
  5. 1 1
      modules/complementary_ration_lib/models/compleRationModel.js
  6. 1 1
      modules/complementary_ration_lib/models/searchModel.js
  7. 4 0
      modules/main/facade/ration_facade.js
  8. 1 1
      modules/pm/controllers/pm_controller.js
  9. 3 2
      modules/pm/models/project_model.js
  10. 1 1
      modules/std_billsGuidance_lib/facade/facades.js
  11. 148 0
      modules/users/controllers/cld_controller.js
  12. 48 0
      modules/users/models/cld_model.js
  13. 1 1
      modules/users/models/compilation_model.js
  14. 26 0
      modules/users/routes/cld_route.js
  15. 103 2
      public/web/sheet/sheet_common.js
  16. 2 1
      public/web/sheet/sheet_data_helper.js
  17. 6 0
      public/web/tool_toast_util.js
  18. 8 2
      public/web/tree_sheet/tree_sheet_controller.js
  19. 44 13
      public/web/tree_sheet/tree_sheet_helper.js
  20. 2 2
      server.js
  21. 6 3
      web/building_saas/complementary_glj_lib/js/glj.js
  22. 61 1
      web/building_saas/css/custom.css
  23. 12 3
      web/building_saas/css/main.css
  24. 1 1
      web/building_saas/fee_rates/fee_rate.html
  25. 3 2
      web/building_saas/js/global.js
  26. 153 167
      web/building_saas/main/html/main.html
  27. 12 1
      web/building_saas/main/js/main.js
  28. 9 3
      web/building_saas/main/js/models/calc_program.js
  29. 6 6
      web/building_saas/main/js/models/fee_rate.js
  30. 295 149
      web/building_saas/main/js/views/block_lib.js
  31. 1 0
      web/building_saas/main/js/views/calc_base_view.js
  32. 7 6
      web/building_saas/main/js/views/character_content_view.js
  33. 163 71
      web/building_saas/main/js/views/fee_rate_view.js
  34. 2 2
      web/building_saas/main/js/views/glj_col.js
  35. 7 55
      web/building_saas/main/js/views/glj_view.js
  36. 26 19
      web/building_saas/main/js/views/main_tree_col.js
  37. 8 5
      web/building_saas/main/js/views/project_glj_view.js
  38. 49 22
      web/building_saas/main/js/views/project_view.js
  39. 43 59
      web/building_saas/main/js/views/quantity_edit_view.js
  40. 21 2
      web/building_saas/main/js/views/side_tools.js
  41. 231 42
      web/building_saas/main/js/views/std_billsGuidance_lib.js
  42. 1 1
      web/building_saas/main/js/views/std_bills_lib.js
  43. 70 22
      web/building_saas/main/js/views/std_ration_lib.js
  44. 42 14
      web/building_saas/main/js/views/sub_view.js
  45. 1 1
      web/building_saas/pm/html/project-management-Recycle.html
  46. 2 2
      web/building_saas/pm/html/project-management.html
  47. 3 3
      web/building_saas/pm/js/pm_gc.js
  48. 3 0
      web/building_saas/pm/js/pm_newMain.js
  49. 4 2
      web/common/html/header.html
  50. BIN
      web/dest/css/img/block.png
  51. BIN
      web/dest/css/img/blocklib.png
  52. 1 1
      web/users/html/login.html
  53. 5 90
      web/users/html/user-buy.html
  54. 43 0
      web/users/js/user.js

+ 4 - 2
config/gulpConfig.js

@@ -14,7 +14,8 @@ module.exports = {
         'public/web/gljUtil.js',
         'public/web/PerfectLoad.js',
         'lib/lodash/lodash.js',
-        'public/web/commonAlert.js'
+        'public/web/commonAlert.js',
+        'lib/jquery-editable-select/jquery.editable-select.min.js'
     ],
     common_css:[
         'lib/jquery-ui/jquery-ui.css',
@@ -22,7 +23,8 @@ module.exports = {
         'lib/spreadjs/sheets/css/gc.spread.sheets.sc.css',
         'web/building_saas/css/main.css',
         'web/building_saas/css/custom.css',
-        'lib/font-awesome/font-awesome.min.css'
+        'lib/font-awesome/font-awesome.min.css',
+        'lib/jquery-editable-select/jquery.editable-select.min.css'
     ],
     login_jspaths:[
         'public/web/url_util.js',

Разлика између датотеке није приказан због своје велике величине
+ 11 - 0
lib/jquery-editable-select/jquery.editable-select.min.css


Разлика између датотеке није приказан због своје велике величине
+ 7 - 0
lib/jquery-editable-select/jquery.editable-select.min.js


+ 6 - 0
modules/all_models/compilation.js

@@ -59,6 +59,12 @@ let modelSchema = {
     release_time: {
         type: Number,
         default: 0
+    },
+
+    // cld 办事处id
+    categoryID: {
+        type: Number,
+        default: 12 // 总部id
     }
 };
 mongoose.model(collectionName, new Schema(modelSchema, {versionKey: false, collection: collectionName}));

+ 1 - 1
modules/complementary_ration_lib/models/compleRationModel.js

@@ -172,7 +172,7 @@ class CompleRatoinDao {
                          glj = await complementaryGljModel.findOne({uesrId: userId, ID: rationGlj.gljId});
                     }
                     if(isDef(glj)){
-                        hintsArr.push(` ${glj.code} ${glj.name}${glj.specs ? ' ' + glj.specs : ''} ${glj.unit} ${rationGlj.consumeAmt}`);
+                        hintsArr.push(` ${glj.code} ${glj.name}${glj.specs ? '   ' + glj.specs : ''} &nbsp ${glj.unit}   ${rationGlj.consumeAmt}`);
                     }
                 }
                 hintsArr.push(`基价 元 ${ration.basePrice}`);

+ 1 - 1
modules/complementary_ration_lib/models/searchModel.js

@@ -62,7 +62,7 @@ class SearchDao{
     async findRation(userId, rationRepId, keyword, callback){
         try{
             let filter = {
-                'rationRepId': rationRepId,
+                'rationRepId': {$in: rationRepId},
                 '$and': [{
                     '$or': [{'code': {'$regex': keyword, $options: '$i'}}, {'name': {'$regex': keyword, $options: '$i'}}]
                 }, {

+ 4 - 0
modules/main/facade/ration_facade.js

@@ -462,6 +462,10 @@ async function CalculateQuantity (ration,billsItemID,projectID) {
     let decimalObject =await decimal_facade.getProjectDecimal(projectID,project);
     let quantity_decimal = (decimalObject&&decimalObject.ration&&decimalObject.ration.quantity)?decimalObject.ration.quantity:3;
     let pbill = await bill_model.model.findOne({projectID:projectID,ID:billsItemID});
+    let  t_unit = ration.unit.replace(/^\d+/,"");
+    if(t_unit!=pbill.unit){//如果定额工程量的单位去除前面的数字后不等于清单单位,定额工程量保持不变
+        return ;
+    }
     let billsQuantity = pbill.quantity ? pbill.quantity : 0;
     let bill_decimal = await decimal_facade.getBillsQuantityDecimal(projectID,pbill.unit,project);
     billsQuantity=scMathUtil.roundForObj(billsQuantity,bill_decimal);

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

@@ -79,7 +79,7 @@ module.exports = {
     },
     updateProjects: async function (req, res) {
         let data = JSON.parse(req.body.data);
-        await ProjectsData.updateUserProjects(req.session.sessionUser.id, req.session.sessionCompilation._id, data.updateData, function (err, message, data) {
+        await ProjectsData.updateUserProjects(req.session.sessionUser.id, req.session.sessionCompilation._id, req.session.sessionCompilation.name, data.updateData, function (err, message, data) {
             if (err === 0) {
                 callback(req, res, err, message, data);
             } else {

+ 3 - 2
modules/pm/models/project_model.js

@@ -105,7 +105,7 @@ ProjectsDAO.prototype.getUserProject = function (userId, ProjId, callback) {
     });
 };
 
-ProjectsDAO.prototype.updateUserProjects = async function (userId, compilationId, datas, callback) {
+ProjectsDAO.prototype.updateUserProjects = async function (userId, compilationId, compilationName, datas, callback) {
     let data, project, updateLength = 0, hasError = false, deleteInfo = null, i, newProject;
     let updateAll = function (err) {
         if (!err) {
@@ -169,7 +169,8 @@ ProjectsDAO.prototype.updateUserProjects = async function (userId, compilationId
                     //data.updateData.property.basicInformation = basicInformation;
                     //工程特征
                     if(data.updateData.property.featureLibID){
-                        data.updateData.property.projectFeature = await pmFacade.getProjectFeature(data.updateData.property.featureLibID, data.updateData.property.engineeringName);
+                        //工程专业显示费用定额的名称
+                        data.updateData.property.projectFeature = await pmFacade.getProjectFeature(data.updateData.property.featureLibID, compilationName);
                     }
                     /*projectFeature[0]['value'] = data.updateData.property.engineeringName || '';
                     data.updateData.property.projectFeature = projectFeature;*/

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

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

+ 148 - 0
modules/users/controllers/cld_controller.js

@@ -0,0 +1,148 @@
+'use strict';
+
+/**
+ * CLD接口相关控制器
+ *
+ * @author EllisRan.
+ * @date 2018/9/25
+ * @version
+ */
+
+import CLDModel from "../models/cld_model";
+import UserModel from "../models/user_model"
+import CompilationModel from "../models/compilation_model";
+
+class CLDController {
+
+    /**
+     * 获取cld办事处人员信息
+     *
+     * @param request
+     * @param reponse
+     * @return {Promise.<void>}
+     */
+    async getCategoryStaff(request, response) {
+        let category = request.query.category;
+        try {
+            let cldModel = new CLDModel();
+            let result = await cldModel.getCategoryStaff(category);
+            response.json({error: 0, msg: 'success', data: JSON.parse(result)});
+        } catch (err) {
+            response.json({error: 1, msg: err});
+        }
+    }
+
+    /**
+     * cld 获取建筑用户和编办接口
+     *
+     * @param request
+     * @param response
+     * @return {Promise.<void>}
+     */
+    async getUsersAndCompilationList(request, response) {
+        let mobile = request.query.mobile;
+        let ssoID = request.query.ssoID;
+        try {
+            //获取用户信息
+            if (mobile === undefined && ssoID === undefined) {
+                throw '传参有误';
+            }
+            let userModel = new UserModel();
+            let userData = '';
+            if (mobile !== undefined) {
+                userData = await userModel.findDataByMobile(mobile);
+            } else {
+                userData = await userModel.findDataBySsoId(ssoID);
+            }
+            if (userData === null || userData === '') {
+                throw '不存在该建筑用户';
+            }
+            userData = JSON.parse(JSON.stringify(userData));
+
+            userData.company_scale = userData.company_scale === null || userData.company_scale === undefined ? '' : userModel.companyScale[userData.company_scale] + '人';
+            userData.company_type = userData.company_type === null || userData.company_type === undefined ? '' : userModel.companyType[userData.company_type];
+            userData.province = userModel.province[userData.province];
+
+            let date = new Date(userData.create_time);
+            userData.create_time = date.getFullYear() + '年' +
+                (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '月' +
+                (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + '日';
+
+            //获取编办列表
+            let compilationModel = new CompilationModel();
+            let compilationList = JSON.parse(JSON.stringify(await compilationModel.getList()));
+            if (userData.upgrade_list !== undefined) {
+                let userUpgradeList = userData.upgrade_list;
+                for (let i in userUpgradeList) {
+                    let oneCompilationIndex = await compilationList.findIndex(function (item) {
+                        return item._id === userUpgradeList[i].compilationID;
+                    });
+                    if (oneCompilationIndex !== -1) {
+                        compilationList[oneCompilationIndex].isUpgrade = userUpgradeList[i].isUpgrade;
+                    }
+                }
+            }
+            response.json({error: 0, msg: 'success', data: { userInfo: userData, compilationList: compilationList }});
+        } catch (err) {
+            response.json({error: 1, msg: err});
+        }
+    }
+
+    /**
+     * 设置用户编办专业版
+     *
+     * @param request
+     * @param response
+     * @return {Promise.<void>}
+     */
+    async setUsersUpgrade(request, response) {
+        let ssoID = request.body.ssoId;
+        let compilationID = request.body.cid;
+        try {
+
+            let userModel = new UserModel();
+
+            let userData = await userModel.findDataBySsoId(ssoID);
+
+            let compilationModel = new CompilationModel();
+
+            let compilationData = compilationModel.getCompilationById(compilationID);
+
+            if (compilationData === null || compilationData === undefined) {
+                throw '不存在该编办或者编办未发布';
+            }
+
+            let upgrade_list = userData.upgrade_list !== undefined ? JSON.parse(JSON.stringify(userData.upgrade_list)) : [];
+
+            let upgradeIndex = upgrade_list.findIndex(function (item) {
+                return item.compilationID === compilationID
+            });
+
+            let upgradeInfo = {
+                compilationID:compilationID,//编办ID
+                upgrade_time:new Date().getTime(),
+                isUpgrade:true,
+                remark: ''
+            };
+
+            if (upgradeIndex === -1) {
+                upgrade_list.push(upgradeInfo);
+            } else {
+                upgrade_list.splice(upgradeIndex, 1, upgradeInfo);
+            }
+
+            let condition = {ssoId: ssoID};
+            let result = await userModel.updateUser(condition, {upgrade_list: upgrade_list});
+
+            if (result) {
+                response.json({error: 0, msg: 'success'});
+            } else {
+                throw '更新失败';
+            }
+        } catch (err) {
+            response.json({error: 1, msg: err});
+        }
+    }
+}
+
+export default CLDController;

+ 48 - 0
modules/users/models/cld_model.js

@@ -0,0 +1,48 @@
+'use strict';
+
+/**
+ * cld接口模型
+ *
+ * @author EllisRan.
+ * @date 2018/9/25
+ * @version
+ */
+
+import Request from "request";
+import BaseModel from "../../common/base/base_model";
+
+class CLDModel extends BaseModel {
+
+    CLDUrl = 'http://cld.smartcost.com.cn';
+
+    /**
+     * 获取办事处人员信息
+     *
+     * @param cid
+     * @return {Promise}
+     */
+    async getCategoryStaff(cid) {
+        let postData = {
+            url: this.CLDUrl + '/api/building/category/staff/' + cid,
+            encoding: 'utf8'
+        };
+        return new Promise(function (resolve, reject) {
+            try {
+                // 请求接口
+                Request.post(postData, function (err, postResponse, body) {
+                    if (err) {
+                        throw '请求错误';
+                    }
+                    if (postResponse.statusCode !== 200) {
+                        throw 'CLD通讯失败!';
+                    }
+                    resolve(body);
+                });
+            } catch (error) {
+                reject([]);
+            }
+        });
+    }
+}
+
+export default CLDModel;

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

@@ -28,7 +28,7 @@ class CompilationModel extends BaseModel {
      */
     async getList() {
         // 筛选字段
-        let field = {_id: 1, name: 1, is_release: 1, description: 1};
+        let field = {_id: 1, name: 1, is_release: 1, description: 1, categoryID: 1};
         let compilationData = await this.findDataByCondition({name: {$ne: ''}, is_release: true}, field, false);
 
         return compilationData === null ? [] : compilationData;

+ 26 - 0
modules/users/routes/cld_route.js

@@ -0,0 +1,26 @@
+'use strict';
+
+/**
+ * CLD接口路由
+ *
+ * @author EllisRan.
+ * @date 2018/9/25
+ * @version
+ */
+
+import express from "express";
+import CLDController from "../controllers/cld_controller";
+
+
+module.exports = function (app) {
+    let router = express.Router();
+    let cldController = new CLDController();
+
+    router.get('/getCategoryStaff', cldController.getCategoryStaff);
+
+    router.get('/getUsersAndCompilation', cldController.getUsersAndCompilationList);
+
+    router.post('/setUserUpgrade', cldController.setUsersUpgrade);
+
+    app.use('/cld',router)
+};

+ 103 - 2
public/web/sheet/sheet_common.js

@@ -502,11 +502,51 @@ var sheetCommonObj = {
             if (options.row === sheet.getActiveRowIndex() && options.col === sheet.getActiveColumnIndex() && (!forLocked || forLocked && !sheet.getCell(options.row, options.col).locked())) {
                 return GC.Spread.Sheets.CellTypes.ComboBox.prototype.getHitInfo.apply(this, arguments);
             } else {
-                return GC.Spread.Sheets.CellTypes.Base.prototype.getHitInfo.apply(this, arguments);
+                return  {
+                    x: x,
+                    y: y,
+                    row: options.row,
+                    col: options.col,
+                    cellStyle: cellStyle,
+                    cellRect: cellRect,
+                    sheetArea: options.sheetArea
+                };//GC.Spread.Sheets.CellTypes.Text.prototype.getHitInfo.apply(this, arguments);
             }
         };
         return new ComboCellForActiveCell();
     },
+    getTipsCombo:function (forLocked,tips,setting) {
+        let getTipsCombo = function () {
+            this.clickCom=false;
+        };
+        getTipsCombo.prototype = sheetCommonObj.getDynamicCombo(forLocked);
+        if(tips && tips !=""){
+            getTipsCombo.prototype.processMouseEnter = function(hitinfo){
+                if(this.clickCom == true){ //点击了下拉框的三角形,则不用再显示悬浮框了
+                    this.clickCom = false;
+                    return;
+                }
+                TREE_SHEET_HELPER.delayShowTips(hitinfo,setting,tips);
+            };
+            getTipsCombo.prototype.processMouseLeave = function (hitinfo) {
+                TREE_SHEET_HELPER.hideTipsDiv();
+            };
+            getTipsCombo.prototype.processMouseDown = function (hitinfo){
+                if(hitinfo.isReservedLocation == true){//这里是点击了下拉框的三角形才会有这个属性
+                    TREE_SHEET_HELPER.hideTipsDiv();
+                    this.clickCom = true;
+                }
+                GC.Spread.Sheets.CellTypes.ComboBox.prototype.processMouseDown.apply(this, arguments);
+            };
+
+            getTipsCombo.prototype.updateEditor = function (editorContext, cellStyle, cellRect, context){
+                TREE_SHEET_HELPER.hideTipsDiv();
+                GC.Spread.Sheets.CellTypes.ComboBox.prototype.updateEditor.apply(this, arguments);
+            };
+        }
+        return new getTipsCombo();
+    },
+
     setDynamicCombo: function (sheet, beginRow, col, rowCount, items, itemsHeight, itemsType) {
         let me = this;
         sheet.suspendPaint();
@@ -739,6 +779,67 @@ var sheetCommonObj = {
             sheet.resumeEvent();
             sheet.resumePaint();
         }
+    },
+    drowRect:function (ctx, x, y, w, h,rectW,rectH,margin) {
+        ctx.save();
+        ctx.strokeStyle = "gray";
+        ctx.translate(0.5, 0.5);
+        ctx.beginPath();
+        let rectX = x + margin;
+        let rectY = y + Math.round(h / 2) - rectH / 2;
+        ctx.moveTo(rectX, rectY);
+        ctx.lineTo(rectX, rectY + rectH);
+        ctx.lineTo(rectX + rectW, rectY + rectH);
+        ctx.lineTo(rectX + rectW, rectY);
+        ctx.lineTo(rectX, rectY);
+        ctx.moveTo(rectX + rectW, y + Math.round(h / 2));
+        ctx.lineTo(rectX + rectW + 5, y + Math.round(h / 2));
+        ctx.stroke();
+        ctx.restore();
+    },
+    drawLine : function (ctx, x1, y1, x2, y2, color) {
+        let l_color = color?color:"gray";
+        ctx.save();
+        ctx.translate(0.5, 0.5);
+        ctx.beginPath();
+        ctx.moveTo(x1, y1);
+        ctx.lineTo(x2, y2);
+        ctx.strokeStyle = l_color;
+        ctx.stroke();
+        ctx.restore();
+    },
+    drowSymbol :function (ctx, x, y, w, h,rectW,rectH,margin,collapsed) {
+        ctx.save();
+        ctx.strokeStyle = "#000000";
+        ctx.translate(0.5, 0.5);
+        ctx.beginPath();
+        ctx.moveTo(x + margin + 2, y + Math.round(h / 2));
+        ctx.lineTo(x + margin + 8, y + Math.round(h / 2));
+        let rectY = y + Math.round(h / 2) - rectH / 2;
+        if (collapsed) {
+            ctx.moveTo(x + margin + rectW / 2, rectY + 2);
+            ctx.lineTo(x + margin + rectW / 2, rectY + 2 + 6);
+        }
+        ctx.stroke();
+        ctx.restore();
+    },
+    drowSubItem: function (ctx, x, y, w, h, offset, hasNext,step) {
+        let t_step = step?step:6;
+        offset += t_step;
+        ctx.save();
+        ctx.strokeStyle = "gray";
+        ctx.translate(0.5, 0.5);
+        ctx.beginPath();
+        ctx.moveTo(x + offset, y);
+        ctx.lineTo(x + offset, y + Math.round(h / 2));
+        offset += 9;
+        ctx.lineTo(x + offset, y + Math.round(h / 2));
+        if (hasNext) {
+            ctx.moveTo(x + offset - 9, y + Math.round(h / 2));
+            ctx.lineTo(x + offset - 9, y + h);
+        }
+        ctx.stroke();
+        ctx.restore();
+        return offset;
     }
-
 }

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

@@ -178,7 +178,8 @@ var SheetDataHelper = {
                             .css("border", "1px #C0C0C0 solid")
                             .css("box-shadow", "1px 2px 5px rgba(0,0,0,0.4)")
                             .css("font", "0.9rem Calibri")
-                            .css("background", "white")
+                            .css("background", "Black")
+                            .css("color", "White")
                             .css("padding", 5)
                             .attr("id", 'autoTip');
                         $(div).hide();

+ 6 - 0
public/web/tool_toast_util.js

@@ -0,0 +1,6 @@
+/**
+ * Created by zhang on 2018/9/26.
+ */
+
+/*
+<div id="toolToastWrap" style="left: 20px; right: 30px; position: fixed; z-index: 10001; top: 100px;"><div id="toolToast" class="toolToast"><span id="tool-toast-content">右键不支持粘贴外部内容,请使用Ctrl+V粘贴。<span id="toolToastBtn">我知道了</span></span></div></div>*/

+ 8 - 2
public/web/tree_sheet/tree_sheet_controller.js

@@ -3,7 +3,7 @@
  */
 
 var TREE_SHEET_CONTROLLER = {
-    createNew: function (tree, sheet, setting) {
+    createNew: function (tree, sheet, setting, loadSheetHeader = true) {
         var controller = function () {
             this.tree = tree;
             this.sheet = sheet;
@@ -12,7 +12,9 @@ var TREE_SHEET_CONTROLLER = {
                 refreshBaseActn: null,
                 treeSelectedChanged: null
             };
-            TREE_SHEET_HELPER.loadSheetHeader(this.setting, this.sheet);
+            if(loadSheetHeader){
+                TREE_SHEET_HELPER.loadSheetHeader(this.setting, this.sheet);
+            }
         };
 
         controller.prototype.showTreeData = function () {
@@ -74,6 +76,10 @@ var TREE_SHEET_CONTROLLER = {
                             sels[0].row = beginRow;
                         }
                         that.sheet.deleteRows(sels[0].row, rowCount);
+                        if(sels[0].row >=  that.tree.items.length){
+                            sels[0].row = that.tree.items.length-1;
+                            sels[0].colCount = 1;
+                        }
                         that.setTreeSelected(that.tree.items[sels[0].row]);
                         that.sheet.setSelection(sels[0].row,sels[0].col,1,sels[0].colCount);
                     });

+ 44 - 13
public/web/tree_sheet/tree_sheet_helper.js

@@ -167,9 +167,9 @@ var TREE_SHEET_HELPER = {
                         let tag ="";
                         if(node.sourceType == ModuleNames.ration){//定额的时候换算子目
                             tag = node.data.adjustState?node.data.adjustState:'';
-                        }else if(node.sourceType == ModuleNames.bills &&projectObj.ifItemCharHiden(setting)){//清单、并且项目特征列隐藏的时候悬浮提示
+                        }/*else if(node.sourceType == ModuleNames.bills &&projectObj.ifItemCharHiden(setting)){//清单、并且项目特征列隐藏的时候悬浮提示  这里改成在 计量单位那里提示
                             tag = node.data.itemCharacterText?node.data.itemCharacterText:'';
-                        }
+                        }*/
                         sheet.setTag(iRow, iCol,tag);
                     }
                     /*if(colSetting.data.field=="name"){ 2018-08-06 改成在编号列悬浮提示
@@ -187,7 +187,7 @@ var TREE_SHEET_HELPER = {
                     cell.value(getFieldText2());
                 }
                 if (colSetting.data.cellType && Object.prototype.toString.apply(colSetting.data.cellType) !== "[object String]") {
-                    cell.cellType(colSetting.data.cellType(node));
+                    cell.cellType(colSetting.data.cellType(node,setting));
                 }
                 if(colSetting.data.autoHeight == true){
                     colSetting.setAutoHeight(cell,node);
@@ -379,6 +379,12 @@ var TREE_SHEET_HELPER = {
                 hitinfo.sheet.repaint();
             }
         };
+        TreeNodeCellType.prototype.processMouseEnter = function(hitinfo){
+            if(hitinfo.sheet.name() === 'stdBillsGuidance_bills'){
+
+                TREE_SHEET_HELPER.delayShowTips(hitinfo,setting);
+            }
+        };
         TreeNodeCellType.prototype.processMouseMove = function(hitinfo){//造价书主界面,当鼠标移动到单元格最右往左50个像素内时才显示悬浮提示内容
             if (hitinfo.sheet.name()!=="mainSheet") return;//只有在造价书主界面才显示
             let offset = 20;//从右向左显示的像素范围
@@ -471,35 +477,58 @@ var TREE_SHEET_HELPER = {
     },
     showTipsDiv:function (text,setting,hitinfo) {
         if (setting.pos && text && text !== '') {
+            if(text) text = replaceAll(/[\n]/,'<br>',text);
+            if(!this._fixedTipElement){
+                let div = $('#fixedTip')[0];
+                if (!div) {
+                    div = document.createElement("div");
+                    $(div).css("padding", 5)
+                        .attr("id", 'fixedTip');
+                    $(div).hide();
+                    document.body.insertBefore(div, null);
+                }
+                this._fixedTipElement = div;
+            }
+            $(this._fixedTipElement).width('');
+            $(this._fixedTipElement).html(text);
             if (!this._toolTipElement) {
                 let div = $('#autoTip')[0];
                 if (!div) {
                     div = document.createElement("div");
                     $(div).addClass("message-box");
-                    $(div) .attr("id", 'autoTip');
+                    $(div).attr("id", 'autoTip');
                     $(div).hide();
                     document.body.insertBefore(div, null);
                 }
                 this._toolTipElement = div;
+                $(this._toolTipElement).width('');
                 //实时读取位置信息
                 if(hitinfo.sheet && hitinfo.sheet.getParent().qo){
                     setting.pos = SheetDataHelper.getObjPos(hitinfo.sheet.getParent().qo);
                 }
-                if(text) text = replaceAll(/[\n]/,'<br>',text);
-                $(this._toolTipElement).html(`<span>${text}</span><div class="triangle-border tb-border"></div><div class="triangle-border tb-background"></div>`);
+                $(this._toolTipElement).html(`<span>${text}</span><div class="triangle-border tb-border_up"></div><div class="triangle-border tb-background_up"></div>`);
                 //清单指引、清单库做特殊处理
                 if($(hitinfo.sheet.getParent().qo).attr('id') === 'stdBillsSpread' || $(hitinfo.sheet.getParent().qo).attr('id') === 'billsGuidance_bills'){
-                    $(this._toolTipElement).css('top', '').css('left', '').css('width', '');
-                    let marginLeftMouse;
-                    if($(this._toolTipElement).width() < hitinfo.x){
-                        marginLeftMouse = hitinfo.x - $(this._toolTipElement).width();
+                    $(this._toolTipElement).html(`<span>${text}</span>`);
+                    let divWidth = $(this._fixedTipElement).width(),
+                        divHeight = $(this._fixedTipElement).height();
+                    if(divWidth > 600){
+                        divWidth = 590;
+                        $(this._toolTipElement).width(divWidth);
                     }
-                    $(this._toolTipElement).css("top", setting.pos.y + hitinfo.cellRect.y  -$(this._toolTipElement).height() -20).css("left", marginLeftMouse ? setting.pos.x + marginLeftMouse : setting.pos.x);
+                    let top = setting.pos.y  + hitinfo.y - divHeight / 2 < 0 ? 0 : setting.pos.y  + hitinfo.y - divHeight / 2;
+                    $(this._toolTipElement).css("top", top).css("left", setting.pos.x - divWidth);
                 } else {
                     //计算显示的初始位置
+               /*   显示在单元格上方,三角形指向下的版本
                     let top = setting.pos.y + hitinfo.cellRect.y -$(this._toolTipElement).height() -26;
                     let left =  setting.pos.x + hitinfo.cellRect.x;
+                    $(this._toolTipElement).css("top", top).css("left", left);*/
+                    //显示在下方,三角形指
+                    let top = setting.pos.y  + hitinfo.cellRect.y+26;
+                    let left =  setting.pos.x + hitinfo.cellRect.x;
                     $(this._toolTipElement).css("top", top).css("left", left);
+
                 }
                 $(this._toolTipElement).show("fast");
                 TREE_SHEET_HELPER.tipDiv = 'show';//做个标记
@@ -527,14 +556,16 @@ var TREE_SHEET_HELPER = {
             }
         },600)
     },
-    delayShowTips:function(hitinfo,setting){//延时显示
+    delayShowTips:function(hitinfo,setting,tips){//延时显示
         let delayTimes = 500; //延时时间
         let now_timeStamp = +new Date();
         TREE_SHEET_HELPER.tipTimeStamp = now_timeStamp;
         setTimeout(function () {
             if(now_timeStamp - TREE_SHEET_HELPER.tipTimeStamp == 0){//鼠标停下的时候才显示
-                let text = hitinfo.sheet.getText(hitinfo.row, hitinfo.col);
                 let tag = hitinfo.sheet.getTag(hitinfo.row, hitinfo.col);
+                if(tips && tips !=""){ //有tips的话优先显示tips
+                    tag = tips;
+                }
                 if(tag&&tag!=''){
                     TREE_SHEET_HELPER.showTipsDiv(tag,setting,hitinfo);
                 }

+ 2 - 2
server.js

@@ -55,8 +55,8 @@ app.use(session({
 // 登录状态全局判断
 app.use(function (req, res, next) {
     let url = req.originalUrl;
-    if (/^\/login/.test(url) || /\.map|\.ico$/.test(url) || /^\/sms/.test(url)) {
-        // 如果是登录页面或短信接口则忽略判断数据
+    if (/^\/login/.test(url) || /\.map|\.ico$/.test(url) || /^\/sms/.test(url) || /^\/cld/.test(url)) {
+        // 如果是登录页面或短信接口或cld接口则忽略判断数据
         next();
     } else {
         try {

+ 6 - 3
web/building_saas/complementary_glj_lib/js/glj.js

@@ -404,13 +404,16 @@ let repositoryGljObj = {
                 }
                 else {
                     $('#gljAlertBtn').click();
-                    $('#aleConfBtn').click(function () {
+                    $('#aleConfBtn').unbind('click');
+                    $('#aleConfBtn').bind('click', function () {
                         me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, focusToCol);
                     });
-                    $('#gljAleClose').click(function () {
+                    $('#gljAleClose').unbind('click');
+                    $('#gljAleClose').bind('click', function () {
                         me.workBook.getSheet(0).setActiveCell(me.editingRowIdx, focusToCol);
                     });
-                    $('#aleCanceBtn').click(function () {
+                    $('#aleCanceBtn').unbind('click');
+                    $('#aleCanceBtn').bind('click', function () {
                         me.addGljObj = null;
                         me.workBook.getSheet(0).suspendPaint();
                         me.workBook.getSheet(0).suspendEvent();

+ 61 - 1
web/building_saas/css/custom.css

@@ -96,7 +96,10 @@ legend.legend{
 }
 .tb-background_up {
     top:-11px;
-    border-color:transparent transparent #000 transparent;}
+    border-color:transparent transparent #000 transparent;
+}
+
+
 .elf-options:hover{
     background-color: #CCCCCC;
 }
@@ -145,4 +148,61 @@ legend.legend{
     background-image: url("/lib/jquery-ui/images/ui-icons_444444_256x240.png");
     background-repeat: no-repeat;
     background-position: -90px -12px;
+}
+
+.feerateInput {
+    padding: 0;
+}
+
+#toolToastWrap{
+    display:-webkit-box;
+    display:-ms-flexbox;
+    display:flex;
+    -webkit-box-pack:center;
+    -ms-flex-pack:center;
+    justify-content:center;
+    pointer-events:none;
+}
+
+#toolToast{
+    padding:11px 20px;
+    line-height:18px;
+    font-size:14px;
+    position:relative;
+    word-wrap:break-word;
+    color:#fff;
+    text-align:center;
+    background:rgba(0,0,0,.75);
+    background-size:cover;
+    -webkit-user-select:none;
+    -moz-user-select:none;
+    -ms-user-select:none;
+    user-select:none;
+    display:-webkit-box;
+    display:-ms-flexbox;
+    display:flex;
+    -webkit-box-align:center;
+    -ms-flex-align:center;
+    align-items:center;
+    max-width:686px;
+    box-sizing:border-box;
+    box-shadow:0 0 0 0 rgba(0,0,0,.15),0 2px 5px 0 rgba(0,0,0,.25);
+    pointer-events:auto;
+    border-radius:2px
+}
+
+#toolToastBtn{
+    color:#0188fb;
+    margin:0 2px;
+    white-space:nowrap;
+    cursor:pointer;
+    font-weight:700
+}
+
+#toolToastBtn:hover{
+    color:#4060c9
+}
+
+#toolToastBtn:active{
+    color:#354ea1
 }

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

@@ -309,6 +309,18 @@ a{
 .bottom-content .tab-content .ovf-hidden{
     overflow: hidden;
 }
+.tn-nav{
+    width:30px;
+    height: 100%;
+    border-left:1px solid #dee2e6 ;
+}
+.tn-nav > span{
+    width:20px;
+}
+.tn-nav:hover{
+    background:#f7f7f9;
+    cursor: pointer;
+}
 .form-signin {
     max-width: 500px;
     margin: 150px auto;
@@ -399,9 +411,6 @@ a{
 .custom-file-input:lang(zh) ~ .custom-file-label::after {
     content: "浏览";
 }
-.custom-file-input{
-    cursor: pointer;
-}
 
 .message-box {
     position:absolute;

+ 1 - 1
web/building_saas/fee_rates/fee_rate.html

@@ -156,7 +156,7 @@
                 </div>
             </div>
             <div class="modal-footer">
-                <button type="button" class="btn btn-primary" data-dismiss="modal" id="renameConfirm" disabled>确定</button>
+                <button type="button" class="btn btn-primary" id="renameConfirm">确定</button>
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
             </div>
         </div>

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

@@ -12,7 +12,7 @@ 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) - $('#billsGuidance_items').height() - 5);
+    $(".main-data-side-zb").height(($(window).height()-headerHeight-toolsbarHeight-toolsBarHeightZ) - $('#billsGuidance_items').height() - $('#zyTools').height() - 12);
     /*$(".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);
@@ -31,7 +31,8 @@ function autoFlashHeight(){
     $(".share-list").height($(window).height()-headerHeight-toolsbarHeight-40);
     $(".form-view").height($(window).height()-headerHeight-ftoolsbarHeight);
     $(".form-list").height($(window).height()-headerHeight-50 );
-
+    $('#comments').find('textarea').height($('#comments').height() - 25);
+    typeof(adaptiveTzjnrWidth)== 'function' ?adaptiveTzjnrWidth():''
 };
 
 

+ 153 - 167
web/building_saas/main/html/main.html

@@ -15,7 +15,7 @@
     <link rel="stylesheet" href="/web/building_saas/css/custom.css">
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
     <link rel="stylesheet" href="/lib/jquery-contextmenu/jquery.contextMenu.css" type="text/css">
-
+    <link rel="stylesheet" href="/lib/jquery-editable-select/jquery.editable-select.min.css" type="text/css">
     <!--zTree-->
     <link rel="stylesheet" href="/lib/ztree/css/zTreeStyle.css" type="text/css">
     <!--SpreadJs-->
@@ -35,6 +35,11 @@
 </head>
 
 <body>
+<!--<div id="toolToastWrap" style="left: 20px; right: 30px; position: fixed; z-index: 10001; top: 100px;">
+    <div id="toolToast" class="toolToast">
+        <span id="tool-toast-content">右键不支持粘贴外部内容,请使用Ctrl+V粘贴。<span id="toolToastBtn">我知道了</span></span>
+    </div>
+</div>-->
     <div class="header">
          <div class="top-msg clearfix">
             <div class="alert alert-warning mb-0 py-0" role="alert" id="notify" style="display: none">
@@ -106,9 +111,9 @@
                           <li class="nav-item">
                               <a class="nav-link px-3" href="javascript:void(0)" id = 'stdBillsGuidanceTab' relaPanel="#zy">清单指引</a>
                           </li>
-                          <li class="nav-item">
+                         <!-- <li class="nav-item">
                               <a class="nav-link px-3" href="javascript:void(0)" id = 'stdBillsTab' relaPanel="#qd">清单规则</a>
-                          </li>
+                          </li>-->
                           <li class="nav-item">
                               <a class="nav-link px-3" href="javascript:void(0)" id="stdRationTab" relaPanel="#de">定额库</a>
                           </li>
@@ -166,176 +171,123 @@
                                           <div class=" main-data-bottom ovf-hidden" style="width: 50%; float: left; margin: 0; padding:0;" id="assSpread"></div>
                                       </div>
                                       <div class="main-data-bottom ovf-hidden" style="display: none" id="comments">
-                                          <textarea class="form-control" rows="8" readonly=""></textarea>
+                                          <textarea style="font-size: 0.9rem" class="form-control" rows="8" readonly=""></textarea>
                                       </div>
-                                      <div id="tzjnrCon" class="main-data-bottom" style="background: #F1F1F1">
-                                          <div class="col-4" style="width: 33%; float: left; margin: 0; padding:0;">
-                                              <div class="main-data-bottom ovf-hidden" id="jobSpread">
-                                              </div>
-                                              <!--工具栏-->
-                                              <div class="bottom-tools btn-group position-absolute">
-                                                  <a href="javascript:void(0);" id="jobInsert" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="插入"><i class="fa fa-sign-in" aria-hidden="true"></i></a>
-                                                  <a href="javascript:void(0);" id="jobAdd" class="btn btn-sm " data-toggle="tooltip" data-placement="bottom" title="" data-original-title="添加"><i class="fa fa-plus" aria-hidden="true"></i></a>
-                                                  <a href="javascript:void(0);" id="jobDel" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="删除"><i class="fa fa-remove" aria-hidden="true"></i></a>
-                                                  <a href="javascript:void(0);" id="jobDown" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a>
-                                                  <a href="javascript:void(0);" id="jobUp" 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 class="col-4" style="width: 33%; float: left; margin: 0; padding:0;">
-                                              <div class="main-data-bottom ovf-hidden"  id="itemSpread">
+                                      <div id="tzjnrCon" class="container-fluid main-data-bottom" style="background: #F1F1F1; overflow: hidden">
+                                          <div class="row" style="overflow: hidden">
+                                              <div class="p-0" id="jobDiv" style="position:relative">
+                                                  <div class="main-data-bottom ovf-hidden" id="jobSpread">
+                                                  </div>
+                                                  <!--工具栏-->
+                                                  <div class="bottom-tools btn-group position-absolute">
+                                                      <a href="javascript:void(0);" id="jobInsert" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="插入"><i class="fa fa-sign-in" aria-hidden="true"></i></a>
+                                                      <a href="javascript:void(0);" id="jobAdd" class="btn btn-sm " data-toggle="tooltip" data-placement="bottom" title="" data-original-title="添加"><i class="fa fa-plus" aria-hidden="true"></i></a>
+                                                      <a href="javascript:void(0);" id="jobDel" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="删除"><i class="fa fa-remove" aria-hidden="true"></i></a>
+                                                      <a href="javascript:void(0);" id="jobDown" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a>
+                                                      <a href="javascript:void(0);" id="jobUp" 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 class="bottom-tools btn-group position-absolute">
-                                                  <a href="javascript:void(0);" id="itemInsert" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="插入"><i class="fa fa-sign-in" aria-hidden="true"></i></a>
-                                                  <a href="javascript:void(0);" id="itemAdd" class="btn btn-sm " data-toggle="tooltip" data-placement="bottom" title="" data-original-title="添加"><i class="fa fa-plus" aria-hidden="true"></i></a>
-                                                  <a href="javascript:void(0);" id="itemDel" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="删除"><i class="fa fa-remove" aria-hidden="true"></i></a>
-                                                  <a href="javascript:void(0);" id="itemDown" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a>
-                                                  <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 class="p-0" id="itemDiv" style="position:relative">
+                                                  <div class="main-data-bottom ovf-hidden"  id="itemSpread">
+                                                  </div>
+                                                  <!--工具栏-->
+                                                  <div class="bottom-tools btn-group position-absolute">
+                                                      <a href="javascript:void(0);" id="itemInsert" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="插入"><i class="fa fa-sign-in" aria-hidden="true"></i></a>
+                                                      <a href="javascript:void(0);" id="itemAdd" class="btn btn-sm " data-toggle="tooltip" data-placement="bottom" title="" data-original-title="添加"><i class="fa fa-plus" aria-hidden="true"></i></a>
+                                                      <a href="javascript:void(0);" id="itemDel" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="删除"><i class="fa fa-remove" aria-hidden="true"></i></a>
+                                                      <a href="javascript:void(0);" id="itemDown" class="btn btn-sm disabled" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a>
+                                                      <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>
-                                          <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">
-                                                      <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 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 class="p-0" id="openTypeSetting" >
+                                                   <div class="tn-nav d-flex align-items-start flex-column" data-toggle="tooltip" data-placement="left" title="" data-original-title="打开排版规则">
+                                                       <span class="mt-3 ml-2 text-primary">排版规则</span>
+                                                       <i class="fa fa-arrow-left mt-auto mb-3 text-primary ml-2"></i>
+                                                   </div>
+                                               </div>
+                                              <div class="p-0">
+                                                  <div class="main-data-bottom" id="add-rule" style="display: none;">
+                                                      <div class="container-fluid my-2">
+                                                          <div class="mb-1 row" style="text-align: center">
+                                                              <label class="col-5 px-0 col-form-label text-right">排版规则</label>
+                                                              <a id="closeTypeSetting" data-toggle="tooltip" data-placement="top" data-original-title="关闭排版规则" class="col-7 px-0 col-form-label" href="javascript:void(0);"><i class="fa fa-arrow-right"></i></a>
                                                           </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>
+                                                          <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 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>
-                                                      <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 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>
-                                                      <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 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>
-                                                      <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 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>
-                                                      <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 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>
                                                       </div>
                                                   </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>
-                                                  <select id="add-position">
-                                                      <option value="1" selected="selected">添加到项目特征列</option>
-                                                      <option value="2">添加到清单名称列</option>
-                                                      <option value="3">添加到工作内容列</option>
-                                                      <option value="4">分别添加到对应列</option>
-                                                  </select>
-                                              </p>
-                                              <p>
-                                                  <label class="title">添加内容:</label>
-                                                  <select id="add-content">
-                                                      <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>
-                                              </p>
-                                              <p>
-                                                  <label class="title">显示格式:</label>
-                                                  <select id="display-format">
-                                                      <option value="1" selected="selected">换行分隔</option>
-                                                      <option value="2">逗号分隔</option>
-                                                      <option value="3">括号分隔</option>
-                                                  </select>
-                                              </p>
-                                              <p>
-                                                  <label class="title">特征生成方式:</label>
-                                                  <select id="character-format">
-                                                      <option value="1">特征值</option>
-                                                      <option value="2" selected="selected">特征:特征值</option>
-                                                  </select>
-                                              </p>
-                                              <p>
-                                                  <label class="title">子目生成方式:</label>
-                                                  <select id="child-display-format" disabled="disabled">
-                                                      <option value="1" selected="selected">编号+定额名称</option>
-                                                      <option value="2">序号+定额名称</option>
-                                                  </select>
-                                              </p>
-                                              <p>
-                                                  <label class="title">序号格式:</label>
-                                                  <select id="serial-type">
-                                                      <option value="">无</option>
-                                                      <option value="1" selected="selected">1.</option>
-                                                      <option value="2">a.</option>
-                                                      <option value="3">A.</option>
-                                                  </select>
-                                              </p>
-                                              <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>
-                                                  <% } %>
-                                                  &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>
@@ -359,10 +311,10 @@
                                                   </div>
                                               </div>
                                           </div>
-                                          <div class="col p-0">
+                                          <!--<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>
+                                          </div>-->
                                       </div>
                                       <!--搜索结果窗体-->
                                       <div class="side-search-box col-12 p-2" id="billsGuidanceSearchResult" style="display: none;">
@@ -378,6 +330,13 @@
                                       </div>
                                   </div>
                                   <div class="resize" id="zyResize" style="background: #F1F1F1"></div>
+                                  <div class="p-1 row" id="zyTools" style="background: #F1F1F1">
+                                      <div class="col">
+                                          <button id="guidanceInsertBills" class="btn btn-primary btn-sm" type="button">插入清单</button>
+                                          <button id="guidanceInsertRation" class="btn btn-primary btn-sm" type="button">插入定额</button>
+                                          <button id="guidanceInsertBillsAndRation" class="btn btn-primary btn-sm" type="button">插入清单和定额</button>
+                                      </div>
+                                  </div>
                                   <div class="bottom-content">
                                       <div class="main-data-side-zi" id="billsGuidance_items"></div>
                                   </div>
@@ -447,7 +406,11 @@
                                           <!--搜索结果窗体-->
                                           <div class="side-search-box col-12 p-0" id="rationSearchResult" style="display: none;">
                                               <div class="d-flex justify-content-between">
-                                                  <span id="rationSearchCount"></span>
+                                                  <div class="my-1">
+                                                      <span id="rationSearchCount"></span>
+                                                      <button id="curRationLib" type="button" class="btn btn-sm btn-secondary" style="margin-left: 15px;">本定额</button>
+                                                      <button id="allRationLibs" type="button" class="btn btn-sm btn-light">全部定额</button>
+                                                  </div>
                                                   <a title="关闭搜索" class="btn btn-link btn-sm" href="javascript:void(0)"><i class="fa fa-remove" aria-hidden="true"></i></a>
                                               </div>
                                               <div class="w-100 main-data-side-search"></div>
@@ -484,12 +447,12 @@
                                           <button id="btn_block_newSubFolder" class="btn btn-warning btn-sm" type="button">新建子类</button>
                                       </div>
                                   </div>
-                                  <div class="top-content" style="background-color:#ff7e0e;overflow: hidden">
+                                  <div class="top-content" style="overflow: hidden">
                                       <div class="main-data-side-d" id="div_block_tree">
                                       </div>
                                   </div>
                                   <div class="resize" id="kmbkResize" style="background: #F1F1F1"></div>
-                                  <div class="bottom-content" style="background-color:#50df89;">
+                                  <div class="bottom-content">
                                       <div class="main-data-bottom" id="div_block_detail">
 
                                       </div>
@@ -786,7 +749,7 @@
                                                 </label>
                                             </div>
                                         </fieldset>
-                                            <label style="margin-top: 320px">将影响所有建设项目</label>
+                                            <label style="margin-top: 320px">*将影响所有建设项目</label>
                                     </div>
                                 </div>
                             </div>
@@ -794,7 +757,7 @@
                     </div>
                 </div>
                 <div class="modal-footer">
-                    <a href="javascript:void(0);" class="btn btn-primary" id="property_default" data-dismiss="modal">恢复默认系统设置</a>
+                    <a href="javascript:void(0);" class="btn btn-primary" id="property_default" data-dismiss="modal" style="margin-right: 485px">恢复默认系统设置</a>
                     <a href="javascript:void(0);" class="btn btn-primary" id="property_ok" data-dismiss="modal">确定</a>
                     <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
                 </div>
@@ -1059,6 +1022,19 @@
                         </div>
                         <div class="tab-pane" id="m-fl" role="tabpanel">
                             <input type="hidden" id="edit_from">
+                        <!--    <div class="row" style="margin-bottom:0.5rem!important">
+                                <div class="col-3">
+                                    <div class="form-check form-control feerateInput" style="border:0px;padding-left:1.25rem">
+                                        <label >
+                                            <input class="form-check-input" id="manualFeeRate" type="checkbox">
+                                            手工输入
+                                        </label>
+                                    </div>
+                                </div>
+                                <div class="col-6">
+                                    <input class="form-control feerateInput" id="inputFeeRate" value="">
+                                </div>
+                            </div>-->
                             <div class="modal-fixed-height" style="overflow: hidden" id="fee_rate_sheet">
                             </div>
                         </div>
@@ -1490,6 +1466,15 @@
         </div>
     </div>
 
+    <img src="/web/dest/css/img/folder_open.png" id="folder_open_pic" style="display: none">
+    <img src="/web/dest/css/img/folder_close.png" id="folder_close_pic" style="display: none">
+    <img src="/web/dest/css/img/project.png" id="proj_pic" style="display: none">
+    <img src="/web/dest/css/img/engineering.png" id="eng_pic" style="display: none">
+    <img src="/web/dest/css/img/tender.png" id="tender_pic" style="display: none">
+
+    <img src="/web/dest/css/img/blockLib.png" id="blockLib_pic" style="display: none">
+    <img src="/web/dest/css/img/folder_open.png" id="folder_pic" style="display: none">
+    <img src="/web/dest/css/img/tender.png" id="block_pic" style="display: none">
 
         <!-- JS. -->
     <script src = "/lib/spreadjs/sheets/gc.spread.sheets.all.11.1.2.min.js"></script>
@@ -1660,6 +1645,7 @@
                 $("#checkCount").text(checkCount);
 
             }
+
             /*$(document).ready(function(){
                 document.addEventListener('visibilitychange', function() {
                     if(document.hidden){ //页面不可见状态

+ 12 - 1
web/building_saas/main/js/main.js

@@ -33,6 +33,7 @@ $(function () {
         projectObj.mainSpread.refresh();
         refreshSubSpread();
         zmhs_obj.refresh();
+        $('#comments').find('textarea').height($('#comments').height() - 25);
     });
 
     const projectId = scUrlUtil.GetQueryString('project');
@@ -43,6 +44,9 @@ $(function () {
             setLocalCache('lastCol:' + projectId, info.col);
         }
     });
+
+
+
 });
 
 function getMainResizeEles() {
@@ -97,6 +101,7 @@ function slideResize(eles, limit, type, callback) {
 
     // 鼠标点下时
     resizeElement.mousedown(function(e) {
+        mouseMoveCount = 0;
         drag = true;
         startP = type === 'height' ? e.clientY : e.clientX;
         // 获取左(上)部分的宽度(高度)
@@ -265,4 +270,10 @@ function disableRightMenu(id,spread,rowChangeFunction) {
 function show()
 {
     return "exit"
-};*/
+};*/
+
+//页面失去焦点时触发
+/*
+window.onblur = function () {
+  console.log("test")
+};*/

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

@@ -168,6 +168,12 @@ let calcTools = {
 
         return flagsArr.includes(flag);
     },
+    isFBFX:function (treeNode) {
+        return projectObj.project.Bills.isFBFX(treeNode);
+    },
+    isTechMeasure:function(treeNode){
+       return projectObj.project.Bills.isTechMeasure(treeNode)
+    },
     getChildrenFormulaNodes: function (self, allFormulaNodesArr, parentNodes){       // 获取结点parentNodes下有公式的子结点
         let nodes = [];
         for (let pn of parentNodes){
@@ -1760,7 +1766,8 @@ class CalcProgram {
             };
 
             // 第1、2部分以外的叶子清单在没有公式的情况下可以手工修改综合单价并参与计算。
-            if(!calcTools.isInheritFrom(treeNode, [fixedFlag.SUB_ENGINERRING, fixedFlag.MEASURE])){
+            // 2017-09-27 需求改了,除了第 1 、 2.2部分以外,都可以手工修改综合单价、综合合价并参与计算
+            if(!calcTools.isFBFX(treeNode) && !calcTools.isTechMeasure(treeNode)){ // if(!calcTools.isInheritFrom(treeNode, [fixedFlag.SUB_ENGINERRING, fixedFlag.MEASURE]))
                 if (treeNode.data.feesIndex && treeNode.data.feesIndex.common){
                     let ftObj = {};
                     ftObj.fieldName = 'common';
@@ -1768,8 +1775,7 @@ class CalcProgram {
                     ftObj.totalFee = (ftObj.unitFee * nQ).toDecimal(decimalObj.bills.totalPrice);
                     calcTools.checkFeeField(treeNode, ftObj);
                 }
-            }
-            else{
+            } else{
                 if (treeNode.data.fees && treeNode.data.fees.length > 0){
                     treeNode.data.fees = null;
                     treeNode.data.feesIndex = null;

+ 6 - 6
web/building_saas/main/js/models/fee_rate.js

@@ -591,9 +591,9 @@ var FeeRate = {
             }
         };
         FeeRate.prototype.changeFeeRateFileFromCurrent = function (newFeeRateFile,callback){
-            var me=this;
-            var projectID = projectInfoObj.projectInfo.ID;
-            var data={
+            let me=this;
+            let projectID = projectInfoObj.projectInfo.ID;
+            let data={
                 "projectID": projectID,
                 "newFeeRateFile":newFeeRateFile
             };
@@ -608,9 +608,9 @@ var FeeRate = {
         };
 
         FeeRate.prototype.changeFeeRateFileFromOthers=function (feeRateFileID,name,callback) {
-            var me = this;
-            var projectID = projectInfoObj.projectInfo.ID;
-            var data={
+            let me = this;
+            let projectID = projectInfoObj.projectInfo.ID;
+            let data={
                 "projectID": projectID,
                 "feeRateFileID":feeRateFileID,
                 "name":name,

+ 295 - 149
web/building_saas/main/js/views/block_lib.js

@@ -2,185 +2,331 @@
  * Created by CSL on 2018-09-19.
  */
 var blockLibObj = {
-    datas: [],
     mainSpread: null,
     mainSheet: null,
+    mainTree: null,
+    mainTreeController: null,
     mainSetting: {
-        header:[
-            {headerName:"名称",headerWidth:400,dataCode:"name", dataType: "String"}
-        ],
-        view:{
-            comboBox:[],
-            lockColumns:[],
-            colHeaderHeight: CP_Col_Width.colHeader,
-            rowHeaderWidth: CP_Col_Width.rowHeader
-        }
+        "emptyRowHeader": true,
+        "rowHeaderWidth": 15,
+        "emptyRows":0,
+        "headRows":1,
+        "headRowHeight":[30],
+        "defaultRowHeight": 21,
+        "treeCol": 0,
+        "cols":[{
+            "width":400,
+            "readOnly": false,
+            "head":{
+                "titleNames":["名称"],
+                "spanCols":[1],
+                "spanRows":[1],
+                "vAlign":[1],
+                "hAlign":[1],
+                "font":["Arial"]
+            },
+            "data":{
+                "field":"name",
+                "vAlign":1,
+                "hAlign":0,
+                "font":"Arial"
+            }
+        }]
     },
-    buildSheet: function (){
+    mainDatas: [],
+    buildSheet: function () {
+        $.bootstrapLoading.start();
         let me = this;
-        me.datas = [];
+        me.mainDatas = [
+            {ID: 1, ParentID: -1, NextSiblingID: 8, name: '我的块模板库1', type: 0},
+            {ID: 2, ParentID: 1, NextSiblingID: 3, name: '分类1', type: 1},
+            {ID: 3, ParentID: 1, NextSiblingID: -1, name: '分类2', type: 1},
+            {ID: 4, ParentID: 2, NextSiblingID: 5, name: '子类A', type: 1},
+            {ID: 5, ParentID: 2, NextSiblingID: -1, name: '子类B', type: 1},
+            {ID: 6, ParentID: 4, NextSiblingID: 7, name: '块1', type: 2},
+            {ID: 7, ParentID: 4, NextSiblingID: -1, name: '块2', type: 2},
+            {ID: 8, ParentID: -1, NextSiblingID: -1, name: '我的块模板库2', type: 0}
+        ];
+
         if (me.mainSpread) {
             me.mainSpread.destroy();
             me.mainSpread = null;
         };
-
-        me.mainSpread = sheetCommonObj.buildSheet($('#div_block_tree')[0], me.mainSetting, me.datas.length);
-        sheetCommonObj.spreadDefaultStyle(me.mainSpread);
+        me.mainSpread = SheetDataHelper.createNewSpread($('#div_block_tree')[0]);
         me.mainSheet = me.mainSpread.getSheet(0);
-        // sheetCommonObj.showData(me.mainSheet, me.mainSetting, me.datas);
-    },
-    showData: function () {
-        let me = this;
-        let sheet =me.mainSheet;
-        let cols = me.mainSetting.header;
-        let datas = me.datas;
-        let fuc = function () {
-            sheet.setRowCount(datas.length);
-            me.initTree(true);
-            // sheet.setFormatter(-1, 1, '@');
-            for(let col = 0, cLen = cols.length; col < cLen; col++){
-                // sheet.getRange(-1, col, -1, 1).hAlign(GC.Spread.Sheets.HorizontalAlign[cols[col]['hAlign']]);
-                // sheet.getRange(-1, col, -1, 1).vAlign(GC.Spread.Sheets.VerticalAlign[cols[col]['vAlign']]);
-                for(let row = 0, rLen = datas.length; row < rLen; row++){
-                    sheet.setValue(row, col, datas[row][cols[col]['dataCode']]);
-                }
-            }
+        me.mainSheet.name('blockLibSheet');
+        sheetCommonObj.spreadDefaultStyle(me.mainSpread);
+        // me.mainSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick, this.onCellDoubleClick);
+
+        var showblockTree = function (datas) {
+            me.mainTree = idTree.createNew({id: 'ID', pid: 'ParentID', nid: 'NextSiblingID', rootId: -1, autoUpdate: false});
+            me.mainTreeController = TREE_SHEET_CONTROLLER.createNew(me.mainTree, me.mainSheet, me.mainSetting);
+            me.mainTree.loadDatas(datas);
+            me.mainTreeController.showTreeData();
+            me.mainSheet.getRange(-1, 0, -1, 1).cellType(me.getTreeCell(me.mainTree));
+/*            me.mainTreeController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, function (node) {
+                rationLibObj.loadSectionRations(node && node.children.length === 0 ? node.getID() : null);
+            });
+            if (me.mainTree.firstNode() && me.mainTree.firstNode().length === 0) {
+                rationLibObj.loadSectionRations(me.mainTree.firstNode().getID());
+            } else {
+                rationLibObj.loadSectionRations();
+            };*/
         };
-        sheet.suspendPaint();
-        sheet.suspendEvent();
-        fuc();
-        sheet.resumePaint();
-        sheet.resumeEvent();
+
+/*        CommonAjax.post('/complementaryRation/api/getRationTree', {userId: userID, rationRepId: rationLibID}, function (datas) {
+            showblockTree(datas);
+            $.bootstrapLoading.end();
+        }, function () {
+            showblockTree([]);
+            $.bootstrapLoading.end();
+        });*/
+
+        showblockTree(me.mainDatas);
+        $.bootstrapLoading.end();
     },
-    initTree: function (collapse) {
+    getTreeCell: function (tree) {
         let me = this;
-        me.mainSheet.getRange(-1, 0, -1, 1).cellType(me.getTreeNodeCellType(me.datas));
-        for(let i =0, len = me.datas.length; i < len; i++){
-            if(me.datas[i].hasOwnProperty('items')){
-                let collapsed = false;
-                if(collapse){
-                    me.datas[i].collapsed = false;
-                    collapsed = true;
-                }else {
-                    collapsed = me.datas[i].collapsed == undefined ? true : me.datas[i].collapsed;
+        let indent = 20, levelIndent = -5, halfBoxLength = 5, halfExpandLength = 3, imgWidth = 14, imgHeight = 14;
+        let TreeCell = function () {};
+        TreeCell.prototype = new GC.Spread.Sheets.CellTypes.Text();
+        TreeCell.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
+            if (style.backColor) {
+                ctx.save();
+                ctx.fillStyle = style.backColor;
+                ctx.fillRect(x, y, w, h);
+                ctx.restore();
+            } else {
+                ctx.clearRect(x, y, w, h);
+            };
+
+            let drawLine = function (canvas, x1, y1, x2, y2, color) {
+                ctx.save();
+                ctx.translate(0.5, 0.5);
+                ctx.beginPath();
+                ctx.moveTo(x1, y1);
+                ctx.lineTo(x2, y2);
+                ctx.strokeStyle = color;
+                ctx.stroke();
+                ctx.restore();
+            };
+            let drawExpandBox = function (ctx, x, y, w, h, centerX, centerY, expanded) {
+                let rect = {}, h1, h2, offset = 1;
+                rect.top = centerY - halfBoxLength;
+                rect.bottom = centerY + halfBoxLength;
+                rect.left = centerX - halfBoxLength;
+                rect.right = centerX + halfBoxLength;
+
+                if (rect.left < x + w) {
+                    rect.right = Math.min(rect.right, x + w);
+
+                    ctx.save();
+                    ctx.translate(0.5, 0.5);
+                    ctx.strokeStyle = 'black';
+                    ctx.beginPath();
+                    ctx.moveTo(rect.left, rect.top);
+                    ctx.lineTo(rect.left, rect.bottom);
+                    ctx.lineTo(rect.right, rect.bottom);
+                    ctx.lineTo(rect.right, rect.top);
+                    ctx.lineTo(rect.left, rect.top);
+                    ctx.stroke();
+                    ctx.fillStyle = 'white';
+                    ctx.fill();
+                    ctx.restore();
+
+                    // Draw Horizontal Line
+                    h1 = centerX - halfExpandLength;
+                    h2 = Math.min(centerX + halfExpandLength, x + w);
+                    if (h2 > h1) {
+                        drawLine(ctx, h1, centerY, h2, centerY, 'black');
+                    }
+                    // Draw Vertical Line
+                    if (!expanded && (centerX < x + w)) {
+                        drawLine(ctx, centerX, centerY - halfExpandLength, centerX, centerY + halfExpandLength, 'black');
+                    }
                 }
-            }
-        }
-    },
-    getTreeNodeCellType: function (data) {
-        var ns = GC.Spread.Sheets;
-        var rectW = 10;
-        var rectH = 10;
-        var margin = 3;
-        function TreeNodeCellType() {
-        }
 
-        function drowRect(ctx,x,y,w,h) {///
-            ctx.save();
-            ctx.strokeStyle = "gray";
-            ctx.translate(0.5,0.5);
-            ctx.beginPath();
-            var rectX = x+margin;
-            var rectY =  y+ Math.round(h/2)-rectH/2;
-            ctx.moveTo(rectX, rectY);
-            ctx.lineTo(rectX, rectY+rectH);
-            ctx.lineTo(rectX+rectW, rectY+rectH);
-            ctx.lineTo(rectX+rectW, rectY);
-            ctx.lineTo(rectX, rectY);
-            ctx.moveTo(rectX+rectW, y+Math.round(h/2));
-            ctx.lineTo(rectX+rectW+5, y+Math.round(h/2));
-            ctx.stroke();
-            ctx.restore();
-        }
+            };
 
-        function drowSymbol(ctx,x,y,w,h,collapsed) {
-            ctx.save();
-            ctx.strokeStyle = "#000000";
-            ctx.translate(0.5, 0.5);
-            ctx.beginPath();
-            ctx.moveTo(x+margin+2, y+Math.round(h/2));
-            ctx.lineTo(x+margin+8, y+Math.round(h/2));
-            var rectY =  y+ Math.round(h/2)-rectH/2;
-            if(collapsed){
-                ctx.moveTo(x+margin+rectW/2,rectY+2);
-                ctx.lineTo(x+margin+rectW/2,rectY+2+6);
+            let node = tree.items[options.row];
+            if (!node) return;
+            let showTreeLine = true;
+            let centerX = Math.floor(x) + node.depth() * indent + node.depth() * levelIndent + indent / 2;
+            let x1 = centerX + indent / 2;
+            let centerY = Math.floor((y + (y + h)) / 2);
+            let y1;
+
+            // Draw Horizontal Line、Image、sibling Vertical Line
+            if (centerX < x + w) {
+                // Draw Horizontal Line
+                drawLine(ctx, centerX, centerY, Math.min(x1, x + w), centerY, 'gray');
+
+                // Draw Image
+                let imgId;
+                if (node.data.type === 0) imgId = 'blockLib_pic'
+                else if (node.data.type === 1) imgId = 'folder_pic'
+                else if (node.data.type === 2) {
+                    imgId = 'block_pic';
+                };
+                let img = document.getElementById(imgId);
+                ctx.drawImage(img, centerX+indent/2+3, centerY - 7, imgWidth, imgHeight);
+
+                // Draw Vertical Line
+                y1 = node.isLast() ? centerY : y + h;
+                if (node.isFirst() && !node.parent/*.parent*/) {
+                    drawLine(ctx, centerX, centerY, centerX, y1, 'gray');
+                } else {
+                    drawLine(ctx, centerX, y, centerX, y1, 'gray');
+                }
             }
-            ctx.stroke();
-            ctx.restore();
-        }
 
-        function drowSubItem(ctx,x,y,w,h,offset,nextItem) {
-            offset+=6;
-            ctx.save();
-            ctx.strokeStyle = "gray";
-            ctx.translate(0.5, 0.5);
-            ctx.beginPath();
-            ctx.moveTo(x+offset, y);
-            ctx.lineTo(x+offset, y+Math.round(h/2));
-            offset+=9;
-            ctx.lineTo(x+offset, y+Math.round(h/2));
-            if(nextItem&&!nextItem.hasOwnProperty('items')){
-                ctx.moveTo(x+offset-9, y+Math.round(h/2));
-                ctx.lineTo(x+offset-9, y+h);
+            // Draw Expand Box
+            if (node.children.length > 0) {
+                drawExpandBox(ctx, x, y, w, h, centerX, centerY, node.expanded);
             }
-            ctx.stroke();
-            ctx.restore();
-            return offset;
-        }
 
-        TreeNodeCellType.prototype = new ns.CellTypes.Text();
-        TreeNodeCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
-            if(value!=null){
-                var offset = margin+rectW+6;
-                var recode = data[options.row];
-                if(recode&&recode.hasOwnProperty('items')){
-                    drowRect(ctx,x,y,w,h);
-                    var collapsed = recode.collapsed==undefined?true:recode.collapsed;//options.sheet.getTag(options.row,options.col);
-                    drowSymbol(ctx,x,y,w,h,collapsed);
-                }else if(recode&&!recode.hasOwnProperty('items')){
-                    offset= drowSubItem(ctx,x,y,w,h,offset,data[options.row+1]);
-                    offset+=1;
+            // Draw Parent Line
+            var curNode = node.parent, parentCenterX = centerX - indent - levelIndent;
+            while (curNode) {
+                if (!curNode.isLast()) {
+                    if (parentCenterX < x + w) {
+                        drawLine(ctx, parentCenterX, y, parentCenterX, y + h, 'gray');
+                    }
                 }
-                arguments[2] = x + offset;
-                arguments[4] = w - offset;
-                GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
+                curNode = curNode.parent;
+                parentCenterX -= (indent + levelIndent);
+            }
 
+            // Draw Text
+            x = x + (node.depth() + 1) * indent +  node.depth() * levelIndent + imgWidth + 3;
+            w = w - (node.depth() + 1) * indent - node.depth() * levelIndent - imgWidth - 3;
+            GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
+        };
+        TreeCell.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) {
+            let info = {x: x, y: y, row: context.row, col: context.col, cellStyle: cellStyle, cellRect: cellRect, sheetArea: context.sheetArea};
+            let node = tree.items[info.row];
+            let offset = -1;
+            let centerX = info.cellRect.x + offset + node.depth() * indent + node.depth() * levelIndent + indent / 2;
+            let text = context.sheet.getText(info.row, info.col);
+            let value = context.sheet.getValue(info.row, info.col);
+            let acStyle = context.sheet.getActualStyle(info.row, info.col),
+                zoom = context.sheet.zoom();
+            let textLength = this.getAutoFitWidth(value, text, acStyle, zoom, {sheet: context.sheet, row: info.row, col: info.col, sheetArea: GC.Spread.Sheets.SheetArea.viewport});
+            if(info.x > centerX + halfBoxLength && info.x < centerX + halfBoxLength + imgWidth + indent/2+3 + textLength){
+                info.isReservedLocation = true;
             }
+            return info;
         };
-        TreeNodeCellType.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) {
-            return {
-                x: x,
-                y: y,
-                row: context.row,
-                col: context.col,
-                cellStyle: cellStyle,
-                cellRect: cellRect,
-                sheetArea: context.sheetArea
-            };
-        }
-        TreeNodeCellType.prototype.processMouseDown = function (hitinfo) {
-            var recode = data[hitinfo.row];
-            if(recode&&recode.hasOwnProperty('items')){
-                var hoffset= hitinfo.cellRect.x+3;
-                if (hitinfo.x > hoffset && hitinfo.x < hoffset + 10){
-                    var collapsed = recode.collapsed==undefined?true:recode.collapsed;
-                    collapsed = !collapsed
-                    recode.collapsed=collapsed;
-                    //hitinfo.sheet.setTag(hitinfo.row,hitinfo.col,collapsed);
-                    hitinfo.sheet.getRange(hitinfo.row+1, -1, recode.items.length, -1).visible(!collapsed);
+        TreeCell.prototype.processMouseDown = function (hitinfo) {
+            let offset = -1;
+            let node = tree.items[hitinfo.row];
+            let centerX = hitinfo.cellRect.x + offset + node.depth() * indent + node.depth() * levelIndent + indent / 2;
+            let centerY = (hitinfo.cellRect.y + offset + (hitinfo.cellRect.y + offset + hitinfo.cellRect.height)) / 2;
+            let text = hitinfo.sheet.getText(hitinfo.row, hitinfo.col);
+            let value = hitinfo.sheet.getValue(hitinfo.row, hitinfo.col);
+            let acStyle = hitinfo.sheet.getActualStyle(hitinfo.row, hitinfo.col),
+                zoom = hitinfo.sheet.zoom();
+            let textLength = this.getAutoFitWidth(value, text, acStyle, zoom, {sheet: hitinfo.sheet, row: hitinfo.row, col: hitinfo.col, sheetArea: GC.Spread.Sheets.SheetArea.viewport});
+            //(图标+名字)区域
+            function withingClickArea(){
+                return hitinfo.x > centerX + halfBoxLength && hitinfo.x < centerX + halfBoxLength + imgWidth + indent/2+3 + textLength;
+            }
+
+            if (hitinfo.x > centerX - halfBoxLength && hitinfo.x < centerX + halfBoxLength && hitinfo.y > centerY - halfBoxLength && hitinfo.y < centerY + halfBoxLength) {
+                node.setExpanded(!node.expanded);
+                TREE_SHEET_HELPER.massOperationSheet(hitinfo.sheet, function () {
+                    let iCount = node.posterityCount(), i, child;
+                    for (i = 0; i < iCount; i++) {
+                        child = tree.items[hitinfo.row + i + 1];
+                        hitinfo.sheet.setRowVisible(hitinfo.row + i + 1, child.visible, hitinfo.sheetArea);
+                    }
                     hitinfo.sheet.invalidateLayout();
-                    hitinfo.sheet.repaint();
-                }
+                });
+                hitinfo.sheet.repaint();
             }
         };
-        return new TreeNodeCellType();
+        TreeCell.prototype.processMouseMove = function (hitInfo) {
+            let sheet = hitInfo.sheet;
+            let div = sheet.getParent().getHost();
+            let canvasId = div.id + "vp_vp";
+/*            let canvas = $(`#${canvasId}`)[0];
+            //改变鼠标图案
+            if (sheet && hitInfo.isReservedLocation) {
+                canvas.style.cursor='pointer';
+                return true;
+            }else{
+                canvas.style.cursor='default';
+            }*/
+            return false;
+        };
+        TreeCell.prototype.processMouseEnter = function (hitinfo) {
+            let text = hitinfo.sheet.getText(hitinfo.row, hitinfo.col);
+            let value = hitinfo.sheet.getValue(hitinfo.row, hitinfo.col);
+            let tag = hitinfo.sheet.getTag(hitinfo.row, hitinfo.col);
+            let acStyle = hitinfo.sheet.getActualStyle(hitinfo.row, hitinfo.col),
+                zoom = hitinfo.sheet.zoom();
+            let node = me.mainTree.items[hitinfo.row];
+            let nodeIndent = node ? (node.depth() + 1) * indent +  node.depth() * levelIndent + imgWidth + 3 : 0;
+            let textLength = this.getAutoFitWidth(value, text, acStyle, zoom, {sheet: hitinfo.sheet, row: hitinfo.row, col: hitinfo.col, sheetArea: GC.Spread.Sheets.SheetArea.viewport});
+            let cellWidth = hitinfo.sheet.getCell(-1, hitinfo.col).width();
+            if(textLength > cellWidth - nodeIndent){
+                TREE_SHEET_HELPER.showTipsDiv(text,{pos: {}},hitinfo);
+            }
+        };
+        TreeCell.prototype.processMouseLeave = function (hitinfo) {
+            let me = this;
+            TREE_SHEET_HELPER.tipDiv = 'hide';
+            if (TREE_SHEET_HELPER._toolTipElement) {
+                $(TREE_SHEET_HELPER._toolTipElement).hide();
+                TREE_SHEET_HELPER._toolTipElement = null;
+            };
+            TREE_SHEET_HELPER.tipDivCheck();//延时检查:当tips正在show的时候,就调用了hide方法,会导致tips一直存在,所以设置一个超时处理
+        };
+        return new TreeCell();
+    },
+    insert: function (insertType){    // 1 后兄弟; 2 孩子。
+        let tree = blockLibObj.mainTree;
+        let select = tree.selected;
+        if (!select) select = tree.items[0];
+        let pID = (insertType == 1) ? select.getParentID() : select.getID();
+        let nID = (insertType == 1) ? select.getNextSiblingID() : -1;
+        let newNode = tree.insert(pID, nID);
+        newNode.data.name = '新建';
+        if (!newNode.parent)
+            newNode.data.type = 0
+        else
+            newNode.data.type = 1;
+        tree.selected = newNode;
+
+        let sheet = blockLibObj.mainSheet;
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+
+        let idx = tree.items.indexOf(newNode);
+        sheet.addRows(idx, 1);
+        sheet.getRange(idx, 0, 1, 1).locked(false);
+        sheet.setValue(idx, 0, newNode.data.name);
+        sheet.setSelection(idx, 0, 1, 1);
+
+        sheet.resumeEvent();
+        sheet.resumePaint();
     }
 };
 
 $(document).ready(function(){
-/*    if (!blockLibObj.mainSpread){
-        blockLibObj.buildSheet();
-        blockLibObj.showData();
-    }*/
+    $('#blockLibTab').on('click', function (){
+        if ($("#kmbk").is(":visible")){
+            if (!blockLibObj.mainSpread){
+                blockLibObj.buildSheet();
+            };
+        }
+    });
+    $('#btn_block_newFolder').on('click', function (){
+        blockLibObj.insert(1);
+    });
+
+    $('#btn_block_newSubFolder').on('click', function (){
+        blockLibObj.insert(2);
+    });
 
 });

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

@@ -130,6 +130,7 @@ let calcBaseView = {
                 me.inputExpr.val(insertStr);
             }
         }
+        me.workBook.focus(false);
         me.inputExpr.focus();
     },
     isDef: function (v) {

+ 7 - 6
web/building_saas/main/js/views/character_content_view.js

@@ -28,7 +28,7 @@ let contentOprObj = {
     },
     setRateWith: function (workBookWidth) {
         let me = this;
-        let otherWidthRate = me.setting.header[1]['headerWidth'] / workBookWidth;
+        let otherWidthRate = scMathUtil.roundTo(me.setting.header[1]['headerWidth'] / workBookWidth, -3);
         let contentWidthRate = 1 - otherWidthRate;
         me.setting.header[0]['rateWidth'] = contentWidthRate;
     },
@@ -1475,13 +1475,14 @@ let pageCCOprObj = {
     },
     resizeWidth: function () {
         let workBookWidth = pageCCOprObj.getWorkBookWidth();
-        contentOprObj.setRateWith(workBookWidth);
-        sheetCommonObj.setColumnWidthByRate(workBookWidth, contentOprObj.workBook, contentOprObj.setting.header);
-        characterOprObj.setRateWith(workBookWidth);
-        sheetCommonObj.setColumnWidthByRate(workBookWidth, characterOprObj.workBook, characterOprObj.setting.header);
+        contentOprObj.setRateWith($('#jobDiv').width() - 40);
+        sheetCommonObj.setColumnWidthByRate($('#jobDiv').width() - 40, contentOprObj.workBook, contentOprObj.setting.header);
+        characterOprObj.setRateWith($('#itemDiv').width() - 40);
+        sheetCommonObj.setColumnWidthByRate($('#itemDiv').width() - 40, characterOprObj.workBook, characterOprObj.setting.header);
     }
 }
 
+/*
 $(window).resize(function () {
     pageCCOprObj.resizeWidth();
-});
+});*/

+ 163 - 71
web/building_saas/main/js/views/fee_rate_view.js

@@ -139,8 +139,10 @@ var feeRateObject={
         feeRateObject.feeRateSheet.bind(GC.Spread.Sheets.Events.CellDoubleClick,feeRateObject.onCellDoubleClick);
     },
     showFeeRateTree:function (sheet,setting,data) {
+
         let ch = GC.Spread.Sheets.SheetArea.viewport;
-        let parentMap=_.indexBy(data, 'ParentID');
+        let parentMap=_.groupBy(data, 'ParentID');
+        let visibleMap = {};
         sheet.suspendPaint();
         sheet.suspendEvent();
         for (let col = 0; col < setting.header.length; col++) {
@@ -168,18 +170,13 @@ var feeRateObject={
                 }
                 sheet.setValue(row, col, val, ch);
                 if(col==0){
-                    sheet.getCell(row, 0).textIndent(feeRateObject.getFeeRateLevel(data[row],data));//设置层级,0 为第一层
+                    let treeType = feeRateObject.getTreeNodeCellType(data,row,parentMap);
+                    sheet.getCell(row, 0).cellType(treeType);
+                    visibleMap[data[row].ID] = treeType.collapsed;
+                    if(visibleMap[data[row].ParentID] ) sheet.getRange(row , -1, 1, -1).visible(false);//显示或隐藏
                 }
             }
         }
-        sheet.outlineColumn.options({columnIndex: 0, maxLevel: 10});//设置树结构显示的列,和最大层级
-        for(let i =0;i<data.length;i++){
-            if(parentMap[data[i].ID]){
-                sheet.rowOutlines.setCollapsed(i, true);
-            }
-        }
-        sheet.showRowOutline(false);
-        sheet.outlineColumn.refresh();
         sheet.resumeEvent();
         sheet.resumePaint();
     },
@@ -212,52 +209,63 @@ var feeRateObject={
         feeRateObject.onCellClick({type: 'CellClick'}, {row:rowIdx});
         
         function expandParent(ID,datas,sheet) {//递归展开父节点
-            let index = _.findIndex(datas,{'ID':ID});
-            sheet.rowOutlines.setCollapsed(index, false);
-            if(datas[index].ParentID){
-                expandParent(datas[index].ParentID,datas,sheet)
+             let cellType = setCollapsed(ID);
+             cellType.refreshChildrenVisible(sheet);
+            function setCollapsed(parentID){
+                let index = _.findIndex(datas,{'ID':parentID});
+                let type = sheet.getCellType(index,0);
+                type.collapsed = false;
+                if(datas[index].ParentID){
+                    setCollapsed(datas[index].ParentID)
+                }
+                return type
             }
+
         }
     },
-    getTreeNodeCellType:function () {//这个方法费率已暂时不用了
+    getTreeNodeCellType:function (datas,row,parentMap) {// 2018-09-26  不用spreadjs默认的树结构,自定义控件
         var ns = GC.Spread.Sheets;
+        let rectW = 10;
+        let rectH = 10;
+        let margin = 3;
         function TreeNodeCellType() {
+            this.collapsed = true; //默认是折叠的
+            this.rectInfo = {};
         }
         TreeNodeCellType.prototype = new ns.CellTypes.Text();
         TreeNodeCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
-            var level = options.sheet.rowOutlines.getLevel(options.row);
-            var nlevel = -1;
-            if (options.row < options.sheet.getRowCount() - 1) {
-                nlevel = options.sheet.rowOutlines.getLevel(options.row + 1);
-            }
-            var hoffset = (level + 2) * 12;
-            x += hoffset;
-            w -= hoffset;
-            GC.Spread.Sheets.CellTypes.Base.prototype.paint.apply(this, arguments);
-            if (options.row == options.sheet.getRowCount() - 1) return; //last row
-            if (nlevel > level) {
-                var collapsed = options.sheet.rowOutlines.isCollapsed(options.row + 1);
-                x--;
-                y += h / 2 - 3;
-                ctx.save();
-                ctx.fillStyle = "black";
-                ctx.beginPath();
-                if (collapsed) {
-                    ctx.moveTo(x - 5, y);
-                    ctx.lineTo(x, y + 3);
-                    ctx.lineTo(x - 5, y + 6);
-                } else {
-                    ctx.moveTo(x, y);
-                    ctx.lineTo(x, y + 5);
-                    ctx.lineTo(x - 5, y + 5);
+            let offset = 0;
+            let step = 7;
+            let level = getTreeLevel(datas[row],datas);//从0开始,取当前节点是第几级的
+            let tem = offset+margin+ rectW/2+step;//两条线之间的间隔
+            let t_offset = offset;
+            let temParentID = datas[row].ParentID;
+            for(let i = level;i>0;i--){//这里是画子节点前面的竖线,从第二级开始
+                let temParent = getParent(temParentID,datas);
+                if(temParent){//父节点有下一个兄弟节点才需要画
+                    if(hasNextBrother(parentMap,temParent)) sheetCommonObj.drawLine(ctx,x+t_offset+tem*i,y,x+t_offset+tem*i,y+h);
+                    temParentID = temParent.ParentID;
                 }
-                ctx.fill();
-                ctx.restore();
+                offset +=tem;
             }
-            else {
-                ctx.save();
-                ctx.restore();
+            offset+=step;
+            if(hasChildern(datas[row].ID,datas)){//如果是有子节点
+                //第一条不用画方框头上那条竖线其它都要
+                if(row !=0) sheetCommonObj.drawLine(ctx,x+offset+ rectW/2+margin,y,x+offset+ rectW/2+margin,y + Math.round(h / 2) - rectH / 2);
+                //画方框下面的那条竖线,如果没有下一个兄弟节点,则不用画
+               if(hasNextBrother(parentMap,datas[row])) sheetCommonObj.drawLine(ctx,x+offset+ rectW/2+margin,y + Math.round(h / 2) + rectH / 2,x+offset+ rectW/2+margin,y + h);
+                sheetCommonObj.drowRect(ctx, x+offset, y, w, h,rectW,rectH,margin);
+                sheetCommonObj.drowSymbol(ctx, x+offset, y, w, h,rectW,rectH,margin, this.collapsed);
+                this.rectInfo = {x:x+offset+margin,rectW:rectW}//计录一下可点击位置
+            }else {
+                let hasNext = datas[row+1]?datas[row+1].ParentID == datas[row].ParentID:false;
+                sheetCommonObj.drowSubItem(ctx, x, y, w, h, offset,hasNext,margin+ rectW/2);
             }
+            offset += step;
+            offset += rectW;
+            x = x + offset;//设置偏移
+            w = w - offset;
+            GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
         };
         // override getHitInfo to allow cell type get mouse messages
         TreeNodeCellType.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) {
@@ -272,16 +280,73 @@ var feeRateObject={
             };
         }
         TreeNodeCellType.prototype.processMouseDown = function (hitinfo) {
-            var level = hitinfo.sheet.rowOutlines.getLevel(hitinfo.row);
-            var hoffset = (level + 2) * 12 + hitinfo.cellRect.x;
-            if (level==-1&&hitinfo.x < hoffset && hitinfo.x > hoffset - 10) {
-                var collapsed = hitinfo.sheet.rowOutlines.isCollapsed(hitinfo.row + 1);
-                hitinfo.sheet.rowOutlines.setCollapsed(hitinfo.row, !collapsed);
+            if (!_.isEmpty(this.rectInfo)&&hitinfo.x < this.rectInfo.x+this.rectInfo.rectW && hitinfo.x > this.rectInfo.x) {
+                this.collapsed = !this.collapsed;
+                this.refreshChildrenVisible(hitinfo.sheet);
                 hitinfo.sheet.invalidateLayout();
                 hitinfo.sheet.repaint();
             }
         };
+        TreeNodeCellType.prototype.refreshChildrenVisible = function (sheet) {
+            sheet.suspendPaint();
+            sheet.suspendEvent();
+            refreshVisible(datas[row]);
+            sheet.resumeEvent();
+            sheet.resumePaint();
+            function refreshVisible(item){
+                if(parentMap[item.ID]){
+                    for(let sub of parentMap[item.ID]){
+                        refreshVisible(sub)
+                    }
+                }
+                let visible = getVisible(item);
+                let trow = datas.indexOf(item);
+                sheet.getRange(trow , -1, 1, -1).visible(visible);
+            }
+            
+            function getVisible(item) {
+                if(item.ParentID){
+                    let parent = getParent(item.ParentID,datas);
+                    if(!parent) return true;
+                    let p_row= datas.indexOf(parent);
+                    let visible = !sheet.getCellType(p_row,0).collapsed;
+                    if(visible == true){ //如果是显示的,则要再往父节点的父节点检查,只要有一个节点是隐藏的,则都是隐藏
+                        return getVisible(parent);
+                    }else {
+                        return visible
+                    }
+                }else {//如果parentID 为空则是最根节点
+                    return true;
+                }
+            }
+            
+            
+        };
         return new TreeNodeCellType()
+
+        function getTreeLevel(item,data) {
+            if(item.ParentID){
+                 let pitem =  _.find(data,{'ID':item.ParentID});
+                 return  getTreeLevel(pitem,data) + 1;
+             }else {
+                 return 0
+             }
+         }
+        function hasChildern(ID,data) {//返回是否有子项
+             let p = _.find(data,{'ParentID':ID});
+             if(p) return true;
+             return false
+         }
+        function getParent(ParentID,data) {
+             let p = _.find(data,{'ID':ParentID});
+             return p;
+         }
+        function hasNextBrother(parentMap,item){
+            let children =parentMap[item.ParentID];
+            if(children && children.indexOf(item) == children.length -1) return false;
+            return true
+        }
+
     },
     getFeeRateEditCellType:function () {
         var ns = GC.Spread.Sheets;
@@ -668,13 +733,13 @@ var feeRateObject={
     },
     checkFeeRateName:function (newVal) {
         if(!newVal||newVal==""){
-            $('#saveAsConfirm').attr("disabled","disabled");
+            //$('#saveAsConfirm').attr("disabled","disabled");
             $('#nameError').text("请输入文件名称。").show();
             return;
         }
         var callback=function (data) {
             if(data){
-                $('#saveAsConfirm').attr("disabled","disabled");
+               // $('#saveAsConfirm').attr("disabled","disabled");
                 $('#nameError').text("已存在同名费率文件。").show();
                 $('#valid_name').val('');
             }else {
@@ -687,25 +752,26 @@ var feeRateObject={
     },
     feeRateFileSaveAs:function (newName) {
         if(!newName||newName==""){
-            $('#saveAsConfirm').attr("disabled","disabled");
+           // $('#saveAsConfirm').attr("disabled","disabled");
             $('#nameError').text("请输入文件名称。").show();
             return;
         }
-        let valideName = $('#valid_name').val();
-        if(valideName==''||valideName!==newName){
-            let callback=function (data) {
-                if(data){
-                    $('#saveAsConfirm').attr("disabled","disabled");
-                    $('#nameError').text("已存在同名费率文件。").show();
-                    $('#valid_name').val('');
-                }else {
-                    feeRateObject.submitSaveAs(newName);
-                }
+        let callback=function (data) {
+            if(data){
+               // $('#saveAsConfirm').attr("disabled","disabled");
+                $('#nameError').text("已存在同名费率文件。").show();
+                $('#valid_name').val('');
+            }else {
+                feeRateObject.submitSaveAs(newName);
             }
-            projectObj.project.FeeRate.checkFeeRateName(newName,callback);
+        }
+        projectObj.project.FeeRate.checkFeeRateName(newName,callback);
+       /* let valideName = $('#valid_name').val();
+        if(valideName==''||valideName!==newName){
+
         }else {
             feeRateObject.submitSaveAs(newName);
-        }
+        }*/
     },
     submitSaveAs:function (newName) {
         let me = this;
@@ -786,14 +852,29 @@ var feeRateObject={
             alert("请选择一个费率文件!");
             return;
         }
-        var currentOption = _.find(this.changeInfo.currentProject.currentOptions,{name:name})
+        var callback=function (data) {
+            if(data){
+                //$('#renameConfirm').attr("disabled","disabled");
+                $('#renameError').text("本建设项目中已存在同名费率文件。").show();
+                $('#rename-lv').modal('show');
+                $("#newFeeRateID").val(feeRateFileID);
+                $("#newFeeRateName").val(name);
+            }else {
+                //$('#renameConfirm').removeAttr("disabled");
+                $('#renameError').hide();
+                feeRateObject.changeFeeRateFileConfirm(feeRateFileID,name);
+            }
+        };
+        projectObj.project.FeeRate.checkFeeRateName(name,callback);
+
+       /* var currentOption = _.find(this.changeInfo.currentProject.currentOptions,{name:name})
         if(currentOption){
             $("#rename-lv").modal({show:true});
             $("#newFeeRateID").val(feeRateFileID);
             $("#newFeeRateName").val(name);
         }else {
             this.changeFeeRateFileConfirm(feeRateFileID,name);
-        }
+        }*/
     },
     changeFeeRateFileConfirm:function(feeRateFileID,name){
         $.bootstrapLoading.start();
@@ -941,16 +1022,16 @@ $(function(){
     $('#newFeeRateName').change(function () {
         var newName = $(this).val();
         if(!newName||newName==""){
-            $('#renameConfirm').attr("disabled","disabled");
+            //$('#renameConfirm').attr("disabled","disabled");
             $('#renameError').text("请输入文件名称。").show();
             return;
         }
         var callback=function (data) {
             if(data){
-                $('#renameConfirm').attr("disabled","disabled");
+                //$('#renameConfirm').attr("disabled","disabled");
                 $('#renameError').text("本建设项目中已存在同名费率文件。").show();
             }else {
-                $('#renameConfirm').removeAttr("disabled");
+                //$('#renameConfirm').removeAttr("disabled");
                 $('#renameError').hide();
             }
         };
@@ -988,7 +1069,18 @@ $(function(){
     $('#renameConfirm').bind('click',function (){
         var feeRateFileID= $("#newFeeRateID").val();
         var name = $("#newFeeRateName").val();
-        feeRateObject.changeFeeRateFileConfirm(feeRateFileID,name);
+        var callback=function (data) {
+            if(data){
+                $('#renameError').text("已存在同名费率文件。").show();
+                $("#newFeeRateID").val(feeRateFileID);
+                $("#newFeeRateName").val(name);
+            }else {
+                $('#renameError').hide();
+                $('#rename-lv').modal('hide');
+                feeRateObject.changeFeeRateFileConfirm(feeRateFileID,name);
+            }
+        };
+        projectObj.project.FeeRate.checkFeeRateName(name,callback);
     })
 
 

+ 2 - 2
web/building_saas/main/js/views/glj_col.js

@@ -4,9 +4,9 @@
 let gljCol = {
     ration_glj_setting: {
         header: [
-            {headerName: "编码", headerWidth: 100, dataCode: "code", dataType: "String", formatter: "@"},
+            {headerName: "编码", headerWidth: 130, dataCode: "code", dataType: "String", formatter: "@"},
             {headerName: "名称", headerWidth: 240, dataCode: "name", dataType: "String",cellType:'tipsCell'},
-            {headerName: "规格型号", headerWidth: 190, dataCode: "specs", dataType: "String", hAlign: "left",cellType:'tipsCell'},
+            {headerName: "规格型号", headerWidth: 160, dataCode: "specs", dataType: "String", hAlign: "left",cellType:'tipsCell'},
             {headerName: "单位", headerWidth: 45, dataCode: "unit", dataType: "String", hAlign: "center"},
             {headerName: "市场价", headerWidth: 80, dataCode: "marketPrice", dataType: "Number", hAlign: "right"},//, decimalField: "glj.unitPrice"
             {headerName: "调整价", headerWidth: 80, dataCode: "adjustPrice", dataType: "Number", hAlign: "right"},//, decimalField: "glj.unitPrice"1

+ 7 - 55
web/building_saas/main/js/views/glj_view.js

@@ -1280,56 +1280,6 @@ var gljOprObj = {
         function TreeNodeCellType() {
             this.ctx = null;
         }
-        function drowRect(ctx, x, y, w, h) {
-            ctx.save();
-            ctx.strokeStyle = "gray";
-            ctx.translate(0.5, 0.5);
-            ctx.beginPath();
-            let rectX = x + margin;
-            let rectY = y + Math.round(h / 2) - rectH / 2;
-            ctx.moveTo(rectX, rectY);
-            ctx.lineTo(rectX, rectY + rectH);
-            ctx.lineTo(rectX + rectW, rectY + rectH);
-            ctx.lineTo(rectX + rectW, rectY);
-            ctx.lineTo(rectX, rectY);
-            ctx.moveTo(rectX + rectW, y + Math.round(h / 2));
-            ctx.lineTo(rectX + rectW + 5, y + Math.round(h / 2));
-            ctx.stroke();
-            ctx.restore();
-        }
-        function drowSymbol(ctx, x, y, w, h, collapsed) {
-            ctx.save();
-            ctx.strokeStyle = "#000000";
-            ctx.translate(0.5, 0.5);
-            ctx.beginPath();
-            ctx.moveTo(x + margin + 2, y + Math.round(h / 2));
-            ctx.lineTo(x + margin + 8, y + Math.round(h / 2));
-            let rectY = y + Math.round(h / 2) - rectH / 2;
-            if (collapsed) {
-                ctx.moveTo(x + margin + rectW / 2, rectY + 2);
-                ctx.lineTo(x + margin + rectW / 2, rectY + 2 + 6);
-            }
-            ctx.stroke();
-            ctx.restore();
-        }
-        function drowSubItem(ctx, x, y, w, h, offset, nextItem) {
-            offset += 6;
-            ctx.save();
-            ctx.strokeStyle = "gray";
-            ctx.translate(0.5, 0.5);
-            ctx.beginPath();
-            ctx.moveTo(x + offset, y);
-            ctx.lineTo(x + offset, y + Math.round(h / 2));
-            offset += 9;
-            ctx.lineTo(x + offset, y + Math.round(h / 2));
-            if (nextItem && nextItem.isMixRatio) {
-                ctx.moveTo(x + offset - 9, y + Math.round(h / 2));
-                ctx.lineTo(x + offset - 9, y + h);
-            }
-            ctx.stroke();
-            ctx.restore();
-            return offset;
-        }
         TreeNodeCellType.prototype =  comboboxOptions?sheetCommonObj.getDynamicCombo():new ns.CellTypes.Text();
         TreeNodeCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
             this.ctx= ctx;
@@ -1345,11 +1295,12 @@ var gljOprObj = {
                 let offset = margin + rectW + 6;
                 let recode = data[options.row];
                 if (recode && recode.hasOwnProperty('subList')) {
-                    drowRect(ctx, x, y, w, h);
+                    sheetCommonObj.drowRect(ctx, x, y, w, h,rectW,rectH,margin);
                     let collapsed = recode.collapsed == undefined ? true : recode.collapsed;//options.sheet.getTag(options.row,options.col);
-                    drowSymbol(ctx, x, y, w, h, collapsed);
+                    sheetCommonObj.drowSymbol(ctx, x, y, w, h,rectW,rectH,margin, collapsed);
                 } else if (recode && recode.isMixRatio) {
-                    offset = drowSubItem(ctx, x, y, w, h, offset, data[options.row + 1]);
+                    let hasNext = data[options.row + 1] && data[options.row + 1].isMixRatio;
+                    offset = sheetCommonObj.drowSubItem(ctx, x, y, w, h, offset,hasNext);
                     offset += 1;
                 }
                 arguments[2] = x + offset;
@@ -1376,6 +1327,9 @@ var gljOprObj = {
         };
         TreeNodeCellType.prototype.processMouseDown = function (hitinfo) {
             let recode = data[hitinfo.row];
+            if(hitinfo.x < hitinfo.cellRect.x+hitinfo.cellRect.width -15){
+                hitinfo.sheet.setTag(hitinfo.row,hitinfo.col,"locked")//通过这个来控制除了点击下拉框的三角形,点击其它地方不充许进入编辑状态,不然不好控制下拉框超出页面后调整滚动条
+            }
             if (recode && recode.hasOwnProperty('subList')) {
                 let hoffset = hitinfo.cellRect.x + 3;
                 if (hitinfo.x > hoffset && hitinfo.x < hoffset + 10) {
@@ -1393,8 +1347,6 @@ var gljOprObj = {
                 hitinfo.sheet.setTag(hitinfo.row,hitinfo.col,"");
                 sheetCommonObj.scrollSheetForOption(hitinfo.sheet,this.ctx,hitinfo.cellRect,hitinfo.row,comboboxOptions);//下拉框超出显示后自动调整滚动条
                 GC.Spread.Sheets.CellTypes.ComboBox.prototype.processMouseDown.apply(this, arguments);
-            }else {
-                hitinfo.sheet.setTag(hitinfo.row,hitinfo.col,"locked")//通过这个来控制除了点击下拉框的三角形,点击其它地方不充许进入编辑状态,不然不好控制下拉框超出页面后调整滚动条
             }
         };
         let cellType = new TreeNodeCellType();

+ 26 - 19
web/building_saas/main/js/views/main_tree_col.js

@@ -100,7 +100,18 @@ let MainTreeCol = {
             return node.data.subType != 201 && node.data.subType != 4 && node.data.subType != 5
         },
         commonUnitFee: function (node) {
-            return !(calcTools.isLeafBill(node) && !calcTools.isBill_DXFY(node) && !calcTools.isCalcBaseBill(node) && !calcTools.isInheritFrom(node, [fixedFlag.SUB_ENGINERRING, fixedFlag.MEASURE]));
+            // 09-29 zhang
+            let Bills =projectObj.project.Bills;
+            // 当前属于分部分项、施工技术措施项目,综合单价只读。
+            if(Bills.isFBFX(node)||Bills.isTechMeasure(node)){
+                return true;
+            }
+            // 不属于分部分项、施工技术措施项目的部分,如果不是叶子清单,或有基数计算/定额/量价/人材机 只读
+            if(!calcTools.isLeafBill(node)||calcTools.isCalcBaseBill(node)||node.children.length > 0){
+                return true;
+            }
+            return false;
+            //return !(calcTools.isLeafBill(node) && !calcTools.isBill_DXFY(node) && !calcTools.isCalcBaseBill(node) && !calcTools.isInheritFrom(node, [fixedFlag.SUB_ENGINERRING, fixedFlag.MEASURE]));
         },
         //根据节点、父节点类型判断是否可用计算基数
         calcBaseType: function (node) {
@@ -238,14 +249,17 @@ let MainTreeCol = {
         }
     },
     cellType: {
-        unit: function () {
-            //let combo = new GC.Spread.Sheets.CellTypes.ComboBox();
-            let dynamicCombo = sheetCommonObj.getDynamicCombo(true);
+        unit: function (node,setting) {
+            let tips = "";
+            //在这里做要不要显示的判断
+             if(node.sourceType == ModuleNames.bills &&projectObj.ifItemCharHiden(setting)){//清单、并且项目特征列隐藏的时候悬浮提示
+                tips = node.data.itemCharacterText?node.data.itemCharacterText:'';
+             }
+                    let dynamicCombo = sheetCommonObj.getTipsCombo(true,tips,setting);//sheetCommonObj.getDynamicCombo(true);
             dynamicCombo.itemHeight(10).items(['m', 'm2', 'm3', 'km', 't', 'kg', '台班', '工日', '昼夜', '元', '项', '处', '个', '件',
                 '根', '组', '系统', '台', '套', '株', '丛', '缸', '支', '只', '块', '座', '对', '份', '樘', '攒', '榀']).editable(true);
             return dynamicCombo;
         },
-
         units: function () {
             this.unit;
         },
@@ -481,10 +495,13 @@ let colSettingObj = {
                 switchTznrHtml(false);
             }
         }
-        projectObj.project.pushNow('editColSetting', projectObj.project.projSetting.moduleName, {
-            projectID: projectObj.project.ID(),
-            main_tree_col: projectObj.project.projSetting.main_tree_col
-        });
+        //别人分享过来的项目,打开时,“显示特征”按钮应有效,不影响数据的修改
+        if(!projectReadOnly){
+            projectObj.project.pushNow('editColSetting', projectObj.project.projSetting.moduleName, {
+                projectID: projectObj.project.ID(),
+                main_tree_col: projectObj.project.projSetting.main_tree_col
+            });
+        }
     },
     setVisible: function (field, visible) {
         let mainTreeCols = projectObj.project.projSetting.main_tree_col.cols;
@@ -530,26 +547,16 @@ let colSettingObj = {
 };
 
 function switchTznrHtml(show) {
-    if(projectReadOnly){
-        return;
-    }
     if(show){
-        /*$('#switchTznr').attr('data-original-title', '显示特征');
-        $('#switchTznr').find('i').removeClass('fa-eye-slash');
-        $('#switchTznr').find('i').addClass('fa-eye');*/
         $('#switchTznr').html('<i class="fa fa-eye" aria-hidden="true"></i> 显示特征');
     }
     else {
-       /* $('#switchTznr').attr('data-original-title', '隐藏特征');
-        $('#switchTznr').find('i').removeClass('fa-eye');
-        $('#switchTznr').find('i').addClass('fa-eye-slash');*/
         $('#switchTznr').html('<i class="fa fa-eye-slash" aria-hidden="true"></i> 隐藏特征');
     }
 }
 
 $('#switchTznr').click(function () {
     let me = colSettingObj;
-    //let cur = $(this).attr('data-original-title');
     let cur = $(this).text();
     if(cur.includes('显示特征')){
         switchTznrHtml(false);

+ 8 - 5
web/building_saas/main/js/views/project_glj_view.js

@@ -1202,8 +1202,8 @@ $(function () {
             changeUnitPriceId = $("#self-file").val();
             if(!changeUnitPriceId){
                 alert('单价文件不可为空');
-                return;
             }
+            submitFileChange(changeUnitPriceId,type);
         } else {
             // 从其他项目中复制
             changeUnitPriceId = $("#other-file").val();
@@ -1214,14 +1214,17 @@ $(function () {
                     $("#newUnitFileID").val(changeUnitPriceId);
                     $("#newUnitFileName").val(newName);
                 }else {
-                    let data = {project_id: scUrlUtil.GetQueryString('project'), change_id: changeUnitPriceId, type: type};
-                    projectObj.project.projectGLJ.changeFile(data,function () {
-                        projectGljObject.changeFileCallback();
-                    })
+                    submitFileChange(changeUnitPriceId,type);
                 }
             });
         }
 
+        function submitFileChange(changeUnitPriceId,type)  {
+            let data = {project_id: scUrlUtil.GetQueryString('project'), change_id: changeUnitPriceId, type: type};
+            projectObj.project.projectGLJ.changeFile(data,function () {
+                projectGljObject.changeFileCallback();
+            })
+        }
     });
     // 单价文件选项切换
     $("input[name='change-type']").change(function () {

+ 49 - 22
web/building_saas/main/js/views/project_view.js

@@ -197,7 +197,7 @@ var projectObj = {
         return value;
     },
     checkSpreadEditingText: function (editingText, colSetting) {
-        if (colSetting.data.field === 'contain') {//colSetting.data.field === 'quantity'
+        if (colSetting.data.field === 'contain'||colSetting.data.field === 'feesIndex.common.unitFee'|| colSetting.data.field === 'feesIndex.common.totalFee') {//colSetting.data.field === 'quantity'
             return this.checkFormulaValidField(editingText, colSetting);
         }
         else if (colSetting.data.field === 'programID') {
@@ -448,17 +448,34 @@ var projectObj = {
             else if(fieldName ==='contain'){//编辑含量
                 project.Ration.updateContain(value,node);
             }
-            else if (fieldName === 'quantity' || fieldName === 'marketUnitFee' || fieldName === 'feesIndex.common.unitFee' || fieldName === 'programID' ||
+            else if (fieldName === 'quantity' || fieldName === 'marketUnitFee' || fieldName === 'feesIndex.common.unitFee'||fieldName === 'feesIndex.common.totalFee' || fieldName === 'programID' ||
                 fieldName === 'subType' || fieldName === 'calcBase' || fieldName === 'isSubcontract'){
                 if (fieldName === 'quantity') {
                     quantityEditObj.checkingAndUpdate(editingText,node);
                    // project.quantity_detail.editMainTreeNodeQuantity(value,node,fieldName,editingText);
                     return;
-                }
-                else if (fieldName === 'marketUnitFee' || fieldName === 'feesIndex.common.unitFee') {
-                    if (value) {value = parseFloat(value).toDecimal(decimalObj.decimal("unitPrice", node))};
-                }
-                else if (fieldName === 'calcBase') {
+                } else if (fieldName === 'marketUnitFee' || fieldName === 'feesIndex.common.unitFee'||fieldName === 'feesIndex.common.totalFee') {
+                    if(isNaN(value)){//说明输入的是无效的字符
+                        //value == null && editingText!=null && editingText!=""
+                        alert("当前输入的数据类型不正确,请重新输入。");
+                        projectObj.mainController.refreshTreeNode([node]);
+                        return
+                    }
+                    if (value) {
+                        if(fieldName === 'feesIndex.common.unitFee')  value = parseFloat(value).toDecimal(decimalObj.decimal("unitPrice", node));
+                        if(fieldName === 'feesIndex.common.totalFee'){//修改了综合合价后,反算综合单价,然后再由计算程序算个综合合价出来
+                            let unitfee = 0;
+                            if(node.data.quantity){//如果工程量为0或空,综合合单直接填到综合单价
+                                let t_quantity = scMathUtil.roundForObj(node.data.quantity,getDecimal("quantity",node));
+                                value = scMathUtil.roundForObj(value,getDecimal("unitPrice", node));
+                                unitfee = scMathUtil.roundForObj(value/t_quantity,getDecimal("totalPrice", node));
+                            }else {
+                                unitfee = scMathUtil.roundForObj(value,getDecimal("totalPrice", node));
+                            }
+                            calcTools.setFieldValue(node, 'feesIndex.common.unitFee', unitfee);
+                        }
+                    }
+                } else if (fieldName === 'calcBase') {
                     //zhong
                     if(value === undefined ||value === null || value.toString().trim() === ''){
                         value = '';
@@ -482,20 +499,17 @@ var projectObj = {
 
                 project.calcProgram.calcAndSave(node);
                 gljOprObj.showRationGLJSheetData();
-            }
-            else if (node.sourceType === project.Bills.getSourceType()&&fieldName === 'unit'){//修改清单单位的时候清单工程量要重新4舍5入
+            } else if (node.sourceType === project.Bills.getSourceType()&&fieldName === 'unit'){//修改清单单位的时候清单工程量要重新4舍5入
                 node.data[fieldName] = value;
                 node.changed = true;
                 if(node.data.quantity){
                     node.data.quantity =scMathUtil.roundForObj(node.data.quantity,getDecimal("quantity",node));
                 }
                 project.calcProgram.calcAndSave(node);
-            }
-            else {
+            } else {
                 if (node.sourceType === project.Bills.getSourceType()) {
                     project.Bills.updateField(node.source, fieldName, value, false);
-                }
-                else if (node.sourceType === project.Ration.getSourceType()) {
+                } else if (node.sourceType === project.Ration.getSourceType()) {
                     project.Ration.updateField(node.source, fieldName, value);
                 }
                 if (colSetting.data.wordWrap) {
@@ -503,11 +517,9 @@ var projectObj = {
                 }
                 projectObj.mainController.refreshTreeNode([node]);
             }
-        }
-        else if(value==null && fieldName ==='feeRate'){
+        } else if(value==null && fieldName ==='feeRate'){
             project.FeeRate.cleanFeeRateID(node);
-        }
-        else {
+        } else {
             projectObj.mainController.refreshTreeNode([node], false);
         }
     },
@@ -568,7 +580,7 @@ var projectObj = {
         let code = node.data.code ? node.data.code : '';
         if(node.sourceType == ModuleNames.bills){//当清单是“分部分项工程”、“措施项目工程”时,要展开清单规则节点
             if(BILLS.isFXorBX(node)||(node.data.type == billType.BILL && BILLS.isMeasure(node))){//是分项或补项,是清单并且属于措施项目节点
-                if(billsLibObj.stdBillsTree === null){
+              /*  if(billsLibObj.stdBillsTree === null){
                     billsLibObj.doAfterLoadBills = function () {
                         this.locateAtBills(code);
                         this.doAfterLoadBills = null;
@@ -577,7 +589,18 @@ var projectObj = {
                 else {
                     billsLibObj.locateAtBills(code);
                 }
-                if(!$("#qd").is(":visible"))  $('#stdBillsTab').click();
+                if(!$("#qd").is(":visible"))  $('#stdBillsTab').click();*/
+                if(!billsGuidance.bills.tree){
+                    doAfterLoadGuidance = function () {
+                        billsGuidance.locateAtBills(code);
+                        doAfterLoadGuidance = null;
+                    }
+                } else {
+                    billsGuidance.locateAtBills(code);
+                }
+                if(!$("#zy").is(":visible"))  {
+                    $('#stdBillsGuidanceTab').click();
+                }
             }
         }
         if(node.sourceType == ModuleNames.ration){ //在定额编码中双击,如果右侧定额库没有展开,则自动展开。
@@ -608,7 +631,6 @@ var projectObj = {
                 }
             }
             if(!$("#de").is(":visible"))  $('#stdRationTab').click();
-            console.log($('#stdRationLibSelect').select().val());
         }
 
     },
@@ -1286,7 +1308,7 @@ var projectObj = {
                         if(selected.sourceType == ModuleNames.bills){
                             if(selected.data.type == billType.FX||selected.data.type ==billType.BILL){
                                 if(selected.data.calcBase&&selected.data.calcBase!=""){
-                                    alert("当前有基数计算,不能插入子项。");
+                                    alert("当前有基数计算,不能插入定额/量价/人材机。");
                                     return;
                                 }
                             }
@@ -2139,6 +2161,8 @@ $('#recColSetting').click(function () {
 $('#property_default').click(function () {
     let project = projectObj.project,
         projectID = project.ID();
+    //todo 清除窗口拖动比例缓存
+
     CommonAjax.post('/pm/api/defaultSettings', {user_id: userID, projectID: projectID}, function (rstData) {
         window.location.href = `/main?project=${projectID}`;
     });
@@ -2777,7 +2801,7 @@ function disableTools(){
     $('#upMove').addClass('disabled');
     $('#downMove').addClass('disabled');
     $('#ZLFB_btn').addClass('disabled');
-    $('#switchTznr').addClass('disabled');
+    //$('#switchTznr').addClass('disabled');
     $('#uploadLj').addClass('disabled');
     $('#uploadGld').addClass('disabled');
     $('a[name="lockBills"]').addClass('disabled');
@@ -2790,6 +2814,8 @@ function disableTools(){
     //呈现选项
     $('#display-setting').find('input').prop('disabled', 'disabled');
     $('#recColSetting').remove();
+    //项目属性恢复默认系统设置
+    $('#property_default').addClass('disabled');
     //项目属性确定
     $('#property_ok').addClass('disabled');
     //特征及内容
@@ -2809,6 +2835,7 @@ function disableTools(){
     $('#stdBillsGuidanceTab').addClass('disabled');
     $('#stdBillsTab').addClass('disabled');
     $('#stdRationTab').addClass('disabled');
+    $('#blockLibTab').addClass('disabled');
     //人材机汇总,选择其他、另存使用
     $('a[data-target="#change-unitFile"]').remove();
     $('a[data-target="#unitFile-save-as"]').remove();

+ 43 - 59
web/building_saas/main/js/views/quantity_edit_view.js

@@ -58,6 +58,7 @@ let quantityEditObj = {
         var ns = GC.Spread.Sheets;
         function QuantityEditCellType() {
             var init=false;
+            this.clickTime = 0; //点击事件时间戳
         }
         QuantityEditCellType.prototype = new ns.CellTypes.Text();
         QuantityEditCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
@@ -96,20 +97,33 @@ let quantityEditObj = {
                 sheetArea: context.sheetArea
             };
         };
+
+        //2018 -09 -26  修改工程量这个输入控件,删除悬浮提示注释,还原时通过git 历史
+
         QuantityEditCellType.prototype.processMouseDown = function (hitinfo) {
-            var me=quantityEditObj;
+            let me=quantityEditObj;
+            if(isDoubleClick(this) == true && !projectReadOnly){//如果是双击,直接显示
+                me.showSelectModal(hitinfo);
+                return ;
+            }
            if(me.editingCell && hitinfo.row==me.editingCell.row){
-                var offset=hitinfo.cellRect.x+hitinfo.cellRect.width-6;
-                var imageMagin=3;
-                var imageHeight = hitinfo.cellRect.height-2*imageMagin;
-                var imageWidth = hitinfo.cellRect.width*2/7;
-                if(hitinfo.x<offset&&hitinfo.x>offset-imageWidth){
-                    if(!projectReadOnly){
-                        me.showSelectModal(hitinfo);
-                    }
-                }else {//点击其它地方,按钮消失
+               if(me.editingCell.isBtn == false){//是第一次点击,刷新显示按钮
+                   me.editingCell.isBtn = true;
+                   hitinfo.sheet.invalidateLayout();
+                   hitinfo.sheet.repaint();
+               }else {
+                   var offset=hitinfo.cellRect.x+hitinfo.cellRect.width-6;
+                   var imageMagin=3;
+                   var imageHeight = hitinfo.cellRect.height-2*imageMagin;
+                   var imageWidth = hitinfo.cellRect.width*2/7;
+                   if(hitinfo.x<offset&&hitinfo.x>offset-imageWidth){
+                       if(!projectReadOnly){
+                           me.showSelectModal(hitinfo);
+                       }
+                   }/*else {//点击其它地方,按钮消失
                     hideButton(hitinfo)
-                }
+                    }*/
+               }
             }
         };
         QuantityEditCellType.prototype.processMouseEnter = function (hitinfo) {
@@ -118,60 +132,17 @@ let quantityEditObj = {
             if(me.editingCell==null){
                 me.editingCell={
                     row:hitinfo.row,
-                    col:hitinfo.col
+                    col:hitinfo.col,
+                    isBtn :false//鼠标刚进入的时候按钮还是没显示的状态
                 }
-                hitinfo.sheet.invalidateLayout();
-                hitinfo.sheet.repaint();
-            }
-                //取消悬浮提示
-            /*  let text = hitinfo.sheet.getText(hitinfo.row, hitinfo.col);
-            let tag = hitinfo.sheet.getTag(hitinfo.row, hitinfo.col);
-            let dataField = "quantity";
-
-            if(hitinfo.sheet.getCell(hitinfo.row,hitinfo.col).wordWrap()==true){
-                return;
-            }
-            if(dataField=="quantity"){
-                text = tag;
-            }else if(tag !== undefined && tag) {
-                text = tag;
+               // hitinfo.sheet.invalidateLayout();
+                //hitinfo.sheet.repaint();
             }
-            if (text && text !== '') {
-                if (!this._toolTipElement) {
-                    let div = $('#autoTip')[0];
-                    if (!div) {
-                        div = document.createElement("div");
-                        $(div).css("position", "absolute")
-                            .css("border", "1px #C0C0C0 solid")
-                            .css("box-shadow", "1px 2px 5px rgba(0,0,0,0.4)")
-                            .css("font", "9pt Arial")
-                            .css("background", "white")
-                            .css("padding", 5)
-                            .attr("id", 'autoTip');
-                        $(div).hide();
-                        document.body.insertBefore(div, null);
-                    }
-                    this._toolTipElement = div;
-                    $(this._toolTipElement).text(text);
-                    let cellRect =  hitinfo.sheet.getCellRect(hitinfo.row,hitinfo.col);
-                    $(this._toolTipElement).css("top", cellRect.y+$('#main').offset().top+cellRect.height).css("left",  hitinfo.x );//
-
-                    $(this._toolTipElement).show("fast");
-                    TREE_SHEET_HELPER.tipDiv = 'show';//做个标记
-                }
-            }*/
         };
         QuantityEditCellType.prototype.processMouseLeave = function (hitinfo) {
             hideButton(hitinfo);
-            //延时检查:当tips正在show的时候,就调用了hide方法,会导致tips一直存在,所以设置一个超时处理
-
-            /*TREE_SHEET_HELPER.tipDiv = 'hide';  取消悬浮提示
-            if (TREE_SHEET_HELPER._toolTipElement) {
-                $(TREE_SHEET_HELPER._toolTipElement).hide();
-                TREE_SHEET_HELPER._toolTipElement = null;
-            };
-            TREE_SHEET_HELPER.tipDivCheck();*/
         };
+
         function hideButton(hitinfo) {
             if(!quantityEditObj.pmLeave){//鼠标进入显示三个点按钮
                 quantityEditObj.editingCell=null;
@@ -180,6 +151,19 @@ let quantityEditObj = {
                 quantityEditObj.pmLeave = true;
             }
         }
+
+        function isDoubleClick(quantityCell) {
+            let nowTime = +new Date();
+            if(quantityCell.clickTime !=0){
+                if(nowTime - quantityCell.clickTime < 280) {//判断为双击
+                    quantityCell.clickTime = 0;
+                    return true;
+                }
+            }
+            quantityCell.clickTime = nowTime;//计录点击时间
+            return false
+        }
+
         return new QuantityEditCellType();
     },
     showSelectModal:function (hitinfo) {

+ 21 - 2
web/building_saas/main/js/views/side_tools.js

@@ -12,10 +12,12 @@ sideResizeEles.farElement = $('.main-side');
 sideResizeEles.farSpread = $('.main-side');
 sideResizeEles.nav = null;
 slideResize(sideResizeEles, {min: 250, max: $('#zaojiashu').width()-260}, 'width', function(){
+    adaptiveTzjnrWidth();
     pageCCOprObj.resizeWidth();
     projectObj.refreshMainSpread();
     refreshSubSpread();
     if(sideResizeEles.id === 'stdBillsGuidanceTab'){
+        billsGuidance.setColumnWidthByRate(billsGuidance.elfItem.workBook, $('#zy').width(), billsGuidance.elfItem.headers)
         billsGuidance.refreshWorkBook();
     }
     else if(sideResizeEles.id === 'stdRationTab'){
@@ -67,6 +69,18 @@ slideResize(billsLibResizeEles, {min: 147, max: 680}, 'height', function() {
     billsLibObj.refreshBillsRelaSpread();
 });
 
+let blockLibResizeEles = {};
+blockLibResizeEles.id = '#kmbk';
+blockLibResizeEles.resize = $('#kmbkResize');
+blockLibResizeEles.nearElement = $('#kmbk').find('.top-content');
+blockLibResizeEles.nearSpread = $('#div_block_tree');
+blockLibResizeEles.farElement = $('#kmbk').find('.bottom-content');
+blockLibResizeEles.farSpread = $('#div_block_detail');
+blockLibResizeEles.nav = null;
+slideResize(blockLibResizeEles, {min: 147, max: 680}, 'height', function() {
+    billsGuidance.refreshWorkBook();
+});
+
 
 var sideToolsObj = {
     showSideTools: function (tabPanel, show, id) {
@@ -74,8 +88,8 @@ var sideToolsObj = {
         if (show) {
             if(id === 'stdBillsGuidanceTab'){
                 //billsGuidance.refreshInsertRation();
-                sideResizeEles.nearElement.css('width', '72%');
-                sideResizeEles.farElement.css('width', '28%');
+                sideResizeEles.nearElement.css('width', '66.666667%');
+                sideResizeEles.farElement.css('width', '33.333333%');
             }
             else {
                 sideResizeEles.nearElement.css('width', '66.666667%');
@@ -92,6 +106,10 @@ var sideToolsObj = {
                     loadSize(rationLibResizeEles, 'height', function(){
                     });
                 }
+                else if(id === 'blockLibTab'){//定额库
+                    loadSize(blockLibResizeEles, 'height', function(){
+                    });
+                }
                 else{//清单库
                     loadSize(billsLibResizeEles, 'height', function(){
                     });
@@ -103,6 +121,7 @@ var sideToolsObj = {
             sideResizeEles.farElement.css('width', '0%');
             tabPanel.hide();
         }
+        adaptiveTzjnrWidth();
         autoFlashHeight();
         pageCCOprObj.resizeWidth();
         billsGuidance.refreshWorkBook();

+ 231 - 42
web/building_saas/main/js/views/std_billsGuidance_lib.js

@@ -8,6 +8,11 @@
  * @version
  */
 
+//清单指引/精灵获取完清单数据后的回调函数
+let doAfterLoadGuidance = null;
+//选项单选多选状态(按住alt为多选) 单选:0 多选:1
+let billsGuidanceSelMode = 0;
+
 const billsGuidance = (function () {
     let currentLib = null;
     //库类型
@@ -33,8 +38,9 @@ const billsGuidance = (function () {
             headRowHeight: [40],
             defaultRowHeight: 21,
             cols: [{
-                width: 160,
+                width: 140,
                 readOnly: true,
+                showHint: true,
                 head: {
                     titleNames: ["项目编码"],
                     spanCols: [1],
@@ -50,7 +56,7 @@ const billsGuidance = (function () {
                     font: "Arial"
                 }
             }, {
-                width: 220,
+                width: 190,
                 readOnly: true,
                 head: {
                     titleNames: ["项目名称"],
@@ -70,7 +76,6 @@ const billsGuidance = (function () {
                {
                 width: 45,
                 readOnly: true,
-                showHint: true,
                  head: {
                      titleNames: ["计量单位"],
                      spanCols: [1],
@@ -89,8 +94,8 @@ const billsGuidance = (function () {
             ]
         },
         headers: [
-            {name: '项目编码', dataCode: 'code', width: 160, vAlign: 'center', hAlign: 'left', formatter: '@'},
-            {name: '项目名称', dataCode: 'name', width: 220, vAlign: 'center', hAlign: 'left', formatter: '@'},
+            {name: '项目编码', dataCode: 'code', width: 140, vAlign: 'center', hAlign: 'left', formatter: '@'},
+            {name: '项目名称', dataCode: 'name', width: 190, vAlign: 'center', hAlign: 'left', formatter: '@'},
             {name: '单位', dataCode: 'unit', width: 45, vAlign: 'center', hAlign: 'center', formatter: '@'},
         ],
         events: {
@@ -126,11 +131,11 @@ const billsGuidance = (function () {
                         } else {
                             ConfirmModal.stdBillsUnit.check(node.data, function (std) {
                                 canAdd = ProjectController.addBills(projectObj.project, projectObj.mainController, std);
-                                if(canAdd !== null || canAdd !== false){
+                               /* if(canAdd !== null || canAdd !== false){
                                     //插入选中的定额
                                     let addRationDatas = currentLib.type && currentLib.type === libType.elf ? getInsertElfRationData() : getInsertRationData(getCheckedRows());
                                     insertRations(addRationDatas);
-                                }
+                                }*/
                                 if(canAdd === false && $.bootstrapLoading.isLoading()){
                                     $.bootstrapLoading.end();
                                 }
@@ -143,11 +148,11 @@ const billsGuidance = (function () {
                     }
                     else {
                         let insert = billsLibObj.insertBills(stdBillsJobData, stdBillsFeatureData, node);
-                        if(insert){
+                        /*if(insert){
                             //插入选中的定额
                             let addRationDatas = currentLib.type && currentLib.type === libType.elf ? getInsertElfRationData() : getInsertRationData(getCheckedRows());
                             insertRations(addRationDatas);
-                        }
+                        }*/
                     }
                 }
                 else {
@@ -317,8 +322,8 @@ const billsGuidance = (function () {
             ]
         },
         headers: [
-            {name: '施工工序', dataCode: 'name', width: 250, vAlign: 'center', hAlign: 'center', formatter: '@'},
-            {name: '选项', dataCode: 'options', width: 250, vAlign: 'center', hAlign: 'left', formatter: '@'},
+            {name: '施工工序', dataCode: 'name', width: 250, rateWidth: 0.5, vAlign: 'center', hAlign: 'center', formatter: '@'},
+            {name: '选项', dataCode: 'options', width: 250, rateWidth: 0.5,  vAlign: 'center', hAlign: 'left', formatter: '@'},
         ],
         events: {
             CellClick: function (sender, args) {
@@ -398,6 +403,31 @@ const billsGuidance = (function () {
             workBook.bind(Events[event], events[event]);
         }
     }
+    //根据宽度比例设置列宽
+    //@param {Object}workBook {Number}workBookWidth {Array}headers @return {void}
+    function setColumnWidthByRate(workBook, workBookWidth, headers) {
+        if(workBook){
+            const sheet = workBook.getActiveSheet();
+            sheet.suspendEvent();
+            sheet.suspendPaint();
+            for(let col = 0; col < headers.length; col++){
+                if(headers[col]['rateWidth'] !== undefined && headers[col]['rateWidth'] !== null && headers[col]['rateWidth'] !== ''){
+                    let width = workBookWidth * headers[col]['rateWidth'];
+                    if(headers[col]['dataCode'] === 'options'){
+                        width = width - 70;
+                    }
+                    sheet.setColumnWidth(col, width, GC.Spread.Sheets.SheetArea.colHeader)
+                }
+                else {
+                    if(headers[col]['headerWidth'] !== undefined && headers[col]['headerWidth'] !== null && headers[col]['headerWidth'] !== ''){
+                        sheet.setColumnWidth(col, headers[col]['headerWidth'], GC.Spread.Sheets.SheetArea.colHeader)
+                    }
+                }
+            }
+            sheet.resumeEvent();
+            sheet.resumePaint();
+        }
+    }
     //建表
     //@param {Object}module @return {void}
     function buildSheet(module) {
@@ -425,6 +455,9 @@ const billsGuidance = (function () {
             }
             setOptions(module.workBook, options);
             buildHeader(module.workBook.getActiveSheet(), module.headers);
+            if(module === elfItem){
+                setColumnWidthByRate(elfItem.workBook, $('#zy').width(), elfItem.headers)
+            }
             bindEvent(module.workBook, module.events);
         }
     }
@@ -449,12 +482,15 @@ const billsGuidance = (function () {
     //@param {Object}module {Object}sheet {Object}treeSetting {Array}datas
     function initTree(module, sheet, treeSetting, datas){
         module.tree = idTree.createNew({id: 'ID', pid: 'ParentID', nid: 'NextSiblingID', rootId: -1, autoUpdate: true});
-        module.controller = TREE_SHEET_CONTROLLER.createNew(module.tree, sheet, treeSetting);
+        module.controller = TREE_SHEET_CONTROLLER.createNew(module.tree, sheet, treeSetting, false);
         module.tree.loadDatas(datas);
         if(module === bills){
             initExpandStat();
         }
         module.controller.showTreeData();
+        if(module === bills){
+            setBillsHint(bills.tree.items, stdBillsJobData, stdBillsFeatureData);
+        }
     }
     //项目指引表焦点控制
     //@param {Number}row @return {void}
@@ -729,15 +765,16 @@ const billsGuidance = (function () {
             this.isEscKey=false;
             this.displayText='';
         }
-        function getHtml(node, cellRect, cellStyle) {
+       /* function getHtml(node, cellRect, cellStyle, top) {
             if(!node){
                 return '';
             }
             let height = cellRect.height;
+            top = top.replace('px', '');
             let htmlArr = [];
             let options = getOptions(node.data, bills.tree.selected.elf.datas);
             //let optionsTitle = node.data.options.split(';').join('\n');
-            htmlArr.push(`<div style="height: ${height}px; background: ${cellStyle.backColor};overflow: hidden; white-space: nowrap; text-overflow: ellipsis">${node.data.options}</div><div style="background: ${cellStyle.backColor};border: 1px solid; overflow: auto; height: ${options.length > 6 ? height*6 : height*options.length+5}px; font-size: 0.9rem;">`);
+            htmlArr.push(`<div style="height: ${height}px; background: ${cellStyle.backColor};overflow: hidden; white-space: nowrap; text-overflow: ellipsis">${node.data.options}</div><div id="optDiv" style="position: fixed; width: ${cellRect.width}px; top: ${top - (options.length - 2) * height - 5}px;background: ${cellStyle.backColor};border: 1px solid; overflow: auto; height: ${options.length > 6 ? height*6 : height*options.length+5}px; font-size: 0.9rem;">`);
             for(let opt of options){
                 htmlArr.push(`<div title="${opt.name ? opt.name : ''}" class="elf-options" style="height: ${height}px;overflow: hidden; white-space: nowrap; text-overflow: ellipsis">
                         <input rank="${opt.rank}" value="${opt.ID}" style="margin-left: 5px; vertical-align: middle" type="checkbox" 
@@ -745,6 +782,39 @@ const billsGuidance = (function () {
             }
             htmlArr.push(`</div>`);
             return htmlArr.join('');
+        }*/
+        function setOptionsDiv($editor, node, cellRect, cellStyle, top) {
+            if(!node){
+                return '';
+            }
+            let height = cellRect.height;
+            top = top.replace('px', '');
+            let options = getOptions(node.data, bills.tree.selected.elf.datas);
+            let $editInput = $(`<div style="height: ${height}px; background: ${cellStyle.backColor};overflow: hidden; white-space: nowrap; text-overflow: ellipsis">${node.data.options}</div>`),
+                $optDiv = $(`<div style="position: fixed; width: ${cellRect.width}px; top: ${top - (options.length - 2) * height - 5}px;background: ${cellStyle.backColor};border: 1px solid; overflow: auto; height: ${options.length > 6 ? height*6 : height*options.length+5}px; font-size: 0.9rem;"></div>`);
+            for(let opt of options){
+                let $opt = $(`<div title="${opt.name ? opt.name : ''}" class="elf-options" style="height: ${height}px;overflow: hidden; white-space: nowrap; text-overflow: ellipsis"></div>`),
+                    $optInput = $(`<input rank="${opt.rank}" value="${opt.ID}" style="margin-left: 5px; vertical-align: middle" type="checkbox" 
+                    ${node.data.optionChecked && _.find(node.data.optionChecked, {ID: opt.ID}) ? 'checked' : ''}>`);
+                $opt.text(`${opt.name ? opt.name : ''}`);
+                $opt.prepend($optInput);
+                $optDiv.append($opt);
+                //选项复选框点击监听
+                $optInput.click(function () {
+                    //单选
+                    if(billsGuidanceSelMode === 0){
+                        let $allInput = $optDiv.find('input');
+                        for(let input of $allInput){
+                            $(input).prop('checked', false);
+                        }
+                        $(this).prop('checked', 'checked');
+                    } else {//多选
+
+                    }
+                });
+            }
+            $editor.append($editInput);
+            $editor.append($optDiv);
         }
         //选择后处理
         function doAfterSel(node) {
@@ -820,8 +890,10 @@ const billsGuidance = (function () {
                 $editor.css("background", "white");
                 $editor.css("width", cellRect.width);
                 $editor.attr("gcUIElement", "gcEditingInput");
+                let activeCellTop = $editor.parent().parent().css('top');
                 let node = bills.tree.selected.elf.tree.items[elfSheet.getActiveRowIndex()];
-                $editor.html(getHtml(node, cellRect, cellStyle));
+                setOptionsDiv($editor, node, cellRect, cellStyle, activeCellTop);
+                this.isEscKey = false;
             }
         }
         OptionsCellType.prototype.deactivateEditor = function (editorContext, context) {
@@ -886,13 +958,16 @@ const billsGuidance = (function () {
         return new OptionsCellType();
     }
     //初始化清单的工作内容和项目特征
-    //@param {Number}billsLibId @return {void}
-    function initJobAndCharacter(billsLibId){
+    //@param {Number}billsLibId {Function}callback @return {void}
+    function initJobAndCharacter(billsLibId, callback){
         CommonAjax.post('/stdBillsEditor/getJobContent', {userId: userID, billsLibId: billsLibId}, function (datas) {
             stdBillsJobData = datas;
-        });
-        CommonAjax.post('/stdBillsEditor/getItemCharacter', {userId: userID, billsLibId: billsLibId}, function (datas) {
-            stdBillsFeatureData = datas;
+            CommonAjax.post('/stdBillsEditor/getItemCharacter', {userId: userID, billsLibId: billsLibId}, function (datas) {
+                stdBillsFeatureData = datas;
+                if(callback){
+                    callback();
+                }
+            });
         });
     }
     //初始化清单展开收起状态
@@ -917,6 +992,89 @@ const billsGuidance = (function () {
             }
         });
     }
+    //根据编码定位至清单精灵库中
+    //@param {String}code @return {void}
+    function locateAtBills(code) {
+        let nineCode = code.substring(0, 9);
+        let items = bills.tree.items;
+        let locateBills = _.find(items, function(item){
+            return item.data.code === nineCode;
+        });
+        if(locateBills){
+            expandSearchNodes([locateBills]);
+            sessionStorage.setItem('stdBillsGuidanceExpState', bills.tree.getExpState(bills.tree.items));
+        }
+        let sheet = bills.workBook.getActiveSheet();
+        let locateRow = locateBills ? locateBills.serialNo() : 0;
+        sheet.setActiveCell(locateRow, 0);
+        billsInitSel(locateRow);
+        sheet.showRow(locateRow, GC.Spread.Sheets.VerticalPosition.center);
+    }
+    //清单设置悬浮提示信息
+    //@param {Array}billsNodes(清单节点) {Array}jobs(总的工作内容数据) {Array}items(总的项目特征数据)
+    function setBillsHint(billsNodes, jobs, items) {
+        let jobsMapping = {},
+            itemsMapping = {};
+        for(let job of jobs){
+            jobsMapping[job.id] = job;
+        }
+        for(let item of items){
+            itemsMapping[item.id] = item;
+        }
+        let tagInfo = [];
+        for(let billsNode of billsNodes){
+            let hintArr = [];
+            let billsItems = billsNode.data.items;
+            if(billsItems.length > 0){
+                //项目特征
+                hintArr.push('项目特征:');
+            }
+            let itemCount = 1,
+                jobCount = 1;
+            for(let billsItem of billsItems){
+                let itemData = itemsMapping[billsItem.id];
+                if(itemData){
+                    //特征值
+                    let eigens = [];
+                    for(let eigen of itemData.itemValue){
+                        eigens.push(eigen.value);
+                    }
+                    eigens = eigens.join(';');
+                    hintArr.push(`${itemCount}.${itemData.content}${eigens === '' ? '' : ': ' + eigens}`);
+                    itemCount ++;
+                }
+            }
+            //工作内容
+            let billsJobs = billsNode.data.jobs;
+            if(billsJobs.length > 0){
+                hintArr.push('工作内容:');
+            }
+            for(let billsJob of billsJobs){
+                let jobData = jobsMapping[billsJob.id];
+                if(jobData){
+                    hintArr.push(`${jobCount}.${jobData.content}`);
+                    jobCount ++;
+                }
+            }
+            /*if(billsNode.data.ruleText && billsNode.data.ruleText !== ''){
+                hintArr.push('工程量计算规则:');
+                hintArr.push(billsNode.data.ruleText);
+            }
+            if(billsNode.data.recharge && billsNode.data.recharge !== ''){
+                hintArr.push('补注:');
+                hintArr.push(billsNode.data.recharge);
+            }*/
+            if(hintArr.length > 0){
+                tagInfo.push({row: billsNode.serialNo(), value: hintArr.join('\n')});
+            }
+        }
+        let sheet = bills.workBook.getActiveSheet();
+        renderSheetFunc(sheet, function () {
+            for(let tagI of tagInfo){
+                sheet.setTag(tagI.row, 0, tagI.value);
+            }
+        });
+    }
     //初始选择清单指引库
     //@param {Number}libID @return {void}
     function libInitSel(libID){
@@ -933,29 +1091,34 @@ const billsGuidance = (function () {
                 elfItem.workBook = null;
             }
             initViews();
-            //获取清单库中的工作内容和项目特征
-            initJobAndCharacter(rstData.guidanceLib.billsLibId);
-            initTree(bills, bills.workBook.getActiveSheet(), bills.treeSetting, rstData.bills);
-            //清单精灵
-            if(rstData.guidanceLib.type && rstData.guidanceLib.type == libType.elf){
-                $('#stdBillsGuidanceTab').text('清单精灵');
-                //每一个清单节点下挂载一棵清单精灵树
-                for(let node of bills.tree.items){
-                    node.elf = {tree: null, controller: null, datas: []}; //挂载全部数据,数据不一定全成为树节点
+            let callback = function () {
+                initTree(bills, bills.workBook.getActiveSheet(), bills.treeSetting, rstData.bills);
+                //清单精灵
+                if(rstData.guidanceLib.type && rstData.guidanceLib.type == libType.elf){
+                    $('#stdBillsGuidanceTab').text('清单精灵');
+                    //每一个清单节点下挂载一棵清单精灵树
+                    for(let node of bills.tree.items){
+                        node.elf = {tree: null, controller: null, datas: []}; //挂载全部数据,数据不一定全成为树节点
+                    }
                 }
-            }
-            //清单指引
-            else {
-                $('#stdBillsGuidanceTab').text('清单指引');
-                //每一棵项目指引树挂在清单节点上
-                for(let node of bills.tree.items){
-                    node.guidance = {tree: null, controller: null};
+                //清单指引
+                else {
+                    $('#stdBillsGuidanceTab').text('清单指引');
+                    //每一棵项目指引树挂在清单节点上
+                    for(let node of bills.tree.items){
+                        node.guidance = {tree: null, controller: null};
+                    }
                 }
-            }
-            setTagForHint(bills.tree.items);
-            //默认初始节点
-            billsInitSel(0);
-            $.bootstrapLoading.end();
+                //setTagForHint(bills.tree.items);
+                //默认初始节点
+                billsInitSel(0);
+                if(doAfterLoadGuidance){
+                    doAfterLoadGuidance();
+                }
+                $.bootstrapLoading.end();
+            };
+            //获取清单库中的工作内容和项目特征
+            initJobAndCharacter(rstData.guidanceLib.billsLibId, callback);
         }, function () {
             $.bootstrapLoading.end();
         });
@@ -1148,6 +1311,21 @@ const billsGuidance = (function () {
             }
             if(bills.tree.selected.children.length === 0){
                 let insert = billsLibObj.insertBills(stdBillsJobData, stdBillsFeatureData, bills.tree.selected);
+                /*if(insert){
+                    //插入选中的定额
+                    let addRationDatas = currentLib.type && currentLib.type === libType.elf ? getInsertElfRationData() : getInsertRationData(getCheckedRows());
+                    insertRations(addRationDatas);
+                }*/
+            }
+        });
+        //插入清单和定额
+        $('#guidanceInsertBillsAndRation').click(function () {
+            //插入清单
+            if(!bills.tree || !bills.tree.selected){
+                return;
+            }
+            if(bills.tree.selected.children.length === 0){
+                let insert = billsLibObj.insertBills(stdBillsJobData, stdBillsFeatureData, bills.tree.selected);
                 if(insert){
                     //插入选中的定额
                     let addRationDatas = currentLib.type && currentLib.type === libType.elf ? getInsertElfRationData() : getInsertRationData(getCheckedRows());
@@ -1231,6 +1409,17 @@ const billsGuidance = (function () {
             billsLibObj.clearHighLight(bills.workBook);
             refreshWorkBook();
         });
+        //监听alt建,确定选项单选多选状态
+        $('#billsGuidance_items').keydown(function(e){
+            if(e.keyCode === 18){
+                billsGuidanceSelMode = 1;
+            }
+        });
+        $('#billsGuidance_items').keyup(function(e){
+            if(e.keyCode === 18){
+                billsGuidanceSelMode = 0;
+            }
+        });
     }
     //刷新表
     //@return {void}
@@ -1246,7 +1435,7 @@ const billsGuidance = (function () {
         }
     }
 
-    return {initViews, bindBtn, refreshWorkBook, refreshInsertRation, bills};
+    return {initViews, bindBtn, refreshWorkBook, refreshInsertRation, setColumnWidthByRate, locateAtBills, bills, elfItem};
 })();
 
 $(document).ready(function(){

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

@@ -225,7 +225,7 @@ var billsLibObj = {
                 that.stdBillsTree.setRootExpanded(that.stdBillsTree.roots, false);
             }
             stdBillsTreeController.showTreeData();
-            billsLibObj.setTagForHint(that.stdBillsTree.items);
+            //billsLibObj.setTagForHint(that.stdBillsTree.items);
             that.showBillsRela(that.stdBillsTree.firstNode());
             stdBillsTreeController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, that.showBillsRela);
             that.stdBillsSpread.unbind(GC.Spread.Sheets.Events.CellDoubleClick);

+ 70 - 22
web/building_saas/main/js/views/std_ration_lib.js

@@ -67,7 +67,6 @@ var rationLibObj = {
         var that = this;
         var showRationChapterTree = function (datas) {
             var rationChapterTree = idTree.createNew({id: 'ID', pid: 'ParentID', nid: 'NextSiblingID', rootId: -1, autoUpdate: false});
-            console.log(that);
             that.tree = rationChapterTree;
             var rationChapterTreeController = TREE_SHEET_CONTROLLER.createNew(rationChapterTree, that.rationChapterSpread.getActiveSheet(), that.rationChapterTreeSetting);
             rationChapterTree.loadDatas(datas);
@@ -132,9 +131,6 @@ var rationLibObj = {
             sheet.setTag(i, 0, '');
         }
         for(let i = 0, len = datas.length; i < len; i++){
-            if(datas[i].code === 'AA0032'){
-                console.log(datas[i]);
-            }
             sheet.setTag(i, 0, datas[i].hint ? datas[i].hint : '');
         }
         sheet.resumePaint();
@@ -448,13 +444,50 @@ $('#rationSearchKeyword').keyup(function () {
         if($('#rationSearchResult').is(':visible')){
             $('#rationSearchResult').hide();
             $(".main-data-side-search", $('#rationSearchResult')).height(0);
+            switchRationSearchMode(0);
             autoFlashHeight();
             rationLibObj.refreshSpread();
         }
     }
 });
+
+//变换搜索本定额、全部定额状态
+function switchRationSearchMode(mode) {
+    //搜索本定额
+    if(mode === 0){
+        $('#curRationLib').removeClass('btn-light');
+        $('#curRationLib').addClass('btn-secondary');
+        $('#allRationLibs').removeClass('btn-secondary');
+        $('#allRationLibs').addClass('btn-light');
+    } else {//搜索全部定额
+        $('#allRationLibs').removeClass('btn-light');
+        $('#allRationLibs').addClass('btn-secondary');
+        $('#curRationLib').removeClass('btn-secondary');
+        $('#curRationLib').addClass('btn-light');
+    }
+}
+
+//搜索本定额
+$('#curRationLib').click(function () {
+    if($(this).hasClass('btn-secondary')){
+        return;
+    }
+    switchRationSearchMode(0);
+    $('#rationSearch').click();
+});
+
+//搜索全部定额
+$('#allRationLibs').click(function () {
+    if($(this).hasClass('btn-secondary')){
+        return;
+    }
+    switchRationSearchMode(1);
+    $('#rationSearch').click();
+});
+
+//搜索
 $('#rationSearch').click(function () {
-    var keyword = $('#rationSearchKeyword').val(), rationLibID = $('#stdRationLibSelect').val();
+    var keyword = $('#rationSearchKeyword').val();
     if(keyword === ''){
         if($('#rationSearchResult').is(':visible')){
             $('#rationSearchResult').hide();
@@ -464,19 +497,15 @@ $('#rationSearch').click(function () {
         }
         return;
     }
-    var getResultHtml = function (result) {
-        var html = [], i, serialNo;
-        html.push('<div class="d-flex justify-content-between">');
-        html.push('<span>搜索结果:');
-        html.push(result.length.toString());
-        html.push('</span>');
-        html.push('<a title="关闭搜索" class="btn btn-link btn-sm" href="javascript:void(0)"><i class="fa fa-remove" aria-hidden="true"></i></a>');
-        html.push('</div>');
-
-        html.push('<div class="w-100 main-data-side-search">');
-        html.push('</div>');
-        return html.join('');
-    };
+    //获取搜索定额的库:本库/所有库
+    let rationLibIDs = [];
+    if($('#curRationLib').hasClass('btn-secondary')){
+        rationLibIDs.push($('#stdRationLibSelect').val());
+    } else {
+        for(let lib of projectInfoObj.projectInfo.engineeringInfo.ration_lib){
+            rationLibIDs.push(lib.id);
+        }
+    }
     let bindContextmenuOpr = function (sheet) {
         $.contextMenu({
             selector: '#rationSearchResult',
@@ -503,7 +532,23 @@ $('#rationSearch').click(function () {
                                     $(".main-data-side-search", $('#rationSearchResult')).height(0);
                                     autoFlashHeight();
                                     rationLibObj.refreshSpread();
-                                    rationLibObj.locateAtRation(data.rationRepId, data.code);
+                                    switchRationSearchMode(0);
+                                    if($('#stdRationLibSelect').select().val() != data.rationRepId){
+                                        let libOpts = $('#stdRationLibSelect').find('option');
+                                        for(let libOpt of libOpts){
+                                            if($(libOpt).val() == data.rationRepId){
+                                                $(libOpt).prop('selected', 'selected');
+                                                break;
+                                            }
+                                        }
+                                        $('#stdRationLibSelect').change();
+                                        rationLibObj.doAfterGetRationTree = function () {
+                                            this.locateAtRation(data.rationRepId, data.code);
+                                            this.doAfterGetRationTree = null;
+                                        };
+                                    } else {
+                                        rationLibObj.locateAtRation(data.rationRepId, data.code);
+                                    }
                                 }}
                         }
                     };
@@ -528,7 +573,8 @@ $('#rationSearch').click(function () {
         SheetDataHelper.loadSheetData(rationLibObj.sectionRationsSetting, rationLibObj.resultSpread.getActiveSheet(), result);
         rationLibObj.setTagForHint(rationLibObj.resultSpread.getActiveSheet(), result);
     };
-    CommonAjax.post('/complementaryRation/api/findRation', {'user_id': userID, 'rationRepId': rationLibID, 'keyword': keyword}, function (result) {
+    $.bootstrapLoading.start();
+    CommonAjax.post('/complementaryRation/api/findRation', {'user_id': userID, 'rationRepId': rationLibIDs, 'keyword': keyword}, function (result) {
         //sort
         result.sort(function (a, b) {
             let rst = 0;
@@ -537,11 +583,10 @@ $('#rationSearch').click(function () {
             return rst;
         });
         var resultObj = $('#rationSearchResult');
-        /*resultObj.empty();
-        resultObj.append(getResultHtml(result));*/
         $('#rationSearchCount').text(`搜索结果:${result.length.toString()}`);
         $('a', result).unbind('click');
         $('a', resultObj).bind('click', function () {
+            switchRationSearchMode(0);
             resultObj.hide();
             $(".main-data-side-search", resultObj).height(0);
             autoFlashHeight();
@@ -550,5 +595,8 @@ $('#rationSearch').click(function () {
         resultObj.show();
         $(".main-data-side-search", resultObj).height($(window).height() - $(".header").height() - $(".toolsbar").height() - 64);
         showResult(result);
+        $.bootstrapLoading.end();
+    }, function () {
+        $.bootstrapLoading.end();
     });
 });

+ 42 - 14
web/building_saas/main/js/views/sub_view.js

@@ -118,29 +118,57 @@ $("#linkZMHS").click(function(){        // 子目换算
 
     gljOprObj.activeTab='#linkZMHS';
 });
-
-tabZMHS
+//特征及内容各模块宽度自适应
+function adaptiveTzjnrWidth() {
+    if(gljOprObj.activeTab !== '#linkTZJNR'){
+        return;
+    }
+    //排版规则工具条宽度
+    const typeSettingWidth = 30;
+    let tzjnrWidth = $('#tzjnrCon').width() + 30;
+    //let tzjnrWidth = $(window).width() - $('.main-nav').width() - $('.main-side').width();
+    if($('#add-rule').is(':visible')){
+        $('#jobDiv').css('width', tzjnrWidth / 3);
+        $('#itemDiv').css('width', tzjnrWidth / 3);
+        $('#add-rule').css('width', tzjnrWidth / 3);
+    } else{
+        $('#jobDiv').css('width', tzjnrWidth / 2);
+        $('#itemDiv').css('width', tzjnrWidth / 2 - typeSettingWidth);
+        $('#openTypeSetting').css('width', typeSettingWidth);
+    }
+    pageCCOprObj.resizeWidth();
+    refreshSubSpread();
+}
 //特征及内容
 $("#linkTZJNR").click(function () {
+    gljOprObj.activeTab='#linkTZJNR';
     $("#subItems").children().hide();
     $("#tzjnrCon").show();
-    $("#add-rule").show();
+    adaptiveTzjnrWidth();
+    pageCCOprObj.resizeWidth();
     $("#add-rule p").not(":first").css('margin-bottom', 4);
     pageCCOprObj.active = true;
     refreshSubSpread();
+    contentOprObj.workBook.getActiveSheet().showColumn(0, GC.Spread.Sheets.HorizontalPosition.left);
+    characterOprObj.workBook.getActiveSheet().showColumn(0, GC.Spread.Sheets.HorizontalPosition.left);
     let selectedNode = projectObj.mainController.tree.selected;
     if (projectObj.project.property.addRule !== undefined) {
         setRule(projectObj.project.property.addRule);
     }
     pageCCOprObj.mainActiveCell = projectObj.mainSpread.getActiveSheet().getSelections()[0];
     pageCCOprObj.setCacheAndShow(selectedNode);
-   /* if(selectedNode && selectedNode.sourceType === projectObj.project.Bills.getSourceType()){
-        pageCCOprObj.setCacheAndShow(selectedNode);
-    }
-    else{
-        pageCCOprObj.clearData();
-    }*/
-    gljOprObj.activeTab='#linkTZJNR';
+});
+//打开排版规则
+$('#openTypeSetting').click(function () {
+    $('#add-rule').show();
+    $(this).hide();
+    adaptiveTzjnrWidth();
+});
+//关闭排版规则
+$('#closeTypeSetting').click(function () {
+    $('#add-rule').hide();
+    $('#openTypeSetting').show();
+    adaptiveTzjnrWidth();
 });
 
 //应用到选中清单、应用到所有,添加位置列如果隐藏了,则重新显示
@@ -455,14 +483,14 @@ let subViewObj = {
         if (node) {
             if (node.sourceType === projectObj.project.Bills.getSourceType() &&
                 (node.data.type === billType.FX || node.data.type === billType.BX || node.data.type === billType.BILL)) {
-                if(node.data.comments && node.data.comments !== ''){
-                    comments.push('清单注释:');
-                    comments.push(node.data.comments);
-                }
                 if(node.data.ruleText && node.data.ruleText !== ''){
                     comments.push('工程量计算规则:');
                     comments.push(node.data.ruleText);
                 }
+                if(node.data.comments && node.data.comments !== ''){
+                    comments.push('清单注释:');
+                    comments.push(node.data.comments);
+                }
             } else if (node.sourceType === projectObj.project.Ration.getSourceType()) {
                 if(node.data.content && node.data.content !== ''){
                     comments.push('工作内容:');

+ 1 - 1
web/building_saas/pm/html/project-management-Recycle.html

@@ -20,7 +20,7 @@
                 </button>
             </div>
             <div class="modal-body">
-                <p><i class="fa fa-cubes"></i> 汽车生产车间 下的单位工程都将恢复都将恢复,恢复后将重命名为</p>
+                <p><i class="fa fa-cubes"></i> 汽车生产车间 下的单位工程都将恢复,恢复后将重命名为</p>
                 <p><b>建筑工程2(10-25 14:33:15恢复)</b>、<b>建筑工程3(10-25 14:33:15恢复)</b></p>
                 <p> 点“确定”按钮,确认从回收站中恢复。</p>
             </div>

+ 2 - 2
web/building_saas/pm/html/project-management.html

@@ -73,12 +73,12 @@
                         <li class="nav-item" data-original-title="分享" data-placement="right" data-toggle="tooltip">
                             <a class="nav-link" href="#pm_share" id="tab_pm_share" data-toggle="tab"><i class="fa fa-share-alt"></i></a>
                         </li>
-                        <li class="nav-item" data-original-title="协同工作" data-placement="right" data-toggle="tooltip">
+                        <!--<li class="nav-item" data-original-title="协同工作" data-placement="right" data-toggle="tooltip">
                             <a class="nav-link" href="javascript:void(0);"><i class="fa fa-users"></i></a>
                         </li>
                         <li class="nav-item" data-original-title="归档" data-placement="right" data-toggle="tooltip">
                             <a class="nav-link" href="javascript:void(0);"><i class="fa fa-book"></i></a>
-                        </li>
+                        </li>-->
                         <li class="nav-item" data-original-title="回收站" data-placement="right" data-toggle="tooltip">
                             <a class="nav-link" href="#pm_gc" id="tab_pm_gc" data-toggle="tab"><i class="fa fa-trash"></i></a>
                         </li>

+ 3 - 3
web/building_saas/pm/js/pm_gc.js

@@ -615,10 +615,10 @@ function v_getMoBody(type, oprNode, nodes){
         }
         else {
             if(oprNode.data.projType === projectType.project){
-                html += '<p><i class="fa fa-cubes"></i> ' + oprNode.data.name + '下的单位工程都将恢复都将恢复,恢复后将重命名为</p>';
+                html += '<p><i class="fa fa-cubes"></i> ' + oprNode.data.name + '下的单位工程都将恢复,恢复后将重命名为</p>';
             }
             else if(oprNode.data.projType === projectType.engineering){
-                html += '<p><i class="fa fa-cube"></i> ' + oprNode.data.name + '下的单位工程都将恢复都将恢复,恢复后将重命名为</p>';
+                html += '<p><i class="fa fa-cube"></i> ' + oprNode.data.name + '下的单位工程都将恢复,恢复后将重命名为</p>';
             }
             html += ('<p>');
             for(let i = 0, len = nodes.length; i < len; i++){
@@ -650,7 +650,7 @@ function v_getFiles(type, files, tenders, opr = null){
         return false;
     }
     for(let i = 0, len = files.length; i < len; i ++){
-        let recName = type === fileType.unitPriceFile ?  files[i].name + '单价文件' : files[i].name + '费率文件';
+        let recName = type === fileType.unitPriceFile ?  files[i].name : files[i].name;
         let fileId = type === fileType.unitPriceFile ? files[i].id : files[i].ID;
         let recTimeA = formatDate(new Date(files[i].deleteInfo.deleteDateTime), 'yyyy-MM-dd');
         let recTimeB = formatDate(new Date(files[i].deleteInfo.deleteDateTime), 'HH:mm:ss');

+ 3 - 0
web/building_saas/pm/js/pm_newMain.js

@@ -292,6 +292,9 @@ const projTreeObj = {
                         $('#share').modal('show');
                         $('#allowCopy').prop('checked', false);
                         $('#allowCopyHint').hide();
+                        setTimeout(function () {
+                            $('#sharePhone').focus();
+                        }, 200);
                     }
                 },
                 "spr3": '--------',

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

@@ -58,11 +58,11 @@
                     <a class="dropdown-item" href="#">关于</a>
                 </div>
             </li>
-            <li class="nav-item">
+          <!--  <li class="nav-item">
                 <a class="nav-link <% if (unreadCount > 0) { %>new-msg<% } %>" id="notify-info" data-toggle="modal" data-target="#msg" href="javacript:void(0);">
                     <i class="fa fa-envelope-o" aria-hidden="true"></i>&nbsp;<span id="unread-num"><%= unreadCount %></span>
                 </a>
-            </li>
+            </li>-->
         </ul>
     </div>
 </nav>
@@ -149,4 +149,6 @@
 <script type="text/javascript" src="/public/web/PerfectLoad.js"></script>
 <script type="text/javascript" src="/lib/lodash/lodash.js"></script>
 <script type="text/javascript" src="/public/web/commonAlert.js"></script>
+<script type="text/javascript" src="/lib/jquery-editable-select/jquery.editable-select.min.js"></script>
+
 <!-- endinject -->

BIN
web/dest/css/img/block.png


BIN
web/dest/css/img/blocklib.png


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

@@ -14,7 +14,7 @@
 <body>
     <div class="container">
         <form class="form-signin" method="post" onsubmit="return false">
-            <h1 class="d-flex justify-content-center">Smartcost</h1>
+            <h1 class="d-flex justify-content-center">纵横云计价</h1>
             <h4 class="d-flex justify-content-center mb-2">用户登录</h4>
             <div class="form-group">
                 <input id="inputEmail" class="form-control " name="inputEmail" placeholder="通行账号 邮箱/手机" autofocus="" />

+ 5 - 90
web/users/html/user-buy.html

@@ -88,9 +88,9 @@
                                         <li class="list-group-item d-flex justify-content-between">
                                             <%= compilation.name %>
                                             <% if (compilation.isUpgrade === undefined || compilation.isUpgrade !== true) { %>
-                                            <a class="btn btn-primary btn-sm" href="activ" data-toggle="modal" data-target="#activ">立即激活</a>
+                                            <a href="javascript:void(0);" class="btn btn-primary btn-sm getcategory" data-upgrade="<%= compilation.isUpgrade %>" data-category="<%= compilation.categoryID %>">立即激活</a>
                                             <% } else { %>
-                                            <a class="btn btn-outline-secondary btn-sm" href="activ2" data-toggle="modal" data-target="#activ2"><i class="fa fa-check"></i> 已激活</a>
+                                            <a href="javascript:void(0);" class="btn btn-outline-secondary btn-sm getcategory" data-title="<%= compilation.name %>" data-upgrade="<%= compilation.isUpgrade %>" data-category="<%= compilation.categoryID %>"><i class="fa fa-check"></i> 已激活</a>
                                             <% } %>
                                         </li>
                                         <% }) %>
@@ -108,18 +108,18 @@
             </div>
         </div>
     </div>
-    <!--激活产品-->
+    <!--激活产品 & 售后服务-->
     <div class="modal fade" id="activ" data-backdrop="static" style="display: none;" aria-hidden="true">
         <div class="modal-dialog modal-lg" role="document">
             <div class="modal-content">
                 <div class="modal-header">
-                  <h5 class="modal-title">联系销售代表激活</h5>
+                  <h5 class="modal-title" id="upgrade-title">联系销售代表激活</h5>
                   <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                     <span aria-hidden="true">×</span>
                   </button>
                 </div>
                 <div class="modal-body">
-                  <div class="row px-3">
+                  <div class="row px-3" id="staffList">
                     <div class="col-4 mb-4">
                       <div class="card">
                         <div class="card-body">
@@ -206,91 +206,6 @@
             </div>
         </div>
     </div>
-    <!--售后服务-->
-    <div class="modal fade" id="activ2" data-backdrop="static" style="display: none;" aria-hidden="true">
-        <div class="modal-dialog modal-lg" role="document">
-            <div class="modal-content">
-                <div class="modal-header">
-                  <h5 class="modal-title">重庆(2015)售后服务</h5>
-                  <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                    <span aria-hidden="true">×</span>
-                  </button>
-                </div>
-                <div class="modal-body">
-                  <div class="row px-3">
-                    <div class="col-4 mb-4">
-                      <div class="card">
-                        <div class="card-body">
-                          <h4 class="card-title">王星植</h4>
-                          <h6 class="card-subtitle mb-2 text-muted">重庆办</h6>
-                        </div>
-                        <ul class="list-group list-group-flush">
-                          <li class="list-group-item" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="腾讯QQ"><i class="fa fa-qq"></i> 914630468</li>
-                          <li class="list-group-item" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="手机号码"><i class="fa fa-tablet"></i> 15812644017</li>
-                          <li class="list-group-item" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="固定电话"><i class="fa fa-phone"></i> 0756-3850891</li>
-                        </ul>
-                      </div>
-                    </div>
-                    <div class="col-4 mb-4">
-                      <div class="card">
-                        <div class="card-body">
-                          <h4 class="card-title">张文远</h4>
-                          <h6 class="card-subtitle mb-2 text-muted">重庆办</h6>
-                        </div>
-                        <ul class="list-group list-group-flush">
-                          <li class="list-group-item" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="腾讯QQ"><i class="fa fa-qq"></i> 914630468</li>
-                          <li class="list-group-item" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="手机号码"><i class="fa fa-tablet"></i> 15812644017</li>
-                          <li class="list-group-item" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="固定电话"><i class="fa fa-phone"></i> 0756-3850891</li>
-                        </ul>
-                      </div>
-                    </div>
-                    <div class="col-4 mb-4">
-                      <div class="card">
-                        <div class="card-body">
-                          <h4 class="card-title">李清学</h4>
-                          <h6 class="card-subtitle mb-2 text-muted">重庆办</h6>
-                        </div>
-                        <ul class="list-group list-group-flush">
-                          <li class="list-group-item" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="腾讯QQ"><i class="fa fa-qq"></i> 914630468</li>
-                          <li class="list-group-item" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="手机号码"><i class="fa fa-tablet"></i> 15812644017</li>
-                          <li class="list-group-item" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="固定电话"><i class="fa fa-phone"></i> 0756-3850891</li>
-                        </ul>
-                      </div>
-                    </div>
-                    <div class="col-4 mb-4">
-                      <div class="card">
-                        <div class="card-body">
-                          <h4 class="card-title">周洪波</h4>
-                          <h6 class="card-subtitle mb-2 text-muted">重庆办</h6>
-                        </div>
-                        <ul class="list-group list-group-flush">
-                          <li class="list-group-item" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="腾讯QQ"><i class="fa fa-qq"></i> 914630468</li>
-                          <li class="list-group-item" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="手机号码"><i class="fa fa-tablet"></i> 15812644017</li>
-                          <li class="list-group-item" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="固定电话"><i class="fa fa-phone"></i> 0756-3850891</li>
-                        </ul>
-                      </div>
-                    </div>
-                    <div class="col-4 mb-4">
-                      <div class="card">
-                        <div class="card-body">
-                          <h4 class="card-title">邹芝达</h4>
-                          <h6 class="card-subtitle mb-2 text-muted">重庆办</h6>
-                        </div>
-                        <ul class="list-group list-group-flush">
-                          <li class="list-group-item" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="腾讯QQ"><i class="fa fa-qq"></i> 914630468</li>
-                          <li class="list-group-item" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="手机号码"><i class="fa fa-tablet"></i> 15812644017</li>
-                          <li class="list-group-item" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="固定电话"><i class="fa fa-phone"></i> 0756-3850891</li>
-                        </ul>
-                      </div>
-                    </div>
-                  </div>
-                </div>
-                <div class="modal-footer">
-                  <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
-                </div>
-            </div>
-        </div>
-    </div>
     <!-- JS. -->
   <script src="/web/building_saas/js/global.js"></script>
   <script src="/web/users/js/user.js"></script>

+ 43 - 0
web/users/js/user.js

@@ -16,6 +16,49 @@ $(document).ready(function() {
     $("input").blur(function () {
         cleanError();
     });
+
+    //获取cld接口手机号码和数据
+    $('.getcategory').on('click', function () {
+        let category = $(this).attr('data-category');
+        let isupgrade = $(this).attr('data-upgrade');
+        if (isupgrade === 'true') {
+            $('#upgrade-title').text($(this).attr('data-title') + ' 售后服务');
+        } else {
+            $('#upgrade-title').text('联系销售代表激活');
+        }
+        $.ajax({
+            type: 'get',
+            url: '/cld/getCategoryStaff?category=' + category,
+            dataType: 'json',
+            timeout: 5000,
+            success: function (response) {
+                if (response.error !== 0) {
+                    alert('获取CLD人员信息失败!');
+                } else {
+                    let staffList = response.data;
+                    let staffhtml = '';
+                    $.each(staffList, function (key, staff) {
+                        staffhtml += '<div class="col-4 mb-4"> ' +
+                            '<div class="card"> ' +
+                            '<div class="card-body"> ' +
+                            '<h4 class="card-title">' + staff.username + '</h4> ' +
+                            '<h6 class="card-subtitle mb-2 text-muted">' + staff.category + '</h6> ' +
+                            '</div> ' +
+                            '<ul class="list-group list-group-flush"> ' +
+                            '<li class="list-group-item" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="腾讯QQ"><i class="fa fa-qq"></i> ' + staff.qq + '</li> ' +
+                            '<li class="list-group-item" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="手机号码"><i class="fa fa-tablet"></i> ' + staff.telephone + '</li> ' +
+                            '<li class="list-group-item" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="固定电话"><i class="fa fa-phone"></i> ' + staff.phone + '</li> ' +
+                            '</ul> </div> </div>';
+                    });
+                    $('#staffList').html(staffhtml);
+                    $('#activ').modal('show');
+                }
+            },
+            error: function () {
+                console.log('请求超时');
+            }
+        })
+    })
 });
 
 /**