zhangweicheng преди 4 години
родител
ревизия
cfc9b3d242

+ 1 - 0
config/gulpConfig.js

@@ -182,6 +182,7 @@ module.exports = {
         'web/building_saas/main/js/views/zmhs_view.js',
         'web/building_saas/main/js/views/mbzm_view.js',
         'web/building_saas/main/js/views/tender_price_view.js',
+        'web/building_saas/main/js/views/equipment_purchase_view.js',
         'web/building_saas/main/js/views/billsElf.js',
         'web/building_saas/main/js/views/sub_view.js',
         'web/building_saas/main/js/views/fee_rate_view.js',

+ 37 - 0
modules/equipment_purchase/controllers/equipment_purchase_controller.js

@@ -0,0 +1,37 @@
+let equipment_purchase_facade = require('../facade/equipment_purchase_facade');
+let logger = require("../../../logs/log_helper").logger;
+let controller = {
+    insertData:async function(req){
+        let data = req.body.data;
+        data = JSON.parse(data);
+        return await equipment_purchase_facade.insertData(data.projectID,data.equipments);
+    },
+    deleteEquipment:async function(req){
+        let data = req.body.data;
+        data = JSON.parse(data);
+        return await equipment_purchase_facade.deleteEquipment(data.projectID,data.ID); 
+    },
+    updateEquipments:async function(req){
+        let data = req.body.data;
+        data = JSON.parse(data);
+        return await equipment_purchase_facade.updateEquipments(data.projectID,data.updateData); 
+    }
+}
+
+
+module.exports = {   
+    action:async function(req,res){//自动跳转到URL对应的controller方法
+        let result={
+            error:0
+        }
+        try {
+            let functionName = req.url.replace(/\//g,"");
+            result.data = controller[functionName]?await controller[functionName](req):"";
+        }catch (err){
+            logger.err(err.stack);
+            result.error=1;
+            result.message = err.message;
+        }
+        res.json(result);
+    }
+};

+ 33 - 2
modules/equipment_purchase/facade/equipment_purchase_facade.js

@@ -1,16 +1,47 @@
 
 module.exports={
-    getData:getData
+    getData:getData,
+    insertData:insertData,
+    deleteEquipment:deleteEquipment,
+    updateEquipments:updateEquipments
 };
 
 let mongoose = require('mongoose');
 let equipmentPurchaseModel = mongoose.model("equipment_purchase");
 let consts = require('../../main/models/project_consts');
 
+function getPreUpdate (pre, doc){
+    const update = {};
+    for (const key in doc) {
+      update[`${pre}.${key}`] = doc[key];
+    }
+    return update;
+  };
 
+async function deleteEquipment(projectID,ID){
+    await equipmentPurchaseModel.update({projectID},{'$pull':{equipments:{ ID }}});
+}
+
+async function insertData (projectID,data){
+    await equipmentPurchaseModel.update({projectID},{'$push':{equipments:{ $each: data }}});
+    return data
+}
+
+async function updateEquipments (projectID,updateData){
+    let tasks = [];
+    for(let data of updateData){
+        let task = {updateOne : {
+            filter:{projectID,'equipments.ID':data.ID},
+            update:{$set:getPreUpdate('equipments.$',data.doc)}
+        }}
+        tasks.push(task)
+    }
+    if(tasks.length > 0) await equipmentPurchaseModel.bulkWrite(tasks);
+    return updateData
+}
 
 function getData(projectID, callback) {
-    equipmentPurchaseModel.find({'projectID': projectID}).lean().exec((err, data) => {
+    equipmentPurchaseModel.findOne({'projectID': projectID}).lean().exec((err, data) => {
         if (err) {
             callback(1, '', null);
         } else {

+ 4 - 0
modules/equipment_purchase/routes/equipment_purchase_route.js

@@ -1,6 +1,10 @@
 let express = require('express');
+let controller = require('../controllers/equipment_purchase_controller');
 
 module.exports = function (app) {
     var eqRouter = express.Router();
+    eqRouter.post('/insertData', controller.action);
+    eqRouter.post('/deleteEquipment', controller.action);
+    eqRouter.post('/updateEquipments', controller.action);
     app.use('/equipmentPurchase',eqRouter);
 }

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

@@ -24,6 +24,7 @@ function autoFlashHeight(){
     $(".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-30);
+    $(".main-data-full-equipment").height($(window).height()-headerHeight);
     $(".main-data-not").height($(window).height()-headerHeight-1);
     $(".main-data-side-search").height($(window).height()-headerHeight-toolsbarHeight-64);
     $(".side-content").height($(window).height()-headerHeight );

+ 9 - 0
web/building_saas/main/html/equipment_purchase.html

@@ -0,0 +1,9 @@
+
+<div class="container-fluid">
+    <div class="row">
+        <div class="col-lg-12 p-0">
+            <div class="main-data-full-equipment" id="equipmentSpread">
+            </div>
+        </div>
+    </div>
+</div>

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

@@ -74,8 +74,8 @@
         <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"
             style="display:none">总计算程序</a></li>
-        <!--<li class="nav-item"><a data-toggle="tab" href="#tender_price" id="tab_tender_price" role="tab" style="display:none">调价</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="#tender_price" id="tab_tender_price" role="tab">调价</a></li> -->
+        <li class="nav-item"><a data-toggle="tab" href="#equipment_purchase" id="tab_equipment_purchase" role="tab">设备购置</a></li>
         <li class="nav-item"><a data-toggle="tab" href="#reports" role="tab" id="tab_report"
             onclick="rptTplObj.iniPage();">报表</a></li>
         <li class="nav-item"><a data-toggle="tab" href="#index" id="tab_index" role="tab" style="display:none">指标信息</a>
@@ -991,6 +991,9 @@
         <div class="tab-pane" id="tender_price" role="tabpanel">
           <%include tender_price.html %>
         </div>
+        <div class="tab-pane" id="equipment_purchase" role="tabpanel">
+          <%include equipment_purchase.html %>
+        </div>
         <div class="tab-pane" id="calc_program_manage" role="tabpanel">
           <%include calc_program_manage.html %>
         </div>
@@ -2953,6 +2956,7 @@
   <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/mbzm_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/equipment_purchase_view.js"></script>
   <script type="text/javascript" src="/web/building_saas/main/js/views/billsElf.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>

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

@@ -20,7 +20,8 @@ const ModuleNames = {
     projectInfo: 'project_info',
     evaluate_list:'evaluate_list',
     contractor_list:'contractor_list',
-    bid_evaluation_list:'bid_evaluation_list'
+    bid_evaluation_list:'bid_evaluation_list',
+    equipment_purchase:'equipment_purchase'
 };
 
 let gljType = gljUtil.gljType;

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

@@ -109,6 +109,7 @@ var PROJECT = {
             this.evaluate_list = new EvaluateList(this);
             this.bid_evaluation_list = new BidEvaluationList(this);
             this.contractor_list = new ContractorList(this);
+            this.equipment_purchase = new EquipmentPurchase(this);
             this.calcBase = calcBase;
 
             // this.masterField = {ration: 'billsItemID', volumePrice: 'billsItemID'};

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

@@ -1048,4 +1048,15 @@ class ContractorList {
     loadData (datas) {
         this.datas = datas;
     };
+}
+
+class EquipmentPurchase {
+    constructor (project) {
+        this.project = project;
+        this.datas = {};
+        project.registerModule(ModuleNames.equipment_purchase, this);
+    };
+    loadData (data) {
+        this.datas = data;
+    };
 }

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

@@ -465,9 +465,6 @@ var Ration = {
                 } else if (selected.data.calcBase&&selected.data.calcBase!="") {
                     alert('当前有基数计算,不能插入定额/量价/人材机。');
                 } else {
-                    if(selected.data.type === billType.FB){
-                        return;
-                    }
                     billItemID = selected.source.getID();
                     nextID = selected.tree.rootID();
                     br = this.getBillsSortRation(billItemID);

+ 205 - 0
web/building_saas/main/js/views/equipment_purchase_view.js

@@ -0,0 +1,205 @@
+
+let equipmentPurchaseObj  = {
+    setting:{
+        header: [
+            {headerName: "编号", headerWidth: 160, dataCode: "code", dataType: "String",formatter: "@"},
+            {headerName: "名称", headerWidth: 200, dataCode: "name", dataType: "String"},
+            {headerName: "单位", headerWidth: 100, dataCode: "unit",  dataType: "String"},
+            {headerName: "数量", headerWidth: 160, dataCode: "quantity", hAlign: "right", dataType: "Number",validator:'number'},
+            {headerName: "单价", headerWidth: 160, dataCode: "unitPrice", hAlign: "right", dataType: "Number",validator:'number'},
+            {headerName: "金额", headerWidth: 160, dataCode: "totalPrice", hAlign: "right", dataType: "Number"},
+        ],
+        view: {
+            lockColumns: ["totalPrice"],
+            rowHeaderWidth:40,
+            colHeaderHeight:35
+        }
+    
+    },
+    sheet:null,
+    initSpread:function () {
+        if(this.sheet == null){
+            this.spread = SheetDataHelper.createNewSpread($("#equipmentSpread")[0]);
+            sheetCommonObj.spreadDefaultStyle(this.spread);
+            this.sheet = this.spread.getSheet(0);
+            sheetCommonObj.initSheet(this.sheet, this.setting, 0);
+            this.sheet.bind(GC.Spread.Sheets.Events.ValueChanged,this.onValueChange);
+            this.sheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onSheetRangeChange);
+            if (projectReadOnly) {
+                sheetCommonObj.disableSpread(this.spread);
+              } else {
+                this.initRightClick();
+              }
+        }
+    },
+    showData:function(){
+        let equipment_purchase = projectObj.project.equipment_purchase;
+        this.data = equipment_purchase.datas.equipments;
+        _.sortBy(this.data,['code']);
+        sheetCommonObj.showData(this.sheet, this.setting,this.data);
+        this.sheet.setRowCount(this.data.length);
+    },
+
+    onValueChange:function (e,info) {
+        let me = equipmentPurchaseObj,row = info.row, col = info.col;
+        let dataCode = me.setting.header[col].dataCode;
+        let value = info.newValue;
+        let equipment = me.data[row];
+
+        if (value&&! sheetCommonObj.checkData(col,me.setting,value)) {
+            alert('输入的数据类型不对,请重新输入!');
+            return me.showData();
+        }
+        let data = {doc:{},ID:equipment.ID};
+        if(dataCode == 'quantity' || dataCode == 'unitPrice'){
+            me.calcTotalPrice(value,dataCode,data.doc,equipment);
+        }
+        if(equipment[dataCode] == value) return me.showData();
+        data.doc[dataCode] = value;
+        me.updateEquipments([data]);
+    },
+    calcTotalPrice:function(newValue,dataCode,doc,equipment){
+        let unitPrice = equipment.unitPrice?scMathUtil.roundForObj(equipment.unitPrice,getDecimal('glj.unitPrice')):0;
+        let quantity = equipment.quantity?scMathUtil.roundForObj(equipment.quantity,getDecimal('glj.quantity')):0;
+        if(newValue){
+            if(dataCode === 'quantity') {
+                newValue =  scMathUtil.roundForObj(newValue,getDecimal('glj.quantity'));
+                quantity = newValue;
+                if(gljUtil.isDef(doc.unitPrice)) unitPrice = doc.unitPrice;
+            }
+            if(dataCode === 'unitPrice') {
+                newValue =  scMathUtil.roundForObj(newValue,getDecimal('glj.unitPrice'));
+                unitPrice = newValue;
+                if(gljUtil.isDef(doc.quantity)) quantity = doc.quantity;
+            }
+            doc.totalPrice = scMathUtil.roundForObj(quantity * unitPrice,getDecimal('glj.unitPrice'));
+        }
+    },
+    onSheetRangeChange:function(e,args){
+        let updateMap = {};
+        let updateData = []
+        let me = equipmentPurchaseObj;
+        for(let c of args.changedCells){
+            let dataCode = me.setting.header[c.col].dataCode;
+            let value= args.sheet.getCell(c.row, c.col).text();
+            let equipment = me.data[c.row];
+            if (value&&!sheetCommonObj.checkData(c.col,me.setting,value)) {
+                alert('输入的数据类型不对,请重新输入!');
+                me.showData();
+                return ;
+            }
+            let tem = updateMap[equipment.ID]?updateMap[equipment.ID]:{};
+            if(dataCode == 'quantity' || dataCode == 'unitPrice'){
+                me.calcTotalPrice(value,dataCode,tem,equipment);
+            } 
+            tem[dataCode] = value;
+            updateMap[equipment.ID] = tem;
+        }
+        for(let ID in updateMap){
+            let data = {doc:updateMap[ID],ID:ID};
+            updateData.push(data);
+        }
+        if(updateData.length > 0)  me.updateEquipments(updateData);
+    },
+    newEquipment:function(){
+        return {ID:uuid.v1()}
+    },
+    updateEquipments:async function(updateData){
+        try {
+            $.bootstrapLoading.start();
+            let projectID = projectObj.project.ID();
+            await ajaxPost('/equipmentPurchase/updateEquipments', { projectID, updateData });
+            for(let data of updateData){
+                let equipment = _.find(this.data,{ID:data.ID});
+                if(equipment){
+                    Object.assign(equipment,data.doc);
+                }
+            }
+        } catch (error) {
+            alert('更新失败,请重试');
+        }
+        this.showData();
+        $.bootstrapLoading.end();
+    },
+    insertEquipments:async function(equipments){
+        try {
+            $.bootstrapLoading.start();
+            let projectID = projectObj.project.ID();
+            await ajaxPost('/equipmentPurchase/insertData', { projectID, equipments });
+            this.data.push(...equipments)  
+            this.showData();
+        } catch (error) {
+            alert('插入失败,请重试');
+        }
+        $.bootstrapLoading.end();
+    },
+    deleteEquipment:async function(ID){
+        try {
+            let projectID = projectObj.project.ID();
+            await ajaxPost('/equipmentPurchase/deleteEquipment', { projectID, ID });
+            _.remove(this.data,{ID});
+            this.showData();
+        } catch (error) {
+            alert('删除失败,请重试');
+        } 
+    },
+    registerInputContextMenuItem:function(){
+        const insertEquipmentHtml = `<span>插入&nbsp;&nbsp;<input id='insert-equipment-number' class="menu-input" type="text" value="1" onfocus="this.select()">&nbsp;&nbsp;行</span>`;
+        let me = this;    
+        return sheetCommonObj.registerInputContextMenuItem('insertEquipment', insertEquipmentHtml, 'fa-sign-in', async function () {  
+            const number = +$('#insert-equipment-number').val();
+            if (!number) {
+                return;
+            }  
+            const newData = [];
+            for (let i = 0; i < number; i++) {
+                newData.push(me.newEquipment());
+            }
+            me.insertEquipments(newData)   
+        });
+    },
+
+    initRightClick: function () {
+        let me = this;
+        $.contextMenu({
+          selector: '#equipmentSpread',
+          build: function ($trigger, e) {
+            me.rightClickTarget = SheetDataHelper.safeRightClickSelection($trigger, e, me.spread);
+            return me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.viewport ||
+              me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
+          },
+          items: {
+            "insert": {
+              type:  me.registerInputContextMenuItem(),
+              disabled: function () {
+                return false;
+              },
+             /*  callback: function (key, opt) {
+                me.insertEquipments([me.newEquipment()])   
+              } */
+            },
+            "delete": {
+                name: "删除",
+                icon: 'fa-times',
+                disabled: function () {
+                  return me.rightClickTarget.row === undefined;
+                },
+                callback: function (key, opt) {
+                  let row = me.rightClickTarget.row;
+                  me.deleteEquipment(me.data[row].ID);
+                  //me.preApplyInfoPrice(row);
+                }
+              }
+          }
+        });
+      },
+}
+
+$(function () {
+    $('#tab_equipment_purchase').on('shown.bs.tab', function (e) {
+        sessionStorage.setItem('mainTab', '#tab_equipment_purchase');
+        $(e.relatedTarget.hash).removeClass('active');
+        equipmentPurchaseObj.initSpread();
+        equipmentPurchaseObj.showData();
+    })
+})