浏览代码

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

Chenshilong 7 年之前
父节点
当前提交
6d104d87b1

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

@@ -30,7 +30,7 @@ class BootController extends BaseController {
             provinceList: userModel.province,
             companyTypeList: userModel.companyType,
             companyScaleList: userModel.companyScale,
-            area: request.params.area
+            version: request.params.version
         };
         response.render('users/html/login-infoinput', renderData);
     }

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

@@ -7,6 +7,7 @@
  */
 import UserModel from "../models/user_model";
 import SettingModel from "../models/setting_model";
+import VersionModel from "../models/version_model";
 
 class LoginController {
 
@@ -17,11 +18,12 @@ class LoginController {
      * @param {object} response
      * @return {void}
      */
-    index(request, response) {
+    async index(request, response) {
         let sessionUser = request.session.sessionUser;
         if (sessionUser !== undefined && sessionUser.ssoId >= 0) {
             return response.redirect("/pm");
         }
+
         response.render('users/html/login', {});
     }
 
@@ -36,7 +38,7 @@ class LoginController {
         let account = request.body.account;
         let password = request.body.pw;
         let preferenceSetting = {};
-
+        let versionList = [];
         try {
             // 调用接口验证登录信息
             let userModel = new UserModel();
@@ -70,11 +72,15 @@ class LoginController {
                 throw '标记用户信息失败!';
             }
 
+            // 获取版本信息
+            let versionModel = new VersionModel();
+            versionList = await versionModel.getVersionData();
+
         } catch (error) {
             console.log(error);
             return response.json({error: 1, msg: error});
         }
-        response.json({error: 0, msg: '', login_ask: preferenceSetting.login_ask});
+        response.json({error: 0, msg: '', login_ask: preferenceSetting.login_ask, version_list: JSON.stringify(versionList)});
     }
 
 }

+ 12 - 5
modules/users/controllers/user_controller.js

@@ -11,6 +11,7 @@ import LogType from "../../common/const/log_type_const";
 import LogModel from "../models/log_model";
 import SettingModel from "../models/setting_model";
 import SettingType from "../../common/const/setting_type_const";
+import VersionModel from "../models/version_model";
 
 class UserController extends BaseController {
 
@@ -24,9 +25,10 @@ class UserController extends BaseController {
     async info(request, response) {
         // 获取当前用户数据
         let sessionUser = request.session.sessionUser;
+
         let userModel = new UserModel();
         let userData = await userModel.findDataByName(sessionUser.username);
-        userData = userData.length <= 0 ? [] : userData[0];
+        userData = Object.keys(userData).length <= 0 ? [] : userData;
 
         let renderData = {
             userData: userData,
@@ -52,7 +54,7 @@ class UserController extends BaseController {
                 company: request.body.company,
                 company_type: request.body.company_type,
                 company_scale: request.body.company_scale,
-                area: request.body.area
+                version: request.body.version
             };
             let sessionUser = request.session.sessionUser;
             // 切换验证场景
@@ -125,17 +127,23 @@ class UserController extends BaseController {
     async preferences(request, response) {
         let sessionUserData = request.session.sessionUser;
         let preferenceSetting = {};
+        let versionList = [];
         try {
             // 获取配置信息
             let settingModel = new SettingModel();
             preferenceSetting = await settingModel.getPreferenceSetting(sessionUserData.id);
 
+            // 获取版本信息
+            let versionModel = new VersionModel();
+            versionList = await versionModel.getVersionData();
+
         } catch(error) {
             console.log(error);
         }
 
         let renderData = {
-            preferenceSetting: preferenceSetting
+            preferenceSetting: preferenceSetting,
+            versionList: versionList
         };
         response.render('users/html/user-set', renderData);
     }
@@ -151,13 +159,12 @@ class UserController extends BaseController {
         let loginAsk = request.body.login_ask;
         loginAsk = parseInt(loginAsk);
         let selectVersion = request.body.select_version;
-        selectVersion = parseInt(selectVersion);
         let sessionUserData = request.session.sessionUser;
 
         try {
             let data = {
                 login_ask: loginAsk,
-                select_version: loginAsk === 0 ? selectVersion : -1
+                select_version: loginAsk === 0 ? selectVersion : ''
             };
             let settingModel = new SettingModel();
             let result = await settingModel.save(sessionUserData.id, SettingType.PREFERENCE, data);

+ 3 - 3
modules/users/models/schema/user.js

@@ -28,9 +28,9 @@ let schema = {
         type: Number,
         default: -1
     },
-    area: {
-        type: Number,
-        default: 0
+    version: {
+        type: String,
+        default: ''
     },
     company_type: {
         type: Number,

+ 26 - 0
modules/users/models/schema/version.js

@@ -0,0 +1,26 @@
+/**
+ * 版本管理数据模型
+ *
+ * @author CaiAoLin
+ * @date 2017/7/28
+ * @version
+ */
+import mongoose from "mongoose";
+
+let Schema = mongoose.Schema;
+let collectionName = 'version';
+let modelSchema = {
+    // 自增id
+    id: {
+        type: Number,
+        index: true
+    },
+    // 名称
+    name: String,
+    // 标准清单
+    standard_bill: Schema.Types.Mixed,
+    // 定额库
+    ration_lib: Schema.Types.Mixed
+};
+let model = mongoose.model(collectionName, new Schema(modelSchema, {versionKey: false, collection: collectionName}));
+export {model as default, collectionName as collectionName};

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

@@ -112,7 +112,7 @@ class UserModel extends BaseModel {
                 this.model.schema.path('real_name').required(true);
                 this.model.schema.path('company').required(true);
                 this.model.schema.path('province').required(true);
-                this.model.schema.path('area').required(true);
+                this.model.schema.path('version').required(true);
                 break;
         }
     }

+ 35 - 0
modules/users/models/version_model.js

@@ -0,0 +1,35 @@
+/**
+ * 版本管理业务逻辑模型
+ *
+ * @author CaiAoLin
+ * @date 2017/8/1
+ * @version
+ */
+import BaseModel from "../../common/base/base_model";
+import VersionSchema from "./schema/version";
+
+class VersionModel extends BaseModel {
+
+    /**
+     * 构造函数
+     *
+     * @return {void}
+     */
+    constructor () {
+        let parent = super();
+        parent.model = VersionSchema;
+        parent.init();
+    }
+
+    /**
+     * 获取版本数据
+     *
+     * @return {Promise}
+     */
+    getVersionData() {
+        return this.findDataByCondition({name: {$ne: ''}}, {_id: 1, name: 1}, false);
+    }
+
+}
+
+export default VersionModel;

+ 1 - 1
modules/users/routes/boot_route.js

@@ -13,6 +13,6 @@ module.exports=function (app){
     let bootController = new BootController();
 
 // 引导页面
-    router.get('/:area', bootController.boot);
+    router.get('/:version', bootController.boot);
     app.use('/boot', router);
 };

+ 3 - 0
public/web/tree_sheet/tree_sheet_helper.js

@@ -11,6 +11,9 @@ var TREE_SHEET_HELPER = {
         style.hAlign = setting.data.hAlign;
         style.vAlign = setting.data.vAlign;
         style.wordWrap = setting.data.wordWrap;
+        if (setting.data.formatter) {
+            style.formatter = setting.data.formatter;
+        }
         return style;
     },
     loadSheetHeader: function (setting, sheet) {

+ 13 - 8
test/tmp_data/bills_grid_setting.js

@@ -316,7 +316,7 @@ var BillsGridSetting ={
         },
         {
             "width":80,
-            "readOnly":false,
+            "readOnly":'readOnly.billsParent',
             "head":{
                 "titleNames":[
                     "工程量"
@@ -341,7 +341,8 @@ var BillsGridSetting ={
                 "field":"quantity",
                 "vAlign":1,
                 "hAlign":2,
-                "font":"Arial"
+                "font":"Arial",
+                "digit": 'common.quantity'
             }
         },
         {
@@ -436,7 +437,7 @@ var BillsGridSetting ={
         },
         {
             "width":80,
-            "readOnly":false,
+            "readOnly":'readOnly.ration',
             "head":{
                 "titleNames":[
                     "综合单价"
@@ -461,12 +462,13 @@ var BillsGridSetting ={
                 "field":"feesIndex.common.unitFee",
                 "vAlign":1,
                 "hAlign":2,
-                "font":"Arial"
+                "font":"Arial",
+                "digit": 'common.unitFee'
             }
         },
         {
             "width":80,
-            "readOnly":false,
+            "readOnly":'readOnly.ration',
             "head":{
                 "titleNames":[
                     "综合合价"
@@ -491,7 +493,8 @@ var BillsGridSetting ={
                 "field":"feesIndex.common.totalFee",
                 "vAlign":1,
                 "hAlign":2,
-                "font":"Arial"
+                "font":"Arial",
+                "digit": 'common.totalFee'
             }
         },
         {
@@ -521,7 +524,8 @@ var BillsGridSetting ={
                 "field":"feesIndex.zangu.unitFee",
                 "vAlign":1,
                 "hAlign":2,
-                "font":"Arial"
+                "font":"Arial",
+                "digit": 'common.unitFee'
             }
         },
         {
@@ -551,7 +555,8 @@ var BillsGridSetting ={
                 "field":"feesIndex.zangu.totalFee",
                 "vAlign":1,
                 "hAlign":2,
-                "font":"Arial"
+                "font":"Arial",
+                "digit": 'common.totalFee'
             }
         },
         {

+ 2 - 2
web/building_saas/main/js/calc/calc_fees.js

@@ -83,9 +83,9 @@ let calcFees = {
                 }
             } else {
                 if (i == fields.length - 1) {
-                    valueField[fields[i]] = {};
-                } else {
                     valueField[fields[i]] = value;
+                } else {
+                    valueField[fields[i]] = {};
                 };
             }
         }

+ 23 - 2
web/building_saas/main/js/models/bills.js

@@ -178,7 +178,6 @@ var Bills = {
             return this.tree.delete(node);
         };
 
-
         bills.prototype.upMoveBills = function (node) {
             var upMoveData = node.getUpMoveData();
             project.pushNow('upMoveBills', this.getSourceType(), tools.coverseTreeUpdateData(upMoveData, this.project.ID()));
@@ -202,7 +201,29 @@ var Bills = {
             project.pushNow('downLevelBills', [this.getSourceType()], [tools.coverseTreeUpdateData(downLevelData, this.project.ID())]);
 
             return node.downLevel();
-        }
+        };
+
+        bills.prototype.updateField = function (node, field, newValue) {
+            calcFees.setFee(node.data, field, newValue);
+            let updateData = [];
+            let data = {'ID': node.getID(), 'projectID': this.project.ID()};
+            if (field === 'quantity') {
+                data[field] = newValue;
+                // to do Calculate
+                if (node.data.fees) {
+                    data.fees = node.data.fees;
+                }
+            } else if (field === 'feesIndex.common.unitFee') {
+                // to do Calculate
+                if (node.data.fees) {
+                    data.fees = node.data.fees;
+                }
+            } else {
+                data[field] = newValue;
+            }
+            updateData.push({'updateType': 'ut_update', 'updateData': data});
+            this.project.pushNow('updateBills', this.getSourceType(), updateData);
+        };
 
         return new bills(project);
     }

+ 23 - 1
web/building_saas/main/js/models/project.js

@@ -74,6 +74,13 @@ var PROJECT = {
             this.quantity_detail = quantity_detail.createNew(this);
             this.FeeRate = FeeRate.createNew(this);
             this.VolumePrice = VolumePrice.createNew(this);
+            this.Decimal = {
+                common: {
+                    quantity: 2,
+                    unitFee: 2,
+                    totalFee: 2
+                }
+            };
 
             this.masterField = {ration: 'billsItemID', volumePrice: 'billsItemID'};
         };
@@ -90,7 +97,22 @@ var PROJECT = {
 
         project.prototype.projCounter = function () {
             return tools.projCounter;
-        }
+        };
+        project.prototype.getDecimal = function (fullName) {
+            let names = fullName.split('.'), decimal = this.Decimal;
+            for (let name of names) {
+                if (decimal[name]) {
+                    decimal = decimal[name];
+                } else {
+                    return null;
+                }
+            }
+            if (Object.prototype.toString.apply(decimal) === '[object Number]') {
+                return decimal;
+            } else {
+                return null;
+            }
+        };
 
         project.prototype.loadMainTree = function () {
             var that = this;

+ 22 - 0
web/building_saas/main/js/models/ration.js

@@ -229,6 +229,28 @@ var Ration = {
             ration2.serialNo = preSerialNo;
         };
 
+        ration.prototype.updateField = function (ration, field, newValue) {
+            calcFees.setFee(ration, field, newValue);
+            let updateData = [];
+            let data = {'ID': ration.ID, 'projectID': this.project.ID()};
+            if (field === 'quantity') {
+                data[field] = newValue;
+                // to do Calculate
+                if (ration.fees) {
+                    data.fees = ration.fees;
+                }
+            } else if (field === 'feesIndex.common.unitFee') {
+                // to do Calculate
+                if (ration.fees) {
+                    data.fees = ration.fees;
+                }
+            } else {
+                data[field] = newValue;
+            }
+            updateData.push({'updateType': 'ut_update', 'updateData': data});
+            this.project.pushNow('updateBills', this.getSourceType(), updateData);
+        };
+
         return new ration(project);
     }
 };

+ 8 - 8
web/building_saas/main/js/models/volume_price.js

@@ -145,25 +145,25 @@ var VolumePrice = {
                 if (!calcFees.findFee(volumePrice, 'common')) {
                     calcFees.addFee(volumePrice, 'common');
                 }
-                volumePrice.feesIndex.common.totalFee = (volumePrice.feesIndex.common.unitFee * volumePrice.quantity).toDecimal(2);
+                volumePrice.feesIndex.common.totalFee = (volumePrice.feesIndex.common.unitFee * volumePrice.quantity).toDecimal(tools.owner.Decimal.common.totalFee);
                 volumePrice.needRefresh = true;
             }
             updateField(volumePrice, field, newValue) {
                 calcFees.setFee(volumePrice, field, newValue);
                 let updateData = [];
-                if (field === 'quantity' || field === 'feesIndex.common.unitFee') {
-                    let data = {'ID': volumePrice.ID, 'projectID': this.getProject().ID()};
+                let data = {'ID': volumePrice.ID, 'projectID': this.getProject().ID()};
+                if (field === 'quantity') {
                     data[field] = newValue;
                     this.calculate(volumePrice);
                     data.fees = volumePrice.fees;
-                    updateData.push({'updateType': 'ut_update', 'updateData': data});
-                    tools.owner.pushNow('updateVolumePrice', this.getSourceType(), updateData);
+                } else if (field === 'feesIndex.common.unitFee') {
+                    this.calculate(volumePrice);
+                    data.fees = volumePrice.fees;
                 } else {
-                    let data = {'ID': volumePrice.ID, 'projectID': this.getProject().ID()};
                     data[field] = newValue;
-                    updateData.push({'updateType': 'ut_update', 'updateData': data});
-                    tools.owner.pushNow('updateVolumePrice', this.getSourceType(), updateData);
                 }
+                updateData.push({'updateType': 'ut_update', 'updateData': data});
+                tools.owner.pushNow('updateVolumePrice', this.getSourceType(), updateData);
             }
         }
 

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

@@ -17,8 +17,17 @@ let MainTreeCol = {
         }
     },
     readOnly: {
+        bills: function (node) {
+            return node.sourceType === projectObj.project.Bills.getSourceType();
+        },
+        ration: function (node) {
+            return node.sourceType === projectObj.project.Ration.getSourceType();
+        },
         volumePrice: function (node) {
             return node.sourceType === projectObj.project.VolumePrice.getSourceType();
+        },
+        billsParent: function (node) {
+            return node.sourceType === projectObj.project.Bills.getSourceType() && node.source.children.length > 0;
         }
     },
     getEvent: function (eventName) {
@@ -36,5 +45,23 @@ let MainTreeCol = {
         } else {
             return event;
         }
+    },
+    getNumberFormatter: function (digit) {
+        switch (digit) {
+            case 1:
+                return '0.#';
+            case 2:
+                return '0.##';
+            case 3:
+                return '0.###';
+            case 4:
+                return '0.####';
+            case 5:
+                return '0.#####';
+            case 6:
+                return '0.######';
+            default:
+                return '0.##';
+        }
     }
 }

+ 55 - 10
web/building_saas/main/js/views/project_view.js

@@ -7,25 +7,66 @@ var projectObj = {
     mainSpread: null,
     mainController: null,
     gljSpreed:null,
+    checkCommonField: function (editingText, colSetting) {
+        let value;
+        if (colSetting.data.decimal) {
+            value = Number(editingText);
+            if (number_util.isNumber(value)) {
+                value = value.toDecimal(colSetting.data.decimal);
+            } else {
+                value = null;
+                alert('当前输入的数据类型不正确,请重新输入。');
+            }
+        } else {
+            value = info.editingText;
+        }
+        return value;
+    },
+    checkQuantityField: function (editingText, colSetting) {
+        let value = Number(editingText);
+        if (!value) {
+            try {
+                let exp = new Expression('');
+                exp.Expression(editingText);
+                value = Number(exp.Evaluate());
+            } catch (error) {
+                value = null;
+            }
+        }
+        if (value) {
+            value = value.toDecimal(colSetting.data.decimal);
+        } else {
+            value = null;
+            alert('当前输入的数据类型不正确,请重新输入。');
+        }
+        return value;
+    },
+    checkSpreadEditingText: function (editingText, colSetting) {
+        if (colSetting.data.field === 'quantity') {
+            return this.checkQuantityField(editingText, colSetting);
+        } else {
+            return this.checkCommonField(editingText, colSetting);
+        }
+    },
     mainSpreadEditEnded: function (sender, info) {
         let project = projectObj.project;
         let node = project.mainTree.items[info.row];
         let colSetting = projectObj.mainController.setting.cols[info.col];
         let fieldName = projectObj.mainController.setting.cols[info.col].data.field;
+        let value = projectObj.checkSpreadEditingText(info.editingText, colSetting);
         if (colSetting.data.wordWrap) {
             info.sheet.autoFitRow(info.row);
         }
-        if (node.sourceType === project.Bills.getSourceType()) {
-
-        } else if (node.sourceType === project.Ration.getSourceType()) {
-
-        } else if (node.sourceType === project.VolumePrice.getSourceType()) {
-            project.VolumePrice.updateField(node.source, fieldName, info.editingText);
-            if (node.source.needRefresh) {
-                projectObj.mainController.refreshTreeNode([node]);
-                node.source.needRefresh = false;
+        if (value) {
+            if (node.sourceType === project.Bills.getSourceType()) {
+                project.Bills.updateField(node.source, fieldName, value);
+            } else if (node.sourceType === project.Ration.getSourceType()) {
+                project.Ration.updateField(node.source, fieldName, value);
+            } else if (node.sourceType === project.VolumePrice.getSourceType()) {
+                project.VolumePrice.updateField(node.source, fieldName, value);
             }
-        };
+        }
+        projectObj.mainController.refreshTreeNode([node]);
     },
     checkMainSpread: function () {
         if (!this.mainSpread) {
@@ -51,6 +92,10 @@ var projectObj = {
                     if (col.readOnly && Object.prototype.toString.apply(col.readOnly) === "[object String]") {
                         col.readOnly = MainTreeCol.getEvent(col.readOnly);
                     }
+                    if (col.data.digit && Object.prototype.toString.apply(col.data.digit) === "[object String]") {
+                        col.data.decimal = that.project.getDecimal(col.data.digit);
+                        col.data.formatter = MainTreeCol.getNumberFormatter(col.data.decimal);
+                    }
                 });
                 that.mainController = TREE_SHEET_CONTROLLER.createNew(that.project.mainTree, that.mainSpread.getActiveSheet(), BillsGridSetting);
                 that.mainController.showTreeData();

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

@@ -61,7 +61,7 @@
                         </div>
                     </div>
                     <div class="form-group">
-                        <input type="hidden" name="area" value="<%= area %>"/>
+                        <input type="hidden" name="version" value="<%= version %>"/>
                         <button class="btn btn-primary btn-block" type="submit">下一步</button>
                     </div>
                 </div>

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

@@ -48,21 +48,21 @@
                     <p class="m-0 text-warning"><i class="fa fa-exclamation-triangle"></i> <b>偏好设置</b> 中可以修改您的登录习惯。</p>
                 </div>
                 <div class="modal-body">
-                    <div class="row">
-                        <div class="col-sm-6">
-                            <div class="card card-block">
-                                <h3 class="card-title">重庆版免费版</h3>
-                                <p class="card-text">With supporting text below as a natural lead-in to additional content.</p>
-                                <a class="btn btn-primary" href="/boot/1">开始使用</a>
-                            </div>
-                        </div>
-                        <div class="col-sm-6">
-                            <div class="card card-block">
-                                <h3 class="card-title">广东版免费版</h3>
-                                <p class="card-text">With supporting text below as a natural lead-in to additional content.</p>
-                                <a class="btn btn-primary" href="/boot/2">开始使用</a>
-                            </div>
-                        </div>
+                    <div class="row" id="version-area">
+                        <!--<div class="col-sm-6">-->
+                            <!--<div class="card card-block">-->
+                                <!--<h3 class="card-title">重庆版免费版</h3>-->
+                                <!--<p class="card-text">With supporting text below as a natural lead-in to additional content.</p>-->
+                                <!--<a class="btn btn-primary" href="/boot/1">开始使用</a>-->
+                            <!--</div>-->
+                        <!--</div>-->
+                        <!--<div class="col-sm-6">-->
+                            <!--<div class="card card-block">-->
+                                <!--<h3 class="card-title">广东版免费版</h3>-->
+                                <!--<p class="card-text">With supporting text below as a natural lead-in to additional content.</p>-->
+                                <!--<a class="btn btn-primary" href="/boot/2">开始使用</a>-->
+                            <!--</div>-->
+                        <!--</div>-->
                     </div>
                 </div>
             </div>

+ 6 - 2
web/users/html/user-set.html

@@ -60,8 +60,12 @@
                             <div class="form-group">
                                 <label class="form-control-label">指定版本</label>
                                 <select class="form-control" name="select_version">
-                                  <option value="1" <% if(preferenceSetting.select_version === 1) { %>selected="selected" <% } %>>广东版(专业版)</option>
-                                  <option value="2" <% if(preferenceSetting.select_version === 2) { %>selected="selected" <% } %>>重庆版(免费版)</option>
+                                    <option value="">请选择版本</option>
+                                    <% if (versionList.length > 0) {%>
+                                    <% versionList.forEach(function(version) { %>
+                                    <option value="<%= version._id %>" <% if(preferenceSetting.select_version === version._id.toString()) { %>selected="selected" <% } %>><%= version.name %></option>
+                                    <% }) %>
+                                    <% } %>
                                 </select>
                             </div>
                             <div class="form-group mt-3">

+ 28 - 5
web/users/js/login.js

@@ -24,13 +24,15 @@ $(document).ready(function () {
                     if (response.login_ask === 0) {
                         location.href = '/pm';
                     } else {
+                        response.version_list = response.version_list === undefined || response.version_list === '' ?
+                            null : JSON.parse(response.version_list);
+                        if (response.version_list === null || response.version_list.length <= 0) {
+                            location.href = '/pm';
+                            return false;
+                        }
+                        setVersion(response.version_list);
                         $('#ver').modal('show');
                     }
-                    // if (referer) {
-                    //     location.href = referer;
-                    // } else {
-                    //     location.href = '/';
-                    // }
                 } else {
                     let msg = response.msg !== undefined ? response.msg : '未知错误';
                     showError(msg, $("input"));
@@ -98,4 +100,25 @@ function cleanError() {
     $("input").parent().removeClass('has-danger');
     $("#message").text('');
     $("#error-tips").hide("fast");
+}
+
+/**
+ * 设置版本信息
+ *
+ * @param {Object} versionData
+ * @return {void}
+ */
+function setVersion(versionData) {
+    let html = '';
+    for (let version of versionData) {
+        let tmpHtml = '<div class="col-sm-6">' +
+            '<div class="card card-block">' +
+            '<h3 class="card-title">'+ version.name +'</h3>' +
+            '<p class="card-text">With supporting text below as a natural lead-in to additional content.</p>' +
+            '<a class="btn btn-primary" href="/boot/'+ version._id.toString() +'">开始使用</a>' +
+            '</div>' +
+            '</div>';
+        html += tmpHtml;
+    }
+    $("#version-area").html(html);
 }