Selaa lähdekoodia

Merge branch '1.0.0_online' of http://smartcost.f3322.net:3000/SmartCost/ConstructionCost into 1.0.0_online

zhongzewei 7 vuotta sitten
vanhempi
commit
5c8c80106f

+ 1 - 0
config/gulpConfig.js

@@ -124,6 +124,7 @@ module.exports = {
         'web/building_saas/main/js/views/std_billsGuidance_lib.js',
         'web/building_saas/main/js/views/std_bills_lib.js',
         'web/building_saas/main/js/views/std_ration_lib.js',
+        'web/building_saas/main/js/views/block_lib.js',
         'web/building_saas/main/js/models/quantity_detail.js',
         'web/building_saas/main/js/views/glj_view_contextMenu.js',
         'web/building_saas/main/js/views/calc_program_view.js',

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

@@ -269,7 +269,7 @@ module.exports = {
             billValuation: JSON.stringify(billValuation),
             rationValuation: JSON.stringify(rationValuation),
             engineeringList: JSON.stringify(engineering.List),
-            versionName: sessionCompilation.name + '免费版',
+            versionName: sessionCompilation.name + request.session.compilationVersion,
             LicenseKey:config.getLicenseKey(process.env.NODE_ENV)
         };
 

+ 5 - 1
modules/users/controllers/boot_controller.js

@@ -24,11 +24,15 @@ class BootController extends BaseController {
         let sessionUser = request.session.sessionUser;
         let compilationId = request.params.compilation;
         let sessionCompilation = request.session.sessionCompilation;
+        let compilationVersion = request.session.compilationVersion;
 
         // 判断是否有存入编办信息
         if (sessionCompilation === undefined && compilationId !== '') {
             let compilationModel = new CompilationModel();
             let compilationData = await compilationModel.getCompilationById(compilationId);
+            // 判断当前用户的是使用免费版还是专业版
+            compilationVersion = await userModel.getVersionFromUpgrade(sessionUser.ssoId, compilationId);
+            request.session.compilationVersion = compilationVersion;
             request.session.sessionCompilation = compilationData;
             if(sessionUser.latest_used !== compilationId) userModel.updateLatestUsed(sessionUser.id,compilationId);
         }
@@ -44,7 +48,7 @@ class BootController extends BaseController {
             companyTypeList: userModel.companyType,
             companyScaleList: userModel.companyScale,
             compilation: request.params.compilation,
-            versionName: request.session.sessionCompilation.name + '免费版'
+            versionName: request.session.sessionCompilation.name + request.session.compilationVersion
         };
         response.render('users/html/login-infoinput', renderData);
     }

+ 3 - 0
modules/users/controllers/login_controller.js

@@ -89,6 +89,9 @@ class LoginController {
             if (preferenceSetting.login_ask === 0 && !sessionCompilation &&
                 preferenceSetting.select_version !== '') {
                 let compilationData = await compilationModel.getCompilationById(preferenceSetting.select_version);
+                // 判断当前用户的是使用免费版还是专业版
+                let compilationVersion = await userModel.getVersionFromUpgrade(sessionUser.ssoId, preferenceSetting.select_version);
+                request.session.compilationVersion = compilationVersion;
                 request.session.sessionCompilation = compilationData;
                 if(request.session.sessionUser.latest_used !== preferenceSetting.select_version) await userModel.updateLatestUsed(request.session.sessionUser.id,preferenceSetting.select_version);
             }

+ 49 - 4
modules/users/controllers/user_controller.js

@@ -38,7 +38,7 @@ class UserController extends BaseController {
             provinceList: userModel.province,
             companyTypeList: userModel.companyType,
             companyScaleList: userModel.companyScale,
-            versionName: request.session.sessionCompilation.name + '免费版'
+            versionName: request.session.sessionCompilation.name + request.session.compilationVersion
         };
         response.render('users/html/user-info', renderData);
     }
@@ -119,12 +119,54 @@ class UserController extends BaseController {
             userData: userData,
             logList: logList,
             pages: pageData,
-            versionName: request.session.sessionCompilation.name + '免费版'
+            versionName: request.session.sessionCompilation.name + request.session.compilationVersion
         };
         response.render('users/html/user-safe', renderData);
     }
 
     /**
+     * 产品激活页面
+     *
+     * @param request
+     * @param response
+     * @return {void}
+     */
+    async buy(request, response) {
+        let userData = [];
+        let compilationList = [];
+        try {
+            // 获取编办信息
+            let compilationModel = new CompilationModel();
+            compilationList = await compilationModel.getList();
+
+            // 获取当前用户信息
+            let sessionUser = request.session.sessionUser;
+            let userModel = new UserModel();
+            userData = await userModel.findDataBySsoId(sessionUser.ssoId);
+            if (userData.upgrade_list !== undefined) {
+                let userUpgradeList = userData.upgrade_list;
+                for (let index in userUpgradeList) {
+                    let oneCompilationIndex = compilationList.findIndex(function (item) {
+                        return item.id === userUpgradeList[index].compilationID;
+                    });
+                    if (oneCompilationIndex !== -1) {
+                        compilationList[oneCompilationIndex].isUpgrade = userUpgradeList[index].isUpgrade;
+                    }
+                }
+            }
+        } catch(error) {
+            console.log(error);
+        }
+
+        let renderData = {
+            userData: userData,
+            compilationList: compilationList,
+            versionName: request.session.sessionCompilation.name + request.session.compilationVersion
+        };
+        response.render('users/html/user-buy', renderData);
+    }
+
+    /**
      * 偏好设置页面
      *
      * @param {object} request
@@ -151,7 +193,7 @@ class UserController extends BaseController {
         let renderData = {
             preferenceSetting: preferenceSetting,
             compilationList: compilationList,
-            versionName: request.session.sessionCompilation.name + '免费版'
+            versionName: request.session.sessionCompilation.name + request.session.compilationVersion
         };
         response.render('users/html/user-set', renderData);
     }
@@ -185,7 +227,10 @@ class UserController extends BaseController {
                 // 查找对应编办
                 let compilationModel = new CompilationModel();
                 let compilationData = await compilationModel.getCompilationById(selectVersion);
-
+                // 判断当前用户的是使用免费版还是专业版
+                let userModel = new UserModel();
+                let compilationVersion = await userModel.getVersionFromUpgrade(sessionUserData.ssoId, compilationData._id);
+                request.session.compilationVersion = compilationVersion;
                 request.session.sessionCompilation = compilationData;
             }
         } catch (error) {

+ 21 - 0
modules/users/models/user_model.js

@@ -228,6 +228,27 @@ class UserModel extends BaseModel {
         return await this.db.findOneAndUpdate({_id: userObjId}, {$pull: {versionInfo: {compilationId: compilationId}}});
     }
 
+    /**
+     * 判断用户使用免费版还是专业版
+     *
+     * @param ssoId
+     * @param compilationId
+     * @return {version}
+     */
+    async getVersionFromUpgrade(ssoId, compilationId){
+        let version = '免费版';
+        let userData = await this.findDataBySsoId(ssoId);
+        if (userData.upgrade_list !== undefined) {
+            let compilationInfo = userData.upgrade_list.find(function (item) {
+                return item.compilationID === compilationId;
+            });
+            if (compilationInfo !== undefined && compilationInfo.isUpgrade === true) {
+                version = '专业版';
+            }
+        }
+        return version;
+    }
+
 }
 
 export default UserModel;

+ 1 - 0
modules/users/routes/user_route.js

@@ -16,6 +16,7 @@ module.exports = function (app) {
 // action定义区域
     router.get('/info', userController.init, userController.info);
     router.get('/safe', userController.init, userController.safe);
+    router.get('/buy', userController.init, userController.buy);
     router.get('/preferences', userController.init, userController.preferences);
     router.post('/save-preferences', userController.init, userController.savePreferences);
     router.post('/info', userController.init, userController.saveData);

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

@@ -335,6 +335,19 @@ var sheetCommonObj = {
         };
         return new CustomerCoeCellType();
     },
+    scrollSheetForOption:function (sheet,cxt,cellRect,row,options){
+        let topRow = sheet.getViewportTopRow(1);
+        if(row == topRow) return;//已经是最顶行了
+        let length = options&&options.length>0?options.length:1;
+        let height = cxt.canvas.height;
+        let startY = cellRect.y+cellRect.height;//下拉框的起始显示位置
+        let endY =  startY + length * cellRect.height;//下拉框的结束显示位置
+        if(endY <= height) return;  //如果没有超出显示位置,直接返回
+        let overRow =  Math.ceil((endY - height)/cellRect.height);//超出的行数
+        let showRow = topRow + overRow > row?row:topRow + overRow;
+        sheet.showRow(showRow, GC.Spread.Sheets.VerticalPosition.top);
+
+    },
     setSelectButton(row,col,sheet,header){
         let getSelectButton = function (cellWidth=100) {
             function moreButton() {

+ 24 - 0
web/building_saas/main/html/main.html

@@ -112,6 +112,9 @@
                           <li class="nav-item">
                               <a class="nav-link px-3" href="javascript:void(0)" id="stdRationTab" relaPanel="#de">定额库</a>
                           </li>
+<!--                          <li class="nav-item">
+                              <a class="nav-link px-3" href="javascript:void(0)" id="blockLibTab" relaPanel="#kmbk">块模板库</a>
+                          </li>-->
                       </ul>
                   </div>
               </div>
@@ -455,6 +458,26 @@
                                       <div class="main-data-bottom" id="stdSectionRations"></div>
                                   </div>
                               </div>
+                              <!--块模板库-->
+                              <div class="tab-pane" id="kmbk">
+                                  <div class="tools-bar-height-d container-fluid">
+                                      <div class="p-1 row">
+                                          <button id="btn_block_collapse" class="btn btn-primary btn-sm" type="button">展开/折叠</button>
+                                          <button id="btn_block_newFolder" class="btn btn-primary btn-sm" type="button">新建分类</button>
+                                          <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="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="main-data-bottom" id="div_block_detail">
+
+                                      </div>
+                                  </div>
+                              </div>
                           </div>
                       </div>
                   </div>
@@ -1552,6 +1575,7 @@
     <script type="text/javascript" src="/web/building_saas/main/js/views/std_billsGuidance_lib.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/views/std_bills_lib.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/views/std_ration_lib.js"></script>
+    <script type="text/javascript" src="/web/building_saas/main/js/views/block_lib.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/models/quantity_detail.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/views/glj_view_contextMenu.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/views/calc_program_view.js"></script>

+ 186 - 0
web/building_saas/main/js/views/block_lib.js

@@ -0,0 +1,186 @@
+/**
+ * Created by CSL on 2018-09-19.
+ */
+var blockLibObj = {
+    datas: [],
+    mainSpread: null,
+    mainSheet: null,
+    mainSetting: {
+        header:[
+            {headerName:"名称",headerWidth:400,dataCode:"name", dataType: "String"}
+        ],
+        view:{
+            comboBox:[],
+            lockColumns:[],
+            colHeaderHeight: CP_Col_Width.colHeader,
+            rowHeaderWidth: CP_Col_Width.rowHeader
+        }
+    },
+    buildSheet: function (){
+        let me = this;
+        me.datas = [];
+        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.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']]);
+                }
+            }
+        };
+        sheet.suspendPaint();
+        sheet.suspendEvent();
+        fuc();
+        sheet.resumePaint();
+        sheet.resumeEvent();
+    },
+    initTree: function (collapse) {
+        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;
+                }
+            }
+        }
+    },
+    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);
+            }
+            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);
+            }
+            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;
+                }
+                arguments[2] = x + offset;
+                arguments[4] = w - offset;
+                GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
+
+            }
+        };
+        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);
+                    hitinfo.sheet.invalidateLayout();
+                    hitinfo.sheet.repaint();
+                }
+            }
+        };
+        return new TreeNodeCellType();
+    }
+};
+
+$(document).ready(function(){
+/*    if (!blockLibObj.mainSpread){
+        blockLibObj.buildSheet();
+        blockLibObj.showData();
+    }*/
+
+});

+ 11 - 4
web/building_saas/main/js/views/glj_view.js

@@ -404,6 +404,7 @@ var gljOprObj = {
     rationGLJEditCheck:function (args) {//true 可以编辑,false 不能编辑
         var me = gljOprObj;
         var header = me.setting.header;
+        if(me.sheet.getTag(args.row,args.col)=="locked") return false;//如果是双击树节点编号里设置了锁定标记,不能编辑
         if (_.includes(me.setting.view.lockColumns, args.col))  return false;//如果是锁定的列,不能编辑
         if(me.sheetData[args.row] != undefined){
             if(me.sheetData[args.row].isMixRatio){//对于组成物列
@@ -1277,6 +1278,7 @@ var gljOprObj = {
         let margin = 3;
 
         function TreeNodeCellType() {
+            this.ctx = null;
         }
         function drowRect(ctx, x, y, w, h) {
             ctx.save();
@@ -1328,9 +1330,9 @@ var gljOprObj = {
             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;
             if (style.backColor) {//先画背景色
                 ctx.save();
                 ctx.fillStyle = style.backColor;
@@ -1387,8 +1389,13 @@ var gljOprObj = {
                     return;
                 }
             }
-            GC.Spread.Sheets.CellTypes.ComboBox.prototype.processMouseDown.apply(this, arguments);
-           // GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
+            if(comboboxOptions&&hitinfo.x > hitinfo.cellRect.x+hitinfo.cellRect.width -15){//点击了下拉框按钮,这里要判断下拉框是否会被挡住,从而决定是否自动调整滚动条
+                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();
         if(comboboxOptions){
@@ -1409,7 +1416,7 @@ var gljOprObj = {
     locateZTree: function(ID) {
         let zTree = $.fn.zTree.getZTreeObj("gljTree");
         let node = null;
-        if (ID) node = zTree.getNodesByParam('ID', ID, null)[0]
+        if (ID) node = zTree.getNodesByParam('ID', ID, null)[0];
         if (!node) node = zTree.getNodeByTId('gljTree_1');
         zTree.selectNode(node);
         gljOprObj.gljCurTypeId = ID;

+ 13 - 12
web/building_saas/main/js/views/project_glj_view.js

@@ -1208,19 +1208,20 @@ $(function () {
             // 从其他项目中复制
             changeUnitPriceId = $("#other-file").val();
             let newName = $("#other-file").children("option:selected").text();
-            let currentOption = _.find(projectGljObject.changeInfo.self,{name:newName});
-            if(currentOption){ //存在则说明有重名的文件
-                //rename-unitFile
-                $("#rename-unitFile").modal({show:true});
-                $("#newUnitFileID").val(changeUnitPriceId);
-                $("#newUnitFileName").val(newName);
-                return;
-            }
+            projectObj.project.projectGLJ.checkUnitFileName(newName,function (need_rename) {
+                if(need_rename){
+                    $("#rename-unitFile").modal({show:true});
+                    $("#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();
+                    })
+                }
+            });
         }
-        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 () {

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

@@ -660,7 +660,17 @@ var projectObj = {
             function getPasteTextArr(info) {
                 let copyText = info.pasteData.text.trim();
                 if (!copyText) return null;
-                let rows = copyText.split('\r\n');
+                let spliter = '';
+                if (copyText.includes('\r\n')){
+                    spliter = '\r\n'
+                }
+                else if (copyText.includes('\n')){      // 兼容Unix、Mac 等系统回车换行符
+                    spliter = '\n'
+                }
+                else{
+                    spliter = '\r'
+                };
+                let rows = copyText.split(spliter);
                 let rstArr = [];
                 for (let row of rows) {
                     row = row.trim();

+ 45 - 5
web/building_saas/main/js/views/quantity_edit_view.js

@@ -41,11 +41,19 @@ let quantityEditObj = {
     },
     onCellDoubleClick:function (e,info) {
         if(quantityEditObj.datas[info.row]){
-            let oldVal = $("#quantityEXPValue").val();
-            $("#quantityEXPValue").val(oldVal+quantityEditObj.datas[info.row].code);
             $("#quantityEXPValue").focus();
+            quantityEditObj.setToQuantityEXP(quantityEditObj.datas[info.row].code);
+            quantityEditObj.spread.focus(false);
         }
     },
+    setToQuantityEXP:function (value) {
+        let oldVal = $("#quantityEXPValue").val();
+        let startIndex = getCursor($("#quantityEXPValue")[0]);//取光标位置
+        let strartString = oldVal.substring(0,startIndex);
+        let endString = oldVal.substring(startIndex);
+        $("#quantityEXPValue").val(strartString+value+endString);
+        setCursor($("#quantityEXPValue")[0],startIndex+value.length);//设置回光标位置
+    },
     getQuantityEditCellType:function () {
         var ns = GC.Spread.Sheets;
         function QuantityEditCellType() {
@@ -248,14 +256,15 @@ let quantityEditObj = {
 };
 $(function(){
     $('#quantityEXPEdit').on('shown.bs.modal', function (e) {
+        projectObj.mainSpread.focus(false);
         quantityEditObj.initSpread();
+        $("#quantityEXPValue").focus();
     });
 
     $('#operation_p').children("button").bind('click',function (){
-        let oldVal = $("#quantityEXPValue").val();
-        $("#quantityEXPValue").val(oldVal+$(this).text());
+        quantityEditObj.setToQuantityEXP($(this).text());
         $("#quantityEXPValue").focus();
-    })
+    });
 
     $("#quantityEditConf").bind('click',function () {
         let selected = projectObj.project.mainTree.selected;
@@ -264,6 +273,37 @@ $(function(){
             $("#quantityEXPEdit").modal('hide');
         }
     })
+    $('#quantityEXPEdit').bind('keypress', function (event) {
+        if(event.keyCode === 13){
+            $("#quantityEditConf").click();
+            event.preventDefault();
+        }
 
+    });
 
 });
+
+function getCursor(elem) {
+    //IE 9 ,10,其他浏览器
+    if (elem.selectionStart !== undefined) {
+        return elem.selectionStart;
+    } else { //IE 6,7,8
+        var range = document.selection.createRange();
+        range.moveStart("character", -elem.value.length);
+        var len = range.text.length;
+        return len;
+    }
+}
+
+function setCursor(elem, index) {
+    //IE 9 ,10,其他浏览器
+    if (elem.selectionStart !== undefined) {
+        elem.selectionStart = index;
+        elem.selectionEnd = index;
+    } else { //IE 6,7,8
+        var range = elem.createTextRange();
+        range.moveStart("character", -elem.value.length); //左边界移动到起点
+        range.move("character", index); //光标放到index位置
+        range.select();
+    }
+}

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

@@ -31,7 +31,7 @@
                 <a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown"><%= sessionUser.real_name === '' ? sessionUser.mobile : sessionUser.real_name %></a>
                 <div class="dropdown-menu dropdown-menu-right">
                     <a class="dropdown-item" href="/user/info" target="_blank">账号资料</a>
-                    <a class="dropdown-item" href="user-buy.html" target="_blank">产品购买</a>
+                    <a class="dropdown-item" href="/user/buy" target="_blank">产品激活</a>
                     <a class="dropdown-item" href="/user/preferences" target="_blank">登录设置</a>
                     <div class="dropdown-divider"></div>
                     <a class="dropdown-item" href="/logout">退出登录</a>

+ 302 - 0
web/users/html/user-buy.html

@@ -0,0 +1,302 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+    <meta http-equiv="x-ua-compatible" content="ie=edge">
+    <title>产品激活-纵横云计价</title>
+    <link rel="stylesheet" href="/lib/bootstrap/css/bootstrap.min.css">
+    <link rel="stylesheet" href="/web/building_saas/css/main.css">
+    <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
+</head>
+
+<body>
+  <div class="header">
+      <%include ../../common/html/header.html %>
+  </div>
+    <div class="main">
+        <div class="poj-manage container-fluid">
+            <div class="row">
+                <div class="col-lg-2">
+                    <div class="mt-3">
+                        <ul class="nav nav-pills flex-column">
+                            <li class="nav-item">
+                                <a class="nav-link" href="/user/info">账号资料</a>
+                            </li>
+                            <li class="nav-item">
+                                <a class="nav-link" href="/user/safe">账号安全</a>
+                            </li>
+                            <li class="nav-item">
+                                <a class="nav-link active" href="/user/buy">产品激活</a>
+                            </li>
+                            <li class="nav-item">
+                                <a class="nav-link" href="/user/preferences">登录设置</a>
+                            </li>
+                        </ul>
+                    </div>
+                </div>
+                <div class="col-lg-10 side-content">
+                    <div class="col-lg-12 my-3">
+                        <!-- <legend>购买企业版</legend>
+                        <div class="card card-body mb-5">
+                            <h3 class="card-title">Smartcost 企业版</h3>
+                            <p class="card-text">简介</p>
+                            <a class="btn btn-primary" href="#">了解企业版</a>
+                        </div> -->
+                        <legend class=" mb-4">激活专业版</legend>
+                        <div class="row">
+                            <div class="col-sm-4 mb-5">
+                                <div class="card">
+                                  <div class=" card-body">
+                                    <h3 class="card-title">免费版 </h3>
+                                      <p class="card-text">
+                                      <ul class="pl-3">
+                                          <li>只可创建 50 个单位工程</li>
+                                          <li>报表带水印</li>
+                                      </ul>
+                                      </p>
+                                  </div>
+                                    <ul class="list-group list-group-flush">
+                                        <% if (compilationList.length > 0) {%>
+                                        <% compilationList.forEach(function(compilation) { %>
+                                        <% if (compilation.is_release === true) { %>
+                                        <li class="list-group-item d-flex justify-content-between">
+                                            <%= compilation.name %>
+                                            <a class="btn disabled btn-sm"><i class="fa fa-check"></i> 已激活</a>
+                                        </li>
+                                        <% } %>
+                                        <% }) %>
+                                        <% } %>
+                                    </ul>
+                                </div>
+                            </div>
+                            <div class="col-sm-4 mb-5">
+                                <div class="card">
+                                  <div class=" card-body">
+                                    <h3 class="card-title">专业版</h3>
+                                      <p class="card-text">
+                                      <ul class="pl-3">
+                                          <li>创建单位工程无限制</li>
+                                          <li>报表无水印</li>
+                                      </ul>
+                                      </p>
+                                  </div>
+                                    <ul class="list-group list-group-flush">
+                                        <% if (compilationList.length > 0) {%>
+                                        <% compilationList.forEach(function(compilation) { %>
+                                        <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>
+                                            <% } else { %>
+                                            <a class="btn btn-outline-secondary btn-sm" href="activ2" data-toggle="modal" data-target="#activ2"><i class="fa fa-check"></i> 已激活</a>
+                                            <% } %>
+                                        </li>
+                                        <% }) %>
+                                        <% } %>
+                                        <!--<li class="list-group-item d-flex justify-content-between">-->
+                                        <!--重庆(2015)-->
+                                        <!--<a class="btn btn-outline-secondary btn-sm" href="activ2" data-toggle="modal" data-target="#activ2"><i class="fa fa-check"></i> 已激活</a>-->
+                                        <!--</li>-->
+                                    </ul>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </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>
+                  <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 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>
+    <!--售后服务-->
+    <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>
+</body>
+<script type="text/javascript">
+    autoFlashHeight();
+</script>
+
+</html>

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

@@ -28,7 +28,7 @@
                             <a class="nav-link" href="/user/safe">账号安全</a>
                         </li>
                         <li class="nav-item">
-                            <a class="nav-link" href="/user/buy">产品购买</a>
+                            <a class="nav-link" href="/user/buy">产品激活</a>
                         </li>
                         <li class="nav-item">
                             <a class="nav-link" href="/user/preferences">登录设置</a>

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

@@ -31,7 +31,7 @@
                             <a class="nav-link active" href="/user/safe">账号安全</a>
                         </li>
                         <li class="nav-item">
-                            <a class="nav-link" href="/user/buy">产品购买</a>
+                            <a class="nav-link" href="/user/buy">产品激活</a>
                         </li>
                         <li class="nav-item">
                             <a class="nav-link" href="/user/preferences">登录设置</a>

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

@@ -29,7 +29,7 @@
                                 <a class="nav-link" href="/user/safe">账号安全</a>
                             </li>
                             <li class="nav-item">
-                                <a class="nav-link" href="/user/buy">产品购买</a>
+                                <a class="nav-link" href="/user/buy">产品激活</a>
                             </li>
                             <li class="nav-item">
                                 <a class="nav-link active" href="/user/preferences">登录设置</a>