/**
* Created by Zhong on 2017/10/30.
*/
//测试数据
let deleteInfo = {deleteBy: 76075, deleteDateTime: '2017-10-31', deleted: true};
let temp_gc_datas = [
{ID: 1, ParentID: -1, NextSiblingID: 7, name: 'testTreeA', projType: 'Project', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo,
unitPriceFiles: [{name: 'uA', id: 100, root_project_id: 1, user_id: 76075, deleteInfo: deleteInfo}, {name: 'uB', id: 101, root_project_id: 1, user_id: 76075, deleteInfo: deleteInfo}],
feeRateFiles: [{name: 'fA', ID: 'fr-1', rootProjectID: 1, userID: 76075, deleteInfo: deleteInfo}, {name: 'fB', ID: 'fr-2', rootProjectID: 1, userID: 76075, deleteInfo: deleteInfo}]},
{ID: 2, ParentID: 1, NextSiblingID: 3, name: 'enA', projType: 'Engineering', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo},
{ID: 3, ParentID: 1, NextSiblingID: -1, name: 'enB', projType: 'Engineering', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo},
{ID: 4, ParentID: 3, NextSiblingID: 5, name: 'tenderA', projType: 'Tender', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo, property: {feeFile: {id: 'fr-1', name: 'fA'}, unitPriceFile: {id: 100, name: 'uA'}}},
{ID: 5, ParentID: 3, NextSiblingID: 6, name: 'tenderB', projType: 'Tender', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo, property: {feeFile: {id: 'unD-1', name: 'unDF'}, unitPriceFile: {id: 100, name: 'uA'}}},
{ID: 6, ParentID: 3, NextSiblingID: -1, name: 'tenderC', projType: 'Tender', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo, property: {feeFile: {id: 'fr-2', name: 'fB'}, unitPriceFile: {id: 101, name: 'uB'}}},
{ID: 7, ParentID: -1, NextSiblingID: 10, name: 'testTreeB', projType: 'Project', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo,
unitPriceFiles: [{name: 'uC', id: 102, root_project_id: 7, user_id: 76075, deleteInfo: deleteInfo}, {name: 'uD', id: 103, root_project_id: 7, user_id: 76075, deleteInfo: deleteInfo}],
feeRateFiles: [{name: 'fC', ID: 'fr-3', rootProjectID: 7, userID: 76075, deleteInfo: deleteInfo}]},
{ID: 8, ParentID: 7, NextSiblingID: -1, name: 'enC', projType: 'Engineering', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo},
{ID: 9, ParentID: 8, NextSiblingID: -1, name: 'tenderD', projType: 'Tender', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo, property: {feeFile: {id: 'fr-3', name: 'fC'}, unitPriceFile: {id: 102, name: 'uC'}}},
{ID: 10, ParentID: -1, NextSiblingID: -1, name: 'testTreeC', projType: 'Project', userID: 76075, createDateTime: '2017-10-30', unitPriceFiles: [], feeRateFiles: [{name: 'fC', ID: 'fr-3', rootProjectID: 7, userID: 76075, deleteInfo: deleteInfo}]},
{ID: 11, ParentID: 10, NextSiblingID: -1, name: 'enD', projType: 'Engineering', userID: 76075, createDateTime: '2017-10-30'},
{ID: 12, ParentID: 11, NextSiblingID: -1, name: 'tenderE', projType: 'Tender', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo, property: {feeFile: {id: 'fr-3', name: 'fC'}, unitPriceFile: {id: 103, name: 'uD'}}},
{ID: 13, ParentID: 2, NextSiblingID: 14, name: 'tenderF', projType: 'Tender', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo, property: {feeFile: {id: 'unD-2', name: 'unDF2'}, unitPriceFile: {id: 102, name: 'uC'}}},
{ID: 14, ParentID: 2, NextSiblingID: 15, name: 'tenderG', projType: 'Tender', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo, property: {feeFile: {id: 'fr-3', name: 'fC'}, unitPriceFile: {id: 102, name: 'uC'}}},
{ID: 15, ParentID: 2, NextSiblingID: -1, name: 'tenderH', projType: 'Tender', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo, property: {feeFile: {id: 'qwqw', name: 'qweq'}, unitPriceFile: {id: 300, name: 'u30'}}}
];
/*function getTestDatas(){
let rst = [];
for(let i = 0; i < 1000; i ++){
let nid = i + 1 < 1000 ? i + 1 : -1;
let obj = {ID: i, ParentID: -1, NextSiblingID: nid, name : 'test' + i, projType: 'Project', userID: 76075, createDateTime: '2017-11-3', deleteInfo: deleteInfo,
unitPriceFiles: [{name: 'up' + i, id: i + 10000, deleteInfo: deleteInfo}], feeRateFiles: [{name: 'ff' + i, id: 'fr-' + i, deleteInfo: deleteInfo}]};
rst.push(obj);
}
return rst;
}*/
let gcTree = null;
let decDate = null;//恢复后的名称后缀(时间+恢复)
/*let projectType = {
folder: 'Folder',
tender: 'Tender',
project: 'Project',
engineering: 'Engineering'
};*/
let fileType = {
unitPriceFile: 'UnitPriceFile',
feeRateFile: 'FeeRateFile'
};
//恢复路径t = tender, e = engineering, p = project
let recPath = {t: 'T', t_e: 'T_E', t_e_p: 'T_E_P', e: 'E', e_p: 'E_P', p: 'P'};
let gcTreeSetting = {
tree: {
id: 'ID',
pid: 'ParentID',
nid: 'NextSiblingID',
btnColumn: 1,
nullId: -1
},
columns: [
{
head: '',
data: '',
width: '40',
event: {}
},
{
head: '工程列表',
data: 'name',
width: '50%',
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(icon, ' ', text);
},
getIcon: function (html, node) {
if (node.data.projType === projectType.tender) {
html.push('└ ');
}
}
}
},
{
head: '删除日期',
data: 'deleteDateTime',
width: '10%',
event: {
getText: function (html, node, text) {
if (node.data.projType === projectType.tender) {
html.push(deleted(node) ?
node.data.deleteInfo.deleteDateTime : '');
// 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 ? text : '');
}
}
}
},
{
head: '恢复',
data: 'recovery',
width: '10%',
event: {
getText: function (html, node, text) {
if(node.data.projType === projectType.project && deleted(node)){
html.push('恢复 ');
}
else if(node.data.projType === projectType.engineering && deleted(node)){
html.push('恢复 ');
}
else if(node.data.projType === projectType.tender && deleted(node)){
html.push('恢复 ');
}
else {
html.push('');
}
},
tdBindEvent: function(td, node){
$('a:eq(0)' ,td).bind('click', function () {
let tenderNodes = m_getTenders(node);
$('#rePoj .modal-header').empty();
$('p', '#rePoj .modal-body').remove();
$('#rePoj .modal-header').html(v_getTitle(node));
$('#rePoj .modal-body').html(v_getMoBody(node, tenderNodes));
console.log(node);
console.log(node.preSibling());
//test 获取更新的数据
/*let updateDatas = m_getRecDatas(node);
console.log(updateDatas);*/
});
}
}
},
{
head: '单价文件',
data: 'unitPriceFiles',
width: '10%',
event: {
getText: function (html, node, text) {
if(node.data.projType === projectType.project && node.data.unitPriceFiles !== undefined && node.data.unitPriceFiles.length > 0){
html.push('恢复 ');
}
},
tdBindEvent: function (td, node) {
$('a:eq(0)', td).bind('click', function () {
let unitPriceFiles = node.data.unitPriceFiles;
$('#reFile h5').text('恢复单价文件');
$('tr', '#reFile tbody').remove();
$('#reFile tbody').html(v_getFiles(fileType.unitPriceFile, unitPriceFiles));
});
}
}
},
{
head: '费率文件',
data: 'feeRateFiles',
width: '10%',
event: {
getText: function (html, node, text) {
if(node.data.projType === projectType.project && node.data.feeRateFiles !== undefined && node.data.feeRateFiles.length > 0){
html.push('恢复 ');
}
},
tdBindEvent: function (td, node) {
$('a:eq(0)', td).bind('click', function () {
let feeRateFiles = node.data.feeRateFiles;
$('#reFile h5').text('恢复费率文件');
$('tr', '#reFile tbody').remove();
$('#reFile tbody').html(v_getFiles(fileType.feeRateFile, feeRateFiles));
});
}
}
}
]
};
$(document).ready(function () {
$('#tab_pm_gc').on('show.bs.tab', function () {
gc_init();
Tree = null;
});
e_recFiles($('#reFileBtn'));
e_recProj($('#rePojBtn'));
});
function gc_init(){
let table = $('#gcTree');
$('thead', table).remove();
$('tbody', table).remove();
m_buildVirtualTree(temp_gc_datas);
gcTree = $.fn.treeTable.init(table, gcTreeSetting, temp_gc_datas);
//gcTree = $.fn.treeTable.init(table, gcTreeSetting, getTestDatas());
}
//项目恢复模态框标题
function v_getTitle(node){
let html = '';
html += '
恢复 ';
if(node.data.projType === projectType.project){
html += ' 建设项目 ';
}
else if(node.data.projType === projectType.engineering){
html += ' 单项工程';
}
else if(node.data.projType === projectType.tender){
html += ' 单位工程';
}
html += '× ';
return html;
}
//项目恢复模态框主体
function v_getMoBody(oprNode, nodes){
let html = '';
if(oprNode.data.projType === projectType.tender){
decDate = '(' + new Date().Format('MM-dd hh:mm:ss') + '恢复)';
let recName = oprNode.data.name + decDate;
html += '恢复后将重命名为 ' + recName + '
';
}
else {
if(oprNode.data.projType === projectType.project){
html += ' ' + oprNode.data.name + '下的单位工程都将恢复都将恢复,恢复后将重命名为
';
}
else if(oprNode.data.projType === projectType.engineering){
html += ' ' + oprNode.data.name + '下的单位工程都将恢复都将恢复,恢复后将重命名为
';
}
html += ('');
for(let i = 0, len = nodes.length; i < len; i++){
let recName = nodes[i].data.name + '(' + new Date().Format('MM-dd hh:mm:ss') +'恢复)';
html += '' + recName + ' 、';
}
html = html.slice(0, html.length - 1);
html += ('
');
}
html += ('点“确定”按钮,确认从回收站中恢复
');
return html;
}
//单价、费率文件恢复弹出框数据
function v_getFiles(type, files){
let html = '';
for(let i = 0, len = files.length; i < len; i ++){
let recName = type === fileType.unitPriceFile ? files[i].name + '单价文件' : files[i].name + '费率文件';
let fileId = type === fileType.unitPriceFile ? files[i].id : files[i].ID;
let recTime = new Date();
let recTimeA = recTime.Format('yyyy-MM-dd');
let recTimeB = recTime.Format('hh:mm:ss');
html += ''+ recName +' ' + recTimeA + ' ' + recTimeB + ' ';
}
return html;
}
//恢复单价、费率文件后前端显示变化
function v_recFiles(project, fileIds, type){
let projFiles;
if(type === fileType.unitPriceFile){
projFiles = project.data.unitPriceFiles;
}
else if(type === fileType.feeRateFile){
projFiles = project.data.feeRateFiles;
}
if(projFiles && projFiles.length > 0){
let tempFiles = [];
for(let i = 0, len = projFiles.length; i < len; i++){
let isExist = false;
for(let j = 0, jLen = fileIds.length; j < jLen; j++){
let id = projFiles[i].id || projFiles[i].ID || null;
if(id && id === fileIds[j]){
isExist = true;
}
}
if(!isExist){
tempFiles.push(projFiles[i]);
}
}
if(type === fileType.unitPriceFile){
project.data.unitPriceFiles = tempFiles;
}
else if(type === fileType.feeRateFile){
project.data.feeRateFiles = tempFiles;
}
}
}
function v_removeNode(node){
gcTree.removeNode(node);
let parent = node.parent || null;
if(parent && parent.children.length === 0 && parent.data !== undefined){
v_removeNode(parent);
}
}
function v_refreshNode(node){
if(deleted(node)){
delete node.data.deleteInfo;
}
gcTree.refreshNodesDom([node]);
let parent = node.parent || null;
if(parent && parent.data !== undefined){
v_refreshNode(parent);
}
}
//将获取的回收站中的数据建虚拟树
function m_buildVirtualTree(datas){
for(let i = 0, len = datas.length; i < len; i++){
let children = datas[i].children || null;
if(children){
m_buildVirtualTree(children);
}
let next = datas[i+1] || null;
if(next){
datas[i].NextSiblingID = next.ID;
}
else {
datas[i].NextSiblingID = -1;
}
}
}
//获得当前节点的tenders数据,模态提示框用
function m_getTenders(node){
if(node.data.projType === projectType.tender) return [node];
else {
let rst = [];
if(node.children.length > 0){
node.children.forEach(function (cNode) {
if(cNode.children.length > 0){
cNode.children.forEach(function (ccNode) {
if(ccNode.data.projType === projectType.tender) rst.push(ccNode);
});
}
else if(cNode.children.length === 0 && cNode.data.projType === projectType.tender){
rst.push(cNode);
}
});
}
return rst;
}
}
//获得要更新的数据(包含恢复的数据,维护项目管理树的数据)
function m_getRecDatas(oprNode){
let rst = Object.create(null);
let rstProj = [], rstFile = [];
let path;
if(oprNode.data.projType === projectType.tender){
path = recPath.t;
let engineering = oprNode.parent || null;
if(!engineering) return null;
let project = engineering.parent || null;
if(!project) return null;
if(engineering && deleted(engineering)){
path = recPath.t_e;
}
//恢复建设项目
if(project && deleted(project)){
path = recPath.t_e_p;
}
//恢复单价、费率文件
rstFile = rstFile.concat(getUpdateFiles([oprNode], project));
if(path === recPath.t){
rstProj = rstProj.concat(getUpdateDatas(projectType.tender, oprNode, true, true));
}
else if(path === recPath.t_e){
rstProj = rstProj.concat(getUpdateDatas(projectType.tender, oprNode, true, false));
rstProj = rstProj.concat(getUpdateDatas(projectType.engineering, engineering, true, true));
}
else if(path === recPath.t_e_p){
rstProj = rstProj.concat(getUpdateDatas(projectType.tender, oprNode, true, false));
rstProj = rstProj.concat(getUpdateDatas(projectType.engineering, engineering, true, false));
rstProj = rstProj.concat(getUpdateDatas(projectType.project, project, true, false));
}
}
else if(oprNode.data.projType === projectType.engineering){
path = recPath.e;
let project = oprNode.parent || null;
if(!project) return null;
//恢复建设项目
if(project && deleted(project)){
path = recPath.e_p;
}
let tenders = oprNode.children;
if(tenders.length > 0){
for(let i = 0, len = tenders.length; i < len; i++){
rstProj = rstProj.concat(getUpdateDatas(projectType.tender, tenders[i], true, false));
}
//恢复单价、费率文件
rstFile = rstFile.concat(getUpdateFiles(tenders, project));
}
if(path === recPath.e){
rstProj= rstProj.concat(getUpdateDatas(projectType.engineering, oprNode, true, true));
}
else if(path === recPath.e_p){
rstProj= rstProj.concat(getUpdateDatas(projectType.engineering, oprNode, true, false));
rstProj= rstProj.concat(getUpdateDatas(projectType.project, project, true, false));
}
}
else if(oprNode.data.projType === projectType.project){
path = recPath.p;
let engineerings = oprNode.children;
if(engineerings.length > 0){
let allTenders = [];
for(let i = 0, len = engineerings.length; i < len; i++){
//恢复单项工程
rstProj = rstProj.concat(getUpdateDatas(projectType.engineering, engineerings[i], false, false));
let tenders = engineerings[i].children;
allTenders = allTenders.concat(tenders);
for(let j = 0, jLen = tenders.length; j < jLen; j++){
//恢复单位工程
rstProj = rstProj.concat(getUpdateDatas(projectType.tender, tenders[j], false, false));
}
}
//恢复单价、费率文件
rstFile = rstFile.concat(getUpdateFiles(allTenders, oprNode));
}
//恢复建设项目
rstProj = rstProj.concat(getUpdateDatas(projectType.project, oprNode, false, false));
}
console.log(path);
rst.proj = rstProj;
rst.file = rstFile;
return rst;
}
//获得勾选的单价、费率文件的id
function m_getFilesIds(nodes){
let rstSet = new Set();
for(let i = 0, len = nodes.length; i < len; i++){
let fileId = $(nodes[i]).attr('fileId') || null;
if(fileId){
if($(nodes[i]).attr('fileType') === fileType.unitPriceFile){
fileId = parseInt(fileId);
}
rstSet.add(fileId);
}
}
return Array.from(rstSet);
}
function m_project(node){
if(node && node.data.projType === projectType.project) return node;
if(!node) return null;
let parent = node.parent || null;
if(!parent) return null;
if(parent && parent.data.projType === projectType.project) return parent;
let gParent = parent.parent || null;
if(!gParent) return null;
if(gParent && gParent.data.projType === projectType.project) return gParent;
return null;
}
//点击单价文件、费率文件下的恢复操作(确认)
function e_recFiles(btn){
btn.bind('click', function () {
let recIds = m_getFilesIds($('[name = "fileItems"]:checked'));
let fileType = $('[name = "fileItems"]:checked').attr('fileType');
let selected = gcTree.selected();
//backend
let updateDatas = [];
for(let i = 0, len = recIds.length; i < len; i++){
updateDatas.push(getUpdateObj(fileType, {id: recIds[i]}, {deleteInfo: null}));
}
//front
if(recIds.length > 0){
v_recFiles(selected, recIds, fileType);
if(deleted(selected)){
delete selected.data.deleteInfo;
}
gcTree.refreshNodesDom([selected]);
}
});
}
//点击项目下的恢复操作(确认
function e_recProj(btn){
btn.bind('click', function () {
let selected = gcTree.selected();
//backend
let updateObj = m_getRecDatas(selected);
let updateDatas = updateObj.proj.concat(updateObj.file);
let fileObj = getRecFileObj(updateObj.file);
console.log(updateObj);
//保存成功后回调front
//front
let project = m_project(selected);
if(project){
if(fileObj[fileType.unitPriceFile].length > 0){
v_recFiles(project, fileObj[fileType.unitPriceFile], fileType.unitPriceFile);
}
if(fileObj[fileType.feeRateFile].length > 0){
v_recFiles(project, fileObj[fileType.feeRateFile], fileType.feeRateFile);
}
}
v_removeNode(selected);
v_refreshNode(selected);
});
}
function a_getGC(callback){
$.ajax({
type: 'post',
url: '/pm/api/getGCDatas',
dataType: 'json',
timeout: 5000,
success: function (result) {
if(!result.error){
if(callback){
callback(result.data);
}
}
}
})
}
function a_rec(nodes, callback){
$.ajax({
type: 'post',
url: '/pm/api/recGC',
data: {nodes: JSON.stringify(nodes)},
dataType: 'json',
timeout: 5000,
success: function (result) {
if(!result.error){
if(callback){
callback();
}
}
}
})
}
function deleted(node){
return node.data.deleteInfo !== undefined && node.data.deleteInfo.deleted;
}
function fIsExist(files, id, type){
let isExist = false;
for(let i = 0, len = files.length; i < len; i++){
if((type === fileType.unitPriceFile && files[i].id === id) || (type === fileType.feeRateFile && files[i].ID === id)){
isExist = true;
break;
}
}
return isExist;
}
function getRecFileObj(files){
let rst = Object.create(null);
let rst_UF = [], rst_FF = [];
for(let i = 0, len = files.length; i < len; i++){
if(files[i].findData !== undefined && files[i].findData.id !== undefined){
if(files[i].updateType === fileType.unitPriceFile){
rst_UF.push(files[i].findData.id);
}
else if(files[i].updateType === fileType.feeRateFile){
rst_FF.push(files[i].findData.id);
}
}
}
rst[fileType.unitPriceFile] = rst_UF;
rst[fileType.feeRateFile] = rst_FF;
return rst;
}
function getUpdateObj(updateType, findData, updateData){
let obj = Object.create(null);
obj.updateType = updateType;
obj.findData = findData;
obj.updateData = updateData;
return obj;
}
function getUpdateDatas(updateType, node, mtNID, mtPM){
let rst = [];
if(!decDate){
decDate = '(' + new Date().Format('MM-dd hh:mm:ss') + '恢复)';
}
if(updateType === projectType.tender || updateType === projectType.engineering){
//维护回收站树
/* if(mtGC){
rst.push(getUpdateObj(updateType, {NextSiblingID: node.data.ID, 'deleteInfo.deleted': true}, {NextSiblingID: node.data.NextSiblingID}));
}*/
//维护项目管理树
if(mtPM){
rst.push(getUpdateObj(updateType, {ParentID: node.data.ParentID, NextSiblingID: -1, deleteInfo: null}, {NextSiblingID: node.data.ID}));
}
//恢复
if(mtNID){
rst.push(getUpdateObj(updateType, {ID: node.data.ID, name: node.data.name + decDate}, {deleteInfo: null, NextSiblingID: -1}));
}
else {
rst.push(getUpdateObj(updateType, {ID: node.data.ID, name: node.data.name + decDate}, {deleteInfo: null}));
}
}
else if(updateType === projectType.project){
/* //维护回收站树
if(mtGC){
rst.push(getUpdateObj(updateType, {NextSiblingID: node.data.ID, 'deleteInfo.deleted': true}, {NextSiblingID: node.data.NextSiblingID}));
}*/
//恢复
rst.push(getUpdateObj(updateType, {ID: node.data.ID, name: node.data.name + decDate}, {deleteInfo: null}));//NextSibling为undefined,后端处理
}
return rst;
}
//unitPriceFile or feeRateFile
function getUpdateFiles(tenders, project){
let unitFiles = [], feeFiles = [], rst = [];
for(let i = 0, len = tenders.length; i < len; i++){
//恢复单价文件
if(project && project.data.unitPriceFiles.length > 0 && fIsExist(project.data.unitPriceFiles, tenders[i].data.property.unitPriceFile.id, fileType.unitPriceFile)){
unitFiles.push(tenders[i].data.property.unitPriceFile.id);
}
//恢复费率文件
if(project && project.data.feeRateFiles.length > 0 && fIsExist(project.data.feeRateFiles, tenders[i].data.property.feeFile.id, fileType.feeRateFile)){
feeFiles.push(tenders[i].data.property.feeFile.id);
}
}
let ufIds = Array.from(new Set(unitFiles));
let ffIds = Array.from(new Set(feeFiles));
for(let i = 0, len = ufIds.length; i < len; i++){
rst.push(getUpdateObj(fileType.unitPriceFile, {id: ufIds[i]}, {deleteInfo: null}));
}
for(let i = 0, len = ffIds.length; i < len; i++){
rst.push(getUpdateObj(fileType.feeRateFile, {id: ffIds[i]}, {deleteInfo: null}));
}
return rst;
}