|
@@ -6,26 +6,34 @@ let mbzm_obj={
|
|
|
spread:null,
|
|
|
nodeChanged:false,
|
|
|
datas:[],
|
|
|
+ locateMap:{
|
|
|
+ INMEASURE:1,
|
|
|
+ INFBFX:2,
|
|
|
+ AFTERRATION:3
|
|
|
+ },
|
|
|
setting:{
|
|
|
header: [
|
|
|
{headerName: "编码", headerWidth: 130, dataCode: "code", dataType: "String", formatter: "@"},
|
|
|
{headerName: "模板类别", headerWidth: 260, dataCode: "name", dataType: "String", hAlign: "left"},
|
|
|
{headerName: "系数", headerWidth: 65, dataCode: "coe", dataType: "Number",validator:"number"},
|
|
|
- {headerName: "单位", headerWidth: 45, dataCode: "unit", dataType: "String", hAlign: "center"},
|
|
|
+ {headerName: "单位", headerWidth: 45, dataCode: "unit", dataType: "String", hAlign: "center",getText:'forUnit'},
|
|
|
{headerName: "工程量", headerWidth: 65, dataCode: "quantity", dataType: "Number",validator:"number"},
|
|
|
{headerName: "关联类别", headerWidth: 100, dataCode: "type", dataType: "String"},
|
|
|
{headerName: "清单位置", headerWidth: 200, dataCode: "position", hAlign: "left", dataType: "String",cellType:'selectButton',getText:'forPosition'},
|
|
|
],
|
|
|
view: {
|
|
|
- lockColumns:["code","name","unit","type","fxID"],
|
|
|
+ lockColumns:["code","name","unit","type"],
|
|
|
rowHeaderWidth:25
|
|
|
},
|
|
|
getText:{
|
|
|
forPosition:function (item) {
|
|
|
let createL = $('#createLocation').val();
|
|
|
- if(createL == 1) return mbzm_obj.getDisplayText(item.billID,item.billsLocation);
|
|
|
- if(createL == 2) return mbzm_obj.getDisplayText(item.fxID,"");
|
|
|
+ if(createL == mbzm_obj.locateMap.INMEASURE) return mbzm_obj.getDisplayText(item.billID,item.billsLocation);
|
|
|
+ if(createL == mbzm_obj.locateMap.INFBFX) return mbzm_obj.getDisplayText(item.fxID,"");
|
|
|
return ""
|
|
|
+ },
|
|
|
+ forUnit:function (item) {//这里显示的单位是去掉定额单位前面的数字的结果
|
|
|
+ return item.unit &&_.isString(item.unit)?item.unit.replace(/^\d+/,""):""
|
|
|
}
|
|
|
}
|
|
|
},
|
|
@@ -63,8 +71,8 @@ let mbzm_obj={
|
|
|
let selected = node?node:projectObj.project.mainTree.selected;
|
|
|
if(this.nodeChanged == true){//选中的行改变了才做初始化,刷新当前缓存, 在project_view 中treeSelectedChanged方法里设置
|
|
|
let datas = [];
|
|
|
- $("#createLocation").val(1);//初始化
|
|
|
- if(selected&&selected.sourceType == "ration"){
|
|
|
+ $("#createLocation").val(this.locateMap.INMEASURE);//初始化
|
|
|
+ if(selected&&selected.sourceType == ModuleNames.ration){
|
|
|
let ration = selected.data;
|
|
|
let template = projectObj.project.ration_template.getTemplateByRationID(ration.ID);
|
|
|
if(template) {
|
|
@@ -106,13 +114,351 @@ let mbzm_obj={
|
|
|
}
|
|
|
recode[dataCode] = value;
|
|
|
me.refreshSheetData();
|
|
|
+ },
|
|
|
+ updatePosition:function (recode) {
|
|
|
+ let selection = this.sheet.getSelections()[0];
|
|
|
+ let selectedItem =(this.datas[selection.row]);
|
|
|
+ let updateField = $("#createLocation").val()==this.locateMap.INMEASURE?"billID":"fxID";
|
|
|
+ if(selectedItem[updateField] == recode.ID) return;
|
|
|
+ selectedItem[updateField] = recode.ID;
|
|
|
+ if($("#createLocation").val()==this.locateMap.INMEASURE)selectedItem.billsLocation = recode.code;
|
|
|
+ this.refreshSheetData();
|
|
|
+ },
|
|
|
+ applyTemplate:function () {//应用清单模板
|
|
|
+ let selected = projectObj.project.mainTree.selected;
|
|
|
+ let template = projectObj.project.ration_template.getTemplateByRationID(selected.data.ID);
|
|
|
+ let createLocation = $("#createLocation").val();
|
|
|
+ let rations = {update:[],create:[]},bills={update:[],create:[]};
|
|
|
+ if(this.datas.length <= 0) return;
|
|
|
+ for(let d of this.datas){
|
|
|
+ if(gljUtil.isDef(d.quantity)&& parseFloat(d.quantity)>0){
|
|
|
+ if(this.positionChecking(createLocation,d) == false){
|
|
|
+ alert(`请选择${d.code}生成的清单位置`);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ this.getNodeUpdateData(d,selected.data.ID,createLocation,rations,bills);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ let ration_template={type:ModuleNames.ration_template,data:{ID:template.ID, createLocation:createLocation, templateList:this.datas}};
|
|
|
+ let data = {
|
|
|
+ ration_template:ration_template,
|
|
|
+ rations:rations,
|
|
|
+ bills:bills
|
|
|
+ };
|
|
|
+
|
|
|
+ console.log(data);
|
|
|
+ $.bootstrapLoading.start();
|
|
|
+ CommonAjax.post('/ration/applyTemplate',data,function (result) {
|
|
|
+ $.bootstrapLoading.end();
|
|
|
+ let refreshNodes = projectObj.project.updateNodesCache(result.updateDatas);//更新要update的前端缓存,并返回要刷新的树节点
|
|
|
+ //对于新插入的清单:
|
|
|
+ if(result.billsResult.length > 0){
|
|
|
+
|
|
|
+ }
|
|
|
+ //对于新插入的定额
|
|
|
+
|
|
|
+
|
|
|
+ console.log(result);
|
|
|
+ })
|
|
|
+
|
|
|
+ },
|
|
|
+ positionChecking(type,data){//这个要之后再测试一下
|
|
|
+ let validate = true;
|
|
|
+ if(type == mbzm_obj.locateMap.INMEASURE){
|
|
|
+ if(!_.isEmpty(data.billID)){
|
|
|
+ let node = projectObj.project.mainTree.getNodeByID(data.billID);
|
|
|
+ if(!node) validate = false;//ID有值,但是找不到,说明清单已经被删除
|
|
|
+ }else if(_.isEmpty(data.billsLocation)){
|
|
|
+ validate = false
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ if(_.isEmpty(data.fxID)) {
|
|
|
+ validate = false;
|
|
|
+ }else {
|
|
|
+ let node = projectObj.project.mainTree.getNodeByID(data.fxID);
|
|
|
+ if(!node) validate = false;//ID有值,但是找不到,说明分项已经被删除
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return validate
|
|
|
+ },
|
|
|
+ getNodeUpdateData:function(data,referenceRationID,type,rations,bills){
|
|
|
+ let quantity = this.getQuantity(data);//工程量要经过转换
|
|
|
+ let mainRation = projectObj.project.mainTree.getNodeByID(referenceRationID);
|
|
|
+ let billsID="";
|
|
|
+ //先检查要更新的定额是否已经存在
|
|
|
+ let ration = this.getExistRation(data,referenceRationID,type);
|
|
|
+ if(ration) {//如果存在,则比较清耗量、工程量表达式是否一致
|
|
|
+ let tem = this.getRationData(ration,data,quantity);//取更新信息
|
|
|
+ if(tem){//如果不一致,则需要更新
|
|
|
+ rations.update.push(tem);
|
|
|
+ }
|
|
|
+ //在定额存在的情况下,不用往下执行了
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ //定额不存在的情况下
|
|
|
+ if(type == mbzm_obj.locateMap.AFTERRATION) {//如果是生成在主定额后面的位置
|
|
|
+ this.createNewRationAfterMain(data,mainRation,quantity,rations);
|
|
|
+ }
|
|
|
+ if(type == mbzm_obj.locateMap.INMEASURE){//生成在措施项目下
|
|
|
+ this.createNewRationInMeasure(data,mainRation,quantity,rations,bills);
|
|
|
+ }else {
|
|
|
+ this.createNewRationInFBFX(data,mainRation,quantity,rations,bills);
|
|
|
+ }
|
|
|
+
|
|
|
+ /*[
|
|
|
+ {
|
|
|
+ type:'ration',
|
|
|
+ data:{
|
|
|
+ projectID:1605,
|
|
|
+ ID:"7b962fb0-1131-11e8-b3da-af725dadd7ae",
|
|
|
+ name:'testRation'
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ type:'bills',
|
|
|
+ data:{
|
|
|
+ projectID:1605,
|
|
|
+ ID:"af9f0081-1127-11e8-99a8-2fc02230b6e7",
|
|
|
+ name:'安全文明施工专项费用123'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ]*/
|
|
|
+ },
|
|
|
+ getRationData:function (ration,data,quantity) {
|
|
|
+ let tem = {};
|
|
|
+ if (ration.quantity + "" != quantity) tem.quantity = quantity;
|
|
|
+ if (gljUtil.isDef(data.coe) && data.coe != "0") tem.quantityEXP = "MBGCL";
|
|
|
+ if(!_.isEmpty(tem)) {
|
|
|
+ tem.projectID = ration.projectID;
|
|
|
+ tem.ID = ration.ID;
|
|
|
+ return tem;
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ },
|
|
|
+ createNewRationAfterMain:function (data,mainRation,quantity,rations) {
|
|
|
+ //生成新的定额
|
|
|
+ let newID = uuid.v1();
|
|
|
+ let serialNo = mainRation.data.serialNo+1;
|
|
|
+ //如果已经有正要生成的定额,则取这个序号再加1
|
|
|
+ if(rations.create.length > 0){
|
|
|
+ serialNo = rations.create[rations.create.length -1].newData.serialNo + 1
|
|
|
+ }
|
|
|
+ let n_ration = this.createNewRationData(data,newID,mainRation.data.referenceRationID,mainRation.data.billsItemID,serialNo,quantity,mainRation.data.libID);
|
|
|
+ rations.create.push(n_ration);
|
|
|
+ //处理其它兄弟节点的序号
|
|
|
+ let br = projectObj.project.Ration.getBillsSortRation();
|
|
|
+ for(let i = mainRation.data.serialNo;i<br.length;i++){
|
|
|
+ if(rations.update.length > 0){//如果update列表中有数据,要更新那里的序列号
|
|
|
+ let u = _.find(rations.update,{'ID':br[i].ID});
|
|
|
+ if(u){
|
|
|
+ u.serialNo += 1;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ rations.update.push({ID:br[i].ID,projectID:br[i].projectID,serialNo:br[i].serialNo+1})
|
|
|
+ }
|
|
|
+ },
|
|
|
+ createNewRationInMeasure:function (data,mainRation,quantity,rations,bills) {
|
|
|
+ let controller = projectObj.mainController;
|
|
|
+ let billsID="";
|
|
|
+ if(!_.isEmpty(data.billID)&&projectObj.project.mainTree.getNodeByID(data.billID)){
|
|
|
+ billsID = data.billID;
|
|
|
+ }else {//剩下的就是没找到的
|
|
|
+ let rootNode = projectObj.project.Bills.getMeasureNode(controller);
|
|
|
+ let leaveNodes = projectObj.mainController.tree.getLeavesNodes(rootNode.source);
|
|
|
+ for(let n of leaveNodes){
|
|
|
+ if (!(n.data.calcBase&&n.data.calcBase!="")&& n.data.code&&(n.data.code ==data.billsLocation||n.data.code.indexOf(data.billsLocation) != -1)){//没有使用基数计算的清单
|
|
|
+ billsID = n.data.ID;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(billsID == ""){//还是没有找到的情况下,先查找是不是已经生成过了
|
|
|
+ if(bills.create.length > 0){
|
|
|
+ let t_b = _.find(bills.create,{"billsLocation":data.billsLocation});
|
|
|
+ if(t_b) billsID = t_b.ID;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(billsID == ""){//也没有生成过的情况下,要自动生成清单
|
|
|
+ let parentNode = projectObj.project.Bills.getAutoParentNode("措施费用");
|
|
|
+ billsID = uuid.v1();
|
|
|
+ let newBill = {
|
|
|
+ ID:billsID,
|
|
|
+ projectID: parseInt(projectObj.project.ID()),
|
|
|
+ ParentID:parentNode.data.ID,
|
|
|
+ NextSiblingID:-1,
|
|
|
+ code:projectObj.project.Bills.newFormatCode(data.billsLocation),
|
|
|
+ billsLibId:projectInfoObj.projectInfo.engineeringInfo.bill_lib[0].id,//projectInfoObj.projectInfo.engineeringInfo.billsGuidance_lib
|
|
|
+ billsLocation : data.billsLocation//这个是用来在后端查找清单信息
|
|
|
+ };
|
|
|
+ let existB = projectObj.project.Bills.sameStdCodeBillsData(data.billsLocation);//对于多单位的清单
|
|
|
+ if (existB) {
|
|
|
+ newBill.unit = existB.unit;
|
|
|
+ }
|
|
|
+ //将这个节点的上一节点的NextSiblingID设置为这个新清单
|
|
|
+ //先看有没有刚生成的清单,有的话直接修改最后一个清单的NextSiblingID即可
|
|
|
+ let lastIndex = this.getLastIndex(bills.create,"ParentID",parentNode.data.ID);
|
|
|
+ if(bills.create.length > 0 && lastIndex!=-1){
|
|
|
+ bills.create[lastIndex].NextSiblingID = newBill.ID;
|
|
|
+ }else if(parentNode.children.length > 0){//如果新生的没有找到的话,查看父节点下是否有子节点
|
|
|
+ let pre = parentNode.children[parentNode.children.length-1];
|
|
|
+ bills.update.push({ projectID:newBill.projectID,ID:pre.data.ID, NextSiblingID:newBill.ID});
|
|
|
+ }
|
|
|
+ bills.create.push(newBill);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //生成定额
|
|
|
+ let newID = uuid.v1();
|
|
|
+ let serialNo = 1;
|
|
|
+ serialNo = this.checkAndGetSerialNo(serialNo,billsID,rations);
|
|
|
+ //先查看刚生成的定额中有没有相同父清单,有的话取最后的一个序列号加1
|
|
|
+ let n_ration = this.createNewRationData(data,newID,mainRation.data.ID,billsID,serialNo,quantity,mainRation.data.libID);
|
|
|
+ rations.create.push(n_ration);
|
|
|
+ },
|
|
|
+ createNewRationInFBFX:function (data,mainRation,quantity,rations,bills) {
|
|
|
+ let billsID = "";
|
|
|
+ let parentNode = projectObj.project.mainTree.getNodeByID(data.fxID);
|
|
|
+ //分部分项这里,如果没选择位置,或者选择后又删除了,是无法到这一步的,所以不用像生成在清单那里做很多检查
|
|
|
+ if(!_.isEmpty(data.fxID)&&parentNode){
|
|
|
+ billsID = data.fxID;
|
|
|
+ }
|
|
|
+ if(billsID !=""){
|
|
|
+ //生成定额
|
|
|
+ let newID = uuid.v1();
|
|
|
+ let serialNo = 1;
|
|
|
+ serialNo = this.checkAndGetSerialNo(serialNo,billsID,rations);
|
|
|
+ let n_ration = this.createNewRationData(data,newID,mainRation.data.ID,billsID,serialNo,quantity,mainRation.data.libID,true);
|
|
|
+ rations.create.push(n_ration);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ getLastIndex:function (arrays,key,value) {
|
|
|
+ let index = -1;
|
|
|
+ for (let i = 0;i<arrays.length;i++) {
|
|
|
+ if(arrays[i][key] == value){
|
|
|
+ index = i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return index;
|
|
|
+ },
|
|
|
+ checkAndGetSerialNo:function (sNo,billsID,rations) {
|
|
|
+ let serialNo = sNo;
|
|
|
+ //先查看刚生成的定额中有没有相同父清单,有的话取最后的一个序列号加1
|
|
|
+ let last_ration = this.getLastBrotherNewRation(billsID,rations.create);
|
|
|
+ if(last_ration){
|
|
|
+ serialNo = last_ration.serialNo +1;
|
|
|
+ }else {
|
|
|
+ let parentBillsNode = projectObj.project.mainTree.getNodeByID(billsID);
|
|
|
+ if(parentBillsNode && parentBillsNode.children.length > 0){//如果能找到则说明已经存在的清单
|
|
|
+ serialNo = parentBillsNode.children[parentBillsNode.children.length - 1].data.serialNo + 1
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return serialNo
|
|
|
+ },
|
|
|
+ getLastBrotherNewRation:function(billsItemID,rations){
|
|
|
+ let newData = null;
|
|
|
+ for(let tem of rations){
|
|
|
+ if(tem.newData.billsItemID == billsItemID) newData = tem.newData;
|
|
|
+ }
|
|
|
+ return newData;
|
|
|
+ },
|
|
|
+ createNewRationData:function (data,newID,referenceRationID,billsID,serialNo,quantity,libID,isFBFX) {
|
|
|
+ let newData = projectObj.project.Ration.getTempRationData(newID,billsID,serialNo,rationType.ration);
|
|
|
+ newData.referenceRationID = referenceRationID;
|
|
|
+ newData.quantity = quantity;
|
|
|
+ newData.quantityEXP = gljUtil.isDef(data.coe) && data.coe != "0"?"MBGCL":quantity+"";
|
|
|
+ let temRation = this.getDefaultRationCreateData(newData,data.code,libID,isFBFX);
|
|
|
+ return temRation;
|
|
|
+ },
|
|
|
+ getDefaultRationCreateData:function(newData,code,libID,isFBFX){
|
|
|
+ let itemQuery = {userID: userID, rationRepId: libID, code: code};
|
|
|
+ let needInstall = false;
|
|
|
+ if(projectObj.project.isInstall()) {//如果是安装工程,要看需不需要生成安装增加费
|
|
|
+ needInstall = isFBFX;//在分部分项插入的定额才需要定额安装增加费
|
|
|
+ }
|
|
|
+ return{itemQuery:itemQuery,newData:newData,defaultLibID: rationLibObj.getDefaultStdRationLibID(),calQuantity:false,brUpdate:[],needInstall:needInstall}
|
|
|
+ },
|
|
|
+ getQuantity:function (data) {//取最新的消耗量,需经过转换
|
|
|
+ if(data.unit){
|
|
|
+ let times = parseInt(data.unit);
|
|
|
+ if(!isNaN(times)){
|
|
|
+ return scMathUtil.roundForObj(parseFloat(data.quantity)/times,getDecimal("ration.quantity"))+""
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return data.quantity
|
|
|
+ },
|
|
|
+
|
|
|
+ getExistRation:function (data,referenceRationID,type) {
|
|
|
+ let temRation = null;
|
|
|
+ //先检查要更新的定额是否已经存在
|
|
|
+ let rations =_.filter(projectObj.project.Ration.datas,{'referenceRationID':referenceRationID,'code':data.code});
|
|
|
+ for(let r of rations){
|
|
|
+ if(type == mbzm_obj.locateMap.AFTERRATION){//如果是生成在主定额后面的位置
|
|
|
+ let mainRationNode = projectObj.project.mainTree.getNodeByID(referenceRationID);
|
|
|
+ if(r.billsItemID == mainRationNode.data.billsItemID){//如果清单ID相同, 说明是兄弟节点,位置相同
|
|
|
+ temRation = r;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ let billsNode = projectObj.project.mainTree.getNodeByID(r.billsItemID);
|
|
|
+ if(billsNode){//将父清单与要生成的清单比较,看是否一致
|
|
|
+ if(type == mbzm_obj.locateMap.INMEASURE && billsNode.data.type ==billType.BILL){
|
|
|
+ if(!_.isEmpty(data.billID)){
|
|
|
+ //说明生成位置已经有定额了,只需更新消耗量就好
|
|
|
+ if(data.billID == r.billsItemID){
|
|
|
+ temRation = r;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }else if(!_.isEmpty(data.billsLocation)){//按清单编号到找对应的位置
|
|
|
+ if(billsNode.data.code && billsNode.data.code.indexOf(data.billsLocation)!=-1) {
|
|
|
+ temRation = r;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else if(type == mbzm_obj.locateMap.INFBFX && (billsNode.data.type ==billType.FX||billsNode.data.type ==billType.BX)){
|
|
|
+ if(!_.isEmpty(data.fxID) && data.fxID == r.billsItemID){//分项、补项下有对应的定额
|
|
|
+ temRation = r;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return temRation;
|
|
|
}
|
|
|
};
|
|
|
|
|
|
$('#createLocation').change(function(){
|
|
|
let me = mbzm_obj;
|
|
|
let pcol = _.findIndex(me.setting.header,{dataCode:"position"});
|
|
|
- me.setting.header[pcol].visible = $(this).val() == 3?false:true;
|
|
|
+ me.setting.header[pcol].visible = $(this).val() == mbzm_obj.locateMap.AFTERRATION?false:true;
|
|
|
me.refreshSheetData();
|
|
|
+});
|
|
|
+
|
|
|
+
|
|
|
+$('#next_mbzm').click(function () {
|
|
|
+ let mainSheet = projectObj.mainSpread.getActiveSheet();
|
|
|
+ let selection = mainSheet.getSelections()[0];
|
|
|
+ let node = projectObj.project.mainTree.selected;
|
|
|
+ let index = node.serialNo();
|
|
|
+ let next = null;
|
|
|
+ for(let i = index+1;i< projectObj.project.mainTree.items.length;i++){
|
|
|
+ let temNode = projectObj.project.mainTree.items[i];
|
|
|
+ if(temNode && temNode.sourceType == ModuleNames.ration){
|
|
|
+ let template = projectObj.project.ration_template.getTemplateByRationID(temNode.data.ID);
|
|
|
+ if(template) {
|
|
|
+ next = temNode;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(next){
|
|
|
+ let row = next.serialNo();
|
|
|
+ let col = selection.col?selection.col:0;
|
|
|
+ mainSheet.setSelection(row, col, selection.rowCount, selection.colCount);
|
|
|
+ projectObj.mainController.setTreeSelected(next);
|
|
|
+ mainSheet.showRow(row, GC.Spread.Sheets.VerticalPosition.center);
|
|
|
+ }
|
|
|
+});
|
|
|
|
|
|
+$('#apply_mbzm').click(function () {
|
|
|
+ mbzm_obj.applyTemplate();
|
|
|
});
|