/** * Created by Zhong on 2017/8/15. */ let gljComponentOprObj = { workBook: null, setting: { owner: "gljComponent", header:[ {headerName:"编码",headerWidth:50,dataCode:"code", dataType: "String", formatter: "@", hAlign: "left", vAlign: "center"}, {headerName:"名称",headerWidth:60,dataCode:"name", dataType: "String", hAlign: "left", vAlign: "center"}, {headerName:"计量单位",headerWidth:60,dataCode:"unit", dataType: "String", hAlign: "center", vAlign: "center"}, {headerName:"单价",headerWidth:50,dataCode:"basePrice", dataType: "Number", formatter: "0.00", hAlign: "right", vAlign: "center"}, {headerName:"消耗量",headerWidth:55,dataCode:"consumeAmt", dataType: "Number", formatter: "0.000", hAlign: "right", vAlign: "center"} ], view: { lockedCells:[1, 2, 3] } }, buildSheet: function(container) { let me = gljComponentOprObj; me.workBook = sheetCommonObj.buildSheet(container, me.setting, 30, me); me.workBook.getSheet(0).setColumnWidth(0, 20, GC.Spread.Sheets.SheetArea.rowHeader); me.workBook.getSheet(0).setFormatter(-1, 0, "@", GC.Spread.Sheets.SheetArea.viewport); me.workBook.getSheet(0).options.isProtected = true; sheetCommonObj.cleanSheet(me.workBook.getSheet(0), me.setting, -1); me.gljComponentDelOpr(); me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting); me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasted, me.onClipboardPasted); me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditStarting, me.onCellEditStart); me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditEnded, me.onCellEditEnd); /* me.repositoryGljDelOpr(); me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting); me.workBook.bind(GC.Spread.Sheets.Events.ClipboardPasted, me.onClipboardPasted); me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditStarting, me.onCellEditStart); me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EditEnded, me.onCellEditEnd); me.workBook.getSheet(0).bind(GC.Spread.Sheets.Events.EnterCell, me.onEnterCell);*/ }, getRowData: function (sheet, row, setting) { let rst = {}; for(let i = 0; i < setting.header.length; i++){ rst[setting.header[i].dataCode] = sheet.getValue(row, i); } return rst; }, getComponent: function (sheet, rowCount) { let component = []; for(let row = 0; row < rowCount; row++){ let obj = {}; obj.consumeAmt = sheet.getValue(row, 4); obj.ID = sheet.getTag(row, 0); component.push(obj); } return component; }, gljComponentDelOpr: function () { let me = gljComponentOprObj, that = repositoryGljObj, updateArr = [], removeArr = [], isUpdate = false, updateBasePrc= []; me.workBook.commandManager().register('gljComponentDel', function () { let sels = me.workBook.getSheet(0).getSelections(); if(sels.length > 0 && that.currentComponent.length > 0){ let component = that.currentGlj.component; for(let i = 0; i < sels.length > 0; i++){ if(sels[i].colCount === me.setting.header.length){//可删除 for(let j = 0; j < sels[i].rowCount; j++){ if(sels[i].row + j < that.currentComponent.length){ removeArr.push(that.currentComponent[sels[i].row + j].ID); } } } else if(sels[i].col === 0){ //编码不可为空 alert("编码不可为空!"); } else if(sels[i].col === 4){//消耗量修改为0 if(sels[i].row === -1){//全修改 for(let j = 0; j < that.currentComponent.length; j++){ isUpdate = true; that.currentComponent[j].consumeAmt = 0; for(let k = 0; k < component.length; k++){ if(component[k].ID === that.currentComponent[j].ID){ component[k].consumeAmt = 0; break; } } } } else{//部分修改 for(let j = 0; j < sels[i].rowCount; j++){ if(sels[i].row + j < that.currentComponent.length){ isUpdate = true; that.currentComponent[sels[i].row + j].consumeAmt = 0; for(let k = 0; k < component.length; k++){ if(component[k].ID === that.currentComponent[sels[i].row + j].ID){ component[k].consumeAmt = 0; break; } } } } } } } if(removeArr.length > 0 || isUpdate){ for(let i = 0; i < removeArr.length; i++){ for(let j = 0; j < that.currentComponent.length; j++){ if(that.currentComponent[j].ID === removeArr[i]){ that.currentComponent.splice(j--, 1); } } for(let j = 0; j < component.length; j++){ if(component[j].ID === removeArr[i]){ component.splice(j--, 1); } } } //重新计算工料机 let gljBasePrc = me.reCalGljBasePrc(that.currentComponent); if(gljBasePrc !== that.currentGlj.basePrice){ that.currentGlj.basePrice = gljBasePrc; that.reshowGljBasePrc(that.currentGlj); updateBasePrc.push({gljId: that.currentGlj.ID, gljType: that.currentGlj.gljType, basePrice: that.currentGlj.basePrice}); } updateArr.push(that.currentGlj); me.updateComponent(updateArr); if(updateBasePrc.length > 0){ that.updateRationBasePrcRq(updateBasePrc); } } } }); me.workBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.del, false, false, false, false); me.workBook.commandManager().setShortcutKey('gljComponentDel', GC.Spread.Commands.Key.del, false, false, false, false); }, onCellEditStart: function(sender, args) { let me = gljComponentOprObj, that = repositoryGljObj; let rObj = me.getRowData(args.sheet, args.row, me.setting); me.currentEditingComponent = rObj; }, onCellEditEnd: function (sender, args) { let me = gljComponentOprObj, that = repositoryGljObj, updateBasePrc = []; let gljList = that.gljList, updateArr = [], materialComponent = [202, 203, 204], machineComponent = [302, 303]; if(args.editingText !== me.currentEditingComponent.code){ if(args.col === 0 && args.editingText && args.editingText.trim().length > 0){ let component = that.currentGlj.component, hasCode = false; for(let i = 0; i < gljList.length; i++){ if(gljList[i].code === args.editingText){//有效的组成物 hasCode = true; if((materialComponent.indexOf(that.currentGlj.gljType) !== -1 && gljList[i].gljType === 201) || (that.currentGlj.gljType === 301 && machineComponent.indexOf(gljList[i].gljType) !== -1 )){//普通材料 //是否与原有组成物不同 let isExist = false; for(let j = 0; j < component.length; j++){ if(component[j].ID === gljList[i].ID){ isExist = true; break; } } if(!isExist){ let rObj = {}; rObj.ID = gljList[i].ID; //rObj.basePrice = gljList[i].basePrice; if(typeof that.currentComponent[args.row] !== 'undefined'){ rObj.consumeAmt = that.currentComponent[args.row].consumeAmt; let index; for(let j = 0; j < component.length; j++){ if(component[j].ID === that.currentComponent[args.row].ID){ index = j; break; } } component.splice(index, 1); component.splice(index, 0, rObj); //计算工料机单价 let gljBasePrc = me.reCalGljBasePrc(that.getCurrentComponent(component)); if(gljBasePrc !== that.currentGlj.basePrice){ that.currentGlj.basePrice = gljBasePrc; that.reshowGljBasePrc(that.currentGlj); //工料机单价改变,重算引用了该工料机的定额单价 updateBasePrc.push({gljId: that.currentGlj.ID, gljType: that.currentGlj.gljType, basePrice: that.currentGlj.basePrice}); } updateArr.push(that.currentGlj); } else{ rObj.consumeAmt = 0; component.push(rObj); //计算工料机单价 let gljBasePrc = me.reCalGljBasePrc(that.getCurrentComponent(component)); if(gljBasePrc !== that.currentGlj.basePrice){ that.currentGlj.basePrice = gljBasePrc; that.reshowGljBasePrc(that.currentGlj); //工料机单价改变,重算引用了该工料机的定额单价 updateBasePrc.push({gljId: that.currentGlj.ID, gljType: that.currentGlj.gljType, basePrice: that.currentGlj.basePrice}); } updateArr.push(that.currentGlj); } break; } else{ //已存在 alert("已存在!"); args.sheet.setValue(args.row, args.col, me.currentEditingComponent[me.setting.header[args.col].dataCode] ? me.currentEditingComponent[me.setting.header[args.col].dataCode]: ''); } } else{ if(materialComponent.indexOf(that.currentGlj.gljType) === 1){ alert("该组成物只能是普通材料!"); } else if(that.currentGlj.gljType === 301){ alert("该组成物只能是机械组成物或机上人工!") } args.sheet.setValue(args.row, args.col, me.currentEditingComponent[me.setting.header[args.col].dataCode] ? me.currentEditingComponent[me.setting.header[args.col].dataCode]: ''); //无效 } } } if(!hasCode){ alert("不存在此工料机,请先添加!"); args.sheet.setValue(args.row, args.col, me.currentEditingComponent[me.setting.header[args.col].dataCode] ? me.currentEditingComponent[me.setting.header[args.col].dataCode] : ''); //不存在 } } else if(args.col === 4 && me.currentEditingComponent.code && args.editingText && args.editingText.trim().length > 0){//消耗量 let consumeAmt = parseFloat(args.editingText); if(!isNaN(consumeAmt) && consumeAmt !== me.currentEditingComponent.consumeAmt){ let component = that.currentGlj.component; for(let i = 0; i < component.length; i++){ if(component[i].ID === that.currentComponent[args.row].ID){ component[i].consumeAmt = consumeAmt } } that.currentComponent[args.row].consumeAmt = consumeAmt; //计算工料机单价 let gljBasePrc = me.reCalGljBasePrc(that.currentComponent); if(gljBasePrc !== that.currentGlj.basePrice){ that.currentGlj.basePrice = gljBasePrc; that.reshowGljBasePrc(that.currentGlj); //工料机单价改变,重算引用了该工料机的定额单价 updateBasePrc.push({gljId: that.currentGlj.ID, gljType: that.currentGlj.gljType, basePrice: that.currentGlj.basePrice}); } updateArr.push(that.currentGlj); } else{ //只能输入数值 args.sheet.setValue(args.row, args.col, me.currentEditingComponent[me.setting.header[args.col].dataCode] ? me.currentEditingComponent[me.setting.header[args.col].dataCode]: 0); } } else{ args.sheet.setValue(args.row, args.col, ''); } } if(updateArr.length > 0){ me.updateComponent(updateArr); if(updateBasePrc.length > 0){ that.updateRationBasePrcRq(updateBasePrc) } } }, onClipboardPasting: function (sender, info) { let me = gljComponentOprObj; let maxCol = info.cellRange.col + info.cellRange.colCount - 1; //复制的列数超过正确的列数,不可复制 if(maxCol >= me.setting.header.length){ args.cancel = true; } }, onClipboardPasted: function (sender, info) { let me = gljComponentOprObj, that = repositoryGljObj, updateArr = [] ,materialComponent = [202, 203, 204], machineComponent = [302, 303], component = that.currentGlj.component, newComponent = [], concatComponent = [], isChange = false, updateBasePrc = []; let items = sheetCommonObj.analyzePasteData(me.setting, info); let gljCache = that.gljList; if(info.cellRange.col === 0){ for(let i = 0; i < items.length; i++){ for(let j = 0; j < gljCache.length; j++){ if(items[i].code === gljCache[j].code){ if((materialComponent.indexOf(that.currentGlj.gljType) !== -1 && gljCache[j].gljType === 201) || (that.currentGlj.gljType === 301 && machineComponent.indexOf(gljCache[j].gljType) !== -1 )){ //是否与原有组成物不同 let isExist = false; for(let k = 0; k < component.length; k++){ if(component[k].ID === gljCache[j].ID){ isExist = true; me.workBook.getSheet(0).setValue(info.cellRange.row + i, info.cellRange.col, typeof that.currentComponent[info.cellRange.row + i] !== 'undefined'? that.currentComponent[info.cellRange.row + i].code : ''); break; } } if(!isExist){ isChange = true; let obj = {}; obj.ID = gljCache[j].ID; if(typeof that.currentComponent[info.cellRange.row + i] !== 'undefined'){//更新 obj.consumeAmt = that.currentComponent[info.cellRange.row + i].consumeAmt; let index; for(let k = 0; k < component.length; k++){ if(that.currentComponent[info.cellRange.row + i].ID === component[k].ID){ index = k; break; } } component.splice(index, 1); component.splice(index, 0, obj); } else{//新增 obj.consumeAmt = 0; component.push(obj); } break; } } else{ me.workBook.getSheet(0).setValue(info.cellRange.row + i, info.cellRange.col, typeof that.currentComponent[info.cellRange.row + i] !== 'undefined'? that.currentComponent[info.cellRange.row + i].code : ''); } } else{ me.workBook.getSheet(0).setValue(info.cellRange.row + i, info.cellRange.col, typeof that.currentComponent[info.cellRange.row + i] !== 'undefined'? that.currentComponent[info.cellRange.row + i].code : ''); } } } if(isChange){ //计算工料机单价 let gljBasePrc = me.reCalGljBasePrc(that.getCurrentComponent(component)); if(gljBasePrc !== that.currentGlj.basePrice){ that.currentGlj.basePrice = gljBasePrc; that.reshowGljBasePrc(that.currentGlj); updateBasePrc.push({gljId: that.currentGlj.ID, gljType: that.currentGlj.gljType, basePrice: that.currentGlj.basePrice}); } updateArr.push(that.currentGlj); } } else if(info.cellRange.col === 4){ let items = sheetCommonObj.analyzePasteData(me.setting, info); let row = info.cellRange.row; for(let i = 0; i < items.length; i++){ if(row + i < that.currentComponent.length){ let currentObj = that.currentComponent[row + i]; if(items[i].consumeAmt.trim().length > 0 && items[i].consumeAmt !== currentObj.consumeAmt){ isChange = true; currentObj.consumeAmt = items[i].consumeAmt; for(let j = 0; j < component.length; j++){ if(component[j].ID === currentObj.ID){ component[j].consumeAmt = currentObj.consumeAmt; break; } } } else{ me.workBook.getSheet(0).setValue(row + i, info.cellRange.col, currentObj.consumeAmt); } } else{ me.workBook.getSheet(0).setValue(row + i, info.cellRange.col, ''); } } if(isChange){ //计算工料机单价 let gljBasePrc = me.reCalGljBasePrc(that.currentComponent); if(gljBasePrc !== that.currentGlj.basePrice){ that.currentGlj.basePrice = gljBasePrc; that.reshowGljBasePrc(that.currentGlj); updateBasePrc.push({gljId: that.currentGlj.ID, gljType: that.currentGlj.gljType, basePrice: that.currentGlj.basePrice}); } updateArr.push(that.currentGlj); } } if(updateArr.length > 0){ me.updateComponent(updateArr); if(updateBasePrc.length > 0){ that.updateRationBasePrcRq(updateBasePrc); } } }, updateComponent: function (updateArr) { let me = gljComponentOprObj, that = repositoryGljObj; $.ajax({ type: 'post', url: 'api/updateComponent', data: {libId: pageOprObj.gljLibId, updateArr: updateArr, oprtor: userAccount}, dataType: 'json', success: function (result) { if(result.data.length > 0){ if(result.data[0]){ that.currentComponent = that.getCurrentComponent(result.data[0].component); sheetCommonObj.cleanSheet(me.workBook.getSheet(0), me.setting, -1); sheetCommonObj.showData(me.workBook.getSheet(0), me.setting, that.currentComponent); } } } }) }, round: function (v, e) { let t=1; for(;e>0;t*=10,e--); for(;e<0;t/=10,e++); return Math.round(v*t)/t; }, reCalGljBasePrc: function (component) { let me = gljComponentOprObj, gljBasePrc = 0; for(let i = 0; i < component.length; i++){ gljBasePrc += me.round(component[i].basePrice * component[i].consumeAmt, 2); } return gljBasePrc; } };