/** * Created by Mai on 2017/4/1. */ var Bills = { createNew: function (project) { var billsTreeSetting = { id: 'ID', pid: 'ParentID', nid: 'NextSiblingID', rootId: -1, autoUpdate: true }; // 用户定义private方法 var tools = { coverseTreeUpdateData: function (datas, projectID) { var updateDatas = []; datas.forEach(function (data) { var updateData = {}; data.data.projectID = projectID; if (data.type === idTree.updateType.new) { updateData.updateType = 'ut_create'; updateData.updateData = data.data; } else if (data.type === idTree.updateType.update) { updateData.updateType = 'ut_update'; updateData.updateData = data.data; } else if (data.type === idTree.updateType.delete) { updateData.updateType = 'ut_delete'; updateData.updateData = data.data; } updateDatas.push(updateData); }); return updateDatas; }, formatBillsUpdateData: function (data) { let uData = JSON.parse(JSON.stringify(data)); delete uData.feesIndex; delete uData.flagsIndex; if (uData.quantity) { uData.quantity = uData.quantity.toFixed(2); } if (uData.fees) { for (let fee of uData.fees) { fee.unitFee = fee.unitFee.toFixed(2); fee.totalFee = fee.totalFee.toFixed(2); fee.tenderUnitFee = fee.tenderUnitFee.toFixed(2); fee.tenderTotalFee = fee.tenderTotalFee.toFixed(2); } } return uData; } }; // 所有通过this访问的属性,都不应在此单元外部进行写入操作 var bills = function (proj) { this.project = proj; this.datas = null; this.tree = idTree.createNew(billsTreeSetting); var sourceType = ModuleNames.bills; this.getSourceType = function () { return sourceType; } proj.registerModule(ModuleNames.bills, this); }; // 从后台获取数据 /*bills.prototype.pullData = function (){ this.project.pullData( '/bills/getData', {projectID: this.project.ID}, function(result){ if (result.error ===0){ this.loadDatas(result.data); } else { // to do: ?错误处理需要细化 alert(result.message); } }, function (){}// to do: 错误处理需要细化 ) };*/ // prototype用于定义public方法 bills.prototype.loadData = function (datas) { this.datas = datas; // generate Fees & Flags Index, For View & Calculate this.datas.forEach(function (data) { 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.flagsIndex = {}; if (data.flags) { data.flags.forEach(function (flag) { data.flagsIndex[flag.fieldName] = flag; }); } }); // datas load to Tree this.tree.loadDatas(this.datas); }; bills.prototype.setMaxID = function (ID) { this.tree.maxNodeID(ID); }; // 提交数据后的错误处理方法 bills.prototype.doAfterUpdate = function(err, data){ // console.log(data) if(data.quantityRefresh){ this.refreshDatas(data,'quantity'); } $.bootstrapLoading.end(); }; 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(project.projSetting.main_tree_col.cols,function (col) { return col.data.field ==fieldName; }); controller.sheet.getCell(selected[0].row,col).value(data[fieldName]); }; bills.prototype.getCounterData = function (count) { var updateData = {'projectID': this.project.ID()}; if (count) { updateData[this.getSourceType()] = this.tree.maxNodeID() + count; } else { updateData[this.getSourceType()] = this.tree.maxNodeID() + 1; } return updateData; }; bills.prototype.insertSpecialBill=function(parentId, nextSiblingId,isUserAdd,type){ var insertData = this.tree.getInsertData(parentId, nextSiblingId); var that = this, newData = null; insertData.forEach(function (data) { if (data.type === idTree.updateType.new) { if(isUserAdd==true){//如果是用户新增的 data.data.isAdd = 1; } data.data.type = type; newData = data.data; } }); this.project.pushNow('insertBills', [this.getSourceType(), this.project.projCounter()], [ tools.coverseTreeUpdateData(insertData, this.project.ID()), this.getCounterData()]); //project.pushNow('insertBills', ModuleNames.bills, tools.coverseTreeUpdateData(insertData)); this.datas.push(newData); return this.tree.insertByData(newData,parentId, nextSiblingId); }; bills.prototype.insertBills = function (parentId, nextSiblingId) { var insertData = this.tree.getInsertData(parentId, nextSiblingId); var that = this, newData = null; insertData.forEach(function (data) { if (data.type === idTree.updateType.new) { data.data.type = billType.BILL; newData = data.data; } }); this.project.pushNow('insertBills', [this.getSourceType(), this.project.projCounter()], [ tools.coverseTreeUpdateData(insertData, this.project.ID()), this.getCounterData()]); //project.pushNow('insertBills', ModuleNames.bills, tools.coverseTreeUpdateData(insertData)); this.datas.push(newData); return this.tree.insertByData(newData,parentId, nextSiblingId); }; bills.prototype.insertStdBills = function (parentId, nextSiblingId, stdBillsData) { var insertData = this.tree.getInsertData(parentId, nextSiblingId); var newData = null, that = this; insertData.forEach(function (data) { if (data.type === idTree.updateType.new) { data.data.code = that.newFormatCode(stdBillsData.code); data.data.name = stdBillsData.name; data.data.unit = stdBillsData.unit; // 工程量计算规则 data.data.ruleText = stdBillsData.ruleText; // 说明(补注) data.data.comments = stdBillsData.recharge; //zhong 特征及内容 data.data.jobContent = stdBillsData.jobContent; data.data.itemCharacter = stdBillsData.itemCharacter; data.data.jobContentText = stdBillsData.jobContentText; data.data.itemCharacterText = stdBillsData.itemCharacterText; data.data.programID = stdBillsData.engineering; data.data.type = stdBillsData.type;//插入清单类型 //zhong newData = data.data; } }); this.project.pushNow('insertStdBills', [this.getSourceType(), this.project.projCounter()], [ tools.coverseTreeUpdateData(insertData, this.project.ID()), this.getCounterData()]); this.datas.push(newData); return this.tree.insertByData(newData, parentId, nextSiblingId); }; bills.prototype.deleteBills = function (node) { let deleteNode = function (node) { this.project.Ration.deleteByBills([node]); // this.project.VolumePrice.deleteByBills([node]); return this.tree.delete(node); } var deleteData = this.tree.getDeleteData(node); var ration_glj =projectObj.project.ration_glj; // let modules =[ModuleNames.bills, ModuleNames.ration, ModuleNames.ration_glj, ModuleNames.volume_price]; let modules =[ModuleNames.bills, ModuleNames.ration, ModuleNames.ration_glj]; let deleteDatas=[tools.coverseTreeUpdateData(deleteData, this.project.ID()), this.project.Ration.getDeleteDataByBill([node]), ration_glj.getDeleteDataByBills(deleteData), // this.project.VolumePrice.getDeleteDataByBills([node]) ]; project.ration_glj.deleteByBills(deleteData); project.quantity_detail.deleteByBills(deleteData); project.pushNow('deleteBills', modules, deleteDatas); this.datas.splice(this.datas.indexOf(node.data), 1); return this.tree.delete(node); }; bills.prototype.singleDeleteBills=function(node,controller){ let updateData = {}; let updateNode={}; let me = this; if(node){ updateData[node.data.ID]=true; if(node.children.length>0){//有子项 if(node.preSibling){//有前兄弟,则子项变成前兄弟的子项 if(node.preSibling.children.length>0){//前兄弟有子项, let preNode = node.preSibling.children[node.preSibling.children.length-1]; updateData[preNode.data.ID]={ NextSiblingID:node.children[0].data.ID } updateNode[preNode.data.ID] = preNode; } for(let i=0;i0){ for(let c of node.children){ getLeaves(c,children) } }else { children.push(node); } } } }; bills.prototype.getRootNode = function (node) { if(node.parent){ return this.getRootNode(node.parent); }else { return node; } }; bills.prototype.isFBFX = function (node) {//判读是否属于分部分项 let rootNode = this.getRootNode(node); if(isFlag(rootNode.data)&&rootNode.data.flagsIndex.fixed.flag==fixedFlag.SUB_ENGINERRING){ return true; }else { return false; } }; bills.prototype.isEngineeringCost = function (node) {//判断这个节点是否是工程造价节点 if(isFlag(node.data)&&node.data.flagsIndex.fixed.flag==fixedFlag.ENGINEERINGCOST){ return true; }else { return false; } }; return new bills(project); } }; function isDef(v) { return v !== undefined && v !== null; } function isFlag(v) { return this.isDef(v.flagsIndex) && this.isDef(v.flagsIndex.fixed); } function getRootFixedNode(node) { let parent = node.parent; if(isFlag(node.data) && (node.data.flagsIndex.fixed.flag === fixedFlag.SUB_ENGINERRING || node.data.flagsIndex.fixed.flag === fixedFlag.MEASURE || node.data.flagsIndex.fixed.flag === fixedFlag.OTHER || node.data.flagsIndex.fixed.flag === fixedFlag.CHARGE || node.data.flagsIndex.fixed.flag === fixedFlag.TAX)){ return node; } else { if(!parent){ return node; } else { return getRootFixedNode(parent); } } }