Browse Source

tender_price

zhangweicheng 7 years ago
parent
commit
bd3dfc99b2

+ 1 - 0
config/gulpConfig.js

@@ -130,6 +130,7 @@ module.exports = {
         'web/building_saas/main/js/views/character_content_view.js',
         'web/building_saas/main/js/views/glj_view.js',
         'web/building_saas/main/js/views/zmhs_view.js',
+        'web/building_saas/main/js/views/tender_price_view.js',
         'web/building_saas/main/js/views/sub_view.js',
         'web/building_saas/main/js/views/fee_rate_view.js',
         'web/building_saas/main/js/views/sub_fee_rate_views.js',

+ 4 - 0
modules/all_models/bills.js

@@ -55,6 +55,10 @@ let billsSchema = new Schema({
     fees: [subSchema.feesSchema],
     // 标记字段
     flags: [subSchema.flagsSchema],
+    //消耗量调整系数字段
+    quantityCoe:subSchema.quantityCoeSchema,
+    // 不调价
+    is_adjust_price: {type: Number,default: 0},
     installationKey:String,//用来记录安装增加费的关联字段
     deleteInfo: deleteSchema,
     isEstimate:{type: Number,default:0},       // 1 true 0 false 是否暂估

+ 2 - 0
modules/all_models/project_glj.js

@@ -83,6 +83,8 @@ let modelSchema = {
     unit_price: Schema.Types.Mixed,
     // 显示关联的消耗量
     quantity: String,
+    // 不调价
+    tenderPrice: String,//调整后价格
     // 显示组成物的消耗量
     consumption: String,
     // 显示关联配合比的id

+ 4 - 0
modules/all_models/ration.js

@@ -36,6 +36,10 @@ let rationSchema = new Schema({
     marketUnitFee: String,
     marketTotalFee: String,
     fees: [subSchema.feesSchema],
+    //消耗量调整系数字段
+    quantityCoe:subSchema.quantityCoeSchema,
+    // 不调价
+    is_adjust_price: {type: Number,default: 0},
     deleteInfo: deleteSchema,
     type: Number,                               // 1 定额、2 量价、3 工料机定额
     subType: Number,                            // 子类型:1人工、201材料、301机械、4主材、5设备

+ 1 - 0
modules/all_models/ration_glj.js

@@ -29,6 +29,7 @@ var ration_glj = new Schema({
     quantity:String,
     customQuantity:String,
     rationItemQuantity:String,
+    tenderQuantity:String,//调整后消耗量
     createType: {type: String,default:'normal'},//normal、add、replace  正常、添加工料机、替换工料机
     from:{type: String,default:'std'}//std, cpt  来自标准工料机库、补充工料机库
 },{versionKey:false});

+ 13 - 2
modules/all_schemas/bills_sub_schemas.js

@@ -10,7 +10,9 @@ var feesSchema = new Schema({
     unitFee: String, // Decimal. 单价
     totalFee: String, // Decimal. 合价
     tenderUnitFee: String, // Decimal. 调价后单价
-    tenderTotalFee: String // Decimal. 调价后合价
+    tenderTotalFee: String, // Decimal. 调价后合价
+    targetUnitFee:String,//目标单价
+    targetTotalFee:String//目标合价
 });
 
 // 标记字段
@@ -44,5 +46,14 @@ let itemCharacterSchema = new Schema({
     eigenvalue: [eigenvalueSchema],//特征值
     isChecked: Boolean //是否勾选(输出)
 }, {_id: false});
+//消耗量调整系数字段
+let quantityCoeSchema = new Schema({
+    labour: String, //人工
+    material: String, //材料
+    machine:String,//机械
+    main: String, //主材
+    equipment:String//设备
+}, {_id: false});
+
 
-module.exports = {feesSchema: feesSchema, flagsSchema: flagsSchema, jobContentSchema: jobContentSchema, itemCharacterSchema: itemCharacterSchema};
+module.exports = {feesSchema: feesSchema, flagsSchema: flagsSchema, jobContentSchema: jobContentSchema, itemCharacterSchema: itemCharacterSchema,quantityCoeSchema:quantityCoeSchema};

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

@@ -11,7 +11,8 @@ import {
     basicInformation,
     projectFeature,
     displaySetting,
-    calcOptions
+    calcOptions,
+    tenderSetting
 } from './project_property_template';
 import fixedFlag from '../../common/const/bills_fixed';
 let FeeRateFiles = mongoose.model('fee_rate_file');
@@ -145,14 +146,15 @@ ProjectsDAO.prototype.updateUserProjects = async function (userId, compilationId
                     data.updateData.property.billsCalcMode = 0;
                     data.updateData.property.zanguCalcMode = 0;
                     //计算选项
-                    data.updateData.property.calcOptions = calcOptions
+                    data.updateData.property.calcOptions = calcOptions;
                     //安装增加费
                     if(parseInt(data.updateData.property.engineering)==4){
                         await installationFacade.copyInstallationFeeFromLib(data.updateData.ID,data.updateData.property.engineering_id);
                     }
                     //锁定清单
                     data.updateData.property.lockBills = false;
-
+                    //工料机单价调整系数
+                    data.updateData.property.tenderSetting = tenderSetting;
                 }
                 newProject = new Projects(data.updateData);
                 // 查找同级是否存在同名数据

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

@@ -19,6 +19,10 @@ const displaySetting = {
     disPlayMainMaterial:true
 }
 
+const tenderSetting = {
+    gljPriceTenderCoe:1 //工料机单价调整系数
+};
+
 const calcOptions={
     calc_main:false,
     calc_add:true,
@@ -132,4 +136,4 @@ const projectFeature = [
     {dispName: '门窗材料及装饰', key: 'doorsWindowsMaterial', value: ''}
 ];
 
-export {defaultDecimal, billsQuantityDecimal, basicInformation, projectFeature,displaySetting,calcOptions};
+export {defaultDecimal, billsQuantityDecimal, basicInformation, projectFeature,displaySetting,calcOptions,tenderSetting};

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

@@ -459,5 +459,71 @@ var sheetCommonObj = {
             pasteText.push(rowText.join('\t'));
         }
         return pasteText.join('\n');
+    },
+    transferToTreeSetting:function(setting,treeSetting){
+        for(let h of setting.header){
+            treeSetting.cols.push(getSettingCol(h))
+        }
+        for(let l of setting.view.lockColumns){
+            treeSetting.cols[l].readOnly = true;
+        }
+        return treeSetting;
+        function getSettingCol(header) {
+            let aMap ={left:0,center:1,right:2};
+            let hAlign = header.hAlign?aMap[header.hAlign]:0;
+            let col = {
+                "width":header.headerWidth?header.headerWidth:100,
+                "head":{
+                    "titleNames":Array.isArray(header.headerName)?header.headerName:[header.headerName],
+                    "spanCols":header.spanCols?header.spanCols:[1],
+                    "spanRows":header.spanRows?header.spanRows:[1],
+                    "vAlign":[1],
+                    "hAlign":[1],
+                    "font":["Arial"]
+                },
+                "data": {
+                    "field": header.dataCode,
+                    "vAlign": 1,
+                    "hAlign": hAlign,
+                    "font": "Arial"
+                }
+            };
+            if(header.showHint == true){
+                col.showHint = true;
+            }
+
+            if(header.cellType){
+                col.data.cellType = getCellType(header);
+            }
+            if(header.decimalField){//设置formatter
+                let decimal = getDecimal(header.decimalField);
+                col.formatter = getFormatter(decimal);
+            }
+            col.readOnly = function (node) {
+                if(node.data.ParentID == -1 || node.data.id == 'GJ'){//三材类别项不能编辑)
+                    return true;
+                }
+                return false;
+            };
+            return col;
+        }
+        function getCellType(header) {
+            return function () {
+                if(header.cellType === "checkBox"){
+                    return new GC.Spread.Sheets.CellTypes.CheckBox();
+                }
+                if(header.cellType === "comboBox"){
+                    let dynamicCombo = sheetCommonObj.getDynamicCombo(true);
+                    if(header.options){
+                        dynamicCombo.itemHeight(header.options.length).items(header.options);
+                        if(header.editorValueType==true){
+                            dynamicCombo.editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.value);
+                        }
+                    }
+                    return dynamicCombo
+                }
+            }
+        }
     }
+
 }

+ 1 - 1
public/web/tree_sheet/tree_sheet_helper.js

@@ -373,7 +373,7 @@ var TREE_SHEET_HELPER = {
                 return;
             }
             if(dataField === 'name' || dataField === 'itemCharacterText' || dataField === 'jobContentText' || dataField === 'adjustState'){
-                if(hitinfo.sheet.getParent() === projectObj.mainSpread && textLength <= cellWidth)
+                if((hitinfo.sheet.getParent() === projectObj.mainSpread||hitinfo.sheet.getParent() === tender_obj.tenderSpread) && textLength <= cellWidth)
                  return;
             }
             if(dataField=="quantity"){

+ 17 - 1
web/building_saas/js/global.js

@@ -3,7 +3,8 @@ function autoFlashHeight(){
     let headerHeight = $(".header").height();
     let toolsbarHeight = $(".toolsbar").height();
     let ftoolsbarHeight = $(".toolsbar-f").height();
-   // var feeRateToolsbarHeight = $(".toolsbar_feeRate").height();
+    let btntoolsbarHeight = $(".btn-toolbar").height();
+    // var feeRateToolsbarHeight = $(".toolsbar_feeRate").height();
     let mainBottomContentHeight = $("#main .bottom-content").height();
     let gljBottomContentHeight = $("#project-glj-main .bottom-content").height();
     let toolsBarHeightQ = $(".tools-bar-height-q").height();
@@ -20,6 +21,7 @@ function autoFlashHeight(){
     $(".main-data-full").height($(window).height()-headerHeight-toolsbarHeight-1);
     $(".main-data-full-fl").height($(window).height()-headerHeight-toolsbarHeight-37);
     $(".main-data-full-feeRate").height($(window).height()-headerHeight-78);
+    $(".main-data-full-tender").height($(window).height()-headerHeight-btntoolsbarHeight-10);
     $(".main-data-not").height($(window).height()-headerHeight-1);
     $(".main-data-side-search").height($(window).height()-headerHeight-toolsbarHeight-64);
     $(".side-content").height($(window).height()-headerHeight );
@@ -106,4 +108,18 @@ function getFormatter(decimal) {
         pre += "0"
     }
     return pre;
+}
+
+function getFeeIndex(fees) {
+    let feesIndex = {};
+    if (fees) {
+        for(let fee of fees){
+            fee.unitFee = parseFloat(fee.unitFee);
+            fee.totalFee = parseFloat(fee.totalFee);
+            fee.tenderUnitFee = parseFloat(fee.tenderUnitFee);
+            fee.tenderTotalFee = parseFloat(fee.tenderTotalFee);
+            feesIndex[fee.fieldName] = fee;
+        }
+    }
+    return feesIndex;
 }

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

@@ -47,6 +47,7 @@
                 <li class="nav-item"><a data-toggle="tab" href="#project_glj" id="tab_project_glj" data-name="tab_project_glj" role="tab">人材机</a></li>
                 <li class="nav-item"><a data-toggle="tab" href="#fee_rates" id="tab_fee_rate" role="tab" >费率</a></li>
                 <li class="nav-item"><a data-toggle="tab" href="#calc_program_manage" id="tab_calc_program_manage" role="tab">计算程序</a></li>
+                <li class="nav-item"><a data-toggle="tab" href="#tender_price" id="tab_tender_price" role="tab">调价</a></li>
                 <li class="nav-item"><a data-toggle="tab" href="#reports" role="tab" id="tab_report" onclick="rptTplObj.iniPage();">报表</a></li>
             </ul>
         </div>
@@ -326,9 +327,13 @@
             <div class="tab-pane" id="fee_rates" role="tabpanel">
                 <%include ../../fee_rates/fee_rate.html %>
             </div>
+              <div class="tab-pane" id="tender_price" role="tabpanel">
+                  <%include tender_price.html %>
+              </div>
             <div class="tab-pane" id="calc_program_manage" role="tabpanel">
                 <%include calc_program_manage.html %>
             </div>
+
           </div>
 
         </div>
@@ -1247,6 +1252,7 @@
         <script type="text/javascript" src="/web/building_saas/main/js/views/character_content_view.js"></script>
         <script type="text/javascript" src="/web/building_saas/main/js/views/glj_view.js"></script>
         <script type="text/javascript" src="/web/building_saas/main/js/views/zmhs_view.js"></script>
+        <script type="text/javascript" src="/web/building_saas/main/js/views/tender_price_view.js"></script>
         <script type="text/javascript" src="/web/building_saas/main/js/views/sub_view.js"></script>
         <script type="text/javascript" src="/web/building_saas/main/js/views/fee_rate_view.js"></script>
         <script type="text/javascript" src="/web/building_saas/main/js/views/sub_fee_rate_views.js"></script>

+ 25 - 0
web/building_saas/main/html/tender_price.html

@@ -0,0 +1,25 @@
+<div class="toolsbar px-1">
+    <div class="btn-toolbar py-1">
+        <div class="input-group input-group-sm mr-2" style="width:220px">
+            <div class="input-group-prepend">
+                <span class="input-group-text" id="inputGroup-sizing-sm">工料机单价调整系数</span>
+            </div>
+            <input type="number" step="0.1" class="form-control" placeholder="请输入系数" value="1">
+        </div>
+        <div class="btn-group mr-2">
+            <button type="button" class="btn btn-outline-primary btn-sm">反调消耗</button>
+           <!-- <button type="button" class="btn btn-outline-primary btn-sm">反调单价</button>-->
+            <button type="button" class="btn btn-outline-primary btn-sm">正向调价</button>
+        </div>
+        <button type="button" class="btn btn-outline-danger btn-sm">清空调价</button>
+    </div>
+</div>
+<div class="container-fluid">
+    <div class="row">
+        <div class="col-lg-12 p-0">
+            <div class="main-data-full-tender" id="tenderSpread">
+            </div>
+        </div>
+    </div>
+</div>
+

+ 1 - 10
web/building_saas/main/js/models/bills.js

@@ -92,16 +92,7 @@ var Bills = {
                 if (data.quantity) {
                     data.quantity = parseFloat(data.quantity);
                 }
-                data.feesIndex = {};
-                if (data.fees) {
-                    data.fees.forEach(function (fee) {
-                        fee.unitFee = parseFloat(fee.unitFee);
-                        fee.totalFee = parseFloat(fee.totalFee);
-                        fee.tenderUnitFee = parseFloat(fee.tenderUnitFee);
-                        fee.tenderTotalFee = parseFloat(fee.tenderTotalFee);
-                        data.feesIndex[fee.fieldName] = fee;
-                    });
-                }
+                data.feesIndex = getFeeIndex(data.fees);
                 data.flagsIndex = {};
                 if (data.flags) {
                     data.flags.forEach(function (flag) {

+ 1 - 4
web/building_saas/main/js/models/ration.js

@@ -53,10 +53,7 @@ var Ration = {
             this.datas = datas;
             // generate Fees & Flags Index,For View & Calculate
             this.datas.forEach(function (data) {
-                data.feesIndex = {};
-                data.fees.forEach(function (fee) {
-                    data.feesIndex[fee.fieldName] = fee;
-                });
+                data.feesIndex = getFeeIndex(data.fees);
                 data.flagsIndex = {};
                 data.flags.forEach(function (flag) {
                     data.flagsIndex[flag.fieldName] = flag;

+ 1 - 59
web/building_saas/main/js/views/project_glj_view.js

@@ -120,65 +120,7 @@ projectGljObject={
         this.materialTreeSheet.name('materialTreeSheet');
     },
     createMaterialTreeSheetSetting:function () {
-        for(let h of this.materialSetting.header){
-            this.materialTreeSetting.cols.push(getSettingCol(h))
-        }
-        for(let l of this.materialSetting.view.lockColumns){
-            this.materialTreeSetting.cols[l].readOnly = true;
-        }
-        return this.materialTreeSetting;
-        function getSettingCol(header) {
-            let aMap ={left:0,center:1,right:2};
-            let hAlign = header.hAlign?aMap[header.hAlign]:0;
-            let col = {
-                "width":header.headerWidth?header.headerWidth:100,
-                "head":{
-                    "titleNames":[header.headerName],
-                    "spanCols":[1],
-                    "spanRows":[1],
-                    "vAlign":[1],
-                    "hAlign":[1],
-                    "font":["Arial"]
-                },
-                "data": {
-                    "field": header.dataCode,
-                    "vAlign": 1,
-                    "hAlign": hAlign,
-                    "font": "Arial"
-                }
-            };
-            if(header.cellType){
-                col.data.cellType = getCellType(header);
-            }
-            if(header.decimalField){//设置formatter
-                let decimal = getDecimal(header.decimalField);
-                col.formatter = getFormatter(decimal);
-            }
-            col.readOnly = function (node) {
-                if(node.data.ParentID == -1 || node.data.id == 'GJ'){//三材类别项不能编辑)
-                    return true;
-                }
-                return false;
-            };
-            return col;
-        }
-        function getCellType(header) {
-            return function () {
-                if(header.cellType === "checkBox"){
-                    return new GC.Spread.Sheets.CellTypes.CheckBox();
-                }
-                if(header.cellType === "comboBox"){
-                    let dynamicCombo = sheetCommonObj.getDynamicCombo(true);
-                    if(header.options){
-                        dynamicCombo.itemHeight(header.options.length).items(header.options);
-                        if(header.editorValueType==true){
-                            dynamicCombo.editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.value);
-                        }
-                    }
-                    return dynamicCombo
-                }
-            }
-        }
+        return sheetCommonObj.transferToTreeSetting(this.materialSetting,this.materialTreeSetting);
     },
     unitPriceFileInit:function() {
         let me = this;

+ 99 - 0
web/building_saas/main/js/views/tender_price_view.js

@@ -0,0 +1,99 @@
+/**
+ * Created by zhang on 2018/6/1.
+ */
+
+let tender_obj={
+    tenderSpread:null,
+    tenderSheet:null,
+    tenderTree:null,
+    tenderController:null,
+    tenderSetting:{
+        header:[
+            {headerName: "项目编码", headerWidth: 170, dataCode: "code", dataType: "String",spanRows: [2]},
+            {headerName: "类别", headerWidth: 50, dataCode: "subType", dataType: "String",spanRows: [2]},
+            {headerName: "项目名称", headerWidth: 200, dataCode: "name",showHint:true, hAlign: "left", dataType: "String",spanRows: [2]},
+            {headerName: "计量\n单位", headerWidth: 120, dataCode: "unit", hAlign: "center", dataType: "String",spanRows: [2]},
+            {headerName: "工程量", headerWidth: 120, dataCode: "basePrice", hAlign: "right", dataType: "Number",validator:"number",spanRows: [2]},
+            {headerName: "不调价", headerWidth: 55, dataCode: "is_adjust_price", hAlign: "center", cellType : "checkBox",dataType: "Number",spanRows: [2]},
+            {headerName: ["初始报价","综合单价"], headerWidth: 80, dataCode: "feesIndex.common.unitFee", hAlign: "right", dataType: "Number",validator:"number",spanCols : [2,1]},
+            {headerName: ["","综合合价"], headerWidth: 80, dataCode: "feesIndex.common.totalFee", hAlign: "right", dataType: "Number",validator:"number",spanCols : [0,1]},
+            {headerName: ["反向目标","综合单价"], headerWidth: 80, dataCode: "feesIndex.common.targetUnitFee", hAlign: "right", dataType: "Number",validator:"number",spanCols : [2,1]},
+            {headerName: ["","综合合价"], headerWidth: 80, dataCode: "feesIndex.common.targetTotalFee", hAlign: "right", dataType: "Number",validator:"number",spanCols : [0,1]},
+            {headerName: ["调整后报价","综合单价"], headerWidth: 80, dataCode: "feesIndex.common.tenderUnitFee", hAlign: "right", dataType: "Number",validator:"number",spanCols : [2,1]},
+            {headerName: ["","综合合价"], headerWidth: 80, dataCode: "feesIndex.common.tenderTotalFee", hAlign: "right", dataType: "Number",validator:"number",spanCols : [0,1]},
+            {headerName: ["消耗量调整系数","人工"], headerWidth: 80, dataCode: "quantityCoe.labour", hAlign: "right", dataType: "Number",validator:"number",spanCols : [5,1]},
+            {headerName: ["","材料"], headerWidth: 80, dataCode: "quantityCoe.material", hAlign: "right", dataType: "Number",validator:"number",spanCols : [0,1]},
+            {headerName: ["","机械"], headerWidth: 80, dataCode: "quantityCoe.machine", hAlign: "right", dataType: "Number",validator:"number",spanCols : [0,1]},
+            {headerName: ["","主材"], headerWidth: 80, dataCode: "quantityCoe.main", hAlign: "right", dataType: "Number",validator:"number",spanCols : [0,1]},
+            {headerName: ["","设备"], headerWidth: 80, dataCode: "quantityCoe.equipment", hAlign: "right", dataType: "Number",validator:"number",spanCols : [0,1]}
+        ],
+        view: {
+            lockColumns: [0,1,2,3,4,5,6,7,10,11]
+        }
+    },
+    tenderTreeSetting:{
+        "emptyRows" : 3,
+        "headRows" :2,
+        "treeCol" : 0,
+        "headRowHeight" : [21],
+        "cols" : []
+    },
+    initTenderSpread:function () {
+        if(!this.tenderSpread){
+            this.tenderSpread = SheetDataHelper.createNewSpread($("#tenderSpread")[0]);
+        }
+        this.tenderSheet = this.tenderSpread.getSheet(0);
+        this.tenderTree = cacheTree.createNew(this);
+        this.tenderTreeSetting = this.createTenderTreeSetting();
+        TREE_SHEET_HELPER.initSetting($('#tenderSpread')[0], this.tenderTreeSetting );
+        this.tenderTreeSetting.setAutoFitRow = MainTreeCol.getEvent("setAutoFitRow");
+        this.tenderController = TREE_SHEET_CONTROLLER.createNew(this.tenderTree, this.tenderSheet, this.tenderTreeSetting);
+       // this.tenderController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, this.onSelectionChange);
+    },
+    createTenderTreeSetting:function () {
+       return sheetCommonObj.transferToTreeSetting(this.tenderSetting,this.tenderTreeSetting);
+    },
+    showTenderData:function () {
+        let me = this;
+        let mainTree = projectObj.project.mainTree;
+        this.tenderTree.nodes={},this.tenderTree.selected = null,this.tenderTree.roots = [],this.tenderTree.items=[];
+        for(r of mainTree.roots){
+            createTenderNode(r,null,null);
+        }
+        me.tenderTree.sortTreeItems();
+        me.tenderController.showTreeData();
+
+        function createTenderNode(mainNode,parent,next) {
+            let newNode = me.tenderTree.addNode(parent, next, mainNode.data.ID);
+            newNode.data = mainNode.data;
+            newNode.source =  mainNode.source;
+            newNode.sourceType = mainNode.sourceType;
+            newNode.mainNode = mainNode;
+            if(mainNode.children.length > 0){
+                for(let c of mainNode.children){
+                    createTenderNode(c,newNode,null);
+                }
+            }
+            return newNode;
+        }
+    }
+
+};
+
+
+
+$(function () {
+    $('#tab_tender_price').on('shown.bs.tab', function (e) {
+        sessionStorage.setItem('mainTab', '#tab_tender_price');
+        $(e.relatedTarget.hash).removeClass('active');
+        if(!tender_obj.tenderSpread){
+            tender_obj.initTenderSpread();
+        }
+        autoFlashHeight();
+        tender_obj.tenderSpread.refresh();
+        tender_obj.showTenderData();
+    });
+
+
+
+});