浏览代码

Merge branch 'master' of http://smartcost.f3322.net:3000/SmartCost/ConstructionCost

Conflicts:
	modules/pm/models/project_model.js
Chenshilong 7 年之前
父节点
当前提交
87b2608496

+ 1 - 0
config/gulpConfig.js

@@ -96,6 +96,7 @@ module.exports = {
         'web/building_saas/main/js/views/project_property_decimal_view.js',
         'web/building_saas/main/js/views/project_property_basicInfo.js',
         'web/building_saas/main/js/views/project_property_projFeature.js',
+        'web/building_saas/main/js/views/project_property_display_view.js',
         'web/building_saas/main/js/main_ajax.js',
         'web/building_saas/main/js/main.js',
         'web/building_saas/main/js/controllers/project_controller.js',

+ 71 - 49
modules/glj/controllers/glj_controller.js

@@ -12,6 +12,7 @@ import UnitPriceModel from "../models/unit_price_model";
 import MixRatioModel from "../models/mix_ratio_model";
 import UnitPriceFileModel from "../models/unit_price_file_model";
 let logger = require("../../../logs/log_helper").logger;
+let consts = require('../../main/models/project_consts');
 
 const ProjectModel = require('../../pm/models/project_model').project;
 class GLJController extends BaseController {
@@ -37,59 +38,23 @@ class GLJController extends BaseController {
         // 标段id
         let projectId = request.body.project_id;
         projectId = parseInt(projectId);
-        let responseData = {
-            err: 0,
-            msg: '',
-            data: {}
-        };
-        try {
-            if (isNaN(projectId) || projectId <= 0) {
-                throw '标段id有误';
-            }
-
-            // 获取标段对应的单价文件id
-            let unitPriceFileId = await ProjectModel.getUnitPriceFileId(projectId);
-            if (unitPriceFileId <= 0) {
-                throw '没有对应的单价文件';
-            }
-
-            // 获取使用该单价文件的项目数据
-            let tenderData = await ProjectModel.getTenderByUnitPriceFileId(unitPriceFileId);
-            let usedTenderList = [];
-            let usedUnitPriceInfo = {};
-            if (tenderData !== null) {
-                for (let tmp of tenderData) {
-                    usedTenderList.push(tmp.name);
-                    usedUnitPriceInfo.name = tmp.property.unitPriceFile.name;
-                    usedUnitPriceInfo.id = tmp.property.unitPriceFile.id;
-                }
-            }
-
-            // 先获取对应标段的项目工料机数据
-            let gljListModel = new GLJListModel();
-            let [gljList, mixRatioConnectData,mixRationMap] = await gljListModel.getListByProjectId(projectId, unitPriceFileId);
-
-            responseData.data.gljList = gljList;
-            responseData.data.mixRatioConnectData = mixRatioConnectData;
-            responseData.data.mixRatioMap = mixRationMap;
-            responseData.data.usedTenderList = usedTenderList;
-            responseData.data.constData = {
-                materialIdList: gljListModel.materialIdList,
-                ownCompositionTypes: gljListModel.ownCompositionTypes,
-                hostname: request.hostname,
-                roomId: unitPriceFileId,
-                GLJTypeConst: JSON.stringify(GLJTypeConst),
-                usedUnitPriceInfo: usedUnitPriceInfo
-            };
-        } catch (error) {
-            responseData.err = 1;
-            responseData.msg = error;
-        }
-
+        let responseData = await getGLJListByProjectID(projectId);
+        responseData.hostname = request.hostname;
         response.json(responseData);
     }
 
     /**
+     * project getData 接口
+     * @param projectID
+     * @param callback
+     */
+    getData(projectID, callback){
+        getGLJListByProjectID(projectID).then(function(result){
+            callback(result.err,consts.projectConst.PROJECTGLJ,result.data);
+        })
+    }
+
+    /**
      * 更新数据
      *
      * @param {object} request
@@ -588,4 +553,61 @@ class GLJController extends BaseController {
 
 }
 
+/**
+ * 取项目工料机列表
+ * @param projectId
+ * @returns {Promise.<void>}
+ */
+async function getGLJListByProjectID(projectId){
+    let responseData = {
+        err: 0,
+        msg: '',
+        data: {}
+    };
+    try {
+        if (isNaN(projectId) || projectId <= 0) {
+            throw '标段id有误';
+        }
+
+        // 获取标段对应的单价文件id
+        let unitPriceFileId = await ProjectModel.getUnitPriceFileId(projectId);
+        if (unitPriceFileId <= 0) {
+            throw '没有对应的单价文件';
+        }
+
+        // 获取使用该单价文件的项目数据
+        let tenderData = await ProjectModel.getTenderByUnitPriceFileId(unitPriceFileId);
+        let usedTenderList = [];
+        let usedUnitPriceInfo = {};
+        if (tenderData !== null) {
+            for (let tmp of tenderData) {
+                usedTenderList.push(tmp.name);
+                usedUnitPriceInfo.name = tmp.property.unitPriceFile.name;
+                usedUnitPriceInfo.id = tmp.property.unitPriceFile.id;
+            }
+        }
+
+        // 先获取对应标段的项目工料机数据
+        let gljListModel = new GLJListModel();
+        let [gljList, mixRatioConnectData,mixRationMap] = await gljListModel.getListByProjectId(projectId, unitPriceFileId);
+
+        responseData.data.gljList = gljList;
+        responseData.data.mixRatioConnectData = mixRatioConnectData;
+        responseData.data.mixRatioMap = mixRationMap;
+        responseData.data.usedTenderList = usedTenderList;
+        responseData.data.constData = {
+            materialIdList: gljListModel.materialIdList,
+            ownCompositionTypes: gljListModel.ownCompositionTypes,
+            roomId: unitPriceFileId,
+            GLJTypeConst: JSON.stringify(GLJTypeConst),
+            usedUnitPriceInfo: usedUnitPriceInfo
+        };
+    } catch (error) {
+        console.log(error);
+        responseData.err = 1;
+        responseData.msg = error;
+    }
+    return responseData;
+}
+
 export default GLJController;

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

@@ -14,6 +14,8 @@ let projSetting = require('./proj_setting_model');
 // let volumePriceData = require('../../volume_price/models/volume_price_model');
 var labour_coe_facade = require('../facade/labour_coe_facade');
 var calc_program_facade = require('../facade/calc_program_facade');
+import GLJController from "../../glj/controllers/glj_controller";
+
 
 const ProjectModel = require('../../pm/models/project_model').project;
 import GLJListModel from "../../glj/models/glj_list_model";
@@ -37,6 +39,7 @@ moduleMap[projSetting.collectionName] = projSetting;
 moduleMap[projectConsts.FEERATE] = fee_rate_data;
 moduleMap[projectConsts.LABOUR_COE] = labour_coe_facade;
 moduleMap[projectConsts.CALC_PROGRAM] = calc_program_facade;
+moduleMap[projectConsts.PROJECTGLJ] = new GLJController();
 
 var Project = function (){};
 

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

@@ -5,7 +5,7 @@ import mongoose from 'mongoose';
 import async_c from 'async';
 import UnitPriceFileModel from "../../glj/models/unit_price_file_model";
 import UnitPriceFiles from '../../glj/models/schemas/unit_price_file';
-import {defaultDecimal, billsQuantityDecimal, basicInformation, projectFeature} from './project_property_template';
+import {defaultDecimal, billsQuantityDecimal, basicInformation, projectFeature,displaySetting} from './project_property_template';
 let FeeRateFiles = mongoose.model('fee_rate_file');
 let counter = require("../../../public/counter/counter.js");
 
@@ -104,10 +104,11 @@ ProjectsDAO.prototype.updateUserProjects = async function(userId, datas, callbac
                     data.updateData.property.basicInformation = basicInformation;
                     //工程特征
                     data.updateData.property.projectFeature = projectFeature;
-
+                    //呈现选项
+		    data.updateData.property.displaySetting = displaySetting;
+		    
                     data.updateData.property.billsCalcMode = 0;
-                    data.updateData.property.zanguCalcMode = 0;
-
+		    data.updateData.property.zanguCalcMode = 0;
                 }
                 newProject = new Projects(data.updateData);
                 // 查找同级是否存在同名数据

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

@@ -11,6 +11,10 @@ const defaultDecimal = {
     quantity_detail: 4,
     process: 6
 };
+const displaySetting = {
+    autoHeight:true,
+    disPlayMainMateria:true
+}
 
 /*
 * 单位工程清单工程量精度模板
@@ -119,4 +123,4 @@ const projectFeature = [
     {dispName: '门窗材料及装饰', key: 'doorsWindowsMaterial', value: ''}
 ];
 
-export {defaultDecimal, billsQuantityDecimal, basicInformation, projectFeature};
+export {defaultDecimal, billsQuantityDecimal, basicInformation, projectFeature,displaySetting};

文件差异内容过多而无法显示
+ 2 - 2
public/web/PerfectLoad.js


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

@@ -98,7 +98,9 @@ var sheetCommonObj = {
 
         sheet.clear(0, 0, sheet.getRowCount(), sheet.getColumnCount(), GC.Spread.Sheets.SheetArea.viewport, GC.Spread.Sheets.StorageType.data);
         if(sheet.getRowCount()<data.length){
-            data.length<30?  sheet.setRowCount(30):sheet.setRowCount(data.length);
+            data.length<30? sheet.setRowCount(30):sheet.setRowCount(data.length);
+        }else if(sheet.getRowCount()==0){
+            sheet.setRowCount(30);
         }
         for (var col = 0; col < setting.header.length; col++) {
             var hAlign = "left", vAlign = "center";

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

@@ -316,4 +316,7 @@ body {
 }
 .dropdown-item.disabled, .dropdown-item:disabled{
   pointer-events:none
+}
+.text-green{
+    color:#00FF00
 }

+ 3 - 3
web/building_saas/glj/js/project_glj_spread.js

@@ -48,9 +48,9 @@ ProjectGLJSpread.prototype.init = function () {
         {name: 'ID', field: 'id', visible: false},
         {name: '类型', field: 'unit_price.type', visible: false},
         {name: '总消耗量', field: 'quantity', visible: true,width:100},
-        {name: '基价单价', field: "unit_price.base_price", visible: true,width:70},
-        {name: '调整价', field: 'adjust_price', visible: true,width:70},
-        {name: '市场价', field: "unit_price.market_price", visible: true, validator: 'number',width:70},
+        {name: '定额价', field: "unit_price.base_price", visible: true,width:70},
+        {name: '调整价', field: 'adjust_price', visible: true,width:70},
+        {name: '市场价', field: "unit_price.market_price", visible: true, validator: 'number',width:70},
         {
             name: '是否暂估',
             field: 'is_evaluate',

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

@@ -47,3 +47,34 @@ $(function () {
     });
 
 });
+
+/**
+ * 设置本地缓存
+ *
+ * @param {String} key
+ * @param {String|Number} value
+ * @return {void}
+ */
+function setLocalCache(key, value) {
+    const storage = window.localStorage;
+    if (!storage || key === '' || value === '') {
+        return;
+    }
+
+    storage.setItem(key, value);
+}
+
+/**
+ * 获取本地缓存
+ *
+ * @param {String} key
+ * @return {String}
+ */
+function getLocalCache(key) {
+    const storage = window.localStorage;
+    if (!storage || key === '') {
+        return null;
+    }
+
+    return storage.getItem(key);
+}

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

@@ -235,6 +235,7 @@
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-billsQuanDecimal" id="tab_poj-settings-bqDecimal" role="tab">清单工程量精度</a></li>
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-decimal" role="tab" id="tab_poj-settings-decimal">小数位数</a></li>
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-6" role="tab" id="tab_poj-settings-6">人工单价调整</a></li>
+                                <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#display_setting" role="tab" id="tab_display_setting">呈现选项</a></li>
                             </ul>
                         </div>
                         <div class="col-9">
@@ -383,6 +384,24 @@
                                     <div style="height:8px;"></div>
                                     <div class="modal-auto-height" id="labourCoeSpread"></div>
                                 </div>
+                                <!--人工单价调整-->
+                                <div class="tab-pane fade" id="display_setting" role="tabpanel">
+                                    <fieldset class="form-group">
+                                        <div class="row px-3">
+                                            <div class="checkbox">
+                                                <label class="form-check-label">
+                                                    <input type="checkbox" id="autoHeight" class="form-check-input">造价书表格自动调整行高
+                                                </label>
+                                            </div>
+                                        </div>
+                                        <div style="height:8px;"></div>
+                                        <div class="checkbox">
+                                            <label class="form-check-label">
+                                                <input type="checkbox" id="disPlayMainMateria" class="form-check-input">定额下显示主村、设备
+                                            </label>
+                                        </div>
+                                    </fieldset>
+                                </div>
                             </div>
                         </div>
                     </div>
@@ -701,6 +720,7 @@
         <script type="text/javascript" src="/web/building_saas/main/js/views/project_property_decimal_view.js"></script>
         <script type="text/javascript" src="/web/building_saas/main/js/views/project_property_basicInfo.js"></script>
         <script type="text/javascript" src="/web/building_saas/main/js/views/project_property_projFeature.js"></script>
+        <script type="text/javascript" src="/web/building_saas/main/js/views/project_property_display_view.js"></script>
         <script type="text/javascript" src="/web/building_saas/main/js/main_ajax.js"></script>
         <script type="text/javascript" src="/web/building_saas/main/js/main.js"></script>
         <script type="text/javascript" src="/web/building_saas/main/js/controllers/project_controller.js"></script>

+ 16 - 10
web/building_saas/main/js/main.js

@@ -28,6 +28,16 @@ $(function () {
         projectObj.mainSpread.refresh();
         refreshSubSpread();
     });
+
+    const projectId = scUrlUtil.GetQueryString('project');
+    // 绑定点击事件
+    projectObj.mainSpread.bind(GC.Spread.Sheets.Events.CellClick, function(sender, info) {
+        if (info.row !== undefined && projectId !== undefined) {
+            setLocalCache('lastRow:' + projectId, info.row);
+            setLocalCache('lastCol:' + projectId, info.col);
+        }
+    });
+
 });
 
 /**
@@ -85,12 +95,9 @@ function slideResize(rootElement, callback) {
             callback();
             drag = false;
             // 存入本地缓存
-            const storage = window.localStorage;
-            if (storage) {
-                const id = rootElement.attr('id');
-                storage.setItem('topHeight:' + id, topChangeHeight);
-                storage.setItem('bottomHeight:' + id, bottomChangeHeight);
-            }
+            const id = rootElement.attr('id');
+            setLocalCache('topHeight:' + id, topChangeHeight);
+            setLocalCache('bottomHeight:' + id, bottomChangeHeight);
         }
     });
 }
@@ -103,12 +110,11 @@ function slideResize(rootElement, callback) {
  * @return {void}
  */
 function loadSize(tag, callback) {
-    const storage = window.localStorage;
-    if (!storage || tag === '') {
+    if (tag === '') {
         return;
     }
-    const topHeight = storage.getItem('topHeight:' + tag);
-    const bottomHeight = storage.getItem('bottomHeight:' + tag);
+    const topHeight = getLocalCache('topHeight:' + tag);
+    const bottomHeight = getLocalCache('bottomHeight:' + tag);
     if (topHeight === null || bottomHeight === null) {
         return;
     }

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

@@ -399,6 +399,7 @@ let cbCalctor = {
 };
 
 let calcBase = {
+    success: false,
     //清单固定行
     fixedFlag: null,
     fixedBills: Object.create(null),
@@ -426,6 +427,7 @@ let calcBase = {
             $CBP = cbParser,
             $CBC = cbCalctor;
         try {
+            me.success = false;
             //分析输入式合法性
             let exp = $CBA.legalExp(node.data.userCalcBase);
             if(!exp){
@@ -440,6 +442,7 @@ let calcBase = {
                 throw '表达式不正确';
             }
             //存储
+            me.success = true;
             node.data.calcBase = exp;
             node.data.calcBaseValue = parseFloat(calcBaseValue).toDecimal(decimalObj.decimal('totalPrice', node));
             me.project.calcProgram.calculate(node);

+ 0 - 1
web/building_saas/main/js/models/main_consts.js

@@ -12,7 +12,6 @@ const ModuleNames = {
     ration_ass:'ration_ass',
     quantity_detail:'quantity_detail',
     // volume_price: 'volume_price',
-    projectGLJ: 'project_glj',
     labour_coe: 'labour_coe',
     calc_program: 'calc_program'
 };

+ 3 - 8
web/building_saas/main/js/models/project.js

@@ -39,6 +39,8 @@ var PROJECT = {
                 } else if (item.moduleName === me.projSetting) {
                     me._project.projSetting = item.data;
                     me._project.projSetting.moduleName = me.projSetting;
+                }else if(item.moduleName === ModuleNames.projectGLJ){
+                    me._project.projectGLJ.loadToCache(item.data);
                 }
             });
             for (module in counter) {
@@ -79,16 +81,9 @@ var PROJECT = {
             this.FeeRate = FeeRate.createNew(this);
             // this.VolumePrice = VolumePrice.createNew(this);
             this.projectGLJ = new ProjectGLJ();
-            this.projectGLJ.loadData();
+           // this.projectGLJ.loadData();
             this.composition = new Composition();
             this.composition.loadData();
-            this.Decimal = {
-                common: {
-                    quantity: 4,
-                    unitFee: 2,
-                    totalFee: 2
-                }
-            };
             this.labourCoe = new LabourCoe(this);
             this.calcProgram = new CalcProgram(this);
             this.calcBase = calcBase;

+ 6 - 0
web/building_saas/main/js/models/project_glj.js

@@ -51,6 +51,12 @@ ProjectGLJ.prototype.loadData = function (callback = null) {
     });
 };
 
+ProjectGLJ.prototype.loadToCache = function (data) {
+    this.datas = data;
+    projectObj.project.projectGLJ=this;
+}
+
+
 /**
  * 获取对应工料机数据
  *

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

@@ -161,6 +161,10 @@ let calcBaseView = {
 
     initCalctor: function (node) {
         let me = calcBaseView;
+        //输入框显示原本的
+        if(me.isDef(node.data.calcBase)){
+            me.inputExpr.val(node.data.calcBase);
+        }
         me.buildSheet();
         let baseObj = me.getFigure(node);
         me.showData(me.toViewData(baseObj));
@@ -221,6 +225,9 @@ let calcBaseView = {
             let selected = projectObj.project.mainTree.selected;
             selected.data.userCalcBase = me.getInputExpr();
             projectObj.project.calcBase.calculate(selected);
+            if(projectObj.project.calcBase.success){
+                $('#qd-jsjs').modal('hide');
+            }
         });
     },
 

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

@@ -253,7 +253,7 @@ var feeRateObject={
         FeeRateEditCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
             if(value!=null){
                // ctx.fillText(value,x+3+ctx.measureText(value).width,y+h-3);
-                ctx.fillText(value,x+w,y+h-3);
+                ctx.fillText(value,x+w-3,y+h-3);
             }
             if(feeRateObject.editingCell){
                 if(feeRateObject.editingCell.row==options.row&&feeRateObject.editingCell.col==options.col){
@@ -345,7 +345,7 @@ var feeRateObject={
     },
     ifFeeRateEdit:function () {
         var selected = projectObj.project.mainTree.selected;
-        return MainTreeCol.readOnly.forCalcBase(selected)?false:true;
+        return MainTreeCol.readOnly.forFeeRate(selected)?false:true;
     },
     createSpreadView:function () {
         if (this.mainViews) {

+ 5 - 5
web/building_saas/main/js/views/glj_view.js

@@ -25,13 +25,13 @@ var gljOprObj = {
             {headerName: "规格型号", headerWidth: 120, dataCode: "specs", dataType: "String", hAlign: "left"},
             {headerName: "单位", headerWidth: 45, dataCode: "unit", dataType: "String", hAlign: "center"},
             {headerName: "类型", headerWidth: 45, dataCode: "shortName", dataType: "String", hAlign: "center"},
-            {headerName: "定额消耗", headerWidth: 80, dataCode: "rationItemQuantity", dataType: "Number", hAlign: "right",decimalField:"glj.quantity"},    // dataType: "Number", formatter: "0.00"
-            {headerName: "自定消耗", headerWidth: 80, dataCode: "customQuantity", dataType: "Number", hAlign: "right",decimalField:"glj.quantity"},
+            {headerName: "定额消耗", headerWidth: 80, dataCode: "rationItemQuantity", dataType: "Number", hAlign: "right",decimalField:"glj.quantity"},    // dataType: "Number", formatter: "0.00"
+            {headerName: "自定消耗", headerWidth: 80, dataCode: "customQuantity", dataType: "Number", hAlign: "right",decimalField:"glj.quantity"},
             {headerName: "消耗量", headerWidth: 80, dataCode: "quantity", dataType: "Number", hAlign: "right",decimalField:"glj.quantity"},
             {headerName: "总消耗量", headerWidth: 80, dataCode: "totalQuantity", dataType: "Number", hAlign: "right",decimalField:"glj.quantity"},
-            {headerName: "基价单价", headerWidth: 80, dataCode: "basePrice", dataType: "Number", hAlign: "right",decimalField:"glj.unitPrice"},
-            {headerName: "调整价", headerWidth: 80, dataCode: "adjustPrice", dataType: "Number", hAlign: "right",decimalField:"glj.unitPrice"},
-            {headerName: "市场价", headerWidth: 80, dataCode: "marketPrice", dataType: "Number", hAlign: "right",decimalField:"glj.unitPrice"},
+            {headerName: "定额价", headerWidth: 80, dataCode: "basePrice", dataType: "Number", hAlign: "right",decimalField:"glj.unitPrice"},
+            {headerName: "调整价", headerWidth: 80, dataCode: "adjustPrice", dataType: "Number", hAlign: "right",decimalField:"glj.unitPrice"},
+            {headerName: "市场价", headerWidth: 80, dataCode: "marketPrice", dataType: "Number", hAlign: "right",decimalField:"glj.unitPrice"},
             {headerName: "是否暂估", headerWidth: 65, dataCode: "isEstimate", dataType: "String", hAlign: "center",vAlign:"center",cellType:"checkBox"}
         ],
         view: {

+ 3 - 0
web/building_saas/main/js/views/main_tree_col.js

@@ -106,6 +106,9 @@ let MainTreeCol = {
         },
         forQuantifyDetail:function (node) {
             return !(node.sourceType==ModuleNames.ration||!MainTreeCol.readOnly.billsParent(node));
+        },
+        forFeeRate:function (node) {
+            return MainTreeCol.readOnly.non_bills(node)||MainTreeCol.readOnly.billsParent(node)||MainTreeCol.readOnly.leafBillsWithDetail(node)
         }
     },
     cellType: {

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

@@ -47,7 +47,6 @@ decimalObj.decimal = function (field, node) {
 
 function returnV(v, r){
     if(isDef(v)){
-        console.log(v);
         return v;
     }
     return r;

+ 20 - 0
web/building_saas/main/js/views/project_property_display_view.js

@@ -0,0 +1,20 @@
+/**
+ * Created by Zhong on 2017/11/24.
+ */
+let projDisplayView = {
+
+    datas: {},//just for view
+
+    init:function () {
+        this.datas = projectInfoObj.projectInfo.property.displaySetting;
+        $("#autoHeight").attr("checked",this.datas.autoHeight);
+        $("#disPlayMainMateria").attr("checked",this.datas.disPlayMainMateria);
+        //$('#disPlayMainMateria').prop('checked')
+    }
+};
+
+$(document).ready(function () {
+    $('#tab_display_setting').on('shown.bs.tab', function () {
+        projDisplayView.init();
+    });
+});

+ 27 - 3
web/building_saas/main/js/views/project_view.js

@@ -289,9 +289,19 @@ var projectObj = {
                     if (value) {value = parseFloat(value).toDecimal(decimalObj.decimal("unitPrice", node))};
                 }
                 else if (fieldName === 'calcBase') {
-                    if (value) {value = parseFloat(value).toDecimal(decimalObj.decimal("totalPrice", node))};
+                    //zhong
+                    if(value){
+                        node.data.userCalcBase = value;
+                        project.calcBase.calculate(node);
+                        if(!project.calcBase.success){
+                            let activeCell = projectObj.mainSpread.getActiveSheet().getSelections()[0];
+                            projectObj.mainSpread.getActiveSheet().setValue(activeCell.row, activeCell.col, node.data.calcBase? node.data.calcBase: '');
+                        }
+                    }
+                    $.bootstrapLoading.end();
+                    return;
+                   // if (value) {value = parseFloat(value).toDecimal(decimalObj.decimal("totalPrice", node))};
                 };
-
                 node.changed = true;
                 if (fieldName == 'feesIndex.common.unitFee'){
                     project.calcProgram.initFeeField(node, 'common');
@@ -320,6 +330,7 @@ var projectObj = {
         } else {
             projectObj.mainController.refreshTreeNode([node], false);
         }
+        $.bootstrapLoading.end();
     },
     mainSpreadEditEnded: function (sender, info) {
         $.bootstrapLoading.start();
@@ -329,7 +340,6 @@ var projectObj = {
         let fieldName = projectObj.mainController.setting.cols[info.col].data.field;
         // 检查输入类型等
         let value = projectObj.checkSpreadEditingText(info.editingText, colSetting);
-
         projectObj.updateCellValue(node, value, colSetting);
     },
     mainSpreadRangeChanged: function (sender, info) {
@@ -360,6 +370,7 @@ var projectObj = {
         var that = this;
         this.project = PROJECT.createNew(scUrlUtil.GetQueryString('project'), userID);
         this.project.loadDatas(function (err) {
+
             if (!err) {
                 that.project.property = projectInfoObj.projectInfo.property;
                 that.project.calcProgram.compileAllTemps();
@@ -415,6 +426,7 @@ var projectObj = {
                 that.mainSpread.bind(GC.Spread.Sheets.Events.EditEnded, that.mainSpreadEditEnded);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.RangeChanged, that.mainSpreadRangeChanged);
                 that.loadMainSpreadContextMenu();
+                that.loadFocusLocation();
             }
             else {
 
@@ -534,6 +546,18 @@ var projectObj = {
         this.project.Bills.updateAll();
         calc = null;
     }*/
+    // 获取上次退出时的焦点位置
+    loadFocusLocation: function() {
+        const projectId = scUrlUtil.GetQueryString('project');
+        let row = getLocalCache('lastRow:' + projectId);
+        let col = getLocalCache('lastCol:' + projectId);
+        if (row !== null && col !== null) {
+            row = parseInt(row);
+            col = parseInt(col);
+            const sheet = this.mainSpread.getActiveSheet();
+            sheet.setSelection(row, col, 1, 1);
+        }
+    },
 };
 
 $('#insert').click(function () {

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

@@ -5,7 +5,7 @@
             <a class="nav-link" href="#" aria-expanded="false" data-toggle="modal" data-target="#poj-set"><i class="fa fa-cube"></i> 项目属性</a>
         </li>
         <li class="nav-item">
-            <a class="nav-link" href="#" aria-expanded="false"><i class="fa fa-sliders"></i> 选项</a>
+            <a class="nav-link" href="#" aria-expanded="false" data-toggle="modal" data-target="#opts-set"><i class="fa fa-sliders"></i> 选项</a>
         </li>
         <li class="nav-item dropdown">
             <a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-wrench"></i> 工具</a>