/** * Created by Tony on 2017/4/28. */ var rationGLJOprObj = { processDecimal: -6, sheet: null, currentRationItem: null, distTypeTree: null, activeCell: null, tempCacheArr: [],//被更新的工料机,若更新的工料机不存在,则恢复 cache: {}, setting: { header:[ {headerName:"编码",headerWidth:120,dataCode:"code", dataType: "String", formatter: "@"}, {headerName:"名称",headerWidth:400,dataCode:"name", dataType: "String"}, {headerName:"规格型号",headerWidth:120,dataCode:"specs", dataType: "String"}, {headerName:"单位",headerWidth:160,dataCode:"unit", dataType: "String", hAlign: "center", vAlign: "center"}, {headerName:"基价单价",headerWidth:160, dataCode:"basePrice", dataType: "Number", formatter:"0.00", precision: 2}, {headerName:"定额消耗",headerWidth:160, dataCode:"consumeAmt", dataType: "Number", formatter: "0.000", precision: 3}, {headerName:"类型",headerWidth:160,dataCode:"gljType", dataType: "String", hAlign: "center", vAlign: "center"} ], view:{ comboBox:[], lockColumns:[1,2,3,4,6] } }, getDistTypeTree: function (gljDistType) { let me = this; let distType; let distTypeTree = { prefix : 'gljDistType', distTypes: {}, comboDatas: [], distTypesArr: [] }; gljDistType.forEach(function (typeData) { let typeObj = { data: typeData, children: [], parent: null } distTypeTree.distTypes[distTypeTree.prefix + typeData.ID] = typeObj; distTypeTree.distTypesArr.push(typeObj); }); gljDistType.forEach(function (typeData) { distType = distTypeTree.distTypes[distTypeTree.prefix + typeData.ID]; let parent = distTypeTree.distTypes[distTypeTree.prefix + typeData.ParentID]; if(parent){ distType.parent = parent; parent.children.push(distType); } }); distTypeTree.distTypesArr.forEach(function (distTypeObj) { if(distTypeObj.children.length === 0 && distTypeObj.data.fullName !== '普通机械' &&distTypeObj.data.fullName !== '机械组成物' && distTypeObj.data.fullName !== '机上人工'){ distTypeTree.comboDatas.push({text: distTypeObj.data.fullName, value: distTypeObj.data.ID}); } if(distTypeObj.data.fullName === '机械'){ distTypeTree.comboDatas.push({text: distTypeObj.data.fullName, value: distTypeObj.data.ID}); } }); return distTypeTree; }, getGljDistType: function (callback) { let me = this; $.ajax({ type: 'post', url: "api/getGljDistType", dataType: 'json', success: function (result) { if(!result.error && callback){ me.distTypeTree = me.getDistTypeTree(result.data); callback(); } } }) }, buildSheet: function(sheet) { var me = this; me.sheet = sheet; me.getGljDistType(function () { // me.onContextmenuOpr(); sheetCommonObj.initSheet(me.sheet, me.setting, 30); me.bindRationGljDelOpr(); me.sheet.bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting); me.sheet.bind(GC.Spread.Sheets.Events.ClipboardPasted, me.onClipboardPasted); me.sheet.bind(GC.Spread.Sheets.Events.EditStarting, me.onEditStarting); me.sheet.bind(GC.Spread.Sheets.Events.EditEnded, me.onCellEditEnd); }); }, bindRationGljDelOpr: function () { let me = rationGLJOprObj, spreadBook = me.sheet.getParent(); spreadBook.commandManager().register('rationGljDelete', function () { if(!me.currentRationItem || me.currentRationItem.type === rationOprObj.type.std){ return; } let sels = me.sheet.getSelections(), lockCols = me.setting.view.lockColumns; let cacheSection = me.cache["_GLJ_" + me.currentRationItem.ID], isUpdate = false; if(sels.length > 0){ for(let sel = 0; sel < sels.length; sel++){ if(sels[sel].colCount === me.setting.header.length){ if(cacheSection && sels[sel].row < cacheSection.length){ isUpdate = true; cacheSection.splice(sels[sel].row, sels[sel].rowCount); } } else{ if(sels[sel].col !== 0 && sels[sel].col !== 5 && !(sels[sel].col === 1 && sels.col + sels[sel].colCount -1 === 3)){ if(cacheSection){ for(let i = sels[sel].row === -1 ? 1 : 0; i < sels[sel].rowCount; i++){ if(sels[sel].row + i < cacheSection.length){ for(let col = sels[sel].col; col <= sels[sel].col + sels[sel].colCount - 1; col++){ if(lockCols.indexOf(col) === -1){ isUpdate = true; cacheSection[sels[sel].row + i][me.setting.header[col].dataCode] = 0; me.sheet.setValue(sels[sel].row + i, col, 0.00); } } } } } } } } } if(isUpdate){ me.updateRationItem(function () { me.sheet.getParent().focus(true); }); sheetCommonObj.cleanData(me.sheet, me.setting, -1); me.showGljItems(me.currentRationItem.ID); } }); spreadBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.del, false, false, false, false); spreadBook.commandManager().setShortcutKey('rationGljDelete', GC.Spread.Commands.Key.del, false, false, false, false); }, onClipboardPasting: function(sender, args) { var me = rationGLJOprObj; let rationSection = rationOprObj.getCache(); let rationRow = rationOprObj.workBook.getSheet(0).getSelections()[0].row; me.currentRationItem = rationRow < rationSection.length ? rationSection[rationRow] : null; if(me.currentRationItem && typeof me.cache["_GLJ_" + me.currentRationItem.ID] === 'undefined'){ me.cache["_GLJ_" + me.currentRationItem.ID] = []; } if (!(args.cellRange.col === 0 || args.cellRange.col === 5) || !(me.currentRationItem) || (me.currentRationItem && me.currentRationItem.type === rationOprObj.type.std)) { args.cancel = true; } }, onClipboardPasted: function(e, info) { var me = rationGLJOprObj, repId = pageOprObj.rationLibId; me.tempCacheArr = []; if (repId) { let gljLibId = pageOprObj.gljLibId; console.log(gljLibId); if(gljLibId){ if (info.cellRange.col == 0) { let cacheArr = me.cache["_GLJ_" + me.currentRationItem.ID]; var tmpCodes = sheetCommonObj.analyzePasteData({header:[{dataCode: "code"}] }, info); var codes = []; for (var i = 0; i < tmpCodes.length; i++) { let rowIdx = info.cellRange.row + i; if(rowIdx < cacheArr.length){//更新 me.tempCacheArr.push({org: cacheArr[rowIdx], newCode: tmpCodes[i].code}); cacheArr.splice(rowIdx--, 1); } codes.push(tmpCodes[i].code); } me.addGljItems(codes, gljLibId, info.cellRange); } else { //修改用量 if(me.cache["_GLJ_" + me.currentRationItem.ID] && info.cellRange.row < me.cache["_GLJ_" + me.currentRationItem.ID].length){ let tempConsumes = sheetCommonObj.analyzePasteData(me.setting, info); let maxCount = info.cellRange.row + info.cellRange.rowCount -1 > me.cache["_GLJ_" + me.currentRationItem.ID].length -1 ? me.cache["_GLJ_" + me.currentRationItem.ID].length - info.cellRange.row : info.cellRange.rowCount; for(let i = 0; i < maxCount; i++){ let roundCons = scMathUtil.roundTo(tempConsumes[i].consumeAmt, -3); me.cache["_GLJ_" + me.currentRationItem.ID][info.cellRange.row + i].consumeAmt = roundCons; } me.updateRationItem(function () { me.sheet.getParent().focus(true); }); if(info.cellRange.row + info.cellRange.rowCount -1 >= me.cache["_GLJ_" + me.currentRationItem.ID].length -1){ me.sheet.suspendPaint(); for(let rowIdx = me.cache["_GLJ_" + me.currentRationItem.ID].length; rowIdx <= info.cellRange.row + info.cellRange.rowCount -1; rowIdx++){ me.sheet.setValue(rowIdx, info.cellRange.col, ''); } me.sheet.resumePaint(); } } else if(info.cellRange.row >= me.cache["_GLJ_" + me.currentRationItem.ID].length){ me.sheet.suspendPaint(); for(let rowIdx = info.cellRange.row; rowIdx <= info.cellRange.row + info.cellRange.rowCount -1; rowIdx ++){ me.sheet.setValue(rowIdx, info.cellRange.col, ''); } me.sheet.resumePaint(); } } } } }, onEditStarting: function (sender, args) { let me = rationGLJOprObj; let rationSection = rationOprObj.getCache(); let rationRow = rationOprObj.workBook.getSheet(0).getSelections()[0].row; me.currentRationItem = rationRow < rationSection.length ? rationSection[rationRow] : null; if(me.currentRationItem && typeof me.cache["_GLJ_" + me.currentRationItem.ID] === 'undefined'){ me.cache["_GLJ_" + me.currentRationItem.ID] = []; } if(!me.currentRationItem){ args.cancel = true; } else { if(args.col !== 0 && args.col !== 5 || args.col === 5 && args.row >= me.cache["_GLJ_" + me.currentRationItem.ID].length || me.currentRationItem.type === rationOprObj.type.std){ args.cancel = true; } } }, onCellEditEnd: function(sender, args){ var me = rationGLJOprObj; if(me.currentRationItem) { var cacheArr = me.cache["_GLJ_" + me.currentRationItem.ID]; me.tempCacheArr = []; if (args.col != 0) { if (args.row < cacheArr.length) { var editGlj = cacheArr[args.row]; if (editGlj["consumeAmt"] != args.editingText) { let parseNum = parseFloat(args.editingText); if (isNaN(parseFloat(args.editingText))) { $('#alertModalBtn').click(); $('#alertText').text("定额消耗只能输入数值!"); $('#alertModalCls').click(function () { args.sheet.setValue(args.row, args.col, editGlj['consumeAmt']); }); $('#alertModalCof').click(function () { args.sheet.setValue(args.row, args.col, editGlj['consumeAmt']); }) } else { args.sheet.setValue(args.row, args.col, parseNum); let roundNum = scMathUtil.roundTo(parseNum, -3); editGlj["consumeAmt"] = roundNum; me.updateRationItem(function () { me.sheet.getParent().focus(true); }); } } } } else { if (args.editingText && args.editingText.toString().trim().length !== 0) { let isExist = false; for (let i = 0, len = cacheArr.length; i < len; i++) { if (cacheArr[i].code === args.editingText && i !== args.row) { isExist = true; break; } } if (isExist) { alert("人材机已存在!"); args.sheet.setValue(args.row, args.col, typeof cacheArr[args.row] !== 'undefined' ? cacheArr[args.row].code + '' : ''); } else { if (args.row < cacheArr.length && args.editingText !== cacheArr[args.row].code) {//更新 me.tempCacheArr.push({org: cacheArr[args.row], newCode: args.editingText.toString().trim()}); cacheArr.splice(args.row, 1); let gljLibID = pageOprObj.gljLibId; let codes = []; codes.push(args.editingText.toString().trim()); me.addGljItems(codes, gljLibID, args); } else if (args.row >= cacheArr.length) {//新增 let gljLibID = pageOprObj.gljLibId; if (gljLibID) { var codes = []; codes.push(args.editingText.toString().trim()); me.addGljItems(codes, gljLibID, args); } } } } else { args.sheet.setValue(args.row, args.col, args.row < cacheArr.length ? cacheArr[args.row].code : ''); } } } else { args.sheet.setValue(args.row, args.col, ''); } }, onContextmenuOpr: function () { let me = rationGLJOprObj; $.contextMenu({ selector: '#rdSpread', build: function ($triggerElement, e) { //控制允许右键菜单在哪个位置出现 let sheet = me.sheet; let offset = $triggerElement.offset(), x = e.pageX - offset.left, y = e.pageY - offset.top; let target = sheet.hitTest(x, y); if(sheet.parent.getActiveSheetIndex() === 0 && target.hitTestType === 3 && typeof target.row !== 'undefined' && typeof target.col !== 'undefined'){ let delDis = true, cacheSection; sheet.setActiveCell(target.row, target.col); if(me.currentRationItem){ let cacheSection = me.cache["_GLJ_" + me.currentRationItem.ID]; if(target.row < cacheSection.length){ delDis = false; } } return { callback: function(key, options) { }, items: { "delete": {name: "删除", icon: 'fa-remove', disabled: delDis, callback: function (key, opt) { cacheSection.splice(target.row, 1); me.updateRationItem(function () { me.sheet.getParent().focus(true); }); sheetCommonObj.cleanData(me.sheet, me.setting, -1); me.showGljItems(me.currentRationItem.ID); }} } }; } else{ return false; } } }); }, getRecoveryArr: function (tempDelArr, newArr) {//获得更新的code不存在,恢复删除的被更新数据 let rst = []; for(let i = 0, len = tempDelArr.length; i < len; i++){ let isExist = false; for(let j = 0, jLen = newArr.length; j < jLen; j++){ if(tempDelArr[i].newCode == newArr[j].code){ isExist = true; break; } } if(!isExist){ rst.push(tempDelArr[i].org); } } return rst; }, addGljItems: function(codes, repId, args) { let me = this; CommonAjax.post('api/getGljItemsByCodes', {gljCodes: codes, rationRepId: repId}, function (rstData) { if(rstData.length > 0){ sheetCommonObj.cleanData(me.sheet, me.setting, -1); let rstArr = [], dummyR = {gljId: 0, consumeAmt:0}, newAddArr = []; for (let i = 0; i < rstData.length; i++) { dummyR.gljId = rstData[i].ID; dummyR.type = rstData[i].type; rstArr.push(me.createRationGljDisplayItem(dummyR, rstData[i])); } if (me.cache["_GLJ_" + me.currentRationItem.ID]) { var cacheArr = me.cache["_GLJ_" + me.currentRationItem.ID]; for (var i = 0; i < rstArr.length; i++) { var hasDup = false; for (var j = 0; j < cacheArr.length; j++) { if (cacheArr[j].gljId == rstArr[i].gljId) { hasDup = true; break; } } if (!hasDup) { newAddArr.push(rstArr[i]); } } me.cache["_GLJ_" + me.currentRationItem.ID] = cacheArr.concat(newAddArr); let recoveryArr = me.getRecoveryArr(me.tempCacheArr, rstData); if(recoveryArr.length > 0){ me.cache["_GLJ_" + me.currentRationItem.ID] = me.cache["_GLJ_" + me.currentRationItem.ID].concat(recoveryArr); } me.cache["_GLJ_" + me.currentRationItem.ID].sort(function(a, b) { var rst = 0; if (a.code > b.code) rst = 1 else if (a.code < b.code) rst = -1; return rst; }); } me.showGljItems(me.currentRationItem.ID); if (newAddArr.length > 0) { me.updateRationItem(function () { me.sheet.getParent().focus(true); }); } } else{ let cacheArr = me.cache["_GLJ_" + me.currentRationItem.ID]? me.cache["_GLJ_" + me.currentRationItem.ID] : []; let recoveryArr = me.getRecoveryArr(me.tempCacheArr, []); if(recoveryArr.length > 0){ me.cache["_GLJ_" + me.currentRationItem.ID] = cacheArr.concat(recoveryArr); } //更新的工料机不存在 me.cache["_GLJ_" + me.currentRationItem.ID].sort(function(a, b) { var rst = 0; if (a.code > b.code) rst = 1 else if (a.code < b.code) rst = -1; return rst; }); $('#alertModalBtn').click(); $('#alertText').text("人材机"+ codes + "不存在,请查找你所需要的人材机,或新增人材机"); $('#alertModalCls').click(function () { me.showGljItems(me.currentRationItem.ID); }); $('#alertModalCof').click(function () { me.showGljItems(me.currentRationItem.ID); }) } }); }, round(v, e){ var t=1; for(;e>0;t*=10,e--); for(;e<0;t/=10,e++); return Math.round(v*t)/t; }, rationCal: function () { let me = rationGLJOprObj; let price = {gljType1: [], gljType2: [], gljType3: []}, rst = {labourPrice: 0, materialPrice: 0, machinePrice: 0}, rationBasePrc = 0; if(me.currentRationItem && me.cache['_GLJ_' + me.currentRationItem.ID]){ let cacheArr = me.cache['_GLJ_' + me.currentRationItem.ID]; cacheArr.forEach(function (gljData) { if(gljData.gljType && gljData.basePrice && gljData.consumeAmt){ let parent = me.distTypeTree.distTypes[me.distTypeTree.prefix + gljData.gljType].parent; if(parent && parent.data.ID <= 3){ price['gljType' + parent.data.ID].push(scMathUtil.roundTo( gljData.basePrice * gljData.consumeAmt, -3));//取三位 } if(!parent && gljData.gljType <= 3){ price['gljType' + gljData.gljType].push(scMathUtil.roundTo( gljData.basePrice * gljData.consumeAmt, -3));//取三位 } } }); if(price.gljType1.length > 0){ let labourPrice = 0; price.gljType1.forEach(function (singlePrc) { labourPrice = scMathUtil.roundTo(labourPrice + singlePrc, me.processDecimal); }); let roundPrice = scMathUtil.roundTo(labourPrice, -2); rst.labourPrice = roundPrice; rationBasePrc = scMathUtil.roundTo(rationBasePrc + roundPrice, -2); } if(price.gljType2.length > 0){ let materialPrice = 0; price.gljType2.forEach(function (singlePrc) { materialPrice = scMathUtil.roundTo(materialPrice + singlePrc, me.processDecimal); }); let roundPrice = scMathUtil.roundTo(materialPrice, -2); rst.materialPrice = roundPrice; rationBasePrc = scMathUtil.roundTo(rationBasePrc + roundPrice, -2); } if(price.gljType3.length > 0){ let machinePrice = 0; price.gljType3.forEach(function (singlePrc) { machinePrice = scMathUtil.roundTo(machinePrice + singlePrc, me.processDecimal); }); let roundPrice = scMathUtil.roundTo(machinePrice, -2); rst.machinePrice = roundPrice; rationBasePrc = scMathUtil.roundTo(rationBasePrc + roundPrice, -2); } rst.rationBasePrc = rationBasePrc; } return rst; }, updateRationItem: function(callback) { var me = this, updateArr = []; if (me.currentRationItem) { me.currentRationItem.rationGljList = me.buildRationItemGlj(); //recalculate ration basePrice let price = me.rationCal(); me.currentRationItem.labourPrice = price.labourPrice; me.currentRationItem.materialPrice = price.materialPrice; me.currentRationItem.machinePrice = price.machinePrice; me.currentRationItem.basePrice = price.rationBasePrc; updateArr.push(me.currentRationItem); rationOprObj.mixUpdateRequest(updateArr, [], [], function () { if(callback) callback(); }); } }, buildRationItemGlj: function(){ var me = this, rst = []; console.log(me.currentRationItem && me.cache["_GLJ_" + me.currentRationItem.ID]); if (me.currentRationItem && me.cache["_GLJ_" + me.currentRationItem.ID]) { var cacheArr = me.cache["_GLJ_" + me.currentRationItem.ID]; for (var i = 0; i < cacheArr.length; i++) { rst.push({gljId: cacheArr[i].gljId, consumeAmt: cacheArr[i].consumeAmt, type: cacheArr[i].type}); } } return rst; }, createRationGljDisplayItem: function(rItem, repGlj) { var rst = {}; rst.gljId = rItem.gljId; rst.type = rItem.type; rst.consumeAmt = rItem.consumeAmt; rst.code = repGlj.code; rst.name = repGlj.name; rst.specs = repGlj.specs; rst.unit = repGlj.unit; rst.basePrice = repGlj.basePrice; rst.gljType = repGlj.gljType; return rst; }, getGljItems: function(rationItem, callback) { let me = this, rationID = rationItem.ID, rationGljList = rationItem.rationGljList, rationType = rationItem.type; me.currentRationItem = rationItem; if (me.cache["_GLJ_" + rationID]) { me.showGljItems(rationID); } else { let gljIds = []; for (let i = 0; i < rationGljList.length; i++) { let idObj = Object.create(null); idObj.type = rationType === rationOprObj.type.std ? rationOprObj.type.std : rationGljList[i].type; idObj.id = rationGljList[i].gljId; gljIds.push(idObj); } CommonAjax.post('api/getGljItemsByIds', {ids: gljIds}, function (rstData) { sheetCommonObj.cleanSheet(me.sheet, me.setting, -1); var cacheArr = []; for (let i = 0; i < rstData.length; i++) { for (let j = 0; j < rationGljList.length; j++) { if (rationGljList[j].gljId == rstData[i].ID) { cacheArr.push(me.createRationGljDisplayItem(rationGljList[j], rstData[i])); break; } } } function compare(){ return function (a, b) { let rst = 0; if (a.code > b.code) { rst = 1; } else if (a.code < b.code) { rst = -1; } return rst; } } cacheArr.sort(compare()); me.cache["_GLJ_" + rationID] = cacheArr; me.showGljItems(rationID); if(callback) callback(); }); } }, showGljItems: function(rationID) { var me = this; if (me.cache["_GLJ_" + rationID]) { sheetCommonObj.cleanData(me.sheet, me.setting, -1); sheetsOprObj.showData(me.sheet, me.setting, me.cache["_GLJ_" + rationID], me.distTypeTree); } } }