123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499 |
- /**
- * Created by zhang on 2020/1/17.
- */
- let itemBaseOptions = ["人工费","材料费","机械费","人工费+材料费","人工费+机械费","人工费+材料费","材料费+机械费","人工费+材料费+机械费"];
- let itemIncreaseFeeObj = {
- settingSpread:null,
- itemSetting:{
- header:[
- {headerName: "名称", headerWidth: 270, dataCode: "name", dataType: "String"},
- {headerName: "范围", headerWidth: 70, dataCode: "displayScope",hAlign: "center",dataType: "String",cellType:'cusButton',callback:'selectScope'},
- {headerName: "取费基数", headerWidth: 150, dataCode: "base", hAlign: "center", dataType: "String",cellType:'comboBox',options:itemBaseOptions},
- {headerName: "系数(%)", headerWidth: 55, dataCode: "coe", hAlign: "center", dataType: "Number",validator:"number"}
- ],
- view: {
- lockColumns: ["name","displayScope"],
- rowHeaderWidth:25,
- colHeaderHeight:36
- },
- autoFit:true,
- fitRow:['name'],
- callback:{
- selectScope:function (hitinfo) {
- $("#item_increase_scope").modal('show');
- }
- }
- },
- settingDatas:[],
- scopeSpread:null,
- scopeSetting:{
- header:[
- {headerName: "编码", headerWidth: 250, dataCode: "code", dataType: "String"},
- {headerName: "类别", headerWidth: 100, dataCode: "type",hAlign: "center",dataType: "String"},
- {headerName: "名称", headerWidth: 300, dataCode: "name", dataType: "String"},
- {headerName: "计取", headerWidth: 100, dataCode: "selected", hAlign: "center", dataType: "String",cellType:'checkBox'}
- ],
- view: {
- lockColumns: ["name","code","type","selected"],
- rowHeaderWidth:25,
- colHeaderHeight:36
- }
- },
- scopeDatas:[],
- initSpread:function () {
- if(this.settingSpread) return this.settingSpread.refresh();
- this.settingSpread = SheetDataHelper.createNewSpread($("#itemIncreaseFee_sheet")[0]);
- sheetCommonObj.spreadDefaultStyle(this.settingSpread);
- this.settingSheet = this.settingSpread.getSheet(0);
- sheetCommonObj.initSheet(this.settingSheet, this.itemSetting, 4);
- this.settingSheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onItemSelectionChange);
- this.settingSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onItemValueChange);
- this.settingSheet.name('itemIncreaseFee_sheet');
- if(projectReadOnly){
- disableSpread(this.settingSpread);
- }
- },
- initScopeSpread:function () {
- if(this.scopeSpread) return this.scopeSpread.refresh();
- this.scopeSpread = SheetDataHelper.createNewSpread($("#scopeSheet")[0]);
- sheetCommonObj.spreadDefaultStyle(this.scopeSpread);
- this.scopeSheet = this.scopeSpread.getSheet(0);
- sheetCommonObj.initSheet(this.scopeSheet, this.scopeSetting, 0);
- this.scopeSpread.bind(GC.Spread.Sheets.Events.ButtonClicked, this.onScopeCheckBoxClick);
- this.scopeSheet.name('scopeSheet');
- if(projectReadOnly){
- disableSpread(this.scopeSpread);
- }
- },
- getSelectedItem:function () {
- let selectedItem = null;
- let sel = this.settingSheet.getSelections()[0];
- if(sel.row != -1 && this.settingDatas.length>sel.row){
- selectedItem = this.settingDatas[sel.row];
- }
- return selectedItem;
- },
- showScopeDatas:function () {
- let controller = projectObj.mainController, project = projectObj.project;
- let allNodes=[];
- this.scopeDatas=[];
- let selectedItem = this.getSelectedItem();
- let fbfcNode = project.Bills.getFBFXNode(controller).source;//分部分项节点
- if(fbfcNode){
- allNodes.push(fbfcNode);
- controller.tree.getAllSubNode(project.Bills.getFBFXNode(controller).source,allNodes);
- }
- let meaNode = project.Bills.getMeasureNode(controller).source;//措施项目节点
- if(meaNode){
- allNodes.push(meaNode);
- controller.tree.getAllSubNode(project.Bills.getMeasureNode(controller).source,allNodes);
- }
- for(let row=0;row<allNodes.length;row++){
- let node = allNodes[row];
- let tem = {
- ID:node.data.ID,
- ParentID:node.data.ParentID,
- code:node.data.code,
- name:node.data.name,
- type:billText[node.data.type],
- selected:0,
- collapsed:false,
- row:row
- };
- if(selectedItem && selectedItem.scope&&selectedItem.scope[tem.ID]) tem.selected = 1;
- if(node.data.calcBase&&node.data.calcBase!="") delete tem.selected;//有基数计算的不可选
- this.scopeDatas.push(tem);
- }
- sheetCommonObj.showTreeData(this.scopeSheet, this.scopeSetting,this.scopeDatas);
- },
- onScopeCheckBoxClick:function (sender,args) {
- let me = itemIncreaseFeeObj;
- let checkboxValue = args.sheet.getCell(args.row, args.col).value();
- let newval = 0;
- checkboxValue?newval=0:newval=1;
- let record = me.scopeDatas[args.row];
- let dataMap= _.groupBy(me.scopeDatas,"ParentID");
- args.sheet.suspendPaint();
- args.sheet.suspendEvent();
- cascadeSelected(record,newval);
- args.sheet.resumeEvent();
- args.sheet.resumePaint();
- function cascadeSelected(parent,val) {
- if(gljUtil.isDef(parent.selected)){
- args.sheet.getCell(parent.row, args.col).value(val);
- parent.selected = val;
- if(dataMap[parent.ID]){
- for(let c of dataMap[parent.ID]){
- cascadeSelected(c,val);
- }
- }
- }
- }
- },
- onItemSelectionChange:function (sender,args) {
- args.sheet.repaint();
- },
- showDatas:function(datas){
- let sel = this.settingSheet.getSelections()[0];
- let oldData = sel.row<this.settingDatas.length?this.settingDatas[sel.row]:"";
- this.settingSheet.setRowCount(0);
- this.settingDatas = datas?datas:this.getItemSettingDatas();
- this.setItemForeStyle(this.settingDatas);
- sheetCommonObj.showData(this.settingSheet, this.itemSetting,this.settingDatas);
- this.settingSheet.setRowCount(this.settingDatas.length);
- sel.row = oldData?_.findIndex(this.settingDatas,{'name':oldData.name}):sel.row ;
- this.settingSheet.setSelection(sel.row==-1?0:sel.row,sel.col,sel.rowCount,sel.colCount);
- },
- setItemForeStyle:function (datas) {
- for(let d of datas){
- if(_.isEmpty(d.scope)){
- d.foreColor = "#ff2a23";
- d.styleCol = 1;
- }else {
- delete d.foreColor;
- delete d.styleCol;
- }
- }
- },
- getItemSettingDatas:function () {
- let datas = [];
- if(projectObj.project.property.itemIncreaseSetting){
- for(let i of projectObj.project.property.itemIncreaseSetting.setting){
- let d = {name:i.name,displayScope:"范围",scope:i.scope,base:i.base,coe:i.coe};
- datas.push(d);
- }
- }
- return datas;
- },
- isItemIncrease: function (node) {
- return node
- && node.sourceType === ModuleNames.ration
- && node.data.type === rationType.itemIncrease;
- },
- onItemValueChange:function (sender,args) {
- let me = itemIncreaseFeeObj;
- let dataCode = me.itemSetting.header[args.col].dataCode;
- let value = args.newValue;
- let tem = me.settingDatas[args.row];
- if (value&&!sheetCommonObj.checkData(args.col,me.itemSetting,value)) {
- alert('输入的数据类型不对,请重新输入!');
- return me.showDatas(me.settingDatas);
- }
- if(dataCode == 'coe') {
- if (value) value = scMathUtil.roundForObj(value, 2);
- }
- tem[dataCode] = value;
- me.showDatas(me.settingDatas);
- me.itemChange = true;
- },
- confirmScope:function(){
- let selectedItem = this.getSelectedItem();
- let scope = {};
- for(let n of this.scopeDatas){
- if(n.selected == 1) scope[n.ID] = true;
- }
- if(JSON.stringify(scope) != JSON.stringify(selectedItem.scope)) this.itemChange = true;//有改变的情况下才更新
- selectedItem.scope=scope;
- this.showDatas(this.settingDatas);
- },
- confirmItemIncreaseSetting:async function () {
- if(this.itemChange == true || projectObj.project.property.itemIncreaseSetting.isCalc == false){
- let datas = [];
- let itemIncreaseSetting = {
- isCalc : true,
- setting :[]
- };
- for(let d of this.settingDatas){
- itemIncreaseSetting.setting.push({name:d.name,scope:d.scope,base:d.base,coe:d.coe});
- }
- let tem ={
- type:'project',
- data:{ID:projectObj.project.ID(),"property.itemIncreaseSetting":itemIncreaseSetting}
- };
- datas.push(tem);
- let changeNodes = this.calcAllItemIncreaseFee(itemIncreaseSetting,datas);
- console.log(datas);
- let selectedNode = projectObj.project.mainTree.selected;
- //刷新缓存和树节点的插入删除
- let nodes = await projectObj.project.syncUpdateNodesAndRefresh(datas);
- //重新计算
- cbTools.refreshFormulaNodes();
- projectObj.project.calcProgram.calcNodesAndSave(changeNodes.concat(nodes));
- projectObj.mainController.setTreeSelection(selectedNode);
- }
- },
- calcItemIncreaseFeeByNodes:async function (nodes) {
- let itemIncreaseSetting = projectObj.project.property.itemIncreaseSetting;
- let datas = [];
- let refreshNodes=[];
- let rationGLJMap ={};
- let uniqMap={};
- if(!itemIncreaseSetting) return;
- if(itemIncreaseSetting.isCalc == false) return;
- for (n of nodes){
- if(n.sourceType == ModuleNames.ration) n = n.parent;
- if(uniqMap[n.data.ID]) continue;//去重复
- let newRefreshNodes = this.calcItemIncreasePerNode(n,itemIncreaseSetting,rationGLJMap,datas);
- if(newRefreshNodes.length > 0) refreshNodes = refreshNodes.concat(newRefreshNodes);
- uniqMap[n.data.ID] = true;
- }
- if(datas.length >0 || refreshNodes.length > 0){
- let nodes = await projectObj.project.syncUpdateNodesAndRefresh(datas);
- //重新计算
- cbTools.refreshFormulaNodes();
- projectObj.project.calcProgram.calcNodesAndSave(refreshNodes.concat(nodes));
- }
- },
- cancelItemIncreaseFee:async function () {
- let itemIncreaseSetting = projectObj.project.property.itemIncreaseSetting;
- let datas = [];
- let refreshNodes = [];
- if(itemIncreaseSetting && itemIncreaseSetting.isCalc == true){
- itemIncreaseSetting.isCalc = false;
- let billNodeMap = {};
- let tem ={
- type:'project',
- data:{ID:projectObj.project.ID(),"property.itemIncreaseSetting":itemIncreaseSetting}
- };
- datas.push(tem);
- for(let s of itemIncreaseSetting.setting){
- if(!_.isEmpty(s.scope)){
- for (let ID in s.scope){
- billNodeMap[ID] = true;//为了去重复
- }
- }
- }
- for(let cancelID in billNodeMap){
- let tnode = projectObj.project.mainTree.getNodeByID(cancelID);
- if(tnode){
- let cNode = this.cancelBillNode(tnode,datas);
- if(cNode) refreshNodes.push(cNode);
- }
- }
- let selectedNode = projectObj.project.mainTree.selected;
- //刷新缓存和树节点的插入删除
- await projectObj.project.syncUpdateNodesAndRefresh(datas);
- if(refreshNodes.length > 0){
- //重新计算
- cbTools.refreshFormulaNodes();
- projectObj.project.calcProgram.calcNodesAndSave(refreshNodes);
- projectObj.mainController.setTreeSelection(selectedNode);
- }
- }
- },
- getAllBillsIDMap:function () {
- let map = {};
- let itemIncreaseSetting = projectObj.project.property.itemIncreaseSetting;
- if(itemIncreaseSetting.isCalc == true){
- for(let s of itemIncreaseSetting.setting){
- if(!_.isEmpty(s.scope)){
- for (let ID in s.scope){
- map[ID] = true;
- }
- }
- }
- }
- return map;
- },
- calcAllItemIncreaseFee : function(setting,datas){
- let refreshNodes = [];
- let itemIncreaseSetting = setting?setting:projectObj.project.property.itemIncreaseSetting;
- let billNodeMap = {},rationGLJMap={};
- let cancelBillsIDMap = this.getAllBillsIDMap();
- if(itemIncreaseSetting && itemIncreaseSetting.isCalc == true){
- //为了不用循环所有节点,先挑出所有受影响的节点
- for(let s of itemIncreaseSetting.setting){
- if(!_.isEmpty(s.scope)){
- for (let ID in s.scope){
- billNodeMap[ID] = true;//为了去重复
- delete cancelBillsIDMap[ID];
- }
- }
- }
- for(let billsID in billNodeMap){
- let node = projectObj.project.mainTree.getNodeByID(billsID);
- let newRefreshNodes = this.calcItemIncreasePerNode(node,itemIncreaseSetting,rationGLJMap,datas);
- if(newRefreshNodes.length > 0) refreshNodes = refreshNodes.concat(newRefreshNodes);
- }
- //删除取消范围的清单下的子目定额
- for(let cancelID in cancelBillsIDMap){
- let tnode = projectObj.project.mainTree.getNodeByID(cancelID);
- let cNode = this.cancelBillNode(tnode,datas);
- if(cNode) refreshNodes.push(cNode);
- }
- }
- return refreshNodes;
- },
- cancelBillNode:function (node,datas) {
- if (node.children.length <= 0) return null;//如果没子项,不用计算
- if (node.source.children.length > 0) return null;//如果不是清单叶子节点,不用计算
- let isDelete = false;
- for(let rationNode of node.children){
- if(rationNode.data.code.indexOf("ZMZJF")!= -1){
- datas.push({type:ModuleNames.ration,data:{ID:rationNode.data.ID},action:"delete"});
- isDelete = true;
- }
- }
- return isDelete == true?node:null;
- },
- calcItemIncreasePerNode:function (node,setting,rationGLJMap,datas) {
- let itemIncreaseSetting = setting ? setting : projectObj.project.property.itemIncreaseSetting;
- let refreshNodes = [],rationCodeMap={},FeeMap={},updateDataIDMap={};
- if (node.children.length <= 0) return [];//如果没子项,不用计算
- if (node.source.children.length > 0) return [];//如果不是清单叶子节点,不用计算
- let labourTotal = 0,materialTotal=0,machineTotal=0;
- let process = getDecimal("process");
- let td = getDecimal("ration.totalPrice");
- let gd = getDecimal('glj.quantity');
- let preID="",serialNo=1;
- let manageFeeRate = null;
- for(let rationNode of node.children){
- rationCodeMap[rationNode.data.code] = rationNode;
- if(rationNode.data.type == rationType.ration || rationNode.data.type == rationType.volumePrice ){//先只汇总定额和量价类型,不考虑自动生成的
- if(manageFeeRate == null) manageFeeRate = rationNode.data.manageFeeRate;
- //计算人工费,材料费,机械费
- if(rationNode.data.feesIndex){
- let labour = rationNode.data.feesIndex.labour && rationNode.data.feesIndex.labour.totalFee?parseFloat(rationNode.data.feesIndex.labour.totalFee):0;
- let material = rationNode.data.feesIndex.material && rationNode.data.feesIndex.material.totalFee?parseFloat(rationNode.data.feesIndex.material.totalFee):0;
- let machine = rationNode.data.feesIndex.machine && rationNode.data.feesIndex.machine.totalFee?parseFloat(rationNode.data.feesIndex.machine.totalFee):0;
- labourTotal = scMathUtil.roundForObj(labourTotal + labour,getDecimal("process"));
- materialTotal = scMathUtil.roundForObj(materialTotal + material,getDecimal("process"));
- machineTotal = scMathUtil.roundForObj(machineTotal + machine,getDecimal("process"));
- }
- }
- if(rationNode.data.type != rationType.itemIncrease ){//计录除了子目增加节点外最后的节点ID,和nexeID
- preID = rationNode.data.ID;
- serialNo = rationNode.data.serialNo;
- }
- }
- FeeMap['人工费'] = labourTotal;
- FeeMap['材料费'] = materialTotal;
- FeeMap['机械费'] = machineTotal;
- //ZMZJF_1
- let s_in = 0;//序列号增长
- for(let i = 0; i < itemIncreaseSetting.setting.length;i++){
- let s = itemIncreaseSetting.setting[i];
- if(s.scope&&s.scope[node.data.ID]){
- let feeIndexArry = s.base.split("+");
- let total = 0;
- for(let index of feeIndexArry){
- total = scMathUtil.roundForObj(total + FeeMap[index],process);
- }
- total = scMathUtil.roundForObj(total,td);
- if(s.coe){
- let t = scMathUtil.roundForObj(total * s.coe/100,process);
- total = t;//scMathUtil.roundForObj(total + t,gd);
- }
- let seq = i+1;
- let code = "ZMZJF_"+seq;
- let ZMZJFnode = rationCodeMap[code];
- if(total > 0) {
- if(ZMZJFnode){//存在的话更新其它人工费消耗量
- this.updateItemNode(ZMZJFnode,total,rationGLJMap,datas);
- if(s_in>0){
- datas.push({type:ModuleNames.ration,data:{ID:ZMZJFnode.data.ID,serialNo:ZMZJFnode.data.serialNo +1}});
- } else {//如果s_in>0时,ZMZJFnode会因为有更新而刷新,不用push到refreshNodes里
- refreshNodes.push(ZMZJFnode);
- }
- preID = ZMZJFnode.data.ID;
- serialNo = ZMZJFnode.data.serialNo;
- }else {//不存在的话插入新的节点
- s_in = s_in +1;
- serialNo = serialNo+1;
- let newRationData = this.inserNewItemNodes(node.data.ID,node.data.quantity,preID,serialNo,code,s.name,total,datas);
- preID = newRationData.ID;
- if(!_.isEmpty(installationFeeObj.feeRateMap))newRationData.manageFeeRate = manageFeeRate;
- }
- }else { //如果total小于0,但又存在的话,删除定额(同时后端处理时记得要删除定额工料机)
- if(ZMZJFnode){
- datas.push({type:ModuleNames.ration,data:{ID:ZMZJFnode.data.ID},action:"delete"});
- if(refreshNodes.length == 0) refreshNodes.push(node);//删除时,如果清单下没有定额更新,则刷新清单节点就行
- }
- }
- }
- }
- return refreshNodes;
- },
- updateItemNode:function (node,total,rationGLJMap,datas) {
- if(_.isEmpty(rationGLJMap)) this.setRationGLJMap(rationGLJMap);
- if(rationGLJMap[node.data.ID] && rationGLJMap[node.data.ID].quantity != total){
- datas.push({type:ModuleNames.ration_glj,data:{ID:rationGLJMap[node.data.ID].ID,quantity:total}})
- }
- },
- setRationGLJMap:function (rationGLJMap) {
- let gljList = projectObj.project.ration_glj.datas;
- for (let g of gljList){
- if(g.code == 'QTRGF') rationGLJMap[g.rationID] = g;
- }
- },
- inserNewItemNodes:function (billsItemID,billsQuantity,preID,serialNo,code,name,total,datas) {
- let Ration = projectObj.project.Ration;
- let newRationData = Ration.getTempRationData(Ration.getNewRationID(), billsItemID, serialNo, rationType.itemIncrease);
- newRationData.code = code;
- newRationData.name=name;
- newRationData.unit = '元';
- newRationData.quantity = "1";
- if(billsQuantity) newRationData.contain = scMathUtil.roundForObj(1/parseFloat(billsQuantity),getDecimal("process"))+"";
- newRationData.quantityEXP = '1';
- datas.push({type:ModuleNames.ration,data:newRationData,preSiblingID:preID,action:"add",parentID:billsItemID});
- let newRationGLJ = {
- rationID:newRationData.ID,
- billsItemID:billsItemID,
- shortName:projectObj.project.projectGLJ.getShortNameByID(gljType.LABOUR),
- GLJID:-1,
- projectID:newRationData.projectID,
- code:'QTRGF',
- original_code:'QTRGF',
- name:'其它人工费',
- specs:'',
- unit:'元',
- type:gljType.LABOUR,
- basePrice:1,
- marketPrice:1,
- adjCoe:null,
- from:'std',
- repositoryId:-1,
- quantity:total+"",
- rationItemQuantity:total+""
- };
- datas.push({type:ModuleNames.ration_glj,data:newRationGLJ,action:"add"});
- return newRationData;
- }
- };
- $(function () {
- $('#itemIncreaseFeeDiv').on('shown.bs.modal', function (e) {
- itemIncreaseFeeObj.itemChange = false;
- itemIncreaseFeeObj.initSpread();
- itemIncreaseFeeObj.showDatas();
- });
- $('#item_increase_scope').on('shown.bs.modal', function (e) {
- itemIncreaseFeeObj.initScopeSpread();
- itemIncreaseFeeObj.showScopeDatas();
- });
-
- $("#select_scope_confirm").click(function () {
- itemIncreaseFeeObj.confirmScope();
- })
- $("#itemIncreaseFeeConfirm").click(function () {
- itemIncreaseFeeObj.confirmItemIncreaseSetting();
- })
- });
|