/**
* 项目管理相关js
*
* @author CaiAoLin
* @date 2017/8/22
* @version
*/
let Tree = null;
let movetoZTree = null;
let copytoZTree = null;
let engineering = [];
let feeRateData = [];
let projectType = {
folder: 'Folder',
tender: 'Tender',
project: 'Project',
engineering: 'Engineering'
};
let ProjTreeSetting = {
tree: {
id: 'ID',
pid: 'ParentID',
nid: 'NextSiblingID',
btnColumn: 1,
nullId: -1
},
columns: [
{
head: '',
data: '',
width: '40',
event: {}
},
{
head: '工程列表',
data: 'name',
width: '78%',
event: {
getText: function (html, node, text) {
let className = '';
switch (node.data.projType) {
case projectType.folder:
className = "fa fa-folder-open-o";
break;
case projectType.tender:
className = "fa fa-sticky-note-o";
break;
case projectType.project:
className = "fa fa-cubes";
break;
case projectType.engineering:
className = "fa fa-cube";
break;
}
let icon = '';
html.push((node && node.data && node.data.projType === projectType.folder) ? ' ' : '');
html.push('', icon, ' ', text, '');
},
getIcon: function (html, node) {
if (node.data.projType === projectType.tender) {
html.push('└');
}
},
tdBindEvent: function (td, node) {
if (node.data.projType === projectType.tender) {
$('a:eq(1)', td).bind('click', function () {
BeforeOpenProject(node.id(), {'fullFolder': GetFullFolder(node.parent)}, function () {
window.location.href = '/main?project=' + node.id();
});
return false;
});
}
}
}
},
{
head: '最近使用',
data: 'lastDateTime',
width: '10%',
event: {
getText: function (html, node, text) {
if (node.data.projType === projectType.tender) {
html.push(text ? new Date(text).Format('yyyy-MM-dd') : '');
}
}
}
},
{
head: '创建日期',
data: 'createDateTime',
width: '10%',
event: {
getText: function (html, node, text) {
if (node.data.projType === projectType.tender) {
html.push(text ? new Date(text).Format('yyyy-MM-dd') : '');
}
}
}
}
],
viewEvent: {
beforeSelect: function (node) {
if (node && node.row) {
$('td:eq(0)', node.row).children().remove();
}
},
onSelectNode: function (node) {
$(".tools-btn > a").not(".disabled").addClass("disabled");
switch(node.data.projType) {
case projectType.project:
$("#add-engineering-btn").removeClass("disabled");
$("#add-project-btn").removeClass("disabled");
break;
case projectType.folder:
$("#add-folder-btn").removeClass("disabled");
$("#add-project-btn").removeClass("disabled");
break;
case projectType.engineering:
$("#add-tender-btn").removeClass("disabled");
$("#add-engineering-btn").removeClass("disabled");
break;
case projectType.tender:
$("#add-tender-btn").removeClass("disabled");
$("#move-to-btn").removeClass("disabled");
$("#copy-to-btn").removeClass("disabled");
$("#share-btn").removeClass("disabled");
$("#cooperate-btn").removeClass("disabled");
break;
}
$("#del-btn").removeClass("disabled");
$("#rename-btn").removeClass("disabled");
$('td:eq(0)', node.row).append($(''));
}
}
};
$(document).ready(function() {
init();
// 新增建设项目点击
$('#add-project-btn').click(function () {
let selectedItem = Tree.selected();
try {
let selectedType = selectedItem !== null && selectedItem.data !== undefined ?
selectedItem.data.projType : projectType.folder;
if (selectedType !== projectType.folder && selectedType !== projectType.project) {
throw '建设项目只能添加到最外层或文件夹中';
}
$('#add-project-dialog').modal('show');
} catch (error) {
alert(error);
}
});
// 新增建设项目操作
$('#addProjOk').click(function () {
AddProject();
});
// 选择计价方式
$("input[name='valuation_type']").click(function() {
let type = $(this).val();
let targetData = type === 'bill' ? JSON.parse(billValuation) : JSON.parse(rationValuation);
let html = '';
for(let valuation of targetData) {
if (valuation === null) {
continue;
}
html += '';
}
$("#valuation").html(html);
});
// 新增单项项目点击
$("#add-engineering-btn").click(function() {
let selectedItem = Tree.selected();
try {
if (selectedItem === null) {
throw '请选择要添加到的项目工程';
}
let selectedType = selectedItem.data !== undefined ? selectedItem.data.projType : '';
if (selectedType !== projectType.project && selectedType !== projectType.engineering) {
throw '单项项目只能添加到建设项目中';
}
$("#add-engineering-dialog").modal("show");
} catch (error) {
alert(error);
}
});
// 新增单项工程操作
$("#add-engineering-confirm").click(function() {
AddEngineering();
});
// 新增单位工程点击
$("#add-tender-btn").click(function() {
let selectedItem = Tree.selected();
try {
if (selectedItem === null) {
throw '请选择要添加到的单项工程';
}
let selectedType = selectedItem.data !== undefined ? selectedItem.data.projType : '';
if (selectedType !== projectType.engineering && selectedType !== projectType.tender) {
throw '单项项目只能添加到单项工程中';
}
$("#add-tender-dialog").modal("show");
} catch (error) {
alert(error);
}
});
// 新增单位工程弹层改变
$('#add-tender-dialog').on('show.bs.modal', function() {
// 当前选中的建设项目
let selectedItem = Tree.selected();
let projectInfo = null;
if (selectedItem.data.projType === projectType.tender) {
projectInfo = selectedItem !== null && selectedItem.parent !== undefined && selectedItem.parent.parent !== undefined ?
selectedItem.parent.parent : null;
} else {
projectInfo = selectedItem !== null && selectedItem.parent !== undefined ? selectedItem.parent : null;
}
if (projectInfo !== null) {
let savedProjectData = localStorage.getItem(projectInfo.data.name);
console.log(savedProjectData);
savedProjectData = JSON.parse(savedProjectData);
// 填入计价规则
let valuationHtml = '';
$("#tender-valuation").html(valuationHtml);
// 填入工程专业
let engineeringHtml = getEngineeringHtml(savedProjectData.engineeringList);
$("#tender-engineering").html(engineeringHtml);
$("input[name='tender_valuation_type']").attr('disabled', 'disabled').removeAttr('checked', 'checked');
$("input[name='tender_valuation_type'][value='"+ savedProjectData.valuationType +"']")
.attr("checked", "checked").removeAttr('disabled', 'disabled');
// 填入费率文件
let feeHtml = '';
// for (let fee of savedProjectData.feeLib) {
// feeHtml += '';
// }
$("#tender-fee-rate").html(feeHtml);
}
});
// 新增单位工程
$("#add-tender-confirm").click(function() {
AddTender();
});
// 新增文件夹按钮点击
$("#add-folder-btn").click(function() {
let selectedItem = Tree.selected();
try {
let selectedType = selectedItem !== null && selectedItem.data !== undefined ?
selectedItem.data.projType : projectType.folder;
if (selectedType !== projectType.folder) {
throw '文件夹只能添加在最外层或者添加在文件夹中';
}
$("#add-folder-dialog").modal("show");
} catch (error) {
alert(error);
}
});
// 新增文件夹操作
$("#add-folder-confirm").click(function() {
AddFolder();
});
// 删除按钮点击
$('#del-btn').click(function() {
if (Tree && Tree.selected()) {
$('#del').modal('show');
}
});
// 删除时文字替换
$('#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 (Tree.selected().children.length === 0) {
tenderHintElement.show();
tenderHintElement.text('删除 "' + Tree.selected().data.name +'" ?');
folderHintElement.hide();
} else {
tenderHintElement.hide();
folderHintElement.show();
folderHintElement.text('删除 "'+ Tree.selected().data.name +'" 以及它包含的子项?');
}
// 显示是否可以找回
if (hasTenderChild([Tree.selected()])) {
$('#restoreHint').show();
} else {
$('#restoreHint').hide();
}
});
// 删除操作
$('#delete-confirm').click(function () {
let updateData = null;
let dialog = $('#del');
if (Tree) {
updateData = GetDeleteUpdateData(Tree.selected());
UpdateProjectData(updateData, function () {
dialog.modal('hide');
Tree.removeNode(Tree.selected());
});
}
});
// 重命名按钮点击
$('#rename-btn').click(function() {
if (!Tree) {
return false;
}
if (!Tree.selected()) {
alert('请选择需要重命名的数据');
return false;
}
$('#rename-dialog').modal('show');
});
// 重命名操作
$("#rename-confirm").click(function() {
let select = Tree.selected();
let newName = $('#rename-name').val();
let dialog = $('#rename-dialog');
if (newName === '') {
alert('请输入重命名的名称');
return false;
}
if (newName === select.data.name) {
dialog.modal('hide');
return false;
}
RenameProject(select.id(), newName, function () {
dialog.modal('hide');
select.data.name = newName;
Tree.refreshNodesDom([select]);
});
});
// 移动到按钮点击
$('#move-to-btn').click(function () {
if (Tree && Tree.selected()) {
$('#move-to-dialog').modal('show');
}
});
// 移动到窗口内容重组
$('#move-to-dialog').on('show.bs.modal', function () {
movetoZTree = ConvertTreeToZtree(Tree, $('#treeDemo'), Tree.selected());
});
// 移动到操作
$('#move-to-confirm').click(function () {
let updateData = null;
let dialog = $('#move-to-dialog');
let target = GetTargetTreeNode($.fn.zTree.getZTreeObj('treeDemo'));
let cur = Tree.selected();
if (!target) {
dialog.modal('hide');
return false;
}
if (target.data.projType !== projectType.engineering) {
alert("请移动到单项工程中!");
return false;
}
let parent = target;
let next = target.firstChild();
if (parent !== cur.parent || (next !== cur && next !== cur.nextSibling)){
let typeInfo = {
updateType: 'update',
projectType: null
};
updateData = GetUpdateData(parent, next, '', Tree.selected().id(), typeInfo);
UpdateProjectData(updateData, function (data) {
dialog.modal('hide');
Tree.move(Tree.selected(), parent, next);
});
} else {
dialog.modal('hide');
}
});
// 复制到按钮点击
$('#copy-to-btn').click(function () {
let selectedItem = 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(Tree, $('#treeDemo2'), null);
});
// 复制到操作
$("#copy-to-confirm").click(function() {
let dialog = $('#copy-to-dialog');
let target = GetTargetTreeNode($.fn.zTree.getZTreeObj('treeDemo2'));
let parent = null;
let next = null;
let pre = null;
let cur = Tree.selected();
if (!target) {
return false;
}
if (target.data.projType !== projectType.engineering) {
alert("请移动到单项工程中!");
return false;
}
if (target.data.projType !== projectType.tender && target.children.length !== 0 &&
target.firstChild().data.projType !== projectType.tender) {
dialog.modal('hide');
}
if (target.data.projType === projectType.tender) {
parent = target.parent;
next = target.nextSibling;
} else {
parent = target;
next = target.firstChild();
}
if (parent !== cur.parent || (next !== cur && next !== cur.nextSibling)){
CommonAjax.post('/pm/api/getNewProjectID', {count: 1, user_id: userID}, function (IDs) {
let typeInfo = {
updateType: 'copy',
projType: cur.data.projectType
};
let updateData = GetUpdateData(parent, next, cur.data.name, IDs.lowID, typeInfo);
updateData['srcProjectId'] = cur.id();
pre = GetNeedUpdatePreNode(parent, next);
if (pre) {
updateData = {};
updateData['updateType'] = 'update';
updateData['updateData'] = {};
updateData['updateData'][Tree.setting.tree.id] = pre.id();
updateData['updateData'][Tree.setting.tree.nid] = node.tree.maxNodeId() + 1;
}
Tree.maxNodeId(IDs.lowID - 1);
CommonAjax.post('/pm/api/copyProjects', {updateData: updateData, user_id: userID}, function (data) {
dialog.modal('hide');
data.forEach(function (nodeData) {
if (nodeData.updateType === 'copy') {
Tree.addNodeData(nodeData.updateData, parent, next);
}
});
}, function () {
dialog.modal('hide');
});
});
}
});
});
/**
* 初始化数据
*
* @return {void}
*/
function init() {
let table = $('#ProjTree');
$('thead', table).remove();
$('tbody', table).remove();
GetAllProjectData(function (data) {
Tree = $.fn.treeTable.init(table, ProjTreeSetting, data);
});
// 显示默认两个可选菜单
$(".tools-btn > a").not(".disabled").addClass("disabled");
$("#add-folder-btn").removeClass("disabled");
$("#add-project-btn").removeClass("disabled");
engineering = engineeringList !== null && engineeringList !== undefined ? JSON.parse(engineeringList) : [];
}
/**
* 新增建设项目
*
* @return {boolean}
*/
function AddProject() {
let name = $('#project-name').val();
if (name === '') {
alert('请填写工程');
return false;
}
let valuation = $("#valuation").val();
if (valuation === '') {
alert("请选择计价规则");
return false;
}
let valuationName = $("#valuation").children("option:selected").text();
let valuationType = $("input[name='valuation_type']:checked").val();
let engineeringList = [];
let valuationData = valuationType === 'bill' ? JSON.parse(billValuation) : JSON.parse(rationValuation);
for(let tmp of valuationData) {
if (tmp._id === valuation) {
engineeringList = tmp.engineering_list;
break;
}
}
let callback = function() {
$("#add-project-dialog").modal("hide");
// 记录选择后的信息
let projectInfo = {
valuation: valuation,
valuationType: valuationType,
valuationName: valuationName,
engineeringList: engineeringList,
};
localStorage.setItem(name, JSON.stringify(projectInfo));
};
let selectedItem = Tree.selected();
// 如果选择的是建设项目则新增同级数据
if (selectedItem !== null && selectedItem.data.projType === projectType.project) {
AddSiblingsItem(name, projectType.project, callback);
} else {
AddChildrenItem(name, projectType.project, callback);
}
}
/**
* 新增子元素
*
* @param {String} name
* @param {String} type
* @param {function} callback
* @return {void}
*/
function AddChildrenItem(name, type, callback) {
let parent = Tree.selected() ? Tree.selected() : Tree._root;
let next = Tree.selected() ? Tree.selected().firstChild() : Tree.firstNode();
GetNewProjectId(function(IDs) {
let typeInfo = {
updateType: 'new',
projectType: type
};
let updateData = GetUpdateData(parent, next, name, IDs.lowID, typeInfo);
Tree.maxNodeId(IDs.lowID - 1);
UpdateProjectData(updateData, function(datas){
datas.forEach(function (data) {
if (data.updateType === 'new') {
Tree.addNodeData(data.updateData, parent, next);
}
});
callback();
});
});
}
/**
* 新增同级元素
*
* @param {String} name
* @param {String} type
* @param {function} callback
* @return {void}
*/
function AddSiblingsItem(name, type, callback) {
let selected = Tree.selected();
let parent = selected ? selected.parent : Tree._root;
let next = selected ? selected.nextSibling : Tree.firstNode();
GetNewProjectId(function(IDs) {
let typeInfo = {
updateType: 'new',
projectType: type
};
let updateData = GetUpdateData(parent, next, name, IDs.lowID, typeInfo);
Tree.maxNodeId(IDs.lowID - 1);
UpdateProjectData(updateData, function(datas){
datas.forEach(function (data) {
if (data.updateType === 'new') {
Tree.addNodeData(data.updateData, parent, next);
}
});
callback();
});
});
}
/**
* 新增单项工程
*
* @return {boolean}
*/
function AddEngineering() {
let name = $('#engineering-name').val();
if (name === '') {
alert('请填写单项工程名称');
return false;
}
let callback = function() {
$("#add-engineering-dialog").modal("hide");
};
let selectedItem = Tree.selected();
// 如果选择的是单项工程则新增同级数据
if (selectedItem !== null && selectedItem.data.projType === projectType.engineering) {
AddSiblingsItem(name, projectType.engineering, callback);
} else {
AddChildrenItem(name, projectType.engineering, callback);
}
}
/**
* 新增单位工程
*
* @return {boolean}
*/
function AddTender() {
let name = $('#tender-name').val();
if (name === '') {
alert('请填写单位工程名称');
return false;
}
let callback = function() {
$("#add-tender-dialog").modal("hide");
};
let selectedItem = Tree.selected();
// 如果选择的是单项工程则新增同级数据
if (selectedItem !== null && selectedItem.data.projType === projectType.tender) {
AddSiblingsItem(name, projectType.tender, callback);
} else {
AddChildrenItem(name, projectType.tender, callback);
}
}
/**
* 新增文件夹
*
* @return {boolean}
*/
function AddFolder() {
let name = $('#folder-name').val();
if (name === '') {
alert('请填写文件夹名称');
return false;
}
let selectedItem = Tree.selected();
if (selectedItem !== null) {
// 判断是否超过3层
if (selectedItem.parent !== null && selectedItem.parent.parent !== null &&
selectedItem.parent.parent.parent !== null) {
alert("文件夹不能超过3层");
return false;
}
AddChildrenItem(name, projectType.folder, function() {
$("#add-folder-dialog").modal("hide");
});
} else {
AddSiblingsItem(name, projectType.folder, function() {
$("#add-folder-dialog").modal("hide");
});
}
}
/**
* 组织更新数据
*
* @param {Object} parent
* @param {Object} next
* @param {String} name
* @param {Object} type
* @return {Object}
*/
function GetUpdateData(parent, next, name, newId, type) {
let data = [];
let updateData = {};
updateData['updateType'] = type.updateType === undefined ? 'new' : type.updateType;
updateData['updateData'] = {};
if (newId !== '') {
updateData['updateData'][Tree.setting.tree.id] = newId;
}
updateData['updateData'][Tree.setting.tree.pid] = parent ? parent.id() : -1;
updateData['updateData'][Tree.setting.tree.nid] = next ? next.id() : -1;
if (name !== '') {
updateData['updateData']['name'] = name;
}
if (type !== null && type.projectType !== null) {
updateData['updateData']['projType'] = type.projectType !== undefined ? type.projectType : 'Tender';
}
data.push(updateData);
return data;
}
/**
* 获取删除数据
*
* @return {Object} node
* @return {Object}
*/
function GetDeleteUpdateData(node) {
let datas = [], updateData,
pre = node.preSibling(),
deleteNodeData = function (node) {
var data = {};
data['updateType'] = 'delete';
data['updateData'] = {};
data['updateData'][Tree.setting.tree.id] = node.id();
if (node.data.projType === 'Tender') {
data['updateData']['FullFolder'] = GetFullFolder(node.parent);
}
return data;
},
addDeleteChildren = function (children) {
children.forEach(function(child){
datas.push(deleteNodeData(child));
addDeleteChildren(child.children);
});
};
if (pre && pre.id() !== -1) {
updateData = {};
updateData['updateType'] = 'update';
updateData['updateData'] = {};
updateData['updateData'][Tree.setting.tree.id] = pre.id();
updateData['updateData'][Tree.setting.tree.nid] = node ? node.nid() : -1;
datas.push(updateData);
}
datas.push(deleteNodeData(node));
addDeleteChildren(node.children);
return datas;
};
/**
* 获取父级所有名称
*
* @return {Array}
*/
function GetFullFolder (node) {
let fullFolder = [];
let cur = node;
while (cur && cur.data) {
fullFolder.unshift(cur.data.name);
cur = cur.parent;
}
return fullFolder;
}
/**
* 获取需要更新的前节点
*
* @param {Object} parent
* @param {Object} next
* @return {Object}
*/
function GetNeedUpdatePreNode(parent, next) {
if (next) {
return next.preSibling();
} else if (parent) {
return parent.firstChild();
} else {
return null;
}
}
/**
* 获取最新id
*
* @param {function} callback
* @return {void}
*/
function GetNewProjectId(callback) {
CommonAjax.post('/pm/api/getNewProjectID', {count: 1}, function(data) {
callback(data);
});
}
/**
* 重命名项目
*
* @param {Number} projectId
* @param {String} newName
* @param {function} callback
* @return {void}
*/
function RenameProject(projectId, newName, callback) {
$.ajax({
type: "POST",
url: '/pm/api/renameProject',
data: {'data': JSON.stringify({"user_id": userID, "id": projectId, "newName": newName})},
dataType: 'json',
cache: false,
timeout: 5000,
success: function(result){
if (result.error === 0) {
callback();
} else {
alert('error' + result.message);
}
},
error: function(iqXHR, textStatus, errorThrown){
alert('error ' + textStatus + " " + errorThrown)
}
});
}
/**
* 转换当前树结构为zTree结构
*
* @param {Object} Tree
* @param {Object} zTreeObj
* @param {Object} filterNode
* @return {Mixed}
*/
function ConvertTreeToZtree(Tree, zTreeObj, filterNode) {
let setting = {
data: {
simpleData: {
enable:true,
idKey: "id",
pIdKey: "pId",
rootPId: "-1"
}
}};
let zTreeData = [],
exportNodesData = function (nodes) {
nodes.forEach(function (node) {
if (node !== filterNode) {
var data = {};
data['id'] = node.data[Tree.setting.tree.id];
data['pId'] = node.pid();
data['name'] = node.data['name'];
data['isParent'] = node.data.projType === 'Folder';//(node.data.projType === 'Folder' && node.children.length === 0);
data['open'] = node.data.projType === 'Folder';//node.children.length !== 0;
zTreeData.push(data);
exportNodesData(node.children);
}
})
};
exportNodesData(Tree._root.children);
return $.fn.zTree.init(zTreeObj, setting, zTreeData);
}
/**
* 获取指定zTree节点
*
* @param {Object} zTreeObj
* @return {object}
*/
function GetTargetTreeNode(zTreeObj) {
if (!zTreeObj || !Tree) {
return null;
}
let ztree_selected = zTreeObj.getSelectedNodes().length === 0 ? null : zTreeObj.getSelectedNodes()[0];
return ztree_selected ? Tree.findNode(ztree_selected.id) : null;
}
/**
* 根据指定id获取对应的工程专业
*
* @param {Array} engineeringList
* @return {String}
*/
function getEngineeringHtml(engineeringList) {
let result = '';
if (engineeringList.length <= 0) {
return result;
}
let engineeringObject = {};
for(let tmp of engineering) {
engineeringObject[tmp.value] = tmp.name;
}
for(let tmp of engineeringList) {
if (engineeringObject[tmp.engineering] !== undefined) {
result += '';
}
}
return result;
}