zhangweicheng před 8 roky
rodič
revize
69af866a81

+ 1 - 0
modules/main/models/bills.js

@@ -24,6 +24,7 @@ let billsSchema = new Schema({
     name: String,
     unit: String,
     quantity: String, // Decimal
+    isFromDetail:{type: Number,default:0},//1 true 2 false
     programID: Number,
     comments: String,
     // 调价

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

@@ -37,6 +37,7 @@ let rationSchema = new Schema({
     caption: String,
     unit: String,
     quantity: String, // Decimal
+    isFromDetail:{type: Number,default:0},  //1 true 2 false
     programID: Number,
     adjustState: String,
     content: String,

+ 367 - 66
modules/ration_glj/facade/quantity_detail_facade.js

@@ -12,6 +12,9 @@ let _=require("lodash");
 let async_n = require("async");
 let quantity_detail_model = mongoose.model('quantity_detail');
 const uuidV1 = require('uuid/v1');
+let ration_model = mongoose.model('ration');
+let bill_model=mongoose.model("bills");
+
 
 module.exports={
     save:save,
@@ -26,110 +29,401 @@ let operationMap={
 
 let updateFunctionMap = {
     'normalUpdate':normalUpdate,
-    'updateQuantityRegex':updateQuantityRegex
+    'updateQuantityRegex':updateQuantityRegex,
+    'insertRecode':insertRecode
 }
 
 function create_quantity_detail(user_id,datas) {
     return function (callback) {
         let doc = datas.doc;
         doc.ID = uuidV1();
-        quantity_detail_model.create(doc,(err,result)=>{
-            if(err){
-                callback(err,null);
+        if(doc.hasOwnProperty('regex')){
+            insertRecodeWithReg(doc).then(function (resultObject) {
+                if(resultObject.err){
+                    callback(null,{
+                        moduleName:consts.projectConst.QUANTITY_DETAIL,
+                        err:{
+                            message:result.err.message
+                        }
+                    });
+                } else {
+                    callback(null,resultObject.return_list);
+                }
+            })
+        }else {
+            createNormalRecode(doc,callback)
+        }
+
+    }
+}
+
+function insertRecode(user_id,datas) {
+    return function (callback) {
+        let doc = datas.doc;
+        doc.ID = uuidV1();
+        doInsertRecode(doc).then(function (result) {
+            console.log(result);
+            if(result.err){
+                callback(result.err,'')
             }else {
-                console.log(result);
-                let returndata ={
-                    updateTpye:commonConsts.UT_CREATE,
-                    moduleName:consts.projectConst.QUANTITY_DETAIL,
-                    data:result
+                callback(null,result.returndata)
+            }
+
+        })
+    }
+}
+
+async function doInsertRecode(doc) {
+    let result={
+        err:null
+    }
+    try{
+        let query = {
+            projectID:doc.projectID,
+            seq : { $gte: doc.seq }
+        }
+        if(doc.hasOwnProperty('rationID')){
+            query.rationID = doc.rationID;
+        }else {
+            query.billID = doc.billID;
+        }
+        let quantity_detail_List = await getDatailList(doc,{data:{}});
+        let update_task = getUpdateReferenceTask(quantity_detail_List,doc.seq,1);
+        await quantity_detail_model.update(query,{$inc:{seq:1}},{multi: true});
+        if(update_task.length>0){
+            await quantity_detail_model.bulkWrite(generateUpdateTaks(update_task));
+        }
+        let newrecode = await quantity_detail_model.create(doc);
+        let returndata ={
+            updateTpye:commonConsts.UT_CREATE,
+            moduleName:consts.projectConst.QUANTITY_DETAIL,
+            data:{
+                doc:newrecode,
+                resort:true,
+                update_task:update_task
+            }
+        };
+        result.returndata =returndata
+        return result;
+    }catch (error){
+        console.log(error)
+        result.err;
+        return result
+    }
+}
+
+function getUpdateReferenceTask(quantity_detail_List,seq,re) {
+    let update_task=[];
+    for(let q of quantity_detail_List){
+        let need_update =false;
+        let newReg = q.regex;
+        let newReferenceIndex;
+        if(q.referenceIndexs.length>0){
+            for (let i =0;i< q.referenceIndexs.length;i++){
+                if(q.referenceIndexs[i]>seq){
+                    newReg = replaceAll('C'+q.referenceIndexs[i],'C'+(q.referenceIndexs[i]+re),newReg);
+                    newReg = replaceAll('c'+q.referenceIndexs[i],'c'+(q.referenceIndexs[i]+re),newReg);
+                    q.referenceIndexs[i] +=re;
+                    need_update = true;
                 }
-                callback(null,returndata)
             }
+        }
+        if(need_update){
+            newReferenceIndex = q.referenceIndexs;
+            let task ={
+                query:{
+                    ID:q.ID,
+                    projectID:q.projectID
+                },
+                doc:{
+                    regex:newReg,
+                    referenceIndexs:newReferenceIndex
+                }
+            }
+            update_task.push(task);
+        }
+    }
+    return update_task;
+}
+
+
+function createNormalRecode(doc,callback) {
+    quantity_detail_model.create(doc,(err,result)=>{
+        if(err){
+            callback(err,null);
+        }else {
+            console.log(result);
+            let returndata ={
+                updateTpye:commonConsts.UT_CREATE,
+                moduleName:consts.projectConst.QUANTITY_DETAIL,
+                data:result
+            }
+            callback(null,returndata)
+        }
+    });
+}
+
+
+async function insertRecodeWithReg (doc) {
+    let returnObjec={
+        err:null,
+        return_list:[]
+    }
+    try {
+        let returnData={
+            moduleName:'',
+            data:{
+                updateTpye:commonConsts.UT_UPDATE,
+            }
+        }
+        let regex = doc.regex.toUpperCase();
+        let referenceIndexs = doc.referenceIndexs;
+        let detailList = await getDatailList(doc,returnData);
+        doc.result =getEvalResult(referenceIndexs,detailList,regex);
+        let refreshQuantity =false;
+        if(doc.refreshQuantity=true){
+            refreshQuantity = true;
+        }
+        delete doc.refreshQuantity;
+        let newRecode = await quantity_detail_model.create(doc) ;
+        detailList.push(newRecode);
+        if(refreshQuantity==true){
+            returnData.data.quantity = await summateResuts(doc,detailList);
+            returnData.data.quantityRefresh = true;
+            returnObjec.return_list.push(returnData);
+        }
+        returnObjec.return_list.push({
+            updateTpye:commonConsts.UT_CREATE,
+            moduleName:consts.projectConst.QUANTITY_DETAIL,
+            data:newRecode
         });
+        return returnObjec;
+    }catch (error){
+        returnObjec.err = new Error('输入的表达式有误,请重新输入!');
+        console.log(error)
+        return returnObjec;
     }
+
+
 }
+
+
+
 function normalUpdate(user_id,datas) {
     return function(callback) {
-        updateRecored(datas.query,datas.doc,callback);
+        if(datas.doc.hasOwnProperty('isSummation')){
+            doIsSummationUpdate(datas.query,datas.doc).then(function (sresult) {
+                let returndata ={
+                    moduleName:consts.projectConst.QUANTITY_DETAIL,
+                    data:{
+                        updateTpye:commonConsts.UT_UPDATE,
+                        query:datas.query,
+                        doc:datas.doc
+                    }
+                }
+                let retrunArr = [];
+                retrunArr.push(returndata);
+                if(sresult){
+                    retrunArr.push(sresult);
+                }
+                callback(null,retrunArr);
+            })
+        }else {
+            updateRecored(datas.query,datas.doc,callback);
+        }
     }
 }
 function updateQuantityRegex(user_id,datas) {
     return function(callback){
         console.log(datas);
         doRegexUpdate(datas).then(function (result) {
+            if(result.err){
+                callback(null,{
+                    moduleName:consts.projectConst.QUANTITY_DETAIL,
+                    err:{
+                        message:result.err.message
+                    }
+                });
+            }else {
+                callback(null,result.rList);
+            }
 
-            console.log("update");
-            callback(null,'');
         })
+    }
+}
 
-       /* let checkResult =checkingRegex(datas);
-        if(checkResult!=null){
-            callback(null,{
-                moduleName:consts.projectConst.QUANTITY_DETAIL,
-                err:{
-                    message:checkResult.message
-                }
-            });
+async function doIsSummationUpdate(query,doc) {
+    try {
+        let returnData={
+            moduleName:'',
+            data:{
+                updateTpye:commonConsts.UT_UPDATE,
+            }
+        }
+        let  refreshQuantity=false;
+        if(query.refreshQuantity==true){
+            refreshQuantity=true;
+        }
+        delete query.refreshQuantity;
+        let updateDoc = await quantity_detail_model.update(query,doc);
+        let detailList = await getDatailList(query,returnData);
+        if(refreshQuantity==true){
+            let quantity = await summateResuts(query,detailList);
+            returnData.data.quantity = quantity;
+            returnData.data.quantityRefresh = true;
+            return returnData;
         }else {
-            updateRecored(datas.query,datas.doc,callback)
-        }*/
+            return null;
+        }
+    }catch (error){
+        console.log(error)
     }
 }
 
-async function doRegexUpdate(datas) {
-    if(datas.doc.regex==null){
-        //update result and bill/ration  records to null and refresh
+async function getDatailList(query,resultObject) {
+    let detailList = [];
+    if(query.hasOwnProperty('rationID')){
+        detailList = await quantity_detail_model.find({'projectID':query.projectID,'rationID':query.rationID}).sort('seq').exec();
+        resultObject.moduleName = consts.projectConst.RATION;
+        resultObject.data.rationID=query.rationID;
+
     }else {
-        try {
-            let regex = datas.doc.regex.toUpperCase();
+        detailList = await quantity_detail_model.find({'projectID':query.projectID,'billID':query.billID}).sort('seq').exec();
+        resultObject.moduleName = consts.projectConst.BILLS;
+        resultObject.data.billID=query.billID;
+    }
+    return detailList;
+}
+
+
+async function doRegexUpdate(datas) {
+    let resultObjec ={
+        err:null,
+        rList:[]
+    }
+    try {
+        let detailList = [];
+        let quantityResult ={
+            moduleName:'',
+            data:{
+                updateTpye:commonConsts.UT_UPDATE,
+                quantityRefresh:true
+            }
+        }
+        if(datas.query.hasOwnProperty('rationID')){
+            detailList = await quantity_detail_model.find({'projectID':datas.query.projectID,'rationID':datas.query.rationID}).sort('seq').exec();
+            quantityResult.moduleName = consts.projectConst.RATION;
+            quantityResult.data.rationID = datas.query.rationID;
+        }else {
+            detailList = await quantity_detail_model.find({'projectID':datas.query.projectID,'billID':datas.query.billID}).sort('seq').exec();
+            quantityResult.data.billID = datas.query.billID;
+            quantityResult.moduleName = consts.projectConst.BILLS;
+        }
+        let regex;
+        let result;
+        if(datas.doc.regex==null){
+            result=0
+            datas.doc.referenceIndexs=[];
+        }else {
+            regex = datas.doc.regex.toUpperCase();
             let referenceIndexs = datas.doc.referenceIndexs;
-            let detailList = await quantity_detail_model.find({'projectID':datas.query.projectID,'rationID':datas.query.rationID}).sort('seq').exec();
-            let result =getEvalResult(referenceIndexs,detailList,regex);
-            detailList[datas.query.index].result =result;
-            detailList[datas.query.index].regex=datas.doc.regex;
-            let updateTasks =[];
-            datas.doc.result=result;
-            updateTasks.push({
+            result =getEvalResult(referenceIndexs,detailList,regex);
+        }
+        detailList[datas.query.index].result =result;
+        detailList[datas.query.index].regex=datas.doc.regex;
+        detailList[datas.query.index].referenceIndexs =datas.doc.referenceIndexs;
+        let updateTasks =[];
+        datas.doc.result=result;
+        updateTasks.push({
+            query:{
+                ID:datas.query.ID,
+                projectID:datas.query.projectID
+            },
+            doc:datas.doc
+        })
+        updateReferenceRecode(datas.query.index+1,detailList,updateTasks);
+        let updateEdit = await quantity_detail_model.bulkWrite(generateUpdateTaks(updateTasks));
+        resultObjec.rList.push(gernerateResultList(updateTasks));
+        if(datas.query.refreshQuantity==true){
+            quantityResult.data.quantity = await summateResuts(datas.query,detailList);
+            resultObjec.rList.push(quantityResult);
+        }
+        return resultObjec;
+    }catch (error){
+        console.log(error);
+        resultObjec.err=error;
+        return resultObjec
+
+    }
+}
+
+function gernerateResultList(updateTasks) {
+    let returndata ={
+        moduleName:consts.projectConst.QUANTITY_DETAIL,
+        data:{
+            updateTpye:commonConsts.UT_UPDATE,
+            refreshList:updateTasks
+        }
+    }
+    return returndata;
+
+}
+
+
+
+function updateReferenceRecode(index,detailList,updateTasks) {
+    for(let d of detailList){
+        if(_.includes(d.referenceIndexs,index)){
+            let tResult = getEvalResult(d.referenceIndexs,detailList,d.regex);
+            let t = {
                 query:{
-                    ID:datas.query.ID,
-                    projectID:datas.query.projectID
+                    ID:d.ID,
+                    projectID:d.projectID
                 },
-                doc:datas.doc
-            })
-            for(let d of detailList){
-                if(_.includes(d.referenceIndexs,datas.query.index+1)){
-                    let tResult = getEvalResult(d.referenceIndexs,detailList,d.regex);
-                    let t = {
-                        query:{
-                            ID:d.ID,
-                            projectID:d.projectID
-                        },
-                        doc:{
-                            result:tResult
-                        }
-                    };
-                    updateTasks.push(t);
-
+                doc:{
+                    result:tResult
                 }
-            }
-            let updateEdit = await quantity_detail_model.bulkWrite(generateUpdateTaks(updateTasks));
-            console.log(updateEdit);
-            return regex;
-        }catch (error){
-            console.log(error);
+            };
+            d.result = tResult;
+            updateTasks.push(t);
+            updateReferenceRecode(d.seq+1,detailList,updateTasks);
         }
+    }
+}
 
+
+async function summateResuts (query,detailList) {
+    let quantity = 0;
+    for(let d of detailList){
+        if(d.isSummation==1){
+            let result = d.result==null||d.result==undefined?0:d.result
+            quantity+=result;
+        }
+    }
+    quantity = quantity.toFixed(4);
+    if(query.hasOwnProperty('rationID')){
+        await ration_model.update({'ID':query.rationID,'projectID':query.projectID,deleteInfo: null},{quantity:quantity,isFromDetail:1});
+    }else {
+        await bill_model.update({'ID':query.billID,'projectID':query.projectID,deleteInfo: null},{quantity:quantity,isFromDetail:1});
     }
+    return quantity
 }
 
+
+
 function  getEvalResult(referenceIndexs,detailList,regex) {
-    for(let i of referenceIndexs){
-        regex = replaceReference(i,detailList,regex)
+    try {
+        for(let i of referenceIndexs){
+            regex = replaceReference(i,detailList,regex)
+        }
+        console.log('replace all C reference -----'+regex);
+        regex =replaceSqr(regex);
+        console.log('replace all sqar reference -----'+regex);
+        return _.round(eval(regex), 4);
+    }catch (error){
+        throw new Error('输入的表达式有误,请重新输入!');
     }
-    console.log('replace all C reference -----'+regex);
-    regex =replaceSqr(regex);
-    console.log('replace all sqar reference -----'+regex);
-    return eval(regex);
+
 }
 
 function  generateUpdateTaks(updateTasks) {
@@ -148,7 +442,8 @@ function  generateUpdateTaks(updateTasks) {
 
 function replaceReference(index,detailList,str) {
     str=str.toUpperCase();
-    str=replaceAll('C'+index,'('+detailList[index-1].regex+')',str);
+    let rstr= detailList[index-1].regex==null?'0':'('+detailList[index-1].regex+')';
+    str=replaceAll('C'+index,rstr,str);
     if(detailList[index-1].referenceIndexs.length>0){
         for (let i of detailList[index-1].referenceIndexs){
             str =replaceReference(i,detailList,str);
@@ -236,10 +531,16 @@ function update_quantity_detail(user_id,datas) {
 
 function delete_quantity_detail(user_id,datas) {
     return function (callback) {
+        doQuantityDelete(datas.doc).then(function (result) {
+
+        });
         callback(null,'');
     }
 }
 
+async function doQuantityDelete(doc) {
+   console.log(doc) ;
+}
 
 
 function getData(projectID, callback) {

+ 1 - 1
modules/ration_glj/models/quantity_detail.js

@@ -12,7 +12,7 @@ var quantity_detail = new Schema({
     billID:Number,
     name:String,
     regex:String,
-    result:String,
+    result:Number,
     isSummation: {type: Number,default:1},//0:false 1:true
     referenceIndexs:[Number],
     seq:Number

+ 40 - 1
modules/ration_glj/models/ration_glj_temp.js

@@ -49,6 +49,7 @@ let rationSchema = new Schema({
     caption: String,
     unit: String,
     quantity: String, // Decimal
+    isFromDetail:{type: Number,default:0},//1 true 2 false
     programID: Number,
     adjustState: String,
     content: String,
@@ -115,4 +116,42 @@ var rationItemSchema = mongoose.Schema({
     rationCoeList: Array,
     rationAssList: [rationAssItemSchema]
 });
-mongoose.model("std_ration_lib_ration_items",rationItemSchema, "std_ration_lib_ration_items")
+mongoose.model("std_ration_lib_ration_items",rationItemSchema, "std_ration_lib_ration_items");
+
+let billsSchema = new Schema({
+    ID: Number,
+    ParentID: Number,
+    NextSiblingID: Number,
+    projectID: Number,
+    serialNo: Number,
+    chapterID: Number,
+    code: String,
+    fullCode: String,
+    name: String,
+    unit: String,
+    quantity: String, // Decimal
+    isFromDetail:{type: Number,default:0},//1 true 2 false
+    programID: Number,
+    comments: String,
+    // 调价
+    xs_Labour: String, // Decimal
+    xs_Material: String, // Decimal
+    xs_Machine: String, // Decimal
+    xs_FeeRate: String, // Decimal
+    xs_LabourPrice: String, // Decimal
+    xs_MaterialPrice: String, // Decimal
+    xs_MachinePrice: String, // Decimal
+    isTender_Labour: Boolean,
+    isTender_Material: Boolean,
+    isTender_Machine: Boolean,
+    tenderTargetPrice: String, // Decimal
+    tenderTargetUnitPrice: String, // Decimal
+    tenderTargetUnitPrice: String, // Decimal
+    // 费用字段
+    fees: [subSchema.feesSchema],
+    // 标记字段
+    flags: [subSchema.flagsSchema],
+    deleteInfo: deleteSchema
+});
+
+mongoose.model("bills", billsSchema);

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

@@ -524,6 +524,7 @@
     <script type="text/javascript" src="/web/building_saas/main/js/views/std_bills_lib.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/views/std_ration_lib.js"></script>
     <script type="text/javascript" src="/web/building_saas/main/js/models/quantity_detail.js"></script>
+    <script type="text/javascript" src="/web/building_saas/main/js/views/glj_view_contextMenu.js"></script>
     <!-- reports -->
     <script type="text/javascript" src="/public/web/treeDataHelper.js"></script>
     <script type="text/javascript" src="/public/web/ztree_common.js"></script>

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

@@ -94,7 +94,26 @@ var Bills = {
 
         // 提交数据后的错误处理方法
         bills.prototype.doAfterUpdate = function(err, data){
-            // to do
+            console.log(data)
+            if(data.quantityRefresh){
+                this.refreshDatas(data,'quantity');
+            }
+        };
+
+        bills.prototype.refreshDatas = function(data,fieldName){
+            var dataIndex = _.findIndex(this.datas,function(item) {
+                return item.ID ==data.billID;
+            });
+            this.datas[dataIndex][fieldName] = data[fieldName];
+            if(fieldName=='quantity'){
+                this.datas[dataIndex]['isFromDetail']=1
+            }
+            var controller = projectObj.mainController;
+            var selected = controller.sheet.getSelections();
+            var col =   _.findIndex(BillsGridSetting.cols,function (col) {
+                return col.data.field ==fieldName;
+            });
+            controller.sheet.getCell(selected[0].row,col).value(data[fieldName]);
         };
 
         bills.prototype.getCounterData = function (count) {

+ 130 - 21
web/building_saas/main/js/models/quantity_detail.js

@@ -36,22 +36,57 @@ var quantity_detail = {
                     this.refreshAfterSave(data);
                 }
             }else {
-                alert("输入的表达式有误,请重新输入");
+                alert(err.message);
                 this.refreshSheetData();
             }
         };
         quantity_detail.prototype.refreshAfterSave=function(data){
-            this.datas.push(data);
-            gljOprObj.detailData.push(data);
+            console.log(data);
+            var me = this;
+            if(data.hasOwnProperty('resort')){
+                this.resortData(data.doc);
+                _.forEach(data.update_task,function (item) {
+                    me.refreshEachItme(item.query,item.doc);
+                })
+            }else {
+                this.datas.push(data);
+                gljOprObj.detailData.push(data);
+            }
             gljOprObj.detailData=_.sortBy(gljOprObj.detailData,'seq');
+            console.log(gljOprObj.detailData);
             this.refreshSheetData();
         };
+        quantity_detail.prototype.resortData=function(data){
+
+            for(var i =0;i<gljOprObj.detailData.length;i++){
+                var item = gljOprObj.detailData[i];
+                if(item.seq>=data.seq){
+                    item.seq=item.seq+1;
+                }
+            }
+            gljOprObj.detailData.push(data);
+            this.datas.push(data);
+        };
         quantity_detail.prototype.refreshAfterUpdate=function(data){
+            var me = this;
+            var filter_object;
+            if(data.hasOwnProperty('refreshList')){
+                _.forEach(data.refreshList,function (item) {
+                    filter_object= me.refreshEachItme(item.query,item.doc);
+                })
+            }else {
+                filter_object = me.refreshEachItme(data.query,data.doc);
+            }
+            var showList = _.filter(this.datas,filter_object);
+            gljOprObj.detailData=showList;
+            this.refreshSheetData();
+        };
+        quantity_detail.prototype.refreshEachItme = function(query,doc){
             var detail_list = this.datas;
-            var detail_index= _.findIndex(detail_list,(detail)=>{
-                return detail.ID==data.query.ID;
+            var detail_index= _.findIndex(detail_list,function(detail){
+                return detail.ID==query.ID;
             })
-            _.forEach(data.doc, function(n, key) {
+            _.forEach(doc, function(n, key) {
                 detail_list[detail_index][key] = n;
             });
             var filter_object;
@@ -60,9 +95,7 @@ var quantity_detail = {
             }else {
                 filter_object={'billID':detail_list[detail_index].billID};
             }
-            var showList = _.filter(this.datas,filter_object);
-            gljOprObj.detailData=showList;
-            this.refreshSheetData();
+            return filter_object;
         };
         quantity_detail.prototype.refreshAfterDelete=function(data){
             var glj_list = projectObj.project.ration_coe.datas;
@@ -100,15 +133,69 @@ var quantity_detail = {
             doc.projectID = selected.data.projectID;
             doc[dataCode]=args.editingText;
             doc.seq=args.row;
-            var updateData = this.getUpdateData('ut_create',null,doc);
+            if(dataCode=='regex'){
+                if(!this.regexChecking(args.editingText)||!this.referenceChecking(args.editingText,args.row,doc)){
+                    return;
+                }
+                doc.refreshQuantity=true;
+                if(!selected.data.hasOwnProperty('isFromDetail')||selected.data.isFromDetail==0){
+                    var c = confirm("确定要使用工程量明细替换原工程量吗?");
+                    if(!c){
+                        doc.refreshQuantity=false;
+                    }
+                }
+
+            }
+            var updateData
+            if(args.hasOwnProperty("insertRecode")){
+                updateData = this.getUpdateData('ut_update',null,doc,'insertRecode');
+            }else{
+                updateData = this.getUpdateData('ut_create',null,doc);
+            }
             project.pushNow('saveQuantityDetail',[this.getSourceType()],updateData);
         };
+        quantity_detail.prototype.insertQuantityDetail = function (row) {
+            var args = {
+                row:row,
+                editingText:1
+            }
+            if(row < gljOprObj.detailData.length){
+                args.insertRecode = true;
+            }
+            this.saveQuantityDetail(args,'isSummation');
+
+        };
+
+        quantity_detail.prototype.deleteQuantityDetail = function (row) {
+           var deleteable = this.checkReference(row);
+           if(deleteable){
+               var recode = gljOprObj.detailData[row];
+               var updateData = this.getUpdateData('ut_delete',null,recode);
+               project.pushNow('deleteQuantityDetail',[this.getSourceType()],updateData);
+           }else {
+               alert("当前行已被引用,不可删除。");
+           }
+
+        };
+        quantity_detail.prototype.checkReference = function (row) {
+            var deleteable = true;
+           for(var i =0;i<gljOprObj.detailData.length;i++){
+                var item = gljOprObj.detailData[i];
+                if(_.includes(item.referenceIndexs,row+1)){
+                    deleteable = false;
+                    break;
+                }
+            }
+
+            return deleteable;
+        };
         quantity_detail.prototype.updateQuantityDetail=function (args,dataCode,recode) {
             var doc ={};
             var query={
                 ID:recode.ID,
                 projectID:recode.projectID
             };
+            var selected = projectObj.project.mainTree.selected;
             doc[dataCode]=args.editingText;
             if (dataCode == 'regex') {
                 if(recode.hasOwnProperty('rationID')){
@@ -116,6 +203,13 @@ var quantity_detail = {
                 }else {
                     query.billID = recode.billID
                 }
+                query.refreshQuantity=true;
+                if(!selected.data.hasOwnProperty('isFromDetail')||selected.data.isFromDetail==0){
+                    var c = confirm("确定要使用工程量明细替换原工程量吗?");
+                    if(!c){
+                        query.refreshQuantity=false;
+                    }
+                }
                 query.index = args.row;
                 this.updateQuantityRegex(query,doc,args)
             }else {
@@ -143,6 +237,19 @@ var quantity_detail = {
                 ID:detailList[args.row].ID,
                 projectID:detailList[args.row].projectID
             };
+            var selected = projectObj.project.mainTree.selected;
+            query.refreshQuantity=true;
+            if(!selected.data.hasOwnProperty('isFromDetail')||selected.data.isFromDetail==0){
+                var c = confirm("确定要使用工程量明细替换原工程量吗?");
+                if(!c){
+                    query.refreshQuantity=false;
+                }
+            }
+            if(detailList[args.row].hasOwnProperty('rationID')){
+                query.rationID=detailList[args.row].rationID;
+            }else {
+                query.billID = detailList[args.row].billID
+            }
             var doc={
                 isSummation:newval
             };
@@ -174,7 +281,7 @@ var quantity_detail = {
             var indexOut = false;
             _.forEach(refList,function (item) {
                 var ref_index = parseInt(item.substring(1));
-                if(ref_index>me.datas.length){
+                if(ref_index>gljOprObj.detailData.length){
                     indexOut=true;
                     return;
                 }else {
@@ -213,18 +320,20 @@ var quantity_detail = {
 
         quantity_detail.prototype.getReferenceList=function(item,original) {
             var invalidate =false;
-            var recode = this.datas[item - 1];
-            if (recode.referenceIndexs.length > 0) {
-                if(_.includes(recode.referenceIndexs,original)){
-                    invalidate = true;
-                    return invalidate;
-                }
-                this.temList = this.temList.concat(recode.referenceIndexs);
-                _.forEach(recode.referenceIndex, function (item) {
-                    if(this.getReferenceList(item,original)){
+            if(gljOprObj.detailData.length>=item){
+                var recode = gljOprObj.detailData[item - 1];
+                if (recode.referenceIndexs.length > 0) {
+                    if(_.includes(recode.referenceIndexs,original)){
                         invalidate = true;
+                        return invalidate;
                     }
-                })
+                    this.temList = this.temList.concat(recode.referenceIndexs);
+                    _.forEach(recode.referenceIndex, function (item) {
+                        if(this.getReferenceList(item,original)){
+                            invalidate = true;
+                        }
+                    })
+                }
             }
             return invalidate;
         }

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

@@ -59,29 +59,34 @@ var Ration = {
             if(data.stateRefresh){
                 this.refreshAdjustState(data);
             }
+            if(data.quantityRefresh){
+                this.refreshQuantity(data);
+            }
         };
         ration.prototype.refreshAdjustState = function(data){
+            this.refreshDatas(data,'adjustState');
+            if(data.hasOwnProperty('name')){
+              this.refreshDatas(data,'name')
+            }
+        };
+        ration.prototype.refreshQuantity = function(data){
+            this.refreshDatas(data,'quantity');
+        };
+        ration.prototype.refreshDatas = function(data,fieldName){
+            var dataIndex = _.findIndex(this.datas,function(item) {
+                return item.ID ==data.rationID;
+            });
+            this.datas[dataIndex][fieldName] = data[fieldName];
+            if(fieldName=='quantity'){
+                this.datas[dataIndex]['isFromDetail']=1
+            }
             var controller = projectObj.mainController;
-             var dataIndex = _.findIndex(this.datas,function(item) {
-                 return item.ID ==data.rationID;
-             });
-            this.datas[dataIndex].adjustState = data.adjustState;
             var selected = controller.sheet.getSelections();
             var col =   _.findIndex(BillsGridSetting.cols,function (col) {
-                return col.data.field =='adjustState';
+                return col.data.field ==fieldName;
             });
-            controller.sheet.getCell(selected[0].row,col).value(data.adjustState);
-            if(data.hasOwnProperty('name')){
-                this.datas[dataIndex].name = data.name;
-                var nameCol = _.findIndex(BillsGridSetting.cols,function (col) {
-                    return col.data.field =='name';
-                })
-                controller.sheet.getCell(selected[0].row,nameCol).value(data.name);
-            }
-
-        }
-
-
+            controller.sheet.getCell(selected[0].row,col).value(data[fieldName]);
+        };
         ration.prototype.getTempRationData = function (id, billsID, serialNo) {
             var newData = {'ID': id, 'serialNo': serialNo, projectID: this.project.ID()};
             newData[project.masterField.ration] = billsID;

+ 3 - 34
web/building_saas/main/js/views/glj_view.js

@@ -75,7 +75,7 @@ var gljOprObj = {
         sheet.name('ration_glj');
         me.bindSheetEvent(sheet);
         sheet.bind(GC.Spread.Sheets.Events.CellClick, me.onCellClick);
-        this.loadGLJSpreadContextMenu();
+        gljContextMenu.loadGLJSpreadContextMenu();
     },
     initCoeSheet:function (sheet) {
         var me = this;
@@ -493,11 +493,11 @@ var gljOprObj = {
         sheetCommonObj.showData(this.sheet,this.setting,[]);
         sheetCommonObj.showData(this.coeSheet,this.coeSetting,[]);
         sheetCommonObj.showData(this.assSheet,this.assSetting,[]);
-        sheetCommonObj.showData(this.detailSheet,this.detailSetting,[]);
+      //  sheetCommonObj.showData(this.detailSheet,this.detailSetting,[]);
         this.sheetData = [];
         this.coeSheetData = [];
         this.assSheetData = [];
-        this.detailData=[];
+        //this.detailData=[];
     },
  /*   lockRationGLJCell:function(){
         sheetCommonObj.lockCells(this.sheet,this.setting);
@@ -516,37 +516,6 @@ var gljOprObj = {
     lockRationGLJCell:function(){
         sheetCommonObj.lockCells(this.sheet,this.setting);
     },*/
-    loadGLJSpreadContextMenu: function () {
-        var project =projectObj.project, spread =subSpread;
-        var selectedRow =null;
-        $.contextMenu({
-            selector: '#subSpread',
-            build: function ($trigger, e) {
-                var target = SheetDataHelper.safeRightClickSelection($trigger, e, spread);
-                selectedRow = target.row;
-                //controller.setTreeSelected(controller.tree.items[target.row]);
-                return target.hitTestType === GC.Spread.Sheets.SheetArea.viewport || target.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
-            },
-            items: {
-                "delete_glj": {
-                    name: '删除工料机',
-                    icon: 'fa-remove',
-                    disabled: function () {
-                        //var selected = project.mainTree.selected;
-                        var disable = true;
-                        if(subSpread.getActiveSheetIndex()==0&&gljOprObj.sheetData!=null&&gljOprObj.sheetData.length>0&&selectedRow<gljOprObj.sheetData.length){
-                            disable=false
-                        }
-                        return disable;
-                    },
-                    callback: function () {
-                        var deleteRow = gljOprObj.sheetData[selectedRow];
-                        projectObj.project.ration_glj.updataOrdelete(deleteRow);
-                    }
-                }
-            }
-        });
-    },
     updateRationGLJ:function (args,updateFunction) {
         if(!updateFunction){
             return

+ 110 - 0
web/building_saas/main/js/views/glj_view_contextMenu.js

@@ -0,0 +1,110 @@
+/**
+ * Created by chen on 2017/7/25.
+ */
+
+var gljContextMenu = {
+    selectedRow :null,
+    loadGLJSpreadContextMenu: function () {
+        $.contextMenu({
+            selector: '#subSpread',
+            build: this.onbuild,
+            items: {
+                "delete_glj": {
+                    name: '删除工料机',
+                    icon: 'fa-remove',
+                    disabled: function () {
+                        var sheetData = gljOprObj.sheetData;
+                        var disable = true;
+                        if(subSpread.getActiveSheetIndex()==0&&sheetData!=null&&sheetData.length>0&&gljContextMenu.selectedRow<sheetData.length){
+                            disable=false
+                        }
+                        return disable;
+                    },
+                    callback: function () {
+                        var sheetData = gljOprObj.sheetData;
+                        var deleteRow = sheetData[gljContextMenu.selectedRow];
+                        projectObj.project.ration_glj.updataOrdelete(deleteRow);
+                    }
+                }
+            }
+        });
+    },
+    loadQuantityDetailMenu:function () {
+        $.contextMenu({
+            selector: '#subSpread',
+            build: this.onbuild,
+            items: {
+                "insert_detail": {
+                    name: '插入行',
+                    icon: 'fa-sign-in',
+                    disabled: function () {
+                        var sheetData = gljOprObj.detailData;
+                        return gljContextMenu.selectedRow>sheetData.length;
+                    },
+                    callback: function () {
+                        projectObj.project.quantity_detail.insertQuantityDetail(gljContextMenu.selectedRow);
+                    }
+                },
+                "delete_detail": {
+                    name: '删除行',
+                    icon: 'fa-remove',
+                    disabled: function () {
+                        var sheetData = gljOprObj.detailData;
+                        return gljContextMenu.selectedRow>sheetData.length-1;
+                    },
+                    callback:function () {
+                        projectObj.project.quantity_detail.deleteQuantityDetail(gljContextMenu.selectedRow);
+                    }
+                },
+                "move_up": {
+                    name: '上移',
+                    icon: 'fa-arrow-up',
+                    disabled: function () {
+
+                    },
+                    callback: function () {
+
+                    }
+                },
+                "move_down": {
+                    name: '下移',
+                    icon: 'fa-arrow-down',
+                    disabled: function () {
+
+                    },
+                    callback: function () {
+
+                    }
+                },
+                "copy": {
+                    name: '复制',
+                    icon: 'fa-files-o',
+                    disabled: function () {
+
+                    },
+                    callback: function () {
+
+                    }
+                },
+                "paste": {
+                    name: '粘贴',
+                    icon: 'fa-clipboard',
+                    disabled: function () {
+
+                    },
+                    callback: function () {
+
+                    }
+                }
+            }
+        });
+
+    },
+    onbuild:function ($trigger, e) {
+        var target = SheetDataHelper.safeRightClickSelection($trigger, e, subSpread);
+        gljContextMenu.selectedRow = target.row;
+        //controller.setTreeSelected(controller.tree.items[target.row]);
+        return target.hitTestType === GC.Spread.Sheets.SheetArea.viewport || target.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
+    }
+
+}

+ 6 - 1
web/building_saas/main/js/views/sub_view.js

@@ -28,25 +28,30 @@ SheetDataHelper.protectdSheet(subSpread.getSheet(3));
 
 $("#linkGLJ").click(function(){
     subSpread.setActiveSheetIndex(0);
-
+    $.contextMenu( 'destroy', "#subSpread" );
+    gljContextMenu.loadGLJSpreadContextMenu();
     // for test
     //subSpread.getActiveSheet().setValue(0, 0, "工料机");
 });
 
 $("#linkFZDE").click(function(){
     subSpread.setActiveSheetIndex(1);
+    $.contextMenu( 'destroy', "#subSpread" );
     // for test
   //  subSpread.getActiveSheet().setValue(0, 0, "辅助定额");
 });
 
 $("#linkFZTJ").click(function(){
     subSpread.setActiveSheetIndex(2);
+    $.contextMenu( 'destroy', "#subSpread" );
     // for test
     //subSpread.getActiveSheet().setValue(0, 0, "附注条件");
 });
 
 $("#linkGCLMX").click(function(){
     subSpread.setActiveSheetIndex(3);
+    $.contextMenu( 'destroy', "#subSpread" );
+    gljContextMenu.loadQuantityDetailMenu();
     // for test
     //subSpread.getActiveSheet().setValue(0, 0, "工程量明细");
 });