zhangweicheng 7 år sedan
förälder
incheckning
b7559edc44

+ 5 - 3
modules/main/models/bills.js

@@ -11,6 +11,8 @@ let counter = require("../../../public/counter/counter.js");
 let consts = require('./project_consts');
 let projectConsts = consts.projectConst;
 let commonConsts = consts.commonConst;
+let quantity_detial = require('../../ration_glj/facade/quantity_detail_facade');
+
 
 let billsSchema = new Schema({
     ID: Number,
@@ -24,7 +26,7 @@ let billsSchema = new Schema({
     name: String,
     unit: String,
     quantity: String, // Decimal
-    isFromDetail:{type: Number,default:0},//1 true 2 false
+    isFromDetail:{type: Number,default:0},//1 true 0 false
     programID: Number,
     comments: String,
     // 调价
@@ -74,7 +76,7 @@ class billsModel extends baseModel {
             return function (cb) {
                 switch (doc.updateType) {
                     case commonConsts.UT_UPDATE:
-                        bills.update({projectID: doc.updateData.projectID, ID: doc.updateData.ID}, doc.updateData, cb);
+                        bills.update({projectID: doc.updateData.projectID, ID: doc.updateData.ID,deleteInfo: null}, doc.updateData, cb);
                         break;
                     case commonConsts.UT_CREATE:
                         bills.create(doc.updateData, cb);
@@ -89,8 +91,8 @@ class billsModel extends baseModel {
         for (let i = 0; i < datas.length; i++){
             data = datas[i];
             functions.push(saveOne(data));
+            quantity_detial.quantityEditChecking(data,'bills',functions);
         }
-
         async.parallel(functions, callback);
     };
 

+ 3 - 1
modules/main/models/ration.js

@@ -11,6 +11,7 @@ let counter = require("../../../public/counter/counter.js");
 let consts = require('./project_consts');
 let projectConsts = consts.projectConst;
 let commonConsts = consts.commonConst;
+let quantity_detial = require('../../ration_glj/facade/quantity_detail_facade');
 
 var rationAssItemSchema = mongoose.Schema({
     name: String,
@@ -77,7 +78,7 @@ class rationModel extends baseModel {
             return function (cb) {
                 switch (doc.updateType) {
                     case commonConsts.UT_UPDATE:
-                        ration.update({projectID: doc.updateData.projectID, ID: doc.updateData.ID}, doc.updateData, cb);
+                        ration.update({projectID: doc.updateData.projectID, ID: doc.updateData.ID, deleteInfo: null}, doc.updateData, cb);
                         break;
                     case commonConsts.UT_CREATE:
                         ration.create(doc.updateData, cb);
@@ -94,6 +95,7 @@ class rationModel extends baseModel {
         for (let i = 0; i < datas.length; i++){
             data = datas[i];
             functions.push(saveOne(data));
+            quantity_detial.quantityEditChecking(data,'ration',functions);
         }
         async.parallel(functions, callback);
     };

+ 13 - 1
modules/ration_glj/facade/quantity_detail_facade.js

@@ -20,7 +20,8 @@ module.exports={
     save:save,
     getData:getData,
     deleteByRation:deleteByRation,
-    deleteByBill:deleteByBill
+    deleteByBill:deleteByBill,
+    quantityEditChecking:quantityEditChecking,
 };
 
 let operationMap={
@@ -623,6 +624,17 @@ function deleteByBill(data) {
     }
 }
 
+function quantityEditChecking(doc,type,functions) {
+    if(doc.updateType == commonConsts.UT_UPDATE&&doc.updateData.hasOwnProperty('isFromDetail')&&doc.updateData.isFromDetail==0) {
+        if(type=='bills'){
+            functions.push(deleteByBill(doc.updateData));
+        }else if(type=='ration'){
+            functions.push(deleteByRation(doc.updateData));
+        }
+    }
+}
+
+
 function commonCallback(callback,result,err) {
     if(err){
         callback(err,'');

+ 41 - 0
public/web/socket/connection.js

@@ -0,0 +1,41 @@
+/**
+ * Created by zhangweicheng on 2017/8/7.
+ */
+socketObject={
+  connect:function () {
+      // 连接socket服务器
+      var hostName = window.location.hostname;
+      socket = io('http://'+hostName+':3300');
+      socket.on('connect', function () {
+
+          var roomID = projectObj.project.FeeRate.getActivateFeeRateID();
+          socket.emit('join', roomID);
+          console.log('连接成功');
+      });
+
+      socket.on('feeRateChange', function(data) {
+          //data = JSON.parse(data);
+
+          $("#message").html('费率文件已被修改,<a href="javascript:void(0);" id="load-data" onclick="window.location.reload()">点击加载</a>');
+          $("#notify").show();
+          //alert('费率文件已经修改,请刷新页面');
+          //window.location.reload();
+      })
+
+      /*   socket.on('connect', function () {
+       socket.emit('join', roomId);
+       console.log('连接成功');
+       });
+
+       // 接收到改变
+       socket.on('dataChange', function(data) {
+       data = JSON.parse(data);
+       if (data.newValue === undefined) {
+       return false;
+       }
+       changeInfo.push(data);
+       $("#message").html('市场单位已被修改,<a href="javascript:void(0);" id="load-data">点击加载</a>');
+       $("#notify").slideDown('fast');
+       });*/
+  }
+}

+ 8 - 0
socket.js

@@ -19,9 +19,17 @@ socketIO.on('connection', function(socket) {
         socket.join(data);
     });
 
+
     // 数据更改通知
     socket.on('dataNotify', function(data) {
         socket.broadcast.to(roomId).emit('dataChange', data);
     });
+    socket.on('feeRateChangeNotify', function(data) {
+        socket.broadcast.to(data).emit('feeRateChange', data);
+    });
+    socket.on('changeActivateFeeRate', function(data) {
+        socket.leave(data.oldRoom);
+        socket.join(data.newRoom);
+    });
 
 });

+ 13 - 0
socketDocker/Dockerfile

@@ -0,0 +1,13 @@
+FROM server:2.0
+
+COPY . ConstructionCost
+
+WORKDIR ConstructionCost
+
+RUN cnpm install 
+
+EXPOSE 3300
+
+ENTRYPOINT babel-node socket.js
+
+

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

@@ -29,14 +29,14 @@
 
 <body>
     <div class="header">
-        <!-- <div class="top-msg clearfix">
-            <div class="alert alert-warning mb-0 py-0" role="alert">
-                <button type="button" class="close" data-dismiss="alert" aria-label="Close">
+         <div class="top-msg clearfix">
+            <div class="alert alert-warning mb-0 py-0" role="alert" id="notify" style="display: none">
+                <button type="button" class="close" aria-label="Close" onclick="$('#notify').hide();">
                   <span aria-hidden="true">&times;</span>
                 </button>
-                <strong>注意!</strong> 这是一条消息通知 <a href="#">链接</a>
+                <strong id="message"></strong>
             </div>
-        </div> -->
+        </div>
         <nav class="navbar navbar-toggleable-lg navbar-light bg-faded p-0 justify-content-between">
             <span class="header-logo px-2">Smartcost</span>
             <div class="navbar-text" id="fullpath"><a href="/pm">项目管理</a><i class="fa fa-angle-right fa-fw"></i>文件夹<i class="fa fa-angle-right fa-fw"></i>建设项目<i class="fa fa-angle-right fa-fw"></i>单项工程<i class="fa fa-angle-right fa-fw"></i>单位工程</div>
@@ -454,36 +454,7 @@
               </div>
             </div>
             <div class="tab-pane" id="fee_rates" role="tabpanel">
-
-                <div class="toolsbar px-1">
-                    <div class="form-inline py-1">
-                        <div class="col-lg-6" > <button id="selctFeeFile">选择费率文件</button></div>
-                        <div class="col-lg-3" style="text-align: center"> 费率文件: <span id="projectName"></span></div>
-                    </div>
-                </div>
-                <div class="container-fluid">
-                    <div class="row">
-                        <div class="col-lg-12 p-0">
-                                <div class="row">
-                                    <div class="col-lg-6">
-                                        <div class="form-inline py-1">
-                                            <label class="mx-2" for="inlineFormCustomSelect">费率标准:</label>
-                                            <select class="form-control form-control-sm" id="inlineFormCustomSelect">
-
-                                            </select>
-                                            <span>&nbsp;</span>
-                                        </div>
-                                        <div class=" grid  main-data-top" id="divFee"></div>
-                                    </div>
-                                    <div class="col-lg-4">
-                                        <div class="py-1"><input type="checkbox" id="cascadeSet" checked >统一设置相同参数</div>
-                                        <div class="grid  main-data-top py-1" id="subRate"></div>
-                                     </div>
-
-                                </div>
-                        </div>
-                    </div>
-                </div>
+                <%include ../../fee_rates/fee_rate.html %>
             </div>
           </div>
 

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

@@ -209,6 +209,7 @@ var Bills = {
             let data = {'ID': node.getID(), 'projectID': this.project.ID()};
             if (field === 'quantity') {
                 data[field] = newValue;
+                data.isFromDetail=0;
                 // to do Calculate
                 if (node.data.fees) {
                     data.fees = node.data.fees;

+ 31 - 1
web/building_saas/main/js/models/fee_rate.js

@@ -13,6 +13,7 @@ var FeeRate = {
         };
         FeeRate.prototype.loadData = function (datas) {
             this.datas = datas;
+            socketObject.connect();
         };
    /*     FeeRate.prototype.getViewDatas = function(){
             var  rates=[];
@@ -32,6 +33,15 @@ var FeeRate = {
             })
             return feeRate;
         };
+        FeeRate.prototype.getActivateFeeRateID = function(){
+            var feeRate = this.getActivateFeeRate()
+            if(feeRate){
+                return feeRate.ID;
+            }else {
+                return 0;
+            }
+        };
+
         FeeRate.prototype.getSubViewData= function(item) {
             var datas = [];
             if(item.hasOwnProperty('subFeeRate')&&item.subFeeRate!=undefined){
@@ -104,6 +114,9 @@ var FeeRate = {
                 rate:params.dataItem
             }
             this.updateFeeRate(query,doc);
+            if(this.ifRateChange(params)){
+                this.synchronizeFeeRate();
+            }
         };
 
         FeeRate.prototype.batchUpdateFeeRate = function (items,feerate) {
@@ -116,6 +129,7 @@ var FeeRate = {
         FeeRate.prototype.updateFeeRate=function (query,doc) {
           var updateData = this.getUpdateData('ut_update',query,doc,'update_rates');
             project.pushNow('updateFeeRate',[this.sourceType],updateData);
+            socket.emit('feeRateChangeNotify', this.getActivateFeeRateID());
         };
         FeeRate.prototype.updateStatusBySelected = function (updateTasks) {
             var updateData = [];
@@ -126,7 +140,23 @@ var FeeRate = {
             }
             updateData.push(newobj);
             project.pushNow('updateFeeRate',[this.sourceType],updateData);
-        }
+        };
+        FeeRate.prototype.synchronizeFeeRate = function () {
+            var node = project.mainTree.selected;
+            if (node.sourceType==='ration'&&rationCalcView.sheet) {
+                rationCalcView.showData(node);
+            }
+        };
+
+        FeeRate.prototype.ifRateChange=function (params) {
+            if(params.dataItem.rate!=params.oldDataItem.rate){
+                return true;
+            }else {
+                return false;
+            }
+
+        };
+
         FeeRate.prototype.getRate = function (fileID, rateID){
 
             return 1.25;

+ 26 - 0
web/building_saas/main/js/models/quantity_detail.js

@@ -447,6 +447,32 @@ var quantity_detail = {
                 this.datas = newList;
             }
         };
+        quantity_detail.prototype.quantityEditChecking = function(value,node,fieldName){
+            var validate = true;
+            if (value && value != calcFees.getFee(node.data, fieldName)){
+                if(fieldName=='quantity'){
+                   if(node.data.hasOwnProperty('isFromDetail')&&node.data.isFromDetail==1){
+                       var c = confirm('已有工程量明细,是否清空明细表,采用手工输入的表达式?')
+                        if(c){
+                            node.data.isFromDetail=0;
+                            if(node.sourceType === project.Bills.getSourceType()){
+                                this.deleteByBills([{type:'delete',data:node.data}]);
+                            }else if(node.sourceType === project.Ration.getSourceType()){
+                                this.deleteByRation(node.data);
+                            }
+                            gljOprObj.detailData=[];
+                            sheetCommonObj.showData(gljOprObj.detailSheet,gljOprObj.detailSetting,[]);
+
+                            validate = true;
+                        }else {
+                            validate = false;
+                        }
+                   }
+                }
+            }
+            return validate;
+
+        }
         return new quantity_detail(project);
     }
 

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

@@ -235,6 +235,7 @@ var Ration = {
             let data = {'ID': ration.ID, 'projectID': this.project.ID()};
             if (field === 'quantity') {
                 data[field] = newValue;
+                data.isFromDetail=0;
                 // to do Calculate
                 if (ration.fees) {
                     data.fees = ration.fees;

+ 15 - 1
web/building_saas/main/js/views/fee_rate_view.js

@@ -168,6 +168,8 @@ var feeRateObject={
         }else {
             this.mainViews.data.updateItem(selected.sourceRow,item);
         }
+        projectObj.project.FeeRate.synchronizeFeeRate();
+
         //this.views.data.updateItem()
     },
     cascadeSetRates:function(selectedItem,sourceRow,mapID,selectMap){
@@ -253,7 +255,6 @@ var feeRateObject={
             $('#inlineFormCustomSelect').val(selectedID);
         }
     }
-
 }
 
 $('#tab_fee_rate').bind('click', function () {
@@ -263,10 +264,21 @@ $('#tab_fee_rate').bind('click', function () {
     feeRateObject.loadFeeRateSelection();
 });
 
+/*$('#fee_rates').bind('click', function () {
+    feeRateObject.datas[0].name = 'test';
+    feeRateObject.mainViews.refresh();
+    feeRateObject.mainViews.invalidate();
+
+});*/
+
 $('#inlineFormCustomSelect').change(function(){
     var updateTask = [];
     var selectID = $(this).val();
+    var oldValue=0;
     _.forEach(projectObj.project.FeeRate.datas,function (feeRate) {
+        if(feeRate.status=='activate'){
+            oldValue=feeRate.ID;
+        }
         if(feeRate.ID ==selectID){
             feeRate.status='activate';
         }else {
@@ -277,4 +289,6 @@ $('#inlineFormCustomSelect').change(function(){
     projectObj.project.FeeRate.updateStatusBySelected(updateTask);
     feeRateObject.createSpreadView();
     subRateObject.destorySpreadView();
+    socket.emit('changeActivateFeeRate',{oldRoom:oldValue,newRoom:selectID});
+
 })

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

@@ -54,10 +54,12 @@ var projectObj = {
         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);
+        let validate = project.quantity_detail.quantityEditChecking(value,node,fieldName);
+
         if (colSetting.data.wordWrap) {
             info.sheet.autoFitRow(info.row);
         }
-        if (value && value != calcFees.getFee(node.data, fieldName)) {
+        if (value && value != calcFees.getFee(node.data, fieldName)&&validate) {
             if (node.sourceType === project.Bills.getSourceType()) {
                 project.Bills.updateField(node.source, fieldName, value);
             } else if (node.sourceType === project.Ration.getSourceType()) {