Browse Source

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

Chenshilong 7 years ago
parent
commit
b3a2851649

+ 1 - 0
config/gulpConfig.js

@@ -87,6 +87,7 @@ module.exports = {
         'web/building_saas/main/js/views/project_info.js',
         'web/building_saas/main/js/views/project_view.js',
         'web/building_saas/main/js/views/options_view.js',
+        'web/building_saas/main/js/views/project_property_decimal_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',

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

@@ -295,5 +295,4 @@ module.exports = {
             callback(request, response, err, msg, data);
         });
     }
-
 };

+ 11 - 1
modules/pm/models/project_model.js

@@ -22,11 +22,18 @@ let projectType = {
     project: 'Project',
     engineering: 'Engineering',
 };
-//回收站恢复级别
 let fileType = {
     unitPriceFile: 'UnitPriceFile',
     feeRateFile: 'FeeRateFile'
 };
+//默认的小数位数
+const defaultDecimal = {
+    bills: {unitPrice: 2, totalPrice: 2},
+    ration: {quantity: 3, unitPrice: 2, totalPrice: 2},
+    glj: {quantity: 3, unitPrice: 2},
+    feeRate: 2,
+    process: 6//中间过程,用于未定义取舍位数
+};
 
 let ProjectsDAO = function(){};
 
@@ -95,6 +102,9 @@ ProjectsDAO.prototype.updateUserProjects = async function(userId, datas, callbac
                     }
                     data.updateData.property.unitPriceFile.id = addResult.id;
                 }
+                if(data.updateData.projType === projectType.tender){
+                    data.updateData.property.decimal = defaultDecimal;
+                }
                 newProject = new Projects(data.updateData);
                 // 查找同级是否存在同名数据
                 let exist = await this.isExist(data.updateData.name, data.updateData.ParentID);

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

@@ -265,6 +265,7 @@
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-3" role="tab">指标信息</a></li>
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-4" role="tab">关于计算</a></li>
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-5" 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>
                             </ul>
                         </div>
@@ -341,6 +342,73 @@
                                         清单工程精度
                                     </div>
                                 </div>
+                                <!--小数位数-->
+                                <div class="tab-pane fade" id="poj-settings-decimal" role="tabpanel">
+                                    <div class="modal-auto-height">
+                                        <fieldset class="form-group">
+                                            <h5>清单</h5>
+                                            <div class="row m-0">
+                                                <div class="col-sm-3">
+                                                    <div class="input-group input-group-sm mb-2">
+                                                        <div class="input-group-addon">单价</div>
+                                                        <input type="number" name="bills-unitPrice" class="form-control" value="2" step="1" max="6" min="0">
+                                                    </div>
+                                                </div>
+                                                <div class="col-sm-3">
+                                                    <div class="input-group input-group-sm mb-2">
+                                                        <div class="input-group-addon">合价</div>
+                                                        <input type="number" name="bills-totalPrice" class="form-control" value="2" step="1" max="6" min="0">
+                                                    </div>
+                                                </div>
+                                            </div>
+                                            <h5 class="mt-3">定额</h5>
+                                            <div class="row m-0">
+                                                <div class="col-sm-3">
+                                                    <div class="input-group input-group-sm mb-2">
+                                                        <div class="input-group-addon">工程量</div>
+                                                        <input type="number" name="ration-quantity" class="form-control" value="2" step="1" max="6" min="0">
+                                                    </div>
+                                                </div>
+                                                <div class="col-sm-3">
+                                                    <div class="input-group input-group-sm mb-2">
+                                                        <div class="input-group-addon">单价</div>
+                                                        <input type="number" name="ration-unitPrice" class="form-control" value="2" step="1" max="6" min="0">
+                                                    </div>
+                                                </div>
+                                                <div class="col-sm-3">
+                                                    <div class="input-group input-group-sm mb-2">
+                                                        <div class="input-group-addon">合价</div>
+                                                        <input type="number" name="ration-totalPrice" class="form-control" value="2" step="1" max="6" min="0">
+                                                    </div>
+                                                </div>
+                                            </div>
+                                            <h5 class="mt-3">工料机</h5>
+                                            <div class="row m-0">
+                                                <div class="col-sm-3">
+                                                    <div class="input-group input-group-sm mb-2">
+                                                        <div class="input-group-addon">工程量</div>
+                                                        <input type="number" name="glj-quantity" class="form-control" value="2" step="1" max="6" min="0">
+                                                    </div>
+                                                </div>
+                                                <div class="col-sm-3">
+                                                    <div class="input-group input-group-sm mb-2">
+                                                        <div class="input-group-addon">单价</div>
+                                                        <input type="number" name="glj-unitPrice" class="form-control" value="2" step="1" max="6" min="0">
+                                                    </div>
+                                                </div>
+                                            </div>
+                                            <h5 class="mt-3">费率</h5>
+                                            <div class="row m-0">
+                                                <div class="col-sm-3">
+                                                    <div class="input-group input-group-sm mb-2">
+                                                        <div class="input-group-addon">费率</div>
+                                                        <input type="number" name="feeRate" class="form-control" value="2" step="1" max="6" min="0">
+                                                    </div>
+                                                </div>
+                                            </div>
+                                        </fieldset>
+                                    </div>
+                                </div>
                                 <!--人工单价调整-->
                                 <div class="tab-pane fade" id="poj-settings-6" role="tabpanel">
                                     <div class="row px-3">
@@ -596,6 +664,7 @@
         <script type="text/javascript" src="/web/building_saas/main/js/views/project_info.js"></script>
         <script type="text/javascript" src="/web/building_saas/main/js/views/project_view.js"></script>
         <script type="text/javascript" src="/web/building_saas/main/js/views/options_view.js"></script>
+        <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/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>

+ 2 - 0
web/building_saas/main/js/views/project_info.js

@@ -26,6 +26,8 @@ var projectInfoObj = {
         CommonAjax.post('/pm/api/getProject', {"user_id": userID, "proj_id": scUrlUtil.GetQueryString('project')}, function (data) {
             if (data) {
                 that.projectInfo = data;
+                //init decimal
+                setDecimal(decimalObj, data.property.decimal);
                 $('#fullpath').html(that.getFullPathHtml(that.projectInfo));
             }
         });

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

@@ -0,0 +1,184 @@
+/**
+ * Created by Zhong on 2017/11/13.
+ */
+//default setting
+let decimalObj = {
+    default: {
+        min: 0,
+        max: 6,
+        bills: {unitPrice: 2, totalPrice: 2},
+        ration: {quantity: 3, unitPrice: 2, totalPrice: 2},
+        glj: {quantity: 3, unitPrice: 2},
+        feeRate: 2,
+        process: 6
+    }
+};
+
+function isUndef(v) {
+    return v === undefined || v === null;
+}
+
+function isDef(v){
+    return v !== undefined && v !== null;
+}
+
+function isObj(v){
+    return isDef(v) && typeof v === 'object';
+}
+
+function isNum(v){
+    return isDef(v) && !isNaN(v);
+}
+
+function isInt(v){
+    return isNum(v) && v % 1 === 0;
+}
+
+function isValidDigit(v){
+    return isInt(v) && v >= decimalObj.default.min && v <= decimalObj.default.max;
+}
+
+function setDecimal(_digits, data){
+    if(isDef(data)){
+        _digits.bills = data.bills || decimalObj.default.bills;
+        _digits.ration = data.ration || decimalObj.default.ration;
+        _digits.glj = data.glj || decimalObj.default.glj;
+        _digits.feeRate = data.feeRate || decimalObj.default.feeRate;
+        _digits.process = data.process || decimalObj.default.process;
+    }
+    else {
+        _digits.bills = decimalObj.default.bills;
+        _digits.ration = decimalObj.default.ration;
+        _digits.glj = decimalObj.default.glj;
+        _digits.feeRate = decimalObj.default.feeRate;
+        _digits.process = decimalObj.default.process;
+    }
+}
+//获取decimalPanel中要展示的数据
+function m_getInitData(data){
+    let rst = Object.create(null);
+    rst.bills = data.bills;
+    rst.ration = data.ration;
+    rst.glj = data.glj;
+    rst.feeRate = data.feeRate;
+    rst.process = data.process;
+    return rst;
+}
+//获取小数位数panel里的数据
+function m_getDecimalData(inputs){
+    let rst = Object.create(null);
+    for(let i = 0, len = inputs.length ; i < len; i++){
+       let name = $(inputs[i]).attr('name');
+        let attrs = name.split('-');
+        if(attrs.length > 1){
+            if(isUndef(rst[attrs[0]])){
+                rst[attrs[0]] = Object.create(null);
+            }
+            if(isDef(rst[attrs[0]])) {
+                rst[attrs[0]][attrs[1]] = parseInt($(inputs[i]).val());
+            }
+        }
+        else {
+            rst[attrs[0]] = parseInt($(inputs[i]).val());
+        }
+    }
+    //set process
+    rst['process'] = decimalObj.default.process;
+    return rst;
+}
+
+function v_initPanel(data){
+    if(this.isDef(data)){
+        for(let attr in data){
+            if(this.isObj(data[attr])){
+                for(let subAttr in data[attr]){
+                    let str = attr + '-' + subAttr;
+                    let jqs = 'input[name="' + str + '"]';
+                    $(jqs).val(data[attr][subAttr]);
+                    $(jqs).attr('min', decimalObj.default.min);
+                    $(jqs).attr('max', decimalObj.default.max);
+                }
+            }
+            else {
+                let str = attr + '';
+                let jqs = 'input[name="' + str + '"]';
+                $(jqs).val(data[attr]);
+                $(jqs).attr('min', decimalObj.default.min);
+                $(jqs).attr('max', decimalObj.default.max);
+            }
+        }
+    }
+}
+
+function e_validIn(inputs){
+    for(let i = 0, len = inputs.length; i < len; i++){
+        let orgV = $(inputs[i]).val();
+        $(inputs[i]).keydown(function () {
+            let v = $(this).val();
+            if(v.trim().length > 0 && isValidDigit(v)){
+                orgV = v;
+            }
+        });
+        $(inputs[i]).keyup(function () {
+            let v = $(this).val();
+            if(v.trim().length === 0 || !isValidDigit(v)){
+                alert('小数位数范围在0-6!');
+                $(this).val(orgV);
+            }
+            else{
+                //let newV = parseInt(v);
+            }
+        });
+    }
+}
+
+function e_bindCof(btn){
+    btn.bind('click', function () {
+        //获取更新的数据
+        let updateDecimal = m_getDecimalData($('input', '#poj-settings-decimal'));
+        a_updateDigits(updateDecimal);
+    });
+}
+
+function e_unbindCof(btn){
+    btn.unbind();
+}
+
+function a_updateDigits(updateDecimal){
+    let url = '/pm/api/updateProjects';
+    let data = {
+        updateType: 'update',
+        updateData: {
+            ID: parseInt(scUrlUtil.GetQueryString('project')),
+            'property.decimal': updateDecimal
+        }
+    };
+    let postData = {
+        user_id: userID,
+        updateData: [data]
+    };
+    let scCaller = function (resultData) {
+        //update data
+        setDecimal(decimalObj, updateDecimal);
+        let v_data = m_getInitData(decimalObj);
+        v_initPanel(v_data);
+    };
+    let errCaller = function () {
+        alert('更新小数位数失败!');
+    };
+    CommonAjax.post(url, postData, scCaller, errCaller);
+}
+
+$(document).ready(function () {
+    //绑定小数位数输入控制
+    e_validIn($('input', '#poj-settings-decimal'));
+    //绑定小数位数确认更新按钮
+    $('#tab_poj-settings-decimal').on('shown.bs.tab', function (e) {
+        e_bindCof($('#property_ok'));
+        let v_data = m_getInitData(decimalObj);
+        v_initPanel(v_data);
+   });
+    $('#tab_poj-settings-decimal').on('hidden.bs.tab', function (e) {
+        e_unbindCof($('#property_ok'));
+    })
+});