'use strict'; /** * * * @author Zhong * @date 2018/6/1 * @version */ const billsGuidance = (function () { function _isDef(v) { return typeof v !== 'undefined' && v !== null; } const locked = lockUtil.getLocked(); let moduleName = 'stdBillsGuidance'; //上下拖动的拖动条高度 const verticalResize = 10; //自执行函数全局变量定义 const libID = getQueryString('libID'); //总工作内容数据 let stdBillsJobData = []; //总项目特征数据 let stdBillsFeatureData = []; const bills = { dom: $('#billsSpread'), workBook: null, cache: [], tree: null, controller: null, treeSetting: { treeCol: 0, emptyRows: 0, headRows: 1, headRowHeight: [40], defaultRowHeight: 21, cols: [{ width: 200, readOnly: true, showHint: true, head: { titleNames: ["项目编码"], spanCols: [1], spanRows: [1], vAlign: [1], hAlign: [1], font: ["Arial"] }, data: { field: "code", vAlign: 1, hAlign: 0, font: "Arial" } }, { width: 200, readOnly: true, head: { titleNames: ["项目名称"], spanCols: [1], spanRows: [1], vAlign: [1], hAlign: [1], font: ["Arial"] }, data: { field: "name", vAlign: 1, hAlign: 0, font: "Arial" } }] }, headers: [ {name: '项目编码', dataCode: 'code', width: 200, vAlign: 'center', hAlign: 'left', formatter: '@'}, {name: '项目名称', dataCode: 'name', width: 200, vAlign: 'center', hAlign: 'left', formatter: '@'} ], events: { SelectionChanged: function (sender, info) { billsInitSel(info.newSelections[0].row); } } }; //项目指引类型 const itemType = { job: 0, ration: 1 }; //项目指引复制整块localStorage key const itemCopyBlockKey = 'guideItemCopyBlock'; const updateType = { create: 'create', update: 'update', del: 'delete' }; //项目指引节点状态:展开全部、收起定额 const itemExpandState = { expand: 1, contract: 0 }; //项目指引当前节点展开收缩状态,默认展开全部 let curExpandState = 1; const guideItem = { dom: $('#guideItemSpread'), workBook: null, tree: null, controller: null, treeSetting: { treeCol: 0, emptyRows: 0, headRows: 1, headRowHeight: [40], defaultRowHeight: 21, cols: [{ width: 400, readOnly: locked, head: { titleNames: ["项目指引"], spanCols: [1], spanRows: [1], vAlign: [1], hAlign: [1], font: ["Arial"] }, data: { field: "name", vAlign: 1, hAlign: 0, font: "Arial" } }] }, headers: [ {name: '项目指引', dataCode: 'name', width: 400, vAlign: 'center', hAlign: 'left', formatter: '@'}, ], events: { SelectionChanged: function (sender, info) { guideItemInitSel(info.newSelections[0].row) }, EditEnded: function (sender, args) { edit(args.sheet, [{row: args.row, col: args.col}]); }, RangeChanged: function (sender, args) { edit(args.sheet, args.changedCells); } } }; //定额章节树 const section = { dom: $('#sectionSpread'), workBook: null, cache: [], tree: null, controller: null, treeSetting: { treeCol: 0, emptyRows: 0, headRows: 1, headRowHeight: [40], defaultRowHeight: 21, cols: [{ width: 400, readOnly: true, head: { titleNames: ["名称"], spanCols: [1], spanRows: [1], vAlign: [1], hAlign: [1], font: ["Arial"] }, data: { field: "name", vAlign: 1, hAlign: 0, font: "Arial" } }] }, headers: [ {name: '名称', dataCode: 'name', width: 400, vAlign: 'center', hAlign: 'left', formatter: '@'}, ], events: { SelectionChanged: function (sender, info) { sectionInitSel(info.newSelections[0].row) } } }; const ration = { dom: $('#rationSpread'), workBook: null, datas: [],//所有的数据,搜索定额时,从所有数据中筛选 cache: [],//显示在表格上的数据,添加定额可以有效根据行识别定额 headers: [ {name: '选择', dataCode: 'select', width: 50, vAlign: 'center', hAlign: 'center'}, {name: '编码', dataCode: 'code', width: 110, vAlign: 'center', hAlign: 'left', formatter: '@'}, {name: '名称', dataCode: 'name', width: 250, vAlign: 'center', hAlign: 'left', formatter: '@'}, {name: '单位', dataCode: 'unit', width: 100, vAlign: 'center', hAlign: 'left', formatter: '@'} ], events: { ButtonClicked: function (sender, args) { if(args.sheet.isEditing()){ args.sheet.endEdit(true); } }, CellDoubleClick: function (sender, args) { if(ration.headers[args.col].dataCode === 'name'){ let insertDatas = getInsertRations([args.row]); if(insertDatas.length > 0){ insert(insertDatas, false); } } } } }; const options = { workBook: { tabStripVisible: false, allowContextMenu: false, allowCopyPasteExcelStyle : false, allowExtendPasteRange: false, allowUserDragDrop : false, allowUserDragFill: false, scrollbarMaxAlign : true }, sheet: { protectionOptions: {allowResizeRows: true, allowResizeColumns: true}, clipBoardOptions: GC.Spread.Sheets.ClipboardPasteOptions.values } }; //渲染时方法,停止渲染 //@param {Object}sheet {Function}func @return {void} function renderSheetFunc(sheet, func){ sheet.suspendEvent(); sheet.suspendPaint(); if(func){ func(); } sheet.resumeEvent(); sheet.resumePaint(); } //设置表选项 //@param {Object}workBook {Object}opts @return {void} function setOptions (workBook, opts) { for(let opt in opts.workBook){ workBook.options[opt] = opts.workBook[opt]; } for(let opt in opts.sheet){ workBook.getActiveSheet().options[opt] = opts.sheet[opt]; } } //建表头 //@param {Object}sheet {Array}headers @return {void} function buildHeader(sheet, headers) { let fuc = function () { sheet.setColumnCount(headers.length); sheet.setRowHeight(0, 40, GC.Spread.Sheets.SheetArea.colHeader); for(let i = 0, len = headers.length; i < len; i++){ sheet.setValue(0, i, headers[i].name, GC.Spread.Sheets.SheetArea.colHeader); sheet.setColumnWidth(i, headers[i].width, GC.Spread.Sheets.SheetArea.colHeader); if(headers[i].formatter){ sheet.setFormatter(-1, i, headers[i].formatter); } sheet.getRange(-1, i, -1, 1).hAlign(GC.Spread.Sheets.HorizontalAlign[headers[i]['hAlign']]); sheet.getRange(-1, i, -1, 1).vAlign(GC.Spread.Sheets.VerticalAlign[headers[i]['vAlign']]); } }; renderSheetFunc(sheet, fuc); } //表监听事件 //@param {Object}workBook @return {void} function bindEvent(workBook, events) { if(Object.keys(events).length === 0){ return; } const Events = GC.Spread.Sheets.Events; let sheet = workBook.getActiveSheet(); for(let event in events){ workBook.bind(Events[event], events[event]); } } //建表 //@param {Object}module @return {void} function buildSheet(module) { if(!module.workBook){ module.workBook = new GC.Spread.Sheets.Workbook(module.dom[0], {sheetCount: 1}); let sheet = module.workBook.getActiveSheet(); if(module === bills){ sheet.name('stdBillsGuidance_bills'); //默认初始可控制焦点在清单表中 module.workBook.focus(); sheet.options.isProtected = true; } else if(module === ration){ sheet.options.isProtected = true; sheet.getRange(-1, 0, -1, 1).locked(locked); sheet.getRange(-1, 1, -1, -1).locked(true); } else if(module === guideItem){ sheetCommonObj.bindEscKey(module.workBook, [{sheet: sheet, editStarting: null, editEnded: module.events.EditEnded}]); } setOptions(module.workBook, options); buildHeader(module.workBook.getActiveSheet(), module.headers); bindEvent(module.workBook, module.events); } lockUtil.lockSpreads([module.workBook], locked); } //清空表数据 //@param {Object}sheet {Array}headers {Number}rowCount @return {void} function cleanData(sheet, headers, rowCount){ renderSheetFunc(sheet, function () { sheet.clear(-1, 0, -1, headers.length, GC.Spread.Sheets.SheetArea.viewport, GC.Spread.Sheets.StorageType.data); if (rowCount >= 0) { sheet.setRowCount(rowCount); } }); } //根据清单获取项目指引 //@param {String}guidanceLibID {Number}billsID {Function}callback @return {void} function getItemsByBills(guidanceLibID, billsID, callback){ CommonAjax.post('/billsGuidance/api/getItemsByBills', {guidanceLibID: guidanceLibID, billsID: billsID}, function (rstData) { if(callback){ callback(rstData); } }); } //清单表焦点控制 //@param {Number}row @return {void} function billsInitSel(row){ let guideSheet = guideItem.workBook.getActiveSheet(); cleanData(guideSheet, guideItem.headers, -1); let node = bills.tree.items[row]; if(!node){ return; } bills.tree.selected = node; //显示备注 $('.main-side-bottom').find('textarea').val(node.data.comment ? node.data.comment : ''); if(!node.guidance.tree){ getItemsByBills(libID, node.data.ID, function (rstData) { initTree(node.guidance, guideSheet, guideItem.treeSetting, rstData); setNodesExpandState(node.guidance.tree.items, curExpandState); renderSheetFunc(guideSheet, function () { TREE_SHEET_HELPER.refreshNodesVisible(node.guidance.tree.roots, guideSheet, true); }); //设置底色 setNodesColor(guideSheet, node.guidance.tree.items); //项目指引初始焦点 guideItemInitSel(guideSheet.getActiveRowIndex() ? guideSheet.getActiveRowIndex() : 0); }); } else{ setNodesExpandState(node.guidance.tree.items, curExpandState); node.guidance.controller.showTreeData(); //设置底色 setNodesColor(guideSheet, node.guidance.tree.items); //项目指引初始焦点 guideItemInitSel(guideSheet.getActiveRowIndex() ? guideSheet.getActiveRowIndex() : 0); } } //设置项目节点展开收起状态:展开全部、收起定额 //@param {Array}nodes(当前清单下的所有项目指引节点) {Number}expandState(展开全部1或收起定额0). function setNodesExpandState(nodes, expandState) { if(expandState === itemExpandState.contract) { //找出所有定额的父节点 let rations = _.filter(nodes, function (node) { return node.data.type === itemType.ration; }); let rationParentIDs = []; for(let ration of rations){ if(ration.data.ParentID != -1){ rationParentIDs.push(ration.data.ParentID); } } rationParentIDs = Array.from(new Set(rationParentIDs)); let rationParentNodes = _.filter(nodes, function (node) { return rationParentIDs.includes(node.data.ID); }); //收起定额 for(let node of rationParentNodes){ node.setExpanded(false); } } else { for(let node of nodes){ node.setExpanded(true); } } } //根据奇偶层级设置节点底色,奇数层为蓝色(树节点深度为偶数) //@param {Object}sheet {Array}nodes @return {void} function setNodesColor(sheet, nodes) { const color = '#DFE8F9'; renderSheetFunc(sheet, function () { for(let node of nodes){ let style = new GC.Spread.Sheets.Style(); style.borderLeft = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin); style.borderTop = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin); style.borderRight = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin); style.borderBottom = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin); let nDepth = node.depth(); style.backColor = nDepth % 2 == 0 && _isDef(node.data.type) && node.data.type === itemType.job ? color : 'White'; sheet.setStyle(node.serialNo(), -1, style); } }); } //选中的节点是否全是同层节点 //@param {Object}sheet {Array}items @return {Boolean} function itemsSameDepth(sheet, items) { let sels = sheet.getSelections(); if(sels.length === 0 || items.length === 0){ return false; } let depths = []; for(let i = 0; i < sels[0].rowCount; i++){ let row = sels[0].row + i; let node = items[row]; if(node){ depths.push(node.depth()); } } } //节点子项是否全是工作内容 //@param {Object}node @return {Boolean} function allJobChildren(node){ for(let c of node.children){ if(c.data.type === itemType.ration){ return false; } } return true; } //节点子项是否全是定额 //@param {Object}node @return {Boolean} function allRationChildren(node){ for(let c of node.children){ if(c.data.type === itemType.job){ return false; } } return true; } //刷新按钮有效性 //@param {Object}node @return {void} function refreshBtn(node){ if (locked) { return; } //全部设为无效 $('.tools-btn').children().addClass('disabled'); $('#insertRation').addClass('disabled'); $('#insertAll').addClass('disabled'); $('.main-bottom-content').find('textarea').attr('readonly', true); //插入 if(bills.tree.selected && bills.tree.selected.guidance.tree){ $('#insert').removeClass('disabled'); if(node && node.data.type === itemType.ration){ $('#insert').addClass('disabled'); } } //删除 if(node){ $('#del').removeClass('disabled'); } if(node && node.data.type === itemType.job){ //升级 if(node.parent){ $('#upLevel').removeClass('disabled'); if(node.nextSibling && node.children.length > 0 && !allJobChildren(node)){ $('#upLevel').addClass('disabled'); } } //降级 if(node.preSibling){ $('#downLevel').removeClass('disabled'); if(node.preSibling.children.length > 0 && !allJobChildren(node.preSibling)){ $('#downLevel').addClass('disabled'); } } } //上移 if(node && node.preSibling){ $('#upMove').removeClass('disabled') } //下移 if(node && node.nextSibling){ $('#downMove').removeClass('disabled'); } //收起定额、展开全部 $('#expandContract').removeClass('disabled'); //插入定额 if(node && (node.children.length === 0 || allRationChildren(node))){ $('#insertRation').removeClass('disabled'); $('#insertAll').removeClass('disabled'); } //备注,奇数节点可用 if(node && (node.depth() + 1) % 2 === 1 && node.data.type !== itemType.ration){ $('.main-bottom-content').find('textarea').attr('readonly', false); } } //项目指引表焦点控制 //@param {Number}row @return {void} function guideItemInitSel(row){ let billsNode = bills.tree.selected; let node = null; if(billsNode && billsNode.guidance.tree){ node = billsNode.guidance.tree.items[row]; if(node){ billsNode.guidance.tree.selected = node; //显示备注 $('.main-bottom-content').find('textarea').val(node.data.comment ? node.data.comment : ''); } } refreshBtn(node); } //初始化当前库名 //@param {String} @return {void} function initLibName(libName) { $('#libName')[0].outerHTML = $('#libName')[0].outerHTML.replace("XXX清单指引", libName); } //初始化各工作表 //@param {Array}modules @return {void} function initWorkBooks(modules){ for(let module of modules){ buildSheet(module); } } function tipDivCheck(){ setTimeout(function () { let tips = $('#autoTip'); if(ration.tipDiv == 'show'){ return; } else if(ration.tipDiv == 'hide'&&tips){ tips.hide(); ration._toolTipElement = null; } },600) } //获取悬浮提示单元格 //@param {Object}sheet @return {Object} function getTipCellType(sheet) { let setting = {}; let TipCellType = function () {}; TipCellType.prototype = new GC.Spread.Sheets.CellTypes.Text(); TipCellType.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) { return { x: x, y: y, row: context.row, col: context.col, cellStyle: cellStyle, cellRect: cellRect, sheet: context.sheet, sheetArea: context.sheetArea }; }; TipCellType.prototype.processMouseEnter = function (hitinfo) { let text = hitinfo.sheet.getText(hitinfo.row, hitinfo.col); let tag = hitinfo.sheet.getTag(hitinfo.row, hitinfo.col); if(tag !== undefined && tag){ text = tag; } if(sheet && sheet.getParent().qo){ setting.pos = SheetDataHelper.getObjPos(sheet.getParent().qo); } let delayTimes = 500; //延时时间 let now_timeStamp = +new Date(); this.tipTimeStamp = now_timeStamp; let me = this; setTimeout(function () { if(now_timeStamp - me.tipTimeStamp == 0){//鼠标停下的时候才显示 if (setting.pos && text && text !== '') { //固定不显示的div,存储文本获取固定div宽度,toolTipElement由于显示和隐藏,获取宽度不正确 if(!me._fixedTipElement){ let div = $('#fixedTip1')[0]; if (!div) { div = document.createElement("div"); $(div).css("padding", 5) .attr("id", 'fixedTip'); $(div).hide(); document.body.insertBefore(div, null); } me._fixedTipElement = div; } $(me._fixedTipElement).width(''); $(me._fixedTipElement).html(text); if (!me._toolTipElement) { let div = $('#autoTip1')[0]; if (!div) { div = document.createElement("div"); $(div).css("position", "absolute") .css("border", "1px #C0C0C0 solid") .css("box-shadow", "1px 2px 5px rgba(0,0,0,0.4)") .css("font", "0.9rem Calibri") .css("background", "white") .css("padding", 5) .attr("id", 'autoTip1'); $(div).hide(); document.body.insertBefore(div, null); } me._toolTipElement = div; $(me._toolTipElement).width(''); //实时读取位置信息 if(hitinfo.sheet && hitinfo.sheet.getParent().qo){ setting.pos = SheetDataHelper.getObjPos(hitinfo.sheet.getParent().qo); } $(me._toolTipElement).html(text); //定额库定额特殊处理 if($(hitinfo.sheet.getParent().qo).attr('id') === 'rationSpread'){ let divWidth = $(me._fixedTipElement).width(), divHeight = $(me._fixedTipElement).height(); if(divWidth > 600){ divWidth = 590; $(me._toolTipElement).width(divWidth); } let top = setting.pos.y + hitinfo.y - divHeight < 0 ? 0 : setting.pos.y + hitinfo.cellRect.y - divHeight; $(me._toolTipElement).css("top", top).css("left", setting.pos.x - divWidth); } else{ $(me._toolTipElement).css("top", setting.pos.y + hitinfo.y +15).css("left", setting.pos.x + hitinfo.x + 15); } //名称 if(hitinfo.col === 2){ let acStyle = hitinfo.sheet.getActualStyle(hitinfo.row, hitinfo.col), zoom = hitinfo.sheet.zoom(); let value = hitinfo.sheet.getValue(hitinfo.row, hitinfo.col); let textLength = me.getAutoFitWidth(value, text, acStyle, zoom, {sheet: hitinfo.sheet, row: hitinfo.row, col: hitinfo.col, sheetArea: GC.Spread.Sheets.SheetArea.viewport}); let cellWidth = hitinfo.sheet.getCell(-1, hitinfo.col).width(); if(textLength > cellWidth){ $(me._toolTipElement).css("top", setting.pos.y + hitinfo.y +15).css("left", setting.pos.x + hitinfo.x + 15); $(me._toolTipElement).show("fast"); ration.tipDiv = 'show';//做个标记 } } else { $(me._toolTipElement).show("fast"); ration.tipDiv = 'show';//做个标记 } } } } },delayTimes); }; TipCellType.prototype.processMouseLeave = function (hininfo) { this.tipTimeStamp = +new Date(); ration.tipDiv = 'hide'; if (this._toolTipElement) { $(this._toolTipElement).hide(); this._toolTipElement = null; } tipDivCheck();//延时检查:当tips正在show的时候,就调用了hide方法,会导致tips一直存在,所以设置一个超时处理 } return new TipCellType(); } //输出表数据(定额表) //@param {Object}sheet {Array}headers {Array}datas @return {void} function showData(sheet, headers, datas){ let fuc = function () { sheet.setRowCount(datas.length); //复选框 let checkBoxType = new GC.Spread.Sheets.CellTypes.CheckBox(); let tipCellType = getTipCellType(sheet); sheet.setCellType(-1, 0, checkBoxType); for(let col = 0, cLen = headers.length; col < cLen; col++){ for(let row = 0, rLen = datas.length; row < rLen; row++){ sheet.setValue(row, col, datas[row][headers[col]['dataCode']]); if(col === 1){ sheet.setTag(row, col, datas[row]['hint']); } } } sheet.setCellType(-1, 1, tipCellType); sheet.setCellType(-1, 2, tipCellType); }; renderSheetFunc(sheet, fuc); } //根据定额章节树ID获取定额(从数据缓存中获取,定额数据一开始一次性拉取) //@param {Number}sectionId {Array}rations @return {Array} function getRationsBySectionId(sectionId, rations) { if(!sectionId || !rations){ return []; } return _.filter(rations, {sectionId}); } //定额章节树焦点控制 //@param {Number}row @return {void} function sectionInitSel(row) { let rationSheet = ration.workBook.getActiveSheet(); let sectionNode = section.tree ? section.tree.items[row] : null; if(sectionNode && sectionNode.children.length === 0){ let sectionRations = getRationsBySectionId(sectionNode.data.ID, ration.datas); ration.cache = sectionRations; showData(rationSheet, ration.headers, sectionRations); } else { cleanData(rationSheet, ration.headers, 0); } } //初始化定额条目 //@param {Number}rationLibId @return {void} function initRationItems(rationLibId){ $.bootstrapLoading.start(); //获取定额章节树 let sectionSheet = section.workBook.getActiveSheet(); CommonAjax.post('/rationRepository/api/getRationTree', {rationLibId: rationLibId}, function (sectionDatas) { //获取所有定额数据 let reqEntity = {rationLibId: rationLibId, showHint: true, returnFields: '-_id code ID sectionId name unit basePrice rationGljList jobContent annotation'}; CommonAjax.post('/rationRepository/api/getRationItemsByLib', reqEntity, function (rstData) { section.cache = sectionDatas; initTree(section, section.workBook.getActiveSheet(), section.treeSetting, sectionDatas); //初始焦点在第一行(切换库) sectionSheet.setActiveCell(0, 0); rstData.sort(function (a, b) { let rst = 0; if(a.code > b.code){ rst = 1; } else if(a.code < b.code){ rst = -1; } return rst; }); ration.datas = rstData; sectionInitSel(0); $.bootstrapLoading.end(); }, function () { $.bootstrapLoading.end(); }); }, function () { $.bootstrapLoading.end(); }); } //初始化定额库选择 //@param {String}compilationId @return {void} function initRationLibs(compilationId){ CommonAjax.post('/rationRepository/api/getRationLibsByCompilation', {compilationId: compilationId}, function (rstData) { $('#rationLibSel').empty(); for(let rationLib of rstData){ let opt = ``; $('#rationLibSel').append(opt); } //初始选择 initRationItems(parseInt($('#rationLibSel').select().val())); $('#rationLibSel').change(function () { let rationLibId = parseInt($(this).select().val()); initRationItems(rationLibId); }) }); } //清单设置悬浮提示信息 //@param {Array}billsNodes(清单节点) {Array}jobs(总的工作内容数据) {Array}items(总的项目特征数据) function setBillsHint(billsNodes, jobs, items) { let jobsMapping = {}, itemsMapping = {}; for(let job of jobs){ jobsMapping[job.id] = job; } for(let item of items){ itemsMapping[item.id] = item; } let tagInfo = []; for(let billsNode of billsNodes){ let hintArr = []; let billsItems = billsNode.data.items; if(billsItems.length > 0){ //项目特征 hintArr.push('项目特征:'); } let itemCount = 1, jobCount = 1; for(let billsItem of billsItems){ let itemData = itemsMapping[billsItem.id]; if(itemData){ //特征值 let eigens = []; for(let eigen of itemData.itemValue){ eigens.push(eigen.value); } eigens = eigens.join(';'); hintArr.push(`${itemCount}.${itemData.content}${eigens === '' ? '' : ': ' + eigens}`); itemCount ++; } } //工作内容 let billsJobs = billsNode.data.jobs; if(billsJobs.length > 0){ hintArr.push('工作内容:'); } for(let billsJob of billsJobs){ let jobData = jobsMapping[billsJob.id]; if(jobData){ hintArr.push(`${jobCount}.${jobData.content}`); jobCount ++; } } /*if(billsNode.data.ruleText && billsNode.data.ruleText !== ''){ hintArr.push('工程量计算规则:'); hintArr.push(billsNode.data.ruleText); } if(billsNode.data.recharge && billsNode.data.recharge !== ''){ hintArr.push('补注:'); hintArr.push(billsNode.data.recharge); }*/ if(hintArr.length > 0){ tagInfo.push({row: billsNode.serialNo(), value: hintArr.join('\n')}); } } let sheet = bills.workBook.getActiveSheet(); renderSheetFunc(sheet, function () { for(let tagI of tagInfo){ sheet.setTag(tagI.row, 0, tagI.value); } }); } //初始化清单的工作内容和项目特征 //@param {Number}billsLibId {Function}callback @return {void} function initJobAndCharacter(billsLibId, callback){ CommonAjax.post('/stdBillsEditor/getJobContent', {billsLibId: billsLibId}, function (datas) { stdBillsJobData = datas; CommonAjax.post('/stdBillsEditor/getItemCharacter', {billsLibId: billsLibId}, function (datas) { stdBillsFeatureData = datas; if(callback){ callback(); } }); }); } let billsLibId = 0; //获取指引库信息及关联的清单 //@param {Number}libID {Function}callback @return {Object} function getLibWithBills(libID, callback){ CommonAjax.post('/billsGuidance/api/getLibWithBills', {libID: libID}, function (rstData) { billsLibId = rstData.guidanceLib.billsLibId; initRationLibs(rstData.guidanceLib.compilationId); bills.cache = rstData.bills; initLibName(rstData.guidanceLib.name); /*initTree(bills, bills.workBook.getActiveSheet(), bills.treeSetting, bills.cache); //每一棵项目指引树挂在清单节点上 for(let node of bills.tree.items){ node.guidance = {tree: null, controller: null}; } //默认初始节点 billsInitSel(0); if(callback){ callback(rstData); }*/ let initDataCallback = function () { initTree(bills, bills.workBook.getActiveSheet(), bills.treeSetting, bills.cache); //每一棵项目指引树挂在清单节点上 for(let node of bills.tree.items){ node.guidance = {tree: null, controller: null}; } //默认初始节点 billsInitSel(0); if(callback){ callback(rstData); } }; initJobAndCharacter(rstData.guidanceLib.billsLibId, initDataCallback); }, function (msg) { window.location.href = '/billsGuidance/main'; }); } //初始化并输出树 //@param {Object}module {Object}sheet {Object}treeSetting {Array}datas function initTree(module, sheet, treeSetting, datas){ module.tree = idTree.createNew({id: 'ID', pid: 'ParentID', nid: 'NextSiblingID', rootId: -1, autoUpdate: true}); module.controller = TREE_SHEET_CONTROLLER.createNew(module.tree, sheet, treeSetting); module.tree.loadDatas(datas); module.controller.showTreeData(); if(module === bills){ setBillsHint(bills.tree.items, stdBillsJobData, stdBillsFeatureData); } } //更新清单备注 function updateBillsComment(updateData, callback) { CommonAjax.post('/stdBillsEditor/updateBills', updateData, function () { if (callback) { callback(); } }); } //更新项目指引 //@param {Array}updateDatas {Function}callback @return {void} function updateGuideItems(updateDatas, callback){ CommonAjax.post('/billsGuidance/api/updateItems', {updateDatas: updateDatas}, function (rstData) { if(callback){ callback(rstData); } }); } //编辑后自动去除换行符回车符 const deESC = /[\n]/g; //项目指引编辑 //@param {Object}sheet {Array}cells function edit(sheet, cells){ let updateDatas = []; //同步节点数据 let syncDatas = []; for(let cell of cells){ let text = sheet.getValue(cell.row, cell.col); text = text ? text.toString() : ''; text = text.replace(deESC, ''); sheet.setValue(cell.row, cell.col, text); let node = bills.tree.selected.guidance.tree.items[cell.row]; if(node.data.name != text){ syncDatas.push({node: node, text: text}); updateDatas.push({updateType: updateType.update, findData: {ID: node.getID()}, updateData: {name: text}}); } } if(updateDatas.length > 0){ updateGuideItems(updateDatas, function () { for(let syncData of syncDatas){ syncData.node.data.name = syncData.text; } }, function () { //失败恢复 renderSheetFunc(sheet, function () { for(let syncData of syncDatas){ sheet.setValue(syncData.node.serialNo(), 0, syncData.node.data.name ? syncData.node.data.name : ''); } }); }); } } //项目指引插入,支持一次插入多条数据 //@param {Array}datas {Boolean}tobeChild(插入成为子项) {Function}callback @return {void} function insert(datas, tobeChild, callback = null){ $.bootstrapLoading.start(); let sheet = guideItem.workBook.getActiveSheet(); let controller = bills.tree.selected.guidance.controller; let selected = bills.tree.selected.guidance.tree.selected; let updateDatas = []; //建立数组下标索引 let newDataIndex = {}; for(let i = 0; i < datas.length; i++){ let newNodeData = { libID: libID, ID: uuid.v1(), ParentID: selected ? selected.getParentID() : -1, NextSiblingID: selected ? selected.getNextSiblingID() : -1, billsID: bills.tree.selected.getID() }; //定额类型插入当前工作内容焦点行, if(selected && ((selected.data.type === itemType.job && datas[i].type === itemType.ration) || tobeChild)){ newNodeData.ParentID = selected.getID(); newNodeData.NextSiblingID = -1; } Object.assign(newNodeData, datas[i]); newDataIndex[i] = newNodeData; } for(let i = 0; i < datas.length; i++){ //第一个节点 if(i === 0){ //非插入成子节点,更新选中节点NestSiblingID if(selected && !((selected.data.type === itemType.job && datas[i].type === itemType.ration) || tobeChild)){ updateDatas.push({updateType: updateType.update, findData: {ID: selected.getID()}, updateData: {NextSiblingID: newDataIndex[i].ID}}); } } //非最后一个节点 if(i !== datas.length - 1){ newDataIndex[i].NextSiblingID = newDataIndex[i + 1].ID; } updateDatas.push({updateType: updateType.create, updateData: newDataIndex[i]}); } updateGuideItems(updateDatas, function () { for(let updateData of updateDatas){ if(updateData.updateType === updateType.create){ let newNode = controller.insertByIDS(updateData.updateData.ID, updateData.updateData.ParentID, updateData.updateData.NextSiblingID); //同步data Object.assign(newNode.data, updateData.updateData); sheet.setValue(newNode.serialNo(), 0, newNode.data.name); refreshBtn(newNode); } } if(callback){ callback(); } setNodesColor(sheet, bills.tree.selected.guidance.tree.items); guideItem.workBook.focus(true); $.bootstrapLoading.end(); }); } // 删除定额(嵌套删除自身及后代定额) function delRations() { const selected = bills.tree.selected.guidance.tree.selected; if (!selected) { return; } if (selected.data.type === itemType.ration) { del({ row: selected.serialNo(), col: 0, rowCount: 1, colCount: 1 }); return; } const rations = selected.getPosterity().filter(item => item.data.type === itemType.ration); if (!rations.length) { return; } const updateDatas = rations.map(item => ({ updateType: updateType.del, findData: { ID: item.data.ID } })); const rationIDs = rations.map(r => r.data.ID); $.bootstrapLoading.start(); updateGuideItems(updateDatas, function () { const guideSheet = guideItem.workBook.getSheet(0); const treeNodes = bills.tree.selected.guidance.tree.items.filter(item => !rationIDs.includes(item.data.ID)); const state = bills.tree.selected.guidance.tree.getExpState(treeNodes); const treeData = treeNodes.map(item => item.data); initTree(bills.tree.selected.guidance, guideSheet, guideItem.treeSetting, treeData); bills.tree.selected.guidance.tree.setExpandedByState(bills.tree.selected.guidance.tree.items, state); renderSheetFunc(guideSheet, function () { TREE_SHEET_HELPER.refreshNodesVisible(bills.tree.selected.guidance.tree.roots, guideSheet, true); }); //设置底色 setNodesColor(guideSheet, bills.tree.selected.guidance.tree.items); //项目指引初始焦点 guideItemInitSel(guideSheet.getActiveRowIndex() ? guideSheet.getActiveRowIndex() : 0); $.bootstrapLoading.end(); guideItem.workBook.focus(true) }); } //项目指引删除操作 //@return {void} function del(selArea = null){ $.bootstrapLoading.start(); let controller = bills.tree.selected.guidance.controller; let selNodes = []; let sheet = guideItem.workBook.getSheet(0); let sel = selArea ? selArea : sheet.getSelections()[0]; if(sel){ sel.row = sel.row === -1 ? 0 : sel.row; for(let i = 0; i < sel.rowCount; i++){ if(bills.tree.selected.guidance.tree.items[sel.row + i]){ selNodes.push(bills.tree.selected.guidance.tree.items[sel.row + i]); } } } //选中的块节点 let blockNodes = getBlockNodes(selNodes); let updateDatas = []; function getDelDatas(nodes){ for (let node of nodes) { updateDatas.push({updateType: updateType.del, findData: {ID: node.getID()}}); if (node.children.length > 0) { getDelDatas(node.children); } } } getDelDatas(blockNodes); //更新相关的前节点 for (let node of blockNodes) { if (node.preSibling && !blockNodes.includes(node.preSibling)) { let next = node; while (next.nextSibling && blockNodes.includes(next.nextSibling)) { next = next.nextSibling; } updateDatas.push({updateType: updateType.update, findData: {ID: node.preSibling.getID()}, updateData: {NextSiblingID: next.getNextSiblingID()}}); } } updateGuideItems(updateDatas, function () { console.log(blockNodes); controller.m_delete(blockNodes); guideItemInitSel(sheet.getActiveRowIndex()); refreshBtn(bills.tree.selected.guidance.tree.selected); setNodesColor(guideItem.workBook.getActiveSheet(), bills.tree.selected.guidance.tree.items); $.bootstrapLoading.end(); guideItem.workBook.focus(true) }); } //项目指引升级 //@return {void} function upLevel(){ $.bootstrapLoading.start(); let controller = bills.tree.selected.guidance.controller; let selected = bills.tree.selected.guidance.tree.selected; let updateDatas = []; //更新父节点 updateDatas.push({updateType: updateType.update, findData: {ID: selected.getParentID()}, updateData: {NextSiblingID: selected.getID()}}); //更新选中节点 updateDatas.push({updateType: updateType.update, findData: {ID: selected.getID()}, updateData: {ParentID: selected.parent.getParentID(), NextSiblingID: selected.parent.getNextSiblingID()}}); if(selected.nextSibling && selected.children.length > 0){ //更新选中节点最末子节点 let lastChild = selected.children[selected.children.length - 1]; updateDatas.push({updateType: updateType.update, findData: {ID: lastChild.getID()}, updateData: {NextSiblingID: -1}}); } //选中节点的所有后兄弟节点成为选中节点的子项 let selectedNextIDs = []; let sNext = selected.nextSibling; while(sNext){ selectedNextIDs.push(sNext.getID()); sNext = sNext.nextSibling; } for(let sID of selectedNextIDs){ updateDatas.push({updateType: updateType.update, findData: {ID: sID}, updateData: {ParentID: selected.getID()}}); } updateGuideItems(updateDatas, function () { controller.upLevel(); refreshBtn(bills.tree.selected.guidance.tree.selected); setNodesColor(guideItem.workBook.getActiveSheet(), bills.tree.selected.guidance.tree.items); $.bootstrapLoading.end(); guideItem.workBook.focus(true)//31574 }); } //项目指引降级 //@return {void} function downLevel(){ $.bootstrapLoading.start(); let controller = bills.tree.selected.guidance.controller; let selected = bills.tree.selected.guidance.tree.selected; let updateDatas = []; //更新前兄弟节点 updateDatas.push({updateType: updateType.update, findData: {ID: selected.preSibling.getID()}, updateData: {NextSiblingID: selected.getNextSiblingID()}}); //更新前兄弟节点最末子节点 if(selected.preSibling.children.length > 0){ let lastChild = selected.preSibling.children[selected.preSibling.children.length - 1]; updateDatas.push({updateType: updateType.update, findData: {ID: lastChild.getID()}, updateData: {NextSiblingID: selected.getID()}}); } //更新选中节点 updateDatas.push({updateType: updateType.update, findData: {ID: selected.getID()}, updateData: {ParentID: selected.preSibling.getID(), NextSiblingID: -1}}); updateGuideItems(updateDatas, function () { controller.downLevel(); refreshBtn(bills.tree.selected.guidance.tree.selected); setNodesColor(guideItem.workBook.getActiveSheet(), bills.tree.selected.guidance.tree.items); $.bootstrapLoading.end(); guideItem.workBook.focus(true) }); } //项目指引上移 //@return {void} function upMove(){ $.bootstrapLoading.start(); let controller = bills.tree.selected.guidance.controller; let selected = bills.tree.selected.guidance.tree.selected; let updateDatas = []; //更新前节点 updateDatas.push({updateType: updateType.update, findData: {ID: selected.preSibling.getID()}, updateData: {NextSiblingID: selected.getNextSiblingID()}}); //更新前前节点 if(selected.preSibling.preSibling){ updateDatas.push({updateType: updateType.update, findData: {ID: selected.preSibling.preSibling.getID()}, updateData: {NextSiblingID: selected.getID()}}); } //更新选中节点 updateDatas.push({updateType: updateType.update, findData: {ID: selected.getID()}, updateData: {NextSiblingID: selected.preSibling.getID()}}); updateGuideItems(updateDatas, function () { controller.upMove(); refreshBtn(bills.tree.selected.guidance.tree.selected); setNodesColor(guideItem.workBook.getActiveSheet(), bills.tree.selected.guidance.tree.items); $.bootstrapLoading.end(); guideItem.workBook.focus(true) }); } //项目指引下移 //@return {void} function downMove(){ $.bootstrapLoading.start(); let controller = bills.tree.selected.guidance.controller; let selected = bills.tree.selected.guidance.tree.selected; let updateDatas = []; //更新下节点 updateDatas.push({updateType: updateType.update, findData: {ID: selected.getNextSiblingID()}, updateData: {NextSiblingID: selected.getID()}}); //更新前节点 if(selected.preSibling){ updateDatas.push({updateType: updateType.update, findData: {ID: selected.preSibling.getID()}, updateData: {NextSiblingID: selected.getNextSiblingID()}}); } //更新选中节点 updateDatas.push({updateType: updateType.update, findData: {ID: selected.getID()}, updateData: {NextSiblingID: selected.nextSibling.getNextSiblingID()}}); updateGuideItems(updateDatas, function () { controller.downMove(); refreshBtn(bills.tree.selected.guidance.tree.selected); setNodesColor(guideItem.workBook.getActiveSheet(), bills.tree.selected.guidance.tree.items); $.bootstrapLoading.end(); guideItem.workBook.focus(true) }); } //获取定额类型的项目指引名称,通过定额转换 //@param {Object}ration @return {String} function getRationItemName(ration){ let arr = []; arr.push(ration.code ? ration.code : ''); arr.push(ration.name ? ration.name : ''); arr.push(ration.basePrice ? ration.basePrice : ''); let rst = arr.join(' '); rst += `/${ration.unit ? ration.unit : ''}`; return rst; } //获取选中的定额表行 //@return {Array} function getCheckedRationRows(all){ let rst = []; let sheet = ration.workBook.getActiveSheet(); for(let i = 0; i < sheet.getRowCount(); i++){ // 全选 if (all) { rst.push(i); continue; } let checked = sheet.getValue(i, 0); if(checked){ rst.push(i); } } return rst; } //清空选中定额表行 //@param {Array}rows @return {void} function clearCheckedRation(rows) { let sheet = ration.workBook.getActiveSheet(); renderSheetFunc(sheet, function () { for(let row of rows){ sheet.setValue(row, 0, 0); } }); } //获取要插入的定额数据 //@param {Array}rows @return {Array} function getInsertRations(rows){ let rst = []; //当前已存在定额 let curRationIems = []; let selected = bills.tree.selected.guidance.tree.selected; if(selected){ if(selected.data.type === itemType.job){ curRationIems = selected.children; } else { curRationIems = selected.parent ? selected.parent.children : selected.tree.roots; } } for(let row of rows){ let selRation = ration.cache[row]; if(selRation){ //添加的定额是否已存在,不重复添加 let isExist = false; for(let curRation of curRationIems){ if(curRation.data.rationID == selRation.ID){ isExist = true; break; } } if(!isExist){ rst.push({type: itemType.ration, name: getRationItemName(selRation), rationID: selRation.ID}); } } } return rst; } //获取块节点父项不存在于选中节点中的节点 //@param {Array}nodes(选中的节点) @return {Array} function getBlockNodes(nodes) { let nodeMapping = {}; for(let node of nodes){ nodeMapping[node.data.ID] = node; } //块节点,父项不存在于选中节点中的节点 let blockNodes = []; for(let node of nodes){ if(!nodeMapping[node.data.ParentID]){ blockNodes.push(node); } } return blockNodes; } //允许复制整块,如果有多个块节点,且块节点的父项不同,则不可复制 //@param {Array}nodes(块节点) @return {Boolean} function canCopyBlock(nodes) { if(!nodes || nodes.length === 0){ return false; } let pID = nodes[0].data.ParentID; for(let node of nodes){ if(node.data.ParentID !== pID){ return false; } } return true; } //允许粘贴整块 有粘贴数据,节点存在,如果粘贴到的节点为定额数据,粘贴数据为全定额数据 //@param {Object}node(粘贴到的节点) function canPasteBlock(node) { let pasteDatas = JSON.parse(getLocalCache(itemCopyBlockKey)); if(!pasteDatas || pasteDatas.length === 0){ return false; } if(!node){ return false; } //若粘贴到定额节点,则数据须全为定额 if(node.data.type === itemType.ration){ for(let data of pasteDatas){ if(data.type !== itemType.ration){ return false; } } } //若粘贴到非定额节点,则粘贴的顶层数据须全为非定额 else { let topDatas = _.filter(pasteDatas, {ParentID: -1}); for(let topData of topDatas){ if(topData.type === itemType.ration){ return false; } } } return true; } //复制整块,将块节点下所有节点数据复制一份,并且重新生成ID、ParentID、NextSiblingID,使用localStorage存储 //@param {Array}nodes(块节点) @return {void} function copyBlocks(nodes) { nodes = _.cloneDeep(nodes); //将块节点的ParentID暂时设置为-1 for(let topNode of nodes){ topNode.data.ParentID = -1; } let copyDatas = []; let copyNodes = []; //获取块节点包含的所有节点(包括自己) function containNodes(nodes) { for(let node of nodes){ copyNodes.push(node); if(node.children.length > 0){ containNodes(node.children); } } } containNodes(nodes); for(let node of copyNodes){ copyDatas.push(node.data); } console.log(`copyDatas`); console.log(copyDatas); setLocalCache(itemCopyBlockKey, JSON.stringify(copyDatas)); } //粘贴整块,整块数据粘贴到相关节点,并成为其后项 //@param {Object}node(粘贴到的节点) @return {void} function pasteBlock(node) { let itemObj = bills.tree.selected.guidance; let pasteDatas = JSON.parse(getLocalCache(itemCopyBlockKey)); //整理ID let IDMapping = {}; for(let data of pasteDatas){ data.newID = uuid.v1(); IDMapping[data.ID] = data; } for(let data of pasteDatas){ let nextData = IDMapping[data.NextSiblingID]; data.NextSiblingID = nextData ? nextData.newID : -1; let parentData = IDMapping[data.ParentID]; data.ParentID = parentData ? parentData.newID : -1; } for(let data of pasteDatas){ data.ID = data.newID; delete data.newID; } let updateDatas = []; //将最顶层的块数据的ParentID设置成粘贴到节点的ParentID,并设置新的billsID let topDatas = _.filter(pasteDatas, {ParentID: -1}); for(let topData of topDatas){ topData.ParentID = node.getParentID(); } //更新数据 //更新插入的最末顶层数据NextSiblingID if(node.nextSibling){ topDatas[topDatas.length - 1].NextSiblingID = node.getNextSiblingID(); } //新建节点 for(let data of pasteDatas){ data.libID = libID; data.billsID = node.data.billsID; delete data._id; updateDatas.push({updateType: updateType.create, updateData: data}); } console.log(`pasteDatas`); console.log(pasteDatas); //更新粘贴到的节点的NextSiblingID updateDatas.push({updateType: updateType.update, findData: {ID: node.data.ID}, updateData: {NextSiblingID: topDatas[0].ID}}) $.bootstrapLoading.start(); updateGuideItems(updateDatas, function (rstData) { $.bootstrapLoading.end(); node.data.NextSiblingID = topDatas[0].ID; let newNodes = itemObj.tree.insertDatasTo(node.data, pasteDatas); cleanData(guideItem.workBook.getActiveSheet(), guideItem.headers, -1); itemObj.controller.showTreeData(); setNodesColor(guideItem.workBook.getActiveSheet(), bills.tree.selected.guidance.tree.items); }, function () { $.bootstrapLoading.end(); }); } //初始化右键菜单 //@return {void} function initContextMenu() { $.contextMenu({ selector: '#guideItemSpread', build: function($triggerElement, e){ //控制允许右键菜单在哪个位置出现 let sheet = guideItem.workBook.getSheet(0); let offset = $("#guideItemSpread").offset(), x = e.pageX - offset.left, y = e.pageY - offset.top; let target = sheet.hitTest(x, y); if(target.hitTestType === 3 && typeof target.row !== 'undefined' && typeof target.col !== 'undefined'){//在表格内 let sel = sheet.getSelections()[0]; if(sel && sel.rowCount === 1){ sheet.setActiveCell(target.row, target.col); } sel = sheet.getSelections()[0]; let selNodes = []; if(sel){ sel.row = sel.row === -1 ? 0 : sel.row; for(let i = 0; i < sel.rowCount; i++){ if(bills.tree.selected.guidance.tree.items[sel.row + i]){ selNodes.push(bills.tree.selected.guidance.tree.items[sel.row + i]); } } } //块节点 let blockNodes = getBlockNodes(selNodes); //右键在多选内则不重设焦点 if(!sel || sel.rowCount === 1 || !(target.row >= sel.row && target.row <= sel.row + sel.rowCount - 1)){ sheet.setActiveCell(target.row, target.col); } guideItemInitSel(target.row); return { callback: function(){}, items: { "copy": { name: "复制整块", disabled: function () { return locked || !canCopyBlock(blockNodes); }, icon: "fa-copy", callback: function (key, opt) { copyBlocks(blockNodes); }}, "paste": { name: "粘贴整块", disabled: function () { let pasteNode = bills.tree.selected.guidance.tree.items[target.row]; return locked || !canPasteBlock(pasteNode); }, icon: "fa-paste", callback: function (key, opt) { let pasteNode = bills.tree.selected.guidance.tree.items[target.row]; pasteBlock(pasteNode); }}, "delRations": { name: '删除定额', disabled: function () { let node = bills.tree.selected.guidance.tree.items[target.row]; return locked || !node }, icon: "fa-remove", callback: function (key, opt) { $('#delRationAlert').modal('show'); } }, "del": { name: '删除', disabled: function () { let node = bills.tree.selected.guidance.tree.items[target.row]; return locked || !node }, icon: "fa-remove", callback: function (key, opt) { $('#delAlert').modal('show'); } }, "insertSibling": { name: '插入行', disabled: function () { let node = bills.tree.selected.guidance.tree.items[target.row]; return locked || !node || node.data.type !== itemType.job; }, icon: "fa-arrow-left", callback: function (key, opt) { insert([{type: itemType.job, name: ''}], false); } }, "insertChild": { name: '插入子项', disabled: function () { let node = bills.tree.selected.guidance.tree.items[target.row]; return locked || !node || node.data.type !== itemType.job || !allJobChildren(node); }, icon: 'fa-arrow-left', callback: function (key, opt) { insert([{type: itemType.job, name: ''}], true); } } } }; } else{ return false; } } }); } //初始化个按钮点击 //@return {void} function initBtn(){ $('#insert').click(function () { insert([{type: itemType.job, name: ''}], false); }); $('#delConfirm').click(function () { del(); $('#delAlert').modal('hide'); }); $('#delRationConfirm').click(function () { delRations(); $('#delRationAlert').modal('hide'); }); $('#del').click(function () { $('#delAlert').modal('show'); }); $('#upLevel').click(function () { upLevel(); }); $('#downLevel').click(function () { downLevel(); }); $('#upMove').click(function () { upMove(); }); $('#downMove').click(function () { downMove(); }); //收起定额、展开全部 $('#expandContract').click(function () { //目前状态时展开全部节点状态,点击则收起定额 let tree = bills.tree.selected.guidance.tree, itemSheet = guideItem.workBook.getActiveSheet(); if(curExpandState === itemExpandState.expand){ curExpandState = itemExpandState.contract; $(this).html(' 展开全部'); setNodesExpandState(tree.items, itemExpandState.contract); } else { curExpandState = itemExpandState.expand; $(this).html(' 收起定额'); setNodesExpandState(tree.items, itemExpandState.expand); } renderSheetFunc(itemSheet, function () { TREE_SHEET_HELPER.refreshNodesVisible(tree.roots, itemSheet, true); }); }); // 插入选中定额 $('#insertRation').click(function () { let checkedRows = getCheckedRationRows(); let insertDatas = getInsertRations(checkedRows); if(insertDatas.length > 0){ insert(insertDatas, false, function () { //清空选择 clearCheckedRation(checkedRows); }); } else { clearCheckedRation(checkedRows); } }); // 插入全部定额 $('#insertAll').click(function () { let isAll = true; let checkedRows = getCheckedRationRows(isAll); let insertDatas = getInsertRations(checkedRows); if(insertDatas.length > 0){ insert(insertDatas, false); } }); //搜索定额 $('#searchBtn').click(function () { let searchStr = $('#searchText').val(); if(!searchStr || searchStr === ''){ ration.cache = ration.datas; } else{ let reg = new RegExp(searchStr, 'i'); ration.cache = _.filter(ration.datas, function (data) { return reg.test(data.code) || reg.test(data.name); }); } $('.top-content').hide(); $('#searchCount').text(`搜索结果: ${ration.cache.length}`); $('#rationSearchResult').show(); autoFlashHeight(); ration.workBook.refresh(); let rationSheet = ration.workBook.getActiveSheet(); renderSheetFunc(rationSheet, function () { clearCheckedRation(getCheckedRationRows()); showData(rationSheet, ration.headers, ration.cache); }) }); //关闭搜索 $('#rationSearchResult a').click(function () { $('.top-content').show(); $('#rationSearchResult').hide(); autoFlashHeight(); renderSheetFunc(ration.workBook.getActiveSheet(), function () { clearCheckedRation(getCheckedRationRows()); }); section.workBook.refresh(); ration.workBook.refresh(); $('#searchText').val(''); //恢复章节树下的定额 sectionInitSel(section.workBook.getActiveSheet().getActiveRowIndex()); }); let keyupTime = 0, delayTime = 500; function delayKeyup(callback) { let nowTime = Date.now(); keyupTime = nowTime; setTimeout(function () { if (nowTime - keyupTime == 0) { callback(); } }, delayTime); } //执行搜索 $('#searchText').keyup(function (e) { delayKeyup(function () { $('#searchBtn').click(); }); }); //编辑清单备注 $('.main-side-bottom').find('textarea').keyup(function () { let me = this; let node = bills.tree.selected; let comment = $(me).val(); delayKeyup(function () { if (node) { let updateData = {lastOperator: userAccount, billsLibId: billsLibId, updateId: node.getID(), field: 'comment', data: comment}; updateBillsComment(updateData, function () { node.data.comment = comment; }) } }); }); //编辑选项备注 $('.main-bottom-content').find('textarea').keyup(function () { let me = this; let node = bills.tree.selected.guidance.tree.selected; let comment = $(me).val(); delayKeyup(function () { if(node){ let updateDatas = [{updateType: updateType.update, findData: {ID: node.getID()}, updateData: {comment: comment}}]; updateGuideItems(updateDatas, function (rstData) { node.data.comment = comment; }); } }); }); //定额高度拖动调整 let heightEleObj = { module: moduleName, resize: $('#deResize'), top: $('#topContent'), topSpread: $('#sectionSpread'), bottom: $('#bottomContent'), bottomSpread: $('#rationSpread') }, heightLimit = { min: 150, max: `$(window).height()-$('.header').height()-$('.sidebar-tools-bar').height()-150-10`, notTopSpread: 0, notBottomSpread: 0, }; SlideResize.verticalSlide(heightEleObj, heightLimit, function () { if(section.workBook){ section.workBook.refresh(); } if(ration.workBook){ ration.workBook.refresh(); } }); /*slideResize(rationLibResizeEles, {min: 147, max: 680}, 'height', function() { //autoFlashHeight(); if(section.workBook){ section.workBook.refresh(); } if(ration.workBook){ ration.workBook.refresh(); } });*/ //左右拖动 //清单表与项目指引表 let leftElesObj = {}; leftElesObj.module = moduleName; leftElesObj.resize = $('#slideResizeLeft'); leftElesObj.parent = $('#dataRow'); leftElesObj.left = $('#leftContent'); leftElesObj.right = $('#midContent'); SlideResize.horizontalSlide(leftElesObj, {min: 200, max: `$('#dataRow').width() - $('#rightContent').width() - 200`}, function () { refreshALlWorkBook(); }); //人材机表与人材机组成物表 let rightElesObj = {}; rightElesObj.module = moduleName; rightElesObj.resize = $('#slideResizeRight'); rightElesObj.parent = $('#dataRow'); rightElesObj.left = $('#midContent'); rightElesObj.right = $('#rightContent'); SlideResize.horizontalSlide(rightElesObj, {min: 200, max: `$('#dataRow').width() - $('#leftContent').width() - 200`}, function () { refreshALlWorkBook(); }); } //刷新全部工作簿 //@return {void} function refreshALlWorkBook() { if (bills.workBook) { bills.workBook.refresh(); } if (guideItem.workBook) { guideItem.workBook.refresh(); } if (section.workBook) { section.workBook.refresh(); } if (ration.workBook) { ration.workBook.refresh(); } $('.main-side-bottom').find('textarea').height($('.main-side-bottom').height() - 20); $('.main-side-bottom').find('textarea').width($('.main-side-bottom').width() - 25); $('.main-bottom-content').find('textarea').height($('.main-bottom-content').height() - 20); $('.main-bottom-content').find('textarea').width($('.main-bottom-content').width() - 25); } //读取拖动相关 //@return {void} function initSlideSize() { //定额表上下 let heightEleObj = { module: moduleName, top: $('#topContent'), topSpread: $('#sectionSpread'), bottom: $('#bottomContent'), bottomSpread: $('#rationSpread') }; SlideResize.loadVerticalHeight(heightEleObj.module, heightEleObj, {totalHeight: `$(window).height()-$('.header').height()-$('.sidebar-tools-bar').height()-10`, notTopSpread: 0, notBottomSpread: 0}, function () { if(section.workBook){ section.workBook.refresh(); } if(ration.workBook){ ration.workBook.refresh(); } }); //水平 SlideResize.loadHorizonWidth(moduleName, [$('#slideResizeLeft'), $('#slideResizeRight')], [$('#leftContent'), $('#midContent'), $('#rightContent')], function () { refreshALlWorkBook(); }); } //初始化视图 //@param {void} @return {void} function initViews(){ let modules = [bills, guideItem, section, ration]; initWorkBooks(modules); lockUtil.lockTools($(document.body), locked); getLibWithBills(libID); initBtn(); initContextMenu(); initSlideSize(); } return {initViews, initSlideSize}; })(); $(document).ready(function () { billsGuidance.initViews(); });