/** * 项目管理相关js * * @author CaiAoLin * @date 2017/8/22 * @version */ let Tree = null; // let movetoZTree = null; let copytoZTree = null; let engineering = []; let feeRateData = []; let isSaving = false; let projectProperty = []; let fileDelObj = null; let projectType = { folder: "Folder", tender: "Tender", project: "Project", engineering: "Engineering", }; let fileType = { unitPriceFile: "UnitPriceFile", feeRateFile: "FeeRateFile", }; let taxTypeMap = { 1: "一般计税", 2: "简易计税", }; /* * 地区,同一费用定额下不同地区有不同单价,则新建单位工程时需要选择地区项 * 地区项为空的时候,前端不显示该下拉项,地区的赋值覆盖在over_write相关文件中 * */ let regions = []; const { ValuationType: { SUGGESTION, FEASIBILITY, ROUGH, BUDGET, BILL_BUDGET, BOQ, ESTIMATION, }, ValuationText, BOQType: { BID_INVITATION, BID_SUBMISSION }, } = window.commonConstants; const { similarEqual, isDef } = window.commonUtil; function isStopCreate() { if (userMobile === '15919278500') { return false; } const names = ['重庆养护(2018)', '内蒙古养护(2019)', '甘肃养护(2021)', '内蒙古高速公路养护(2022)', '内蒙古高速公路养护(2022)']; return !!(compilationData && names.includes(compilationData.name)); } function isGlYunStopCreate() { let rst = false; const isGlYun = $('title').text().indexOf("纵横公路云造价") !== -1; if (isFree && isGlYun) { rst = true; } // rst = true; // 临时测试用 return rst; } //操作状态 const STATE = { addingTender: false, addingProject: false, addingFolder: false, deleting: false, importing: false, moving: false, }; const projTreeObj = { tree: null, workBook: null, copyToWorkBook: null, replaceWorkBook: null, copySelected: null, preSelection: null, changeInfo: null, setting: { tree: { id: "ID", pid: "ParentID", nid: "NextSiblingID", rootId: -1, autoUpdate: false, }, //0.48 0.13 0.15 0.15 0.09 header: [ { name: "工程列表", dataCode: "name", width: 300, vAlign: "center", hAlign: "left", }, { name: "总造价", dataCode: "totalCost", width: 100, vAlign: "center", hAlign: "right", formatter: "0.00", }, { name: "项目类别", dataCode: "valuationType", width: 100, vAlign: "center", hAlign: "left", }, { name: "单价文件", dataCode: "unitPriceFile", width: 140, vAlign: "center", hAlign: "left", }, { name: "费率文件", dataCode: "feeRateFile", width: 140, vAlign: "center", hAlign: "left", }, { name: "创建日期", dataCode: "createDateTime", width: 100, vAlign: "center", hAlign: "center", }, ], //选中行颜色 style: { defalutBackColor: "White", selectedColor: "#BBFFFF", }, options: { tabStripVisible: false, allowContextMenu: false, allowCopyPasteExcelStyle: false, allowExtendPasteRange: false, allowUserDragDrop: false, allowUserDragFill: false, scrollbarMaxAlign: true, showDragDropTip: false, }, }, copyToSetting: { header: [ { name: "工程列表", dataCode: "name", width: 550, vAlign: "center", hAlign: "left", }, ], //选中行颜色 style: { defalutBackColor: "White", selectedColor: "#BBFFFF", }, options: { tabStripVisible: false, allowCopyPasteExcelStyle: false, allowExtendPasteRange: false, allowUserDragDrop: false, allowUserDragFill: false, scrollbarMaxAlign: true, showDragDropTip: false, allowContextMenu: false, }, }, replaceSetting: { header: [ { name: "工程列表", dataCode: "name", width: 250, vAlign: "center", hAlign: "left", }, { name: "选择", dataCode: "selected", width: 50, vAlign: "center", cellType: "checkBox", }, ], //选中行颜色 style: { defalutBackColor: "White", selectedColor: "#BBFFFF", }, options: { tabStripVisible: false, allowCopyPasteExcelStyle: false, allowExtendPasteRange: false, allowUserDragDrop: false, allowUserDragFill: false, scrollbarMaxAlign: true, showDragDropTip: false, allowContextMenu: false, }, }, renderSheetFuc: function (sheet, fuc) { sheet.suspendPaint(); sheet.suspendEvent(); fuc(); sheet.resumePaint(); sheet.resumeEvent(); }, setOptions: function (workbook, opts) { for (let opt in opts) { workbook.options[opt] = opts[opt]; } }, bindEvent: function (workBook) { const _events = GC.Spread.Sheets.Events; let sheet = workBook.getActiveSheet(); //改变选中节点set selected sheet.bind(_events.SelectionChanging, this.onSelectionChanging); sheet.bind(_events.EditStarting, this.onCellEditing); sheet.bind(_events.ClipboardPasting, this.onCellEditing); workBook.bind(_events.DragDropBlock, this.onDragDropBlock); workBook.bind(GC.Spread.Sheets.Events.ButtonClicked, this.changeFileClick); }, buildHeader: function (sheet, headers) { let me = this; let fuc = function () { //sheet.options.isProtected = true; //为了拖动功能,这里不设置protect,输入限制在editstarting控制 sheet.options.protectionOptions = { allowResizeRows: true, allowResizeColumns: true, }; sheet.setColumnCount(headers.length); sheet.setRowHeight(0, 40, GC.Spread.Sheets.SheetArea.colHeader); let workBookWidth = getWorkBookWidth(); for (let i = 0, len = headers.length; i < len; i++) { sheet.setValue( 0, i, headers[i].name, GC.Spread.Sheets.SheetArea.colHeader ); let width = headers[i].width; sheet.setColumnWidth(i, width, GC.Spread.Sheets.SheetArea.colHeader); if (headers[i].formatter) { sheet.setFormatter( -1, i, headers[i].formatter, GC.Spread.Sheets.SheetArea.viewport ); } } }; me.renderSheetFuc(sheet, fuc); }, buildSheet: function (workBook, spreadID, setting) { //改成和复制项目spread共用 let newWorkBook = workBook; if (!workBook) { newWorkBook = new GC.Spread.Sheets.Workbook($("#" + spreadID)[0], { sheetCount: 1, }); this.setOptions(newWorkBook, setting.options); this.buildHeader(newWorkBook.getActiveSheet(), setting.header); this.bindEvent(newWorkBook); this.loadContextMenu(); this.loadStartMenu(); } else { workBook.refresh(); } return newWorkBook; }, // 获取新建按钮是否是disabled getAddBtnDisabled: function (action) { switch (action) { case projectType.folder: case projectType.project: case projectType.tender: return false; default: return true; } }, refreshAddMenuItems: function () { const items = [ { el: $("#addFolderSub"), action: projectType.folder, }, { el: $("#addProjectSub"), action: projectType.project, }, { el: $("#addTenderSub"), action: projectType.tender, }, ]; items.forEach((item) => { const disabled = this.getAddBtnDisabled(item.action); if (disabled) { item.el.addClass("disabled"); } else { item.el.removeClass("disabled"); } }); }, //右键菜单项 contextMenuItems: { addFolder: { name: "新建文件夹", icon: "fa-folder-o", disabled: function () { return projTreeObj.getAddBtnDisabled(projectType.folder); }, callback: function (key, opt) { $("#add-folder-dialog").modal("show"); }, }, addProject: { name: "新建建设项目", icon: "fa-cubes", disabled: function () { return projTreeObj.getAddBtnDisabled(projectType.project); }, callback: function (key, opt) { if (isStopCreate()) { $('#stop-create-dialog').modal('show'); } if (isGlYunStopCreate()) { $('#stop-create-dialog-glyun').modal('show'); } else { $('#add-project-dialog').modal('show'); } }, }, addTender: { name: "新建分段", icon: "fa-sticky-note-o", disabled: function () { return projTreeObj.getAddBtnDisabled(projectType.tender); }, callback: function (key, opt) { if (isStopCreate()) { $('#stop-create-dialog').modal('show'); return; } if (isGlYunStopCreate()) { $('#stop-create-dialog-glyun').modal('show'); return; } //弹出新建单位工程之前,判断当前使用版本,且当前使用单位工程数是否已到最大值 let selectedItem = projTreeObj.tree.selected; $("#add-tender-dialog").modal("show"); }, }, rename: { name: "重命名", icon: "fa-edit", disabled: function () { return !projTreeObj.tree.selected; }, callback: function (key, opt) { $("#rename-name").val( projTreeObj.tree.selected.data.name ? projTreeObj.tree.selected.data.name : "" ); $("#rename-dialog").modal("show"); setTimeout(function () { $("#rename-name")[0].focus(); }, 300); }, }, delete: { name: "删除", icon: "fa-remove", disabled: function () { let node = projTreeObj.tree.selected; return ( !node || (node.data.projType === projectType.folder && node.children.length > 0) ); }, callback: function (key, opt) { if (projTreeObj.tree && projTreeObj.tree.selected) { $("#del").modal("show"); } }, }, copyTo: { name: "复制到", icon: "fa-copy", disabled: function () { let node = projTreeObj.tree.selected; return !(node && node.data.projType === projectType.tender); }, callback: function (key, opt) { if (isStopCreate()) { $('#stop-create-dialog').modal('show'); return; } if (isGlYunStopCreate()) { // $('#stop-create-dialog-glyun').modal('show'); // return; } let selectedItem = projTreeObj.tree.selected; try { let selectedType = selectedItem !== null && selectedItem.data !== undefined ? selectedItem.data.projType : ""; if (selectedType !== projectType.tender) { throw "请选择单位工程进行复制"; } } catch (error) { alert(error); return false; } //更新选中项目缓存 $("#copy-to-dialog").modal("show"); }, }, saveAs: { name: "另存为", icon: "fa-paste", disabled: function () { const node = projTreeObj.tree.selected; return !(node && node.data.projType === projectType.tender); }, callback: function (key, opt) { if (isStopCreate()) { $('#stop-create-dialog').modal('show'); return; } if (isGlYunStopCreate()) { // $('#stop-create-dialog-glyun').modal('show'); // return; } $("#save-as-dialog").modal("show"); }, }, share: { name: "分享", icon: "fa-share", disabled: function () { let selectedItem = projTreeObj.tree.selected; return !selectedItem; }, callback: function (key, opt) { const selected = projTreeObj.tree.selected; if (selected && selected.data.ID) { SHARE_TO.initModal(SHARE_TO.Mode.PROJECT, selected.data.ID); } }, }, importInterface: { name: "导入接口文件", icon: "fa-cloud-upload", visible: function () { const names = [ "公路造价(2018)", "安徽养护(2018)", "广东公路造价(2018)", "浙江养护(2005)", "山东养护(2016/2024)", "广西养护(2020)", ]; return compilationData && names.includes(compilationData.name); }, callback: function () { CommonHeader.doAfterValidateVersion( () => $("#interface-import-modal").modal("show"), () => alert(`${commonUtil.getVersionText()}不提供此功能。`) // () => $('#interface-import-modal').modal('show') //临时 ); // $('#interface-import-modal').modal('show'); }, }, manageFiles: { name: "管理相关文件", icon: "fa-list", disabled: function () { let selectedItem = projTreeObj.tree.selected; return !( selectedItem && selectedItem.data.projType !== projectType.folder ); }, callback: function (key, opt) { setDataToSideBar(); $(".slide-sidebar").animate({ width: "440" }).addClass("open"); setTimeout(function () { $("body").bind("click", function (event) { var e = event || window.event; //浏览器兼容性 if (!$(event.target).is("a")) { var elem = event.target || e.srcElement; while (elem) { //循环判断至跟节点,防止点击的是div子元素 if ( elem.className == "open-sidebar" || elem.className == "slide-sidebar open" ) { return false; } if ($(elem).attr("id") && $(elem).attr("id") === "del-wj") { return false; } elem = elem.parentNode; } $(".slide-sidebar").animate({ width: "0" }).removeClass("open"); // 关闭处理 $("body").unbind("click"); } }); }, 500); }, }, refreshSummary: { name: "刷新项目造价", icon: "fa-refresh", disabled: function () { let selectedItem = projTreeObj.tree.selected; return !( selectedItem && selectedItem.data.projType !== projectType.folder ); }, callback: function (key, opt) { //获取当前节点的建设项目ID projTreeObj.refreshProjectData(); }, }, exportProject: { name: "导出建设项目", icon: "fa-cloud-download", disabled: function () { let selectedItem = projTreeObj.tree.selected; if (selectedItem) return selectedItem.data.projType === projectType.folder; return true; }, callback: function (key, opt) { //获取当前节点的建设项目ID let selectedItem = projTreeObj.tree.selected; let projectNode = selectedItem; //取建设项目节点 if (selectedItem.data.projType === projectType.tender) { projectNode = selectedItem.parent; } projTreeObj.exportProject(projectNode.data.ID, projectNode.data.name); }, }, importProject: { name: "导入建设项目", icon: "fa-upload", disabled: function () { let selectedItem = projTreeObj.tree.selected; if (selectedItem) { //if(selectedItem.data.projType === projectType.project) return false;//如果是建设项目,可用 if (selectedItem.data.projType === projectType.folder) { //如果是文件夹 if (selectedItem.children) { if (selectedItem.children.length == 0) return false; //如果文件夹没有子项,可用 if (selectedItem.children[0].projType === projectType.project) return false; //如果文件夹有子项,并且是建设项目,可用 } } else { //除了文件夹,都可用 return false; } } else { //列表为空时可导入 return false; } return true; }, callback: function (key, opt) { if (isStopCreate()) { $('#stop-create-dialog').modal('show'); return; } if (isGlYunStopCreate()) { // $('#stop-create-dialog-glyun').modal('show'); // return; } $("#confirm-import").hide(); $("#import").modal("show"); projTreeObj.getUploadToken(); }, }, }, //全部-开始(新建)按钮弹出菜单(新建单位工程) loadStartMenu: function () { let me = this; $("#startA").click(me.contextMenuItems.addTender.callback); }, //spread中鼠标右键弹出菜单 loadContextMenu: function () { let me = this; $.contextMenu({ selector: "#projSpread", build: function ($trigger, e) { let target = SheetDataHelper.safeRightClickSelection( $trigger, e, me.workBook ); me.initSelection( { row: target.row, rowCount: 1 }, me.preSelection ? me.preSelection : null, me.workBook.getActiveSheet() ); return ( target.hitTestType === GC.Spread.Sheets.SheetArea.viewport || target.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader ); }, items: { addFolder: me.contextMenuItems.addFolder, addProject: me.contextMenuItems.addProject, addTender: me.contextMenuItems.addTender, spr1: "--------", rename: me.contextMenuItems.rename, delete: me.contextMenuItems.delete, copyTo: me.contextMenuItems.copyTo, saveAs: me.contextMenuItems.saveAs, spr2: "--------", share: me.contextMenuItems.share, importInterface: me.contextMenuItems.importInterface, spr3: "--------", manageFiles: me.contextMenuItems.manageFiles, refreshSummary: me.contextMenuItems.refreshSummary, exportProject: me.contextMenuItems.exportProject, importProject: me.contextMenuItems.importProject, }, }); }, //刷新按钮有效性(升降级、上下移) refreshBtn: function (selected) { const upLevel = $("#upLevel"); const downLevel = $("#downLevel"); const upMove = $("#upMove"); const downMove = $("#downMove"); if (!selected) { upLevel.addClass("disabled"); downLevel.addClass("disabled"); upMove.addClass("disabled"); downMove.addClass("disabled"); return; } /* 升级有效 * 当前选中文件夹,且文件夹有父项,且父项是文件夹 * 当前选中建设项目,且建设项目有父项,且父项是文件夹 */ if ( [projectType.project, projectType.folder].includes( selected.data.projType ) && selected.parent && selected.parent.data && selected.parent.data.projType === projectType.folder ) { upLevel.removeClass("disabled"); } else { upLevel.addClass("disabled"); } /* * 降级有效 * 当前选中文件夹,且文件夹有前兄弟,且前兄弟是文件夹 * 当前选中建设项目,且建设项目有前兄弟,且前兄弟是文件夹 * */ if ( [projectType.project, projectType.folder].includes( selected.data.projType ) && selected.preSibling() && selected.preSibling().data.projType === projectType.folder ) { downLevel.removeClass("disabled"); } else { downLevel.addClass("disabled"); } /* * 上移有效 * 当前选中行有前兄弟,不论前兄弟类型 * */ selected.preSibling() ? upMove.removeClass("disabled") : upMove.addClass("disabled"); /* * 后移有效 * 当前选中行有后兄弟,不论后兄弟类型 * */ selected.nextSibling ? downMove.removeClass("disabled") : downMove.addClass("disabled"); }, doAfterTreeOpr: function ({ selected, parent, next, projectMap }, action) { $.bootstrapLoading.start(); moveProjects( { user_id: userID, rootProjectID: null, projectMap: projectMap, feeRateMap: {}, unitPriceMap: {}, }, function (result) { for (let key in result) { //更新前端节点数据 let updateData = result[key].update; let node = projTreeObj.tree.findNode(result[key].query.ID); if (node) { for (let ukey in updateData) { _.set(node.data, ukey, updateData[ukey]); } } } projTreeObj.moveTo(selected, null, parent, next, null, action); $.bootstrapLoading.end(); STATE.moving = false; projTreeObj.emitTreeChange(); } ); }, //升级后选中节点的后兄弟节点不成为其子节点,因为有层级类型限制(相当于选中节点移动到父项后成为其后兄弟) upLevel: function () { if (STATE.moving) { return; } STATE.moving = true; let selected = projTreeObj.tree.selected, parent = selected.parent.parent, next = selected.parent.nextSibling, projectMap = {}; //更新父节点 projectMap[selected.pid()] = { query: { ID: selected.pid() }, update: { NextSiblingID: selected.id() }, }; //更新选中节点前兄弟节点 let orgPre = selected.preSibling(); if (orgPre) { projectMap[orgPre.id()] = { query: { ID: orgPre.id() }, update: { NextSiblingID: selected.nid() }, }; } //更新选中节点 projectMap[selected.id()] = { query: { ID: selected.id() }, update: { ParentID: selected.parent.pid(), NextSiblingID: selected.parent.nid(), }, }; this.doAfterTreeOpr({ selected, parent, next, projectMap }); }, downLevel: function () { if (STATE.moving) { return; } STATE.moving = true; let selected = projTreeObj.tree.selected, parent = null, next = null, projectMap = {}; const maxFolderLevel = getMaxFolderLevel(selected); if (maxFolderLevel === 3) { return alert("文件夹不能超过3层"); } //更新前兄弟节点 let orgPre = selected.preSibling(); parent = orgPre; projectMap[orgPre.id()] = { query: { ID: orgPre.id() }, update: { NextSiblingID: selected.nid() }, }; //更新前兄弟最后子节点 if (orgPre.children.length > 0) { let lastChild = orgPre.lastChild(); projectMap[lastChild.id()] = { query: { ID: lastChild.id() }, update: { NextSiblingID: selected.id() }, }; } //更新选中节点 projectMap[selected.id()] = { query: { ID: selected.id() }, update: { ParentID: orgPre.id(), NextSiblingID: -1 }, }; this.doAfterTreeOpr({ selected, parent, next, projectMap }, "downLevel"); }, upMove: function () { if (STATE.moving) { return; } STATE.moving = true; let selected = projTreeObj.tree.selected, parent = selected.parent, next = selected.preSibling(), projectMap = {}; //$('#upMove').addClass('disabled'); //更新前前兄弟 let prepre = selected.preSibling().preSibling(); if (prepre) { projectMap[prepre.id()] = { query: { ID: prepre.id() }, update: { NextSiblingID: selected.id() }, }; } //更新前兄弟 let pre = selected.preSibling(); projectMap[pre.id()] = { query: { ID: pre.id() }, update: { NextSiblingID: selected.nid() }, }; //更新选中节点 projectMap[selected.id()] = { query: { ID: selected.id() }, update: { NextSiblingID: pre.id() }, }; this.doAfterTreeOpr({ selected, parent, next, projectMap }); }, downMove: function () { if (STATE.moving) { return; } STATE.moving = true; let selected = projTreeObj.tree.selected, parent = selected.parent, next = selected.nextSibling.nextSibling, projectMap = {}; //$('#downMove').addClass('disabled'); //更新前兄弟 let pre = selected.preSibling(); if (pre) { projectMap[pre.id()] = { query: { ID: pre.id() }, update: { NextSiblingID: selected.nid() }, }; } //更新后兄弟 projectMap[selected.nid()] = { query: { ID: selected.nid() }, update: { NextSiblingID: selected.id() }, }; //更新选中节点 projectMap[selected.id()] = { query: { ID: selected.id() }, update: { NextSiblingID: selected.nextSibling.nid() }, }; this.doAfterTreeOpr({ selected, parent, next, projectMap }); }, loadBtn: function () { $("#upLevel").click(this.upLevel.bind(this)); $("#downLevel").click(this.downLevel.bind(this)); $("#upMove").click(this.upMove.bind(this)); $("#downMove").click(this.downMove.bind(this)); }, getSelStyle: function (backColor) { let style = new GC.Spread.Sheets.Style(); style.backColor = backColor; 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 ); return style; }, //设置选中行底色 setSelStyle: function (sel, backColor, sheet) { let me = this; //let sheet = me.workBook.getSheet(0); sel.row = sel.row === -1 ? 0 : sel.row; me.renderSheetFuc(sheet, function () { let style = me.getSelStyle(backColor); for (let i = 0; i < sel.rowCount; i++) { let row = i + sel.row; sheet.setStyle(row, -1, style); } }); }, initSelection: function (newSel, oldSel = null, sheet) { let me = this; let node = me.tree.items[newSel.row]; node = node ? node : null; me.refreshBtn(node); //恢复底色 if (oldSel) { me.setSelStyle(oldSel, me.setting.style.defalutBackColor, sheet); } //设置选中行底色 if (newSel) { me.setSelStyle(newSel, me.setting.style.selectedColor, sheet); } if (sheet.name() == "copyToSheet") { //复制到 me.copySelected = node; let canCopy = false; if (node) { canCopy = node.data.projType == projectType.tender || node.data.projType == projectType.project; } canCopy == true ? $("#copy-to-confirm").removeClass("disabled") : $("#copy-to-confirm").addClass("disabled"); return; //如果是复制到表,不用做后面的操作 } else if (sheet.name() == "replaceSheet") { //如果是替换文件,不用做后面的操作 return; } me.tree.selected = node; me.preSelection = newSel; }, onSelectionChanging: function (sender, args) { let me = projTreeObj; me.initSelection(args.newSelections[0], args.oldSelections[0], args.sheet); }, changeFileClick: async function (sender, args) { if (args.sheet.name() == "projectSheet") { await projTreeObj.initFileChangePage( projTreeObj.setting.header[args.col].dataCode ); $("#mr_from").val(projTreeObj.setting.header[args.col].dataCode); $("#m_replace_file").modal("show"); } else if (args.sheet.name() == "replaceSheet") { let cellType = args.sheet.getCellType(args.row, args.col); if (cellType instanceof GC.Spread.Sheets.CellTypes.CheckBox) { projTreeObj.onReplaceNodeCheck(sender, args); } } }, cusButtonClick: async function (info) { projTreeObj.changeFileClick(null, info); }, onDragDropBlock: function (sender, args) { //拖动移动项目位置 let selected = projTreeObj.tree.selected; let targetNode = projTreeObj.tree.items[args.toRow]; let projectMap = {}, feeRateMap = {}, unitPriceMap = {}, parent = null, next = null, oldProject = null; let rootProjectID = null; //记录建设项目ID //let updateObj = {project:[],feeRateFile:[],unitPriceFile:[]}; args.cancel = true; //首先取消填充的动作 if (args.sheet.name() == "copyToSheet") { //如果是复制到表,不用做后面的操作 return; } if ( selected.preSibling() != null && selected.preSibling() == targetNode && selected.data.projType == targetNode.data.projType ) { //如果目标节点与选中节点的前一节点一样,并且选中节点与目标节点项目类型也一样的话,不用移动 return; } if (selected == targetNode) { return; } if (selected.data.projType == "Tender") { //移动单位工程 oldProject = selected.parent; //记录原来的建设项目 if ( targetNode.data.projType == projectType.tender || targetNode.data.projType == projectType.project ) { //只能移动到这两个地方 if (targetNode.data.projType == projectType.tender) { //移动到单位工程后面 [parent, next] = getMoveUpdateData( selected, targetNode, projectMap, true ); rootProjectID = targetNode.pid(); } else { //移动后成为建设项目的子项 [parent, next] = getMoveUpdateData( selected, targetNode, projectMap, false ); rootProjectID = targetNode.id(); } if (selected.data.property.rootProjectID != rootProjectID) { //如果不属于同一个建设项目,要检查是否移动或复制单价文件和费率文件 projectMap[selected.id()].update["property.rootProjectID"] = rootProjectID; //要改变根项目ID //检查费率文件和单价文件 moveOrCopy(selected, rootProjectID, feeRateMap, unitPriceMap, false); } } } if (selected.data.projType == "Project") { //移动的是建设项目 if ( targetNode.data.projType == "Project" || targetNode.data.projType == "Folder" ) { //目标位置是建设项目和文件夹 if (targetNode.data.projType == "Project") { [parent, next] = getMoveUpdateData( selected, targetNode, projectMap, true ); } else { [parent, next] = getMoveUpdateData( selected, targetNode, projectMap, false ); } } } if ( selected.data.projType == "Folder" && targetNode.data.projType == "Folder" ) { //文件夹只能移动到文件夹下 [parent, next] = getMoveUpdateData( selected, targetNode, projectMap, false ); //成为子项 } if (_.isEmpty(projectMap)) { //项目数据为空 return; } $.bootstrapLoading.start(); moveProjects( { user_id: userID, rootProjectID: rootProjectID, projectMap: projectMap, feeRateMap: feeRateMap, unitPriceMap: unitPriceMap, }, function (result) { for (let key in result) { //更新前端节点数据 let updateData = result[key].update; let node = projTreeObj.tree.findNode(result[key].query.ID); if (node) { for (let ukey in updateData) { _.set(node.data, ukey, updateData[ukey]); } } } projTreeObj.moveTo(selected, targetNode, parent, next, oldProject); $.bootstrapLoading.end(); } ); function getMoveUpdateData(sel, target, projectMap, sameLevel) { let tem_parent = null, tem_next = null; if (sameLevel == true) { //移动后的位置的级别相同 tem_parent = target.parent; tem_next = target.nextSibling; //移动到target的后面 projectMap[target.id()] = { query: { ID: target.id() }, update: { NextSiblingID: sel.id() }, }; } else { //移动后变成子项 tem_parent = target; tem_next = target.firstChild(); } let nextID = tem_next ? tem_next.id() : -1; if (sel.preSibling() != null) { //如果原来有前项,更新下一节点 projectMap[sel.preSibling().id()] = { query: { ID: sel.preSibling().id() }, update: { NextSiblingID: sel.data.NextSiblingID }, }; } if (sel.parent.id() == tem_parent.id()) { //移动前移动后的父项相同,只改变next if (selected.id() != nextID) { //父项相同的情况下, 下一节点ID如果等于选中的ID即项目没有移动,不用做处理 projectMap[selected.id()] = { query: { ID: selected.id() }, update: { NextSiblingID: nextID }, }; } } else { // let temData = { query: { ID: selected.id() }, update: { ParentID: tem_parent.id(), NextSiblingID: nextID }, }; let reName = projTreeObj.projectNameChecking(tem_parent, selected); //重名检查 if (reName) { temData.update["name"] = reName; } projectMap[selected.id()] = temData; } return [tem_parent, tem_next]; } function moveOrCopy( sel, rootProjectID, feeRateMap, unitPriceMap, sameCheck ) { //检查选中的项目使用的费率文件和单价文件是要移动还是复制一份 let project = sel.parent; //取建设项目 let sameParent_f = true; let sameParent_u = true; let useFeeRateProject = getTendersByFile( fileType.feeRateFile, sel.data.property.feeFile.id, project ); let useUnitPriceProject = getTendersByFile( fileType.unitPriceFile, sel.data.property.unitPriceFile.id, project ); let tem_feeRate = { action: "copy", rootProjectID: rootProjectID, name: sel.data.property.feeFile.name, query: { ID: sel.data.property.feeFile.id }, }; let tem_unitPrice = { action: "copy", rootProjectID: rootProjectID, name: sel.data.property.unitPriceFile.name, query: { id: sel.data.property.unitPriceFile.id }, }; if (useFeeRateProject.length == 1) { //如果没有其它项目使用同一个费率文件,则移动 tem_feeRate.action = "move"; tem_feeRate.update = { rootProjectID: rootProjectID }; } if (useUnitPriceProject.length == 1) { //如果没有其它项目使用同一个单价文件,则移动 tem_unitPrice.action = "move"; tem_unitPrice.update = { root_project_id: rootProjectID }; } feeRateMap[sel.id()] = tem_feeRate; unitPriceMap[sel.id()] = tem_unitPrice; if (sameCheck == true) { //需要检查是否属于同一个单项工程,移动单项工程的时候用 if (useUnitPriceProject.length > 1) { for (let f of useFeeRateProject) { if (f.pid() != sel.pid()) { //父节点不同 sameParent_f = false; break; } } if (sameParent_f == true) { //如果使用的都是同属于一个单项工程,在移动单项工程的时候,移动费率文件和单价文件就可以了 feeRateMap[sel.id()].action = "move"; feeRateMap[sel.id()].update = { rootProjectID: rootProjectID }; } } if (useUnitPriceProject.length > 1) { for (let u of useUnitPriceProject) { if (u.pid() != sel.pid()) { //父节点不同 sameParent_u = false; break; } } if (sameParent_u == true) { unitPriceMap[sel.id()].action = "move"; unitPriceMap[sel.id()].update = { root_project_id: rootProjectID }; } } } } }, projectNameChecking: function (parent, node, type) { //decDate = '(' + new Date().Format('MM-dd hh:mm:ss') + '恢复)'; type = type ? type : "移动"; for (let c of parent.children) { if (c.data.name == node.data.name) { //如果存在同名的项目 return ( node.data.name + "(" + new Date().Format("MM-dd hh:mm:ss") + type + ")" ); } } return null; }, onCellEditing: function (sender, args) { args.cancel = true; }, getShowData: function (datas) { for (let data of datas) { data.name = data.name ? data.name : ""; if (data.projType !== projectType.tender) { data.engineeringCost = ""; data.unitPriceFile = ""; data.feeRateFile = ""; data.createDateTime = ""; } else { data.engineeringCost = data.engineeringCost ? data.engineeringCost : 0; data.unitPriceFile = data.property && data.property.unitPriceFile && data.property.unitPriceFile.name ? data.property.unitPriceFile.name : ""; data.feeRateFile = data.property && data.property.feeFile && data.property.feeFile.name ? data.property.feeFile.name : ""; data.createDateTime = data.createDateTime ? new Date(data.createDateTime).Format("yyyy-MM-dd") : ""; } } }, openTender: function (ID, parent, timeoutTime) { setTimeout(function () { let newTab = window.open("about:blank"); BeforeOpenProject(ID, { fullFolder: GetFullFolder(parent) }, function () { let mainUrl = `/main?project=${ID}`; newTab.location.replace(mainUrl); //不能后退 }); }, timeoutTime); }, getTreeNodeCell: function (tree) { let me = projTreeObj; let indent = 20; let levelIndent = -5; let halfBoxLength = 5; let halfExpandLength = 3; let imgWidth = 18; let imgHeight = 14; let shareImg = document.getElementById("share_pic"), shareImgWidth = 13, shareImgHeight = 13; let defaultHeight = 18; // 单元格默认高度 let TreeNodeCellType = function () { }; TreeNodeCellType.prototype = new GC.Spread.Sheets.CellTypes.Text(); // 自动行高处理 此函数在每次调用autoFitRow后调用,返回的值作为新的单元格高度 // 在单元格设置为自动行高后,单元格的内容有空格时,spreadjs会将空格认为是换行,会导致高度计算不正确,因此在setCellValue中处理空格 TreeNodeCellType.prototype.getAutoFitHeight = function ( value, text, cellStyle, zoomFactor, context ) { if (!defaultHeight) { defaultHeight = context.sheet.getCell(context.row, -1).height(); } const node = me.tree.items[context.row]; const nodeIndent = node ? (node.depth() + 1) * indent + node.depth() * levelIndent + imgWidth + 5 : 0; const cellWidth = context.sheet.getCell(-1, context.col).width(); const textLength = this.getAutoFitWidth(...arguments); const tempNum = textLength / (cellWidth - nodeIndent); const lineNum = tempNum % 1 > 0.92 ? Math.ceil(tempNum + 1) : Math.ceil(tempNum); // 不这么处理的话有些行高算出来不对 //const lineNum = Math.ceil(textLength / (cellWidth - nodeIndent)); return lineNum * defaultHeight; }; TreeNodeCellType.prototype.paint = function ( ctx, value, x, y, w, h, style, options ) { if (style.backColor == undefined) style.backColor = "white"; if (style.backColor) { ctx.save(); ctx.fillStyle = style.backColor; ctx.fillRect(x, y, w, h); ctx.restore(); } else { ctx.clearRect(x, y, w, h); } let drawLine = function (canvas, x1, y1, x2, y2, color) { ctx.save(); ctx.translate(0.5, 0.5); ctx.beginPath(); ctx.moveTo(x1, y1); ctx.lineTo(x2, y2); ctx.strokeStyle = color; ctx.stroke(); ctx.restore(); }; let drawExpandBox = function ( ctx, x, y, w, h, centerX, centerY, expanded ) { let rect = {}, h1, h2, offset = 1; rect.top = centerY - halfBoxLength; rect.bottom = centerY + halfBoxLength; rect.left = centerX - halfBoxLength; rect.right = centerX + halfBoxLength; if (rect.left < x + w) { rect.right = Math.min(rect.right, x + w); ctx.save(); ctx.translate(0.5, 0.5); ctx.strokeStyle = "black"; ctx.beginPath(); ctx.moveTo(rect.left, rect.top); ctx.lineTo(rect.left, rect.bottom); ctx.lineTo(rect.right, rect.bottom); ctx.lineTo(rect.right, rect.top); ctx.lineTo(rect.left, rect.top); ctx.stroke(); ctx.fillStyle = "white"; ctx.fill(); ctx.restore(); // Draw Horizontal Line h1 = centerX - halfExpandLength; h2 = Math.min(centerX + halfExpandLength, x + w); if (h2 > h1) { drawLine(ctx, h1, centerY, h2, centerY, "black"); } // Draw Vertical Line if (!expanded && centerX < x + w) { drawLine( ctx, centerX, centerY - halfExpandLength, centerX, centerY + halfExpandLength, "black" ); } } }; let node = tree.items[options.row]; let showTreeLine = true; if (!node) { return; } let centerX = Math.floor(x) + node.depth() * indent + node.depth() * levelIndent + indent / 2; let x1 = centerX + indent / 2; let centerY = Math.floor((y + (y + h)) / 2); let y1; const lineColor = "#ababab"; // Draw Sibling Line if (showTreeLine) { // Draw Horizontal Line if (centerX < x + w) { drawLine( ctx, centerX, centerY, Math.min(x1, x + w), centerY, lineColor ); let img; if (node.data.projType === projectType.folder) { img = document.getElementById("folder_open_pic"); imgWidth = 15; } else if (node.data.projType === projectType.project) { img = document.getElementById("proj_pic"); imgWidth = 18; } else if (node.data.projType === projectType.engineering) { img = document.getElementById("eng_pic"); imgWidth = 14; } else if (node.data.projType === projectType.tender) { //如果单位工程不是实时计算结果,则显示刷新标记 img = node.data.changeMark && node.data.changeMark != "" ? document.getElementById("refresh_pic") : document.getElementById("tender_pic"); imgWidth = 14; } ctx.drawImage( img, centerX + indent / 2 + 3, centerY - 7, imgWidth, imgHeight ); } // Draw Vertical Line if (centerX < x + w) { y1 = node.isLast() ? centerY : y + h; if (node.isFirst() && !node.parent.parent) { drawLine(ctx, centerX, centerY, centerX, y1, lineColor); } else { drawLine(ctx, centerX, y, centerX, y1, lineColor); } } } // Draw Expand Box if (node.children.length > 0) { drawExpandBox(ctx, x, y, w, h, centerX, centerY, node.expanded); } // Draw Parent Line if (showTreeLine) { var parent = node.parent, parentCenterX = centerX - indent - levelIndent; while (parent.parent) { if (!parent.isLast()) { if (parentCenterX < x + w) { drawLine(ctx, parentCenterX, y, parentCenterX, y + h, lineColor); } } parent = parent.parent; parentCenterX -= indent + levelIndent; } } //分享标记在开头 if (node.data.shareInfo && node.data.shareInfo.length > 0) { let nowY = Math.floor((y + (y + h)) / 2); ctx.drawImage(shareImg, x + 3, nowY - 7, shareImgWidth, shareImgHeight); } // Draw Text //x = x + (node.depth() + 1) * indent + node.depth() * levelIndent; x = x + (node.depth() + 1) * indent + node.depth() * levelIndent + imgWidth + 3; w = w - (node.depth() + 1) * indent - node.depth() * levelIndent - imgWidth - 3; GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments); /* if (node.data.shareInfo && node.data.shareInfo.length > 0) {//分享标记在文本后 let nowX = Math.floor(x) + w - 20; let nowY = Math.floor((y + (y + h)) / 2); ctx.drawImage(shareImg, nowX + 3, nowY - 7, shareImgWidth,shareImgHeight); }*/ }; TreeNodeCellType.prototype.getHitInfo = function ( x, y, cellStyle, cellRect, context ) { let info = { x: x, y: y, row: context.row, col: context.col, cellStyle: cellStyle, cellRect: cellRect, sheetArea: context.sheetArea, }; let node = tree.items[info.row]; if (node && node.data.projType === projectType.tender) { info.isReservedLocation = true; } return info; }; TreeNodeCellType.prototype.processMouseDown = function (hitinfo) { let offset = -1; let node = tree.items[hitinfo.row]; let centerX = hitinfo.cellRect.x + offset + node.depth() * indent + node.depth() * levelIndent + indent / 2; let centerY = (hitinfo.cellRect.y + offset + (hitinfo.cellRect.y + offset + hitinfo.cellRect.height)) / 2; let text = hitinfo.sheet.getText(hitinfo.row, hitinfo.col); let value = hitinfo.sheet.getValue(hitinfo.row, hitinfo.col); let acStyle = hitinfo.sheet.getActualStyle(hitinfo.row, hitinfo.col), zoom = hitinfo.sheet.zoom(); let textLength = this.getAutoFitWidth(value, text, acStyle, zoom, { sheet: hitinfo.sheet, row: hitinfo.row, col: hitinfo.col, sheetArea: GC.Spread.Sheets.SheetArea.viewport, }); //(图标+名字)区域 function withingClickArea() { return ( hitinfo.x > centerX + halfBoxLength && hitinfo.x < centerX + halfBoxLength + imgWidth + indent / 2 + 3 + textLength ); } if (hitinfo.sheet.name() === "projectSheet") { //只有项目管理界面才执行 //单项文件,进入造价书界面 if (node.data.projType === projectType.tender) { let thisClick = Date.now(), open = false; if ( this.preNode === node && this.preClick && thisClick - this.preClick <= 300 ) { open = true; let timeoutTime = 200; if ($(".slide-sidebar").hasClass("open")) { timeoutTime = 500; } projTreeObj.openTender(node.data.ID, node.parent, timeoutTime); } this.preClick = open ? null : thisClick; this.preNode = open ? null : node; } if (!node || node.children.length === 0) { return; } } //统一改成方框外1像素内都有效 if ( hitinfo.x >= centerX - halfBoxLength - 2 && hitinfo.x <= centerX + halfBoxLength + 2 && hitinfo.y >= centerY - halfBoxLength - 2 && hitinfo.y <= centerY + halfBoxLength + 2 ) { node.setExpanded(!node.expanded); TREE_SHEET_HELPER.massOperationSheet(hitinfo.sheet, function () { let iCount = node.posterityCount(), i, child; for (i = 0; i < iCount; i++) { child = tree.items[hitinfo.row + i + 1]; hitinfo.sheet.setRowVisible( hitinfo.row + i + 1, child.visible, hitinfo.sheetArea ); } hitinfo.sheet.invalidateLayout(); }); hitinfo.sheet.repaint(); } }; /*TreeNodeCellType.prototype.processMouseMove = function (hitInfo) { let sheet = hitInfo.sheet; let div = sheet.getParent().getHost(); let canvasId = div.id + "vp_vp"; let canvas = $(`#${canvasId}`)[0]; //改变鼠标图案 if (sheet && hitInfo.isReservedLocation) { canvas.style.cursor='pointer'; return true; }else{ canvas.style.cursor='default'; } return false; };*/ TreeNodeCellType.prototype.processMouseEnter = function (hitinfo) { let text = hitinfo.sheet.getText(hitinfo.row, hitinfo.col); let value = hitinfo.sheet.getValue(hitinfo.row, hitinfo.col); let tag = hitinfo.sheet.getTag(hitinfo.row, hitinfo.col); let acStyle = hitinfo.sheet.getActualStyle(hitinfo.row, hitinfo.col), zoom = hitinfo.sheet.zoom(); let node = me.tree.items[hitinfo.row]; let nodeIndent = node ? (node.depth() + 1) * indent + node.depth() * levelIndent + imgWidth + 3 : 0; let textLength = this.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 - nodeIndent) { TREE_SHEET_HELPER.showTipsDiv(text, { pos: {} }, hitinfo); } }; TreeNodeCellType.prototype.processMouseLeave = function (hitinfo) { let me = this; TREE_SHEET_HELPER.tipDiv = "hide"; if (TREE_SHEET_HELPER._toolTipElement) { $(TREE_SHEET_HELPER._toolTipElement).hide(); TREE_SHEET_HELPER._toolTipElement = null; } TREE_SHEET_HELPER.tipDivCheck(); //延时检查:当tips正在show的时候,就调用了hide方法,会导致tips一直存在,所以设置一个超时处理 }; return new TreeNodeCellType(); }, setFileSelectButton: function (row, col, node, sheet, setting) { if (!setting) setting = this.setting; let dataCode = setting.header[col]["dataCode"]; if ( node.data.projType == "Tender" && (dataCode == "feeRateFile" || dataCode == "unitPriceFile") ) { sheet.setCellType( row, col, sheetCommonObj.getCusButtonCellType(projTreeObj.cusButtonClick, false), GC.Spread.Sheets.SheetArea.viewport ); } }, setCellValue: function (cell, node, sheet, setting) { //const sheet = this.workBook.getActiveSheet(); if (!setting) setting = this.setting; const { row, col } = cell; let dataCode = setting.header[col]["dataCode"]; let value = ""; if (dataCode === "name") { // 在单元格设置为自动行高后,单元格的内容有空格时,spreadjs会将空格认为是换行,因此需要处理空格 value = (node.data.name && node.data.name.replace(new RegExp(" ", "g"), "\t")) || ""; } else if (dataCode === "unitPriceFile") { if (node.data.projType === projectType.tender) { value = node.data.property && node.data.property.unitPriceFile && node.data.property.unitPriceFile.name ? node.data.property.unitPriceFile.name : ""; } } else if (dataCode === "feeRateFile") { if (node.data.projType === projectType.tender) { value = node.data.property && node.data.property.feeFile && node.data.property.feeFile.name ? node.data.property.feeFile.name : ""; } } else if (dataCode === "createDateTime") { value = node.data.createDateTime ? new Date(node.data.createDateTime).Format("yyyy-MM-dd") : ""; } else { value = isDef(node.data[dataCode]) ? node.data[dataCode] : ""; } sheet.setValue(row, col, value); }, showTreeData: function (nodes, setting, sheet) { let headers = setting.header; let me = this; let tree = nodes.length > 0 ? nodes[0].tree : me.tree; //sheet.name() == "copyToSheet"?me.copyTree:me.tree; let fuc = function () { sheet.setRowCount(0); sheet.setRowCount(nodes.length); let treeNodeCell = me.getTreeNodeCell(tree); sheet.getRange(-1, 0, -1, 1).cellType(treeNodeCell); const rows = []; for (let i = 0; i < nodes.length; i++) { rows.push(i); for (let j = 0; j < headers.length; j++) { sheet .getRange(-1, j, -1, 1) .hAlign(GC.Spread.Sheets.HorizontalAlign[headers[j]["hAlign"]]); sheet .getRange(-1, j, -1, 1) .vAlign(GC.Spread.Sheets.VerticalAlign[headers[j]["vAlign"]]); if ( headers[j].cellType == "checkBox" && nodes[i].data.canSelect === true ) { sheet.setCellType( i, j, new GC.Spread.Sheets.CellTypes.CheckBox(), GC.Spread.Sheets.SheetArea.viewport ); sheet.getCell(i, j).hAlign(GC.Spread.Sheets.HorizontalAlign.center); } me.setCellValue({ row: i, col: j }, nodes[i], sheet, setting); me.setFileSelectButton(i, j, nodes[i], sheet, setting); } sheet.getCell(i, 1, GC.Spread.Sheets.SheetArea.viewport).locked(true); if (typeof nodes[i].visible !== "undefined") { sheet.setRowVisible(nodes[i].serialNo(), nodes[i].visible); } } sheetCommonObj.setRowsAutoFit(sheet, rows, 0, true); }; me.renderSheetFuc(sheet, fuc); }, refreshNodeData: function (nodes) { let me = this; let sheet = me.workBook.getActiveSheet(); let header = me.setting.header; me.renderSheetFuc(sheet, function () { if (_.isArray(nodes)) { for (let t of nodes) { setSheetCellData(t, sheet); } } else { setSheetCellData(nodes, sheet); } }); function setSheetCellData(n, sheet) { let rIdx = me.tree.items.indexOf(n); for (let i = 0; i < header.length; i++) { me.setCellValue({ row: rIdx, col: i }, n, sheet); me.setFileSelectButton(rIdx, i, n, sheet); } } }, sumEngineeringCost: function () { let projectNodes = _.filter(projTreeObj.tree.items, function (item) { return item.data.projType == projectType.project; }); for (let p of projectNodes) { this.calEngineeringCost(p); } }, calEngineeringCost: function (node) { let projectNode = null; //建设项目节点 let refreshNodes = []; if (node.data.projType == projectType.folder) { //如果是文件夹时不用计算 return; } if (node.data.projType == projectType.project) { projectNode = node; } if (node.data.projType == projectType.tender) { projectNode = node.parent; } if (projectNode) { calNode(projectNode); } let children = projectNode.children; refreshNodes.push(projectNode); return refreshNodes.concat(children); function calNode(node) { let tem_sum = 0; if (node.data.projType == projectType.tender) { return; } for (let t of node.children) { calNode(t); let temP = scMathUtil.roundForObj(t.data.totalCost, 2); tem_sum = scMathUtil.roundForObj(temP + tem_sum, 2); } node.data.totalCost = scMathUtil.roundToString(tem_sum, 2); } }, initFileChangePage: async function (from) { let title = from == "unitPriceFile" ? "批量替换单价文件" : "批量替换费率文件"; $("#mr_title").text(title); this.initHtmlByFromRadio(); let result = from == "unitPriceFile" ? await this.setUnitFileChangeFileData() : await this.setFeeRateChangeFileData(); this.changeInfo = result; this.loadFileOptions(this.changeInfo, from); }, setFeeRateChangeFileData: async function () { //userID let node = projTreeObj.tree.selected; let data = { user_id: userID, projectID: node.data.ID, rootProjectID: node.data.property.rootProjectID, }; let result = await ajaxPost("/feeRates/getChangeInfo", data); this.getFileListWithPath(result.others); return result; }, setUnitFileChangeFileData: async function () { let node = projTreeObj.tree.selected; let data = { project_id: node.data.ID, rootProjectID: node.data.property.rootProjectID, }; let result = await ajaxPost("/glj/get-project-info", data); this.getFileListWithPath(result.other); //数据结构不一样,这里做一下转换 let t_result = { currentProject: { ID: node.data.ID, currentOptions: result.self, }, others: result.other, }; return t_result; }, getFileListWithPath: function (list) { for (let n of list) { let node = projTreeObj.tree.findNode(n.ID); if (node) { n.name = getPathName(node); } n.serialNo = (node && node.serialNo()) || 1; } // 按照正确的树结构排序 list.sort((a, b) => a.serialNo - b.serialNo); function getPathName(node) { if (node.parent && node.parent.data) { return getPathName(node.parent) + "\\" + node.data.name; } else { return node.data ? node.data.name : ""; } } }, loadFileOptions: function (data, from) { let idField = "ID", optionField = "optionList"; if (from == "unitPriceFile") { idField = "id"; optionField = "unitPriceList"; } $("#currentOptions").empty(); for (let c of data.currentProject.currentOptions) { var option = $("`; } $("#valuation").html(html); let engineeringList = getEngineeringList(); let engineeringHtml = getEngineeringHtml(engineeringList); $("#tender-engineering").html(engineeringHtml); changeEngineering(); $("#engineering-info").hide(); } function changeEngineering() { $("#engineering-info").hide(); initFeeStandardSel(); } function changeFeeRate(engLib) { if (engLib) { /* if (engLib.fee_lib !== undefined && engLib.fee_lib.length > 0) { $("#tender-fee-rate").children("option").first().val("newFeeRate-"+engLib.fee_lib[0].id); }*/ //2018-08-29 费率改为和计税方式绑定在一起 所以在这里还不能确定标准费率库ID $("#tender-fee-rate").children("option").first().val("newFeeRate@@"); $("#tender-engineering") .parent() .siblings(".hidden-area") .slideDown("fast"); } else { $("#tender-fee-rate") .children("option") .first() .val($("#tender-name").val()); } } function initFeeStandardSel() { $("#tender-feeStandard").empty(); let feeStandards = []; let engineeringList = getEngineeringList(); let currentEngName = $("#tender-engineering").val(); for (let eng of engineeringList) { if ( eng.lib.name && eng.lib.name === currentEngName && eng.lib.feeName && eng.lib.feeName !== "" ) { feeStandards.push(eng.lib.feeName); } } for (let feeName of feeStandards) { let $opt = $(``); $("#tender-feeStandard").append($opt); } if (feeStandards.length > 0) { if ($("#feeStandard-info").is(":visible")) { $("#feeStandard-info").hide(); } } let currentEngLib = getEngineeringLib( currentEngName + $("#tender-feeStandard").val(), engineeringList ); changeFeeRate(currentEngLib); setTaxGroupHtml(); getStdCalcProgramFiles(); } function _iniAdminLevel() { //初始化行政等级(广东农村公路用) $("#tender-adminLevel").empty(); let adminLevels = []; adminLevels.push(adminLevelType.CITY_LEVEL); adminLevels.push(adminLevelType.COUNTRY_SIDE_LEVEL); adminLevels.push(adminLevelType.VLLAGE_LEVEL); for (let feeName of adminLevels) { let $opt = $(``); $("#tender-adminLevel").append($opt); } $("#tender-adminLevel")[0].selectedIndex = 0; // changeFeeRate(currentEngLib); // setTaxGroupHtml(); // getStdCalcProgramFiles(); } function changeFeeStandard() { let currentEngLib = getEngineeringLib( $("#tender-engineering").val() + $("#tender-feeStandard").val(), getEngineeringList() ); changeFeeRate(currentEngLib); setTaxGroupHtml(); getStdCalcProgramFiles(); } function setTaxGroupHtml() { let groups = getTaxGroupList(); let taxTypeArray = []; let htmlString = ""; if (groups && groups.length > 0) { taxTypeArray = _.uniq(_.map(groups, "taxType")); } for (let t of taxTypeArray) { htmlString += ""; } $("#taxType").html(htmlString); if (taxTypeArray.length < 2) { $("#taxType_div").hide(); } else { $("#taxType_div").show(); } } function getStdCalcProgramFiles() { function getStdCPFilesHtml(taxGroups) { let result = ""; if (taxGroups.length <= 0) { return result; } for (let group of taxGroups) { let groupString = ""; //把计算程序、清单模板、列设置的ID生成一个组合的值 let p_id = group.program_lib ? group.program_lib.id : ""; let t_id = group.template_lib ? group.template_lib.id : ""; let c_id = group.col_lib ? group.col_lib.id : ""; let f_id = group.fee_lib ? group.fee_lib.id : ""; groupString = p_id + "|-|" + t_id + "|-|" + c_id + "|-|" + f_id; result += ""; } return result; } let taxType = $("#taxType").val(); let stdCPHtml = getStdCPFilesHtml(getTaxGroupList(taxType)); $("#tender-calcProgram").html(stdCPHtml); if ($("#tender-calcProgram")[0].options.length > 1) $("#tender-calcProgram")[0].selectedIndex = 0; } $(document).ready(function () { // 分享给的一些事件监听 SHARE_TO.handleEventListener(); // 单位工程超限提示后,弹出客服列表 $("#hintBox_form").on("hide.bs.modal", function () { const text = $("#hintBox_caption").text(); if ( text === "您创建的项目个数超限,请联系我们的客服人员,或者导出建设项目保存到本地备份,删除云上数据。" ) { $("#customerService").click(); } }); //绑定项目管理的升降级、上下移按钮事件 projTreeObj.loadBtn(); $("#sideTab") .find("li") .click(function () { //消除tooltip $('[data-toggle="tooltip"]').tooltip("hide"); }); //列宽随着屏幕改变 $(window).resize(function () { sheetCommonObj.setColumnWidthByRate( getWorkBookWidth(), gcTreeObj.workBook, gcTreeObj.setting.header ); //sheetCommonObj.setColumnWidthByRate(getWorkBookWidth(), pmShare.spreadObj.workBook, pmShare.headers); }); projTreeObj.initTree(); $("#tab_pm_all").on("show.bs.tab", () => projTreeObj.initTree(true)); // 侧滑数据 /* $(".poj-list").on('click', ".open-sidebar", function() { setDataToSideBar(); $(".slide-sidebar").animate({width:"800"}).addClass("open"); });*/ //单价、费率文件删除确认 $("#fileDelConfirm").click(function () { if (fileDelObj && fileDelObj.id) { let updateObj = Object.create(null); updateObj.updateType = "delete"; updateObj.updateData = Object.create(null); if (fileDelObj.fileType === fileType.unitPriceFile) { updateObj.updateData.id = fileDelObj.id; } else if (fileDelObj.fileType === fileType.feeRateFile) { updateObj.updateData.ID = fileDelObj.id; } updateObj.fileType = fileDelObj.fileType; a_updateFiles([updateObj], function () { fileDelObj = null; $("#fileDelCancel").click(); setDataToSideBar(); //refresh front? }); } }); //绑定新建建设项目、新建文件夹、重命名Enter键事件 bindInputs($("#project-name"), $("#folder-name"), $("#rename-name")); //绑定新建窗口显示事件 bindModalShown( $("#add-folder-dialog"), $("#add-project-dialog"), $("#add-tender-dialog") ); //绑定新建建设项目、新建单位工程、新建文件夹、重命名弹窗隐藏事件 bindModalsHidden( $("#add-project-dialog"), $("#add-tender-dialog"), $("#add-folder-dialog"), $("#rename-dialog") ); // 新建子菜单有效性刷新 $("#addMenuBtn").click(function () { if (isStopCreate()) { $('#stop-create-dialog').modal('show'); return false; } if (isGlYunStopCreate()) { $('#stop-create-dialog-glyun').modal('show'); return false; } const menuDisplay = !$("#addMenu").is(":visible"); if (!menuDisplay) { return; } projTreeObj.refreshAddMenuItems(); }); // 新增建设项目操作 $("#addProjOk").click(function () { if (STATE.addingProject) { return; } STATE.addingProject = true; let suc = AddProject(); if (suc === false) { STATE.addingProject = false; } }); // 选择计价方式 $("input[name='valuation_type']").click(function () { let type = $(this).val(); changeValuationType(type); }); //选择计价规则 $("#valuation").change(function () { let engineeringList = getEngineeringList(); let engineeringHtml = getEngineeringHtml(engineeringList); $("#tender-engineering").html(engineeringHtml); $("#valuation-info").hide(); changeEngineering(); }); //选择计税方式 $("#taxType").change(function () { $("#valuation-info").hide(); getStdCalcProgramFiles(); }); //新建单位工程-建设项目提示 $("#poj-name").keyup(function () { let pojName = $("#poj-name").val().trim(); let nameList = getNameList($("#poj-name-list").children()); let isExist = hasListName(nameList, pojName); if (!isExist) { //ESTIMATION if (compilationData.name === "内蒙古高速公路日常养护估算(2021)") { changeValuationType(ESTIMATION); } else if ( compilationData.name === "四川养护(2013)" || compilationData.name === "部颁2018计价标准" ) { changeValuationType(BILL_BUDGET); } else { changeValuationType(BUDGET); } if (pojName !== "") { replaceClass($("#poj-name-info"), "text-danger", "text-info"); setDangerInfo($("#poj-name-info"), `新建“${pojName}”`); if (!$("#tender-reserve").children().length) { initProjectOptSet($("#tender-reserve")); } // 新建项目,需要选择项目类型了,单位工程就不需要选择项目类别 $("#val-type-group").hide(); } else { $("#tender-reserve").empty(); $("#poj-name-info").hide(); } //清空文件下拉 setFileOptions(null); } else { $("#val-type-group").show(); $("#tender-reserve").empty(); //触发选项 let curName = $(this).val().trim(); function getProjOpt(opts) { for (let opt of opts) { if ($(opt).text().trim() === curName) { return $(opt); } } return null; } let matchOpt = getProjOpt($("#poj-name-list").find("a")); const projectID = matchOpt.data("id"); handleTenderValuationTypeViewState(projectID); if (matchOpt) { matchOpt.click(); } $("#poj-name-info").hide(); } }); //新建单位工程-单位工程提示 $("#tender-name").keyup(function () { let selected = projTreeObj.tree.selected; let pojName = $("#poj-name").val().trim(); let tenderName = $("#tender-name").val().trim(); let isExist = hasTender(selected, pojName, tenderName); $("#unit-price").find("option:first-child").text(tenderName); $("#tender-fee-rate").find("option:first-child").text(tenderName); if (isExist) { if (tenderName !== "") setDangerInfo($("#tender-name-info"), `已存在“${tenderName}”`); } else { $("#tender-name-info").hide(); } }); //下拉是否含有输入的名字 function hasListName(nameList, name) { for (let i = 0, len = nameList.length; i < len; i++) { if (nameList[i] === name) { return true; } } return false; } function getNameList(list) { let rst = []; for (let i = 0, len = list.length; i < len; i++) { rst.push($(list[i]).text()); } return rst; } //设置地区选项 function setRegionOpts(regions) { $("#regionDiv").find("select").empty(); for (let region of regions) { let $opt = $(``); $("#regionDiv").find("select").append($opt); } } // 某些费用定额不显示费用标准 const compilationWithoutFeeStandard = [ // 内蒙2019 "5d776dad620cc0000dab6b2a", ]; // 新增单位工程弹层改变 $("#add-tender-dialog").on("show.bs.modal", function () { if (compilationWithoutFeeStandard.includes(compilationData._id)) { $("#tender-feeStandard-group").hide(); } //clear info $("#poj-name-info").hide(); $("#tender-name-info").hide(); $("#tender-name").val(""); $("#valuation-info").hide(); $("#engineering-info").hide(); $("#unit-price").find("option:first-child").text("新建单价文件"); $("#tender-fee-rate").find("option:first-child").text("新建费率文件"); //获取建设项目 let selected = projTreeObj.tree.selected; let projs = getProjs(selected); setProjOptions(projs, selected); if (selected.data.valuationType === "工程量清单") { $("#val-type-group").hide(); } else { if (selected.data.property.hasOwnProperty("valuationType")) { $("#val-type-group").hide(); } else { $("#val-type-group").show(); } } const firstProj = selected && selected.data.projType === projectType.project ? selected : projs[0]; const firstProjID = (firstProj && firstProj.data.ID) || null; handleTenderValuationTypeViewState(firstProjID); //设置地区选项 if (regions.length > 0) { setRegionOpts(regions); $("#regionDiv").show(); } }); // 新增单位工程 $("#add-tender-confirm").click(function () { if (STATE.addingTender) { return; } STATE.addingTender = true; let suc = AddTender(); if (suc === false) { STATE.addingTender = false; } }); // 新增文件夹操作 $("#add-folder-confirm").click(function () { if (STATE.addingFolder) { return; } STATE.addingFolder = true; let suc = AddFolder(); if (suc === false) { STATE.addingFolder = false; } }); // 删除时文字替换 $("#del").on("show.bs.modal", function () { let hasTenderChild = function (children) { for (let i = 0; i < children.length; i++) { if (children[i].children.length === 0) { if (children[i].data.projType === "Tender") { return true; } } else if (hasTenderChild(children[i].children)) { return true; } } return false; }; // 显示内容 let tenderHintElement = $("#tenderHint"); let folderHintElement = $("#folderHint"); if (projTreeObj.tree.selected.children.length === 0) { tenderHintElement.show(); tenderHintElement.text( '删除 "' + projTreeObj.tree.selected.data.name + '" ?' ); folderHintElement.hide(); } else { tenderHintElement.hide(); folderHintElement.show(); folderHintElement.text( '删除 "' + projTreeObj.tree.selected.data.name + '" 以及它包含的子项?' ); } // 显示是否可以找回 if (hasTenderChild([projTreeObj.tree.selected])) { $("#restoreHint").show(); } else { $("#restoreHint").hide(); } }); // 删除操作 $("#delete-confirm").click(function () { if (STATE.deleting) { return; } STATE.deleting = true; let updateData = null; let dialog = $("#del"); if (projTreeObj.tree) { $.bootstrapLoading.start(); updateData = GetDeleteUpdateData(projTreeObj.tree.selected); UpdateProjectData( updateData, function () { dialog.modal("hide"); let selected = projTreeObj.tree.selected; //删除行号 let rIdx = projTreeObj.tree.items.indexOf(selected); //删除行数 let rCout = selected.posterityCount() + 1; projTreeObj.tree.removeNode(selected); let refreshNodes = projTreeObj.calEngineeringCost(selected); //delete view let sheet = projTreeObj.workBook.getActiveSheet(); projTreeObj.remove(sheet, rIdx, rCout); if ( selected.data.projType == projectType.tender || selected.data.projType == projectType.engineering ) { projTreeObj.refreshNodeData(refreshNodes); //刷新工程造价信息 } $.bootstrapLoading.end(); //快速点击时,第一个项目删除成功了,可能会删除多项目 setTimeout(function () { STATE.deleting = false; }, 500); projTreeObj.emitTreeChange(); }, function () { $.bootstrapLoading.end(); setTimeout(function () { STATE.deleting = false; }, 500); } ); } }); // 重命名操作 $("#rename-confirm").click(function () { let select = projTreeObj.tree.selected; let parent = select ? select.parent : Tree._root; let newName = $("#rename-name").val().trim(); let dialog = $("#rename-dialog"); if (newName === "") { setDangerInfo($("#rename-name-info"), "请输入重命名"); return false; } if (newName === select.data.name) { dialog.modal("hide"); return false; } if (existName(newName, parent.children, select.data.projType)) { setDangerInfo($("#rename-name-info"), `已存在“${newName}”`); return; } RenameProject(select.id(), newName, select.data.ParentID, function () { setDangerInfo($("#rename-name-info"), "", false); dialog.modal("hide"); select.data.name = newName; let sheet = projTreeObj.workBook.getActiveSheet(); projTreeObj.setCellValue( { row: sheet.getActiveRowIndex(), col: 0 }, select, sheet, projTreeObj.setting ); projTreeObj.emitTreeChange(); }); }); // 复制到按钮点击 /*$('#copy-to-btn').click(function () { let selectedItem = projTreeObj.tree.selected; try { let selectedType = selectedItem !== null && selectedItem.data !== undefined ? selectedItem.data.projType : ''; if (selectedType !== projectType.tender) { throw '请选择单位工程进行复制'; } } catch (error) { alert(error); return false; } $('#copy-to-dialog').modal('show'); });*/ // 复制到弹层替换 /* $('#copy-to-dialog').on('show.bs.modal', function () { copytoZTree = ConvertTreeToZtree(projTreeObj.tree, $('#treeDemo2'), null); });*/ $("#copy-to-dialog").on("shown.bs.modal", function () { projTreeObj.initCopyToSpread(); // copytoZTree = ConvertTreeToZtree(projTreeObj.tree, $('#treeDemo2'), null); }); $("#m_replace_file").on("shown.bs.modal", function () { // projTreeObj.tree.selected projTreeObj.initReplaceSpread(); }); $("input[name='select_from']").each(function () { $(this).click(function () { projTreeObj.initHtmlByFromRadio(); }); }); // 复制到操作 $("#copy-to-confirm").click(async function () { try { let originalNode = projTreeObj.tree.selected; let toNode = projTreeObj.copySelected; let parent = null, next = null, projectMap = {}; if (toNode.data.projType == projectType.project) { //复制为目标的子节点 parent = toNode; next = toNode.firstChild(); } else if (toNode.data.projType == projectType.tender) { //复制为目标的后兄弟 parent = toNode.parent; next = toNode.nextSibling; projectMap["update"] = { query: { ID: toNode.id() } }; //前一节点的下一个节点更新; } // 复制到的目标建设项目项目类型与当前文件项目类型相同才可复制(目标建设项目为空也能复制到,兼容旧项目) const targetValuationType = parent.data.property.valuationType || null; const curValuationType = originalNode.data.property.valuationType || null; if (targetValuationType && targetValuationType !== curValuationType) { return alert( "当前分段与目标建设项目的项目类型不同,请选择其他建设项目进行复制。" ); } let nextID = next ? next.id() : -1; let projectData = _.cloneDeep(originalNode.data); projectData["ParentID"] = parent.id(); projectData["NextSiblingID"] = nextID; projectData["property"] = {}; projectData["property"]["rootProjectID"] = parent.id(); projectData["shareInfo"] = []; let rename = projTreeObj.projectNameChecking( parent, originalNode, "复制" ); //重名检查 rename ? (projectData["name"] = rename) : ""; projectMap["copy"] = { document: projectData }; $("#copy-to-dialog").modal("hide"); const copyRst = await ajaxPost("/pm/api/copyProjects", { projectMap: projectMap, user_id: userID, tenderCount: 1, }); if (!copyRst.error) { $.bootstrapLoading.progressStart("拷贝项目", true); $("#progress_modal_body").text("正在拷贝项目,请稍候……"); await importProcessChecking(null, null, (newProjectData) => handleTenderAfterChecking(newProjectData, projectData) ); } } catch (err) { alert(err); } }); // 另存为操作 $("#save-as-dialog").on("show.bs.modal", function () { const selected = projTreeObj.tree.selected; const name = selected.data.name; $("#save-file").prop("checked", true); $("#save-as-name").val(name); setTimeout(() => $("#save-as-name")[0].focus(), 300); }); $("#save-as-confirm").click( _.throttle(async function () { try { const name = $("#save-as-name").val().trim(); if (!name) { throw new Error("名称不可为空。"); } const saveAsFile = $("#save-file").prop("checked"); const originalNode = projTreeObj.tree.selected; const projectMap = { isSaveAs: true, saveAsFile, }; const parent = originalNode.parent; const next = parent.firstChild(); const nextID = next ? next.id() : -1; const projectData = _.cloneDeep(originalNode.data); projectData["ParentID"] = parent.id(); projectData["NextSiblingID"] = nextID; projectData["property"] = {}; projectData["property"]["rootProjectID"] = parent.id(); projectData["shareInfo"] = []; projectData["name"] = name; projectMap["copy"] = { document: projectData }; //$("#save-as-dialog").modal('hide'); const copyRst = await ajaxPost("/pm/api/copyProjects", { projectMap: projectMap, user_id: userID, tenderCount: 1, }); if (!copyRst.error) { $.bootstrapLoading.progressStart("拷贝项目", true); $("#progress_modal_body").text("正在拷贝项目,请稍候……"); await importProcessChecking(null, null, (newProjectData) => { handleTenderAfterChecking(newProjectData, projectData); if (newProjectData) { $("#save-as-dialog").modal("hide"); } }); } } catch (err) { alert(err); } }, 2000) ); $("#selectSameTypeProject").click(function () { let value = $(this).prop("checked") == true ? 1 : 0; projTreeObj.selectSameTypeProject(value); }); $("#changeFileConfirm").click(function () { projTreeObj.confirmFileChange(); }); // 选择工程专业后动态更改费率文件等数据 $("#tender-engineering").change(function () { changeEngineering(); }); $("#tender-feeStandard").change(function () { changeFeeStandard(); }); }); //获取工作表总宽度 function getWorkBookWidth() { return (workBookWidth = $(window).width() - $(".pm-side").width() - 90); } function prepareInitialTimer() { $("#progressBar").css("width", `0%`); let outer = setInterval(function () { let curWidth = parseInt($("#progressBar")[0].style.width.replace("%", "")); curWidth = parseInt(curWidth + 2); $("#progressBar").css("width", `${curWidth}%`); if (curWidth >= 80) { clearInterval(outer); } }, 100); let inner = setInterval(function () { let curWidth = parseFloat( $("#progressBar")[0].style.width.replace("%", "") ); if (curWidth >= 80) { curWidth = parseFloat(curWidth + 0.1); $("#progressBar").css("width", `${curWidth}%`); if (curWidth >= 95) { clearInterval(inner); } } }, 500); return { outer, inner }; } // 初始化节点可见性,默认收起至建设项目层 function initNodesVisibility(nodes, visible) { function recurSetVisible(nodes, visible) { nodes.forEach((node) => { node.visible = visible; if (node.children) { recurSetVisible(node.children, visible); } }); } nodes.forEach((node) => { const isProject = node.data.projType === projectType.project; if (isProject) { node.expanded = visible; recurSetVisible(node.children, visible); } }); } function initProjects(callback, expandCallback) { GetAllProjectData(function (datas) { //设置项目类别 for (let data of datas) { if (data.projType === projectType.tender && data.property.valuationType) { data.valuationType = ValuationText[data.property.valuationType] || ""; } } CommonAjax.post( "/options/getOptions", [], function (rstData) { projTreeObj.setting.style.selectedColor = rstData.COLOROPTS.SELECTED.backColor; projTreeObj.tree = pmTree.createNew(projTreeObj.setting, datas); projTreeObj.tree.selected = projTreeObj.tree.items[0]; projTreeObj.workBook = projTreeObj.buildSheet( projTreeObj.workBook, "projSpread", projTreeObj.setting ); const sheet = projTreeObj.workBook.getSheet(0); sheet.options.frozenlineColor = "#ababab"; sheet.frozenColumnCount(2); sheet.name("projectSheet"); sheetCommonObj.spreadDefaultStyle(projTreeObj.workBook); projTreeObj.sumEngineeringCost(); if (expandCallback) { expandCallback(); } else { initNodesVisibility(projTreeObj.tree.items, false); } projTreeObj.showTreeData( projTreeObj.tree.items, projTreeObj.setting, sheet ); //初始选择 const initSel = sheet.getSelections()[0] ? sheet.getSelections()[0] : { row: 0, rowCount: 1 }; projTreeObj.initSelection(initSel, null, sheet); autoFlashHeight(); projTreeObj.workBook.refresh(); if (callback) { callback(); } }, function () { $.bootstrapLoading.end(); } ); }); } /** * 初始化数据 * @return {void} */ async function init(refresh = false, callback, expandCallback) { //refresh是刷新页面时才使用的 try { billValuation = billValuation.replace(/\n/g, "\\n"); rationValuation = rationValuation.replace(/\n/g, "\\n"); //init spread and pmTree if (refresh == false) socketObject.connect("pm"); //socket 连接; if (isFirst) { isFirst = false; $.bootstrapLoading.progressStart( "欢迎使用" + $("#projectTitle").val(), true ); $("#progress_modal_body").text("首次加载例题,请稍候……"); await ajaxPost("/pm/api/prepareInitialData", { user_id: userID }); await importProcessChecking( null, null, () => { initProjects(() => { $.bootstrapLoading.progressEnd(); if (callback) { callback(); } }, expandCallback); }, true ); } else { await importProcessChecking( null, ({ content }) => { $.bootstrapLoading.progressStart( "欢迎使用" + $("#projectTitle").val(), true ); $("#progress_modal_body").text(content); }, () => { $.bootstrapLoading.start(); initProjects(() => { $.bootstrapLoading.end(); if (callback) { callback(); } }, expandCallback); }, true ); } engineering = engineeringList !== null && engineeringList !== undefined ? JSON.parse(engineeringList) : []; } catch (err) { alert(err); } } function refreshAllPage() { if (gcTreeObj.workBook) { gcTreeObj.workBook.destroy(); gcTreeObj.workBook = null; } gcTreeObj.tree = null; init(true); } /** * 新增建设项目 * * @return {boolean} */ function AddProject() { let name = $("#project-name").val().trim(); if (name === "") { setDangerInfo($("#project-name-info"), "请填写建设项目名称"); return false; } $.bootstrapLoading.start(); let existCallback = function () { setDangerInfo( $("#project-name-info"), `已存在“${$("#project-name").val()}”` ); STATE.addingProject = false; $.bootstrapLoading.end(); }; let sucCallback = function () { $("#add-project-dialog").modal("hide"); $("#project-name").val(""); setDangerInfo($("#project-name-info"), "", false); $.bootstrapLoading.end(); setTimeout(function () { STATE.addingProject = false; }, 500); projTreeObj.emitTreeChange(); }; let errCB = function () { $.bootstrapLoading.end(); setTimeout(function () { STATE.addingProject = false; }, 500); }; let selectedItem = projTreeObj.tree.selected; const property = { valuationType: $('input[name="valuation-type"]:checked').val(), }; if (property.valuationType === BOQ) { property.boqType = +$('input[name="boq-type-input"]:checked').val(); } /* * (1)、当前没有焦点行,新建建设项目为第一个节点。 (2)、当前定位在文件夹,新建建设项目为文件夹的最后一个子节点。 (3)、当前定位在建设项目,新建建设项目为其后兄弟。 (4)、当前定位在单项工程或单位工程,新建项目为当前所属建设项目的后兄弟。 * */ if (!selectedItem) { AddSiblingsItem( selectedItem, name, property, projectType.project, existCallback, sucCallback, errCB ); } else { if (selectedItem.data.projType === projectType.project) { AddSiblingsItem( selectedItem, name, property, projectType.project, existCallback, sucCallback, errCB ); } else if (selectedItem.data.projType === projectType.tender) { let proj = selectedItem.parent; AddSiblingsItem( proj, name, property, projectType.project, existCallback, sucCallback, errCB ); } else if (selectedItem.data.projType === projectType.folder) { AddChildrenItem( selectedItem, name, property, projectType.project, existCallback, sucCallback, errCB ); } } } function _getOptionDivDomStr(value, rdName, labelName, id, isChecked) { return `