pm_gc.js 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656
  1. /**
  2. * Created by Zhong on 2017/10/30.
  3. */
  4. //测试数据
  5. let deleteInfo = {deleteBy: 76075, deleteDateTime: '2017-10-31', deleted: true};
  6. let temp_gc_datas = [
  7. {ID: 1, ParentID: -1, NextSiblingID: 7, name: 'testTreeA', projType: 'Project', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo,
  8. 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}],
  9. feeRateFiles: [{name: 'fA', ID: 'fr-1', rootProjectID: 1, userID: 76075, deleteInfo: deleteInfo}, {name: 'fB', ID: 'fr-2', rootProjectID: 1, userID: 76075, deleteInfo: deleteInfo}]},
  10. {ID: 2, ParentID: 1, NextSiblingID: 3, name: 'enA', projType: 'Engineering', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo},
  11. {ID: 3, ParentID: 1, NextSiblingID: -1, name: 'enB', projType: 'Engineering', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo},
  12. {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'}}},
  13. {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'}}},
  14. {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'}}},
  15. {ID: 7, ParentID: -1, NextSiblingID: 10, name: 'testTreeB', projType: 'Project', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo,
  16. 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}],
  17. feeRateFiles: [{name: 'fC', ID: 'fr-3', rootProjectID: 7, userID: 76075, deleteInfo: deleteInfo}]},
  18. {ID: 8, ParentID: 7, NextSiblingID: -1, name: 'enC', projType: 'Engineering', userID: 76075, createDateTime: '2017-10-30', deleteInfo: deleteInfo},
  19. {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'}}},
  20. {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}]},
  21. {ID: 11, ParentID: 10, NextSiblingID: -1, name: 'enD', projType: 'Engineering', userID: 76075, createDateTime: '2017-10-30'},
  22. {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'}}},
  23. {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'}}},
  24. {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'}}},
  25. {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'}}}
  26. ];
  27. /*function getTestDatas(){
  28. let rst = [];
  29. for(let i = 0; i < 1000; i ++){
  30. let nid = i + 1 < 1000 ? i + 1 : -1;
  31. let obj = {ID: i, ParentID: -1, NextSiblingID: nid, name : 'test' + i, projType: 'Project', userID: 76075, createDateTime: '2017-11-3', deleteInfo: deleteInfo,
  32. unitPriceFiles: [{name: 'up' + i, id: i + 10000, deleteInfo: deleteInfo}], feeRateFiles: [{name: 'ff' + i, id: 'fr-' + i, deleteInfo: deleteInfo}]};
  33. rst.push(obj);
  34. }
  35. return rst;
  36. }*/
  37. let gcTree = null;
  38. let decDate = null;//恢复后的名称后缀(时间+恢复)
  39. /*let projectType = {
  40. folder: 'Folder',
  41. tender: 'Tender',
  42. project: 'Project',
  43. engineering: 'Engineering'
  44. };*/
  45. let fileType = {
  46. unitPriceFile: 'UnitPriceFile',
  47. feeRateFile: 'FeeRateFile'
  48. };
  49. //恢复路径t = tender, e = engineering, p = project
  50. let recPath = {t: 'T', t_e: 'T_E', t_e_p: 'T_E_P', e: 'E', e_p: 'E_P', p: 'P'};
  51. let gcTreeSetting = {
  52. tree: {
  53. id: 'ID',
  54. pid: 'ParentID',
  55. nid: 'NextSiblingID',
  56. btnColumn: 1,
  57. nullId: -1
  58. },
  59. columns: [
  60. {
  61. head: '',
  62. data: '',
  63. width: '40',
  64. event: {}
  65. },
  66. {
  67. head: '工程列表',
  68. data: 'name',
  69. width: '50%',
  70. event: {
  71. getText: function (html, node, text) {
  72. let className = '';
  73. switch (node.data.projType) {
  74. case projectType.folder:
  75. className = "fa fa-folder-open-o";
  76. break;
  77. case projectType.tender:
  78. className = "fa fa-sticky-note-o";
  79. break;
  80. case projectType.project:
  81. className = "fa fa-cubes";
  82. break;
  83. case projectType.engineering:
  84. className = "fa fa-cube";
  85. break;
  86. }
  87. let icon = '<i class ="tree-icon '+ className +'"></i>';
  88. html.push(icon, '&nbsp;', text);
  89. },
  90. getIcon: function (html, node) {
  91. if (node.data.projType === projectType.tender) {
  92. html.push('<span class="poj-icon">└</span>');
  93. }
  94. }
  95. }
  96. },
  97. {
  98. head: '删除日期',
  99. data: 'deleteDateTime',
  100. width: '10%',
  101. event: {
  102. getText: function (html, node, text) {
  103. if (node.data.projType === projectType.tender) {
  104. html.push(deleted(node) ?
  105. node.data.deleteInfo.deleteDateTime : '');
  106. // html.push(text ? new Date(text).Format('yyyy-MM-dd') : '');
  107. }
  108. }
  109. }
  110. },
  111. {
  112. head: '创建日期',
  113. data: 'createDateTime',
  114. width: '10%',
  115. event: {
  116. getText: function (html, node, text) {
  117. if (node.data.projType === projectType.tender) {
  118. html.push(text ? text : '');
  119. }
  120. }
  121. }
  122. },
  123. {
  124. head: '恢复',
  125. data: 'recovery',
  126. width: '10%',
  127. event: {
  128. getText: function (html, node, text) {
  129. if(node.data.projType === projectType.project && deleted(node)){
  130. html.push('<a href="javascript:void(0);" data-toggle="modal" data-target="#rePoj">恢复</a>');
  131. }
  132. else if(node.data.projType === projectType.engineering && deleted(node)){
  133. html.push('<a href="javascript:void(0);" data-toggle="modal" data-target="#rePoj">恢复</a>');
  134. }
  135. else if(node.data.projType === projectType.tender && deleted(node)){
  136. html.push('<a href="javascript:void(0);" data-toggle="modal" data-target="#rePoj">恢复</a>');
  137. }
  138. else {
  139. html.push('');
  140. }
  141. },
  142. tdBindEvent: function(td, node){
  143. $('a:eq(0)' ,td).bind('click', function () {
  144. let tenderNodes = m_getTenders(node);
  145. $('#rePoj .modal-header').empty();
  146. $('p', '#rePoj .modal-body').remove();
  147. $('#rePoj .modal-header').html(v_getTitle(node));
  148. $('#rePoj .modal-body').html(v_getMoBody(node, tenderNodes));
  149. console.log(node);
  150. console.log(node.preSibling());
  151. //test 获取更新的数据
  152. /*let updateDatas = m_getRecDatas(node);
  153. console.log(updateDatas);*/
  154. });
  155. }
  156. }
  157. },
  158. {
  159. head: '单价文件',
  160. data: 'unitPriceFiles',
  161. width: '10%',
  162. event: {
  163. getText: function (html, node, text) {
  164. if(node.data.projType === projectType.project && node.data.unitPriceFiles !== undefined && node.data.unitPriceFiles.length > 0){
  165. html.push('<a href="javascript:void(0);" data-toggle="modal" data-target="#reFile">恢复</a>');
  166. }
  167. },
  168. tdBindEvent: function (td, node) {
  169. $('a:eq(0)', td).bind('click', function () {
  170. let unitPriceFiles = node.data.unitPriceFiles;
  171. $('#reFile h5').text('恢复单价文件');
  172. $('tr', '#reFile tbody').remove();
  173. $('#reFile tbody').html(v_getFiles(fileType.unitPriceFile, unitPriceFiles));
  174. });
  175. }
  176. }
  177. },
  178. {
  179. head: '费率文件',
  180. data: 'feeRateFiles',
  181. width: '10%',
  182. event: {
  183. getText: function (html, node, text) {
  184. if(node.data.projType === projectType.project && node.data.feeRateFiles !== undefined && node.data.feeRateFiles.length > 0){
  185. html.push('<a href="javascript:void(0);" data-toggle="modal" data-target="#reFile">恢复</a>');
  186. }
  187. },
  188. tdBindEvent: function (td, node) {
  189. $('a:eq(0)', td).bind('click', function () {
  190. let feeRateFiles = node.data.feeRateFiles;
  191. $('#reFile h5').text('恢复费率文件');
  192. $('tr', '#reFile tbody').remove();
  193. $('#reFile tbody').html(v_getFiles(fileType.feeRateFile, feeRateFiles));
  194. });
  195. }
  196. }
  197. }
  198. ]
  199. };
  200. $(document).ready(function () {
  201. $('#tab_pm_gc').on('show.bs.tab', function () {
  202. gc_init();
  203. Tree = null;
  204. });
  205. e_recFiles($('#reFileBtn'));
  206. e_recProj($('#rePojBtn'));
  207. });
  208. function gc_init(){
  209. let table = $('#gcTree');
  210. $('thead', table).remove();
  211. $('tbody', table).remove();
  212. m_buildVirtualTree(temp_gc_datas);
  213. gcTree = $.fn.treeTable.init(table, gcTreeSetting, temp_gc_datas);
  214. //gcTree = $.fn.treeTable.init(table, gcTreeSetting, getTestDatas());
  215. }
  216. //项目恢复模态框标题
  217. function v_getTitle(node){
  218. let html = '';
  219. html += '<h5 class="modal-title">恢复 ';
  220. if(node.data.projType === projectType.project){
  221. html += '<i class="fa fa-cubes"></i>建设项目</h5>';
  222. }
  223. else if(node.data.projType === projectType.engineering){
  224. html += '<i class="fa fa-cube"></i>单项工程</h5>';
  225. }
  226. else if(node.data.projType === projectType.tender){
  227. html += '<i class="fa fa-sticky-note-o"></i>单位工程</h5>';
  228. }
  229. html += '<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>';
  230. return html;
  231. }
  232. //项目恢复模态框主体
  233. function v_getMoBody(oprNode, nodes){
  234. let html = '';
  235. if(oprNode.data.projType === projectType.tender){
  236. decDate = '(' + new Date().Format('MM-dd hh:mm:ss') + '恢复)';
  237. let recName = oprNode.data.name + decDate;
  238. html += '<p>恢复后将重命名为 <b>' + recName + '</b></p>';
  239. }
  240. else {
  241. if(oprNode.data.projType === projectType.project){
  242. html += '<p><i class="fa fa-cubes"></i> ' + oprNode.data.name + '下的单位工程都将恢复都将恢复,恢复后将重命名为</p>';
  243. }
  244. else if(oprNode.data.projType === projectType.engineering){
  245. html += '<p><i class="fa fa-cube"></i> ' + oprNode.data.name + '下的单位工程都将恢复都将恢复,恢复后将重命名为</p>';
  246. }
  247. html += ('<p>');
  248. for(let i = 0, len = nodes.length; i < len; i++){
  249. let recName = nodes[i].data.name + '(' + new Date().Format('MM-dd hh:mm:ss') +'恢复)';
  250. html += '<b>' + recName + '</b>、';
  251. }
  252. html = html.slice(0, html.length - 1);
  253. html += ('</p>');
  254. }
  255. html += ('<p>点“确定”按钮,确认从回收站中恢复</p>');
  256. return html;
  257. }
  258. //单价、费率文件恢复弹出框数据
  259. function v_getFiles(type, files){
  260. let html = '';
  261. for(let i = 0, len = files.length; i < len; i ++){
  262. let recName = type === fileType.unitPriceFile ? files[i].name + '单价文件' : files[i].name + '费率文件';
  263. let fileId = type === fileType.unitPriceFile ? files[i].id : files[i].ID;
  264. let recTime = new Date();
  265. let recTimeA = recTime.Format('yyyy-MM-dd');
  266. let recTimeB = recTime.Format('hh:mm:ss');
  267. html += '<tr><td>'+ recName +'</td><td>' + recTimeA + '<br>' + recTimeB + '</td><td><input name="fileItems" type="checkbox" fileId = "' + fileId + '" fileType = "' + type + '"></td></tr>';
  268. }
  269. return html;
  270. }
  271. //恢复单价、费率文件后前端显示变化
  272. function v_recFiles(project, fileIds, type){
  273. let projFiles;
  274. if(type === fileType.unitPriceFile){
  275. projFiles = project.data.unitPriceFiles;
  276. }
  277. else if(type === fileType.feeRateFile){
  278. projFiles = project.data.feeRateFiles;
  279. }
  280. if(projFiles && projFiles.length > 0){
  281. let tempFiles = [];
  282. for(let i = 0, len = projFiles.length; i < len; i++){
  283. let isExist = false;
  284. for(let j = 0, jLen = fileIds.length; j < jLen; j++){
  285. let id = projFiles[i].id || projFiles[i].ID || null;
  286. if(id && id === fileIds[j]){
  287. isExist = true;
  288. }
  289. }
  290. if(!isExist){
  291. tempFiles.push(projFiles[i]);
  292. }
  293. }
  294. if(type === fileType.unitPriceFile){
  295. project.data.unitPriceFiles = tempFiles;
  296. }
  297. else if(type === fileType.feeRateFile){
  298. project.data.feeRateFiles = tempFiles;
  299. }
  300. }
  301. }
  302. function v_removeNode(node){
  303. gcTree.removeNode(node);
  304. let parent = node.parent || null;
  305. if(parent && parent.children.length === 0 && parent.data !== undefined){
  306. v_removeNode(parent);
  307. }
  308. }
  309. function v_refreshNode(node){
  310. if(deleted(node)){
  311. delete node.data.deleteInfo;
  312. }
  313. gcTree.refreshNodesDom([node]);
  314. let parent = node.parent || null;
  315. if(parent && parent.data !== undefined){
  316. v_refreshNode(parent);
  317. }
  318. }
  319. //将获取的回收站中的数据建虚拟树
  320. function m_buildVirtualTree(datas){
  321. for(let i = 0, len = datas.length; i < len; i++){
  322. let children = datas[i].children || null;
  323. if(children){
  324. m_buildVirtualTree(children);
  325. }
  326. let next = datas[i+1] || null;
  327. if(next){
  328. datas[i].NextSiblingID = next.ID;
  329. }
  330. else {
  331. datas[i].NextSiblingID = -1;
  332. }
  333. }
  334. }
  335. //获得当前节点的tenders数据,模态提示框用
  336. function m_getTenders(node){
  337. if(node.data.projType === projectType.tender) return [node];
  338. else {
  339. let rst = [];
  340. if(node.children.length > 0){
  341. node.children.forEach(function (cNode) {
  342. if(cNode.children.length > 0){
  343. cNode.children.forEach(function (ccNode) {
  344. if(ccNode.data.projType === projectType.tender) rst.push(ccNode);
  345. });
  346. }
  347. else if(cNode.children.length === 0 && cNode.data.projType === projectType.tender){
  348. rst.push(cNode);
  349. }
  350. });
  351. }
  352. return rst;
  353. }
  354. }
  355. //获得要更新的数据(包含恢复的数据,维护项目管理树的数据)
  356. function m_getRecDatas(oprNode){
  357. let rst = Object.create(null);
  358. let rstProj = [], rstFile = [];
  359. let path;
  360. if(oprNode.data.projType === projectType.tender){
  361. path = recPath.t;
  362. let engineering = oprNode.parent || null;
  363. if(!engineering) return null;
  364. let project = engineering.parent || null;
  365. if(!project) return null;
  366. if(engineering && deleted(engineering)){
  367. path = recPath.t_e;
  368. }
  369. //恢复建设项目
  370. if(project && deleted(project)){
  371. path = recPath.t_e_p;
  372. }
  373. //恢复单价、费率文件
  374. rstFile = rstFile.concat(getUpdateFiles([oprNode], project));
  375. if(path === recPath.t){
  376. rstProj = rstProj.concat(getUpdateDatas(projectType.tender, oprNode, true, true));
  377. }
  378. else if(path === recPath.t_e){
  379. rstProj = rstProj.concat(getUpdateDatas(projectType.tender, oprNode, true, false));
  380. rstProj = rstProj.concat(getUpdateDatas(projectType.engineering, engineering, true, true));
  381. }
  382. else if(path === recPath.t_e_p){
  383. rstProj = rstProj.concat(getUpdateDatas(projectType.tender, oprNode, true, false));
  384. rstProj = rstProj.concat(getUpdateDatas(projectType.engineering, engineering, true, false));
  385. rstProj = rstProj.concat(getUpdateDatas(projectType.project, project, true, false));
  386. }
  387. }
  388. else if(oprNode.data.projType === projectType.engineering){
  389. path = recPath.e;
  390. let project = oprNode.parent || null;
  391. if(!project) return null;
  392. //恢复建设项目
  393. if(project && deleted(project)){
  394. path = recPath.e_p;
  395. }
  396. let tenders = oprNode.children;
  397. if(tenders.length > 0){
  398. for(let i = 0, len = tenders.length; i < len; i++){
  399. rstProj = rstProj.concat(getUpdateDatas(projectType.tender, tenders[i], true, false));
  400. }
  401. //恢复单价、费率文件
  402. rstFile = rstFile.concat(getUpdateFiles(tenders, project));
  403. }
  404. if(path === recPath.e){
  405. rstProj= rstProj.concat(getUpdateDatas(projectType.engineering, oprNode, true, true));
  406. }
  407. else if(path === recPath.e_p){
  408. rstProj= rstProj.concat(getUpdateDatas(projectType.engineering, oprNode, true, false));
  409. rstProj= rstProj.concat(getUpdateDatas(projectType.project, project, true, false));
  410. }
  411. }
  412. else if(oprNode.data.projType === projectType.project){
  413. path = recPath.p;
  414. let engineerings = oprNode.children;
  415. if(engineerings.length > 0){
  416. let allTenders = [];
  417. for(let i = 0, len = engineerings.length; i < len; i++){
  418. //恢复单项工程
  419. rstProj = rstProj.concat(getUpdateDatas(projectType.engineering, engineerings[i], false, false));
  420. let tenders = engineerings[i].children;
  421. allTenders = allTenders.concat(tenders);
  422. for(let j = 0, jLen = tenders.length; j < jLen; j++){
  423. //恢复单位工程
  424. rstProj = rstProj.concat(getUpdateDatas(projectType.tender, tenders[j], false, false));
  425. }
  426. }
  427. //恢复单价、费率文件
  428. rstFile = rstFile.concat(getUpdateFiles(allTenders, oprNode));
  429. }
  430. //恢复建设项目
  431. rstProj = rstProj.concat(getUpdateDatas(projectType.project, oprNode, false, false));
  432. }
  433. console.log(path);
  434. rst.proj = rstProj;
  435. rst.file = rstFile;
  436. return rst;
  437. }
  438. //获得勾选的单价、费率文件的id
  439. function m_getFilesIds(nodes){
  440. let rstSet = new Set();
  441. for(let i = 0, len = nodes.length; i < len; i++){
  442. let fileId = $(nodes[i]).attr('fileId') || null;
  443. if(fileId){
  444. if($(nodes[i]).attr('fileType') === fileType.unitPriceFile){
  445. fileId = parseInt(fileId);
  446. }
  447. rstSet.add(fileId);
  448. }
  449. }
  450. return Array.from(rstSet);
  451. }
  452. function m_project(node){
  453. if(node && node.data.projType === projectType.project) return node;
  454. if(!node) return null;
  455. let parent = node.parent || null;
  456. if(!parent) return null;
  457. if(parent && parent.data.projType === projectType.project) return parent;
  458. let gParent = parent.parent || null;
  459. if(!gParent) return null;
  460. if(gParent && gParent.data.projType === projectType.project) return gParent;
  461. return null;
  462. }
  463. //点击单价文件、费率文件下的恢复操作(确认)
  464. function e_recFiles(btn){
  465. btn.bind('click', function () {
  466. let recIds = m_getFilesIds($('[name = "fileItems"]:checked'));
  467. let fileType = $('[name = "fileItems"]:checked').attr('fileType');
  468. let selected = gcTree.selected();
  469. //backend
  470. let updateDatas = [];
  471. for(let i = 0, len = recIds.length; i < len; i++){
  472. updateDatas.push(getUpdateObj(fileType, {id: recIds[i]}, {deleteInfo: null}));
  473. }
  474. //front
  475. if(recIds.length > 0){
  476. v_recFiles(selected, recIds, fileType);
  477. if(deleted(selected)){
  478. delete selected.data.deleteInfo;
  479. }
  480. gcTree.refreshNodesDom([selected]);
  481. }
  482. });
  483. }
  484. //点击项目下的恢复操作(确认
  485. function e_recProj(btn){
  486. btn.bind('click', function () {
  487. let selected = gcTree.selected();
  488. //backend
  489. let updateObj = m_getRecDatas(selected);
  490. let updateDatas = updateObj.proj.concat(updateObj.file);
  491. let fileObj = getRecFileObj(updateObj.file);
  492. console.log(updateObj);
  493. //保存成功后回调front
  494. //front
  495. let project = m_project(selected);
  496. if(project){
  497. if(fileObj[fileType.unitPriceFile].length > 0){
  498. v_recFiles(project, fileObj[fileType.unitPriceFile], fileType.unitPriceFile);
  499. }
  500. if(fileObj[fileType.feeRateFile].length > 0){
  501. v_recFiles(project, fileObj[fileType.feeRateFile], fileType.feeRateFile);
  502. }
  503. }
  504. v_removeNode(selected);
  505. v_refreshNode(selected);
  506. });
  507. }
  508. function a_getGC(callback){
  509. $.ajax({
  510. type: 'post',
  511. url: '/pm/api/getGCDatas',
  512. dataType: 'json',
  513. timeout: 5000,
  514. success: function (result) {
  515. if(!result.error){
  516. if(callback){
  517. callback(result.data);
  518. }
  519. }
  520. }
  521. })
  522. }
  523. function a_rec(nodes, callback){
  524. $.ajax({
  525. type: 'post',
  526. url: '/pm/api/recGC',
  527. data: {nodes: JSON.stringify(nodes)},
  528. dataType: 'json',
  529. timeout: 5000,
  530. success: function (result) {
  531. if(!result.error){
  532. if(callback){
  533. callback();
  534. }
  535. }
  536. }
  537. })
  538. }
  539. function deleted(node){
  540. return node.data.deleteInfo !== undefined && node.data.deleteInfo.deleted;
  541. }
  542. function fIsExist(files, id, type){
  543. let isExist = false;
  544. for(let i = 0, len = files.length; i < len; i++){
  545. if((type === fileType.unitPriceFile && files[i].id === id) || (type === fileType.feeRateFile && files[i].ID === id)){
  546. isExist = true;
  547. break;
  548. }
  549. }
  550. return isExist;
  551. }
  552. function getRecFileObj(files){
  553. let rst = Object.create(null);
  554. let rst_UF = [], rst_FF = [];
  555. for(let i = 0, len = files.length; i < len; i++){
  556. if(files[i].findData !== undefined && files[i].findData.id !== undefined){
  557. if(files[i].updateType === fileType.unitPriceFile){
  558. rst_UF.push(files[i].findData.id);
  559. }
  560. else if(files[i].updateType === fileType.feeRateFile){
  561. rst_FF.push(files[i].findData.id);
  562. }
  563. }
  564. }
  565. rst[fileType.unitPriceFile] = rst_UF;
  566. rst[fileType.feeRateFile] = rst_FF;
  567. return rst;
  568. }
  569. function getUpdateObj(updateType, findData, updateData){
  570. let obj = Object.create(null);
  571. obj.updateType = updateType;
  572. obj.findData = findData;
  573. obj.updateData = updateData;
  574. return obj;
  575. }
  576. function getUpdateDatas(updateType, node, mtNID, mtPM){
  577. let rst = [];
  578. if(!decDate){
  579. decDate = '(' + new Date().Format('MM-dd hh:mm:ss') + '恢复)';
  580. }
  581. if(updateType === projectType.tender || updateType === projectType.engineering){
  582. //维护回收站树
  583. /* if(mtGC){
  584. rst.push(getUpdateObj(updateType, {NextSiblingID: node.data.ID, 'deleteInfo.deleted': true}, {NextSiblingID: node.data.NextSiblingID}));
  585. }*/
  586. //维护项目管理树
  587. if(mtPM){
  588. rst.push(getUpdateObj(updateType, {ParentID: node.data.ParentID, NextSiblingID: -1, deleteInfo: null}, {NextSiblingID: node.data.ID}));
  589. }
  590. //恢复
  591. if(mtNID){
  592. rst.push(getUpdateObj(updateType, {ID: node.data.ID, name: node.data.name + decDate}, {deleteInfo: null, NextSiblingID: -1}));
  593. }
  594. else {
  595. rst.push(getUpdateObj(updateType, {ID: node.data.ID, name: node.data.name + decDate}, {deleteInfo: null}));
  596. }
  597. }
  598. else if(updateType === projectType.project){
  599. /* //维护回收站树
  600. if(mtGC){
  601. rst.push(getUpdateObj(updateType, {NextSiblingID: node.data.ID, 'deleteInfo.deleted': true}, {NextSiblingID: node.data.NextSiblingID}));
  602. }*/
  603. //恢复
  604. rst.push(getUpdateObj(updateType, {ID: node.data.ID, name: node.data.name + decDate}, {deleteInfo: null}));//NextSibling为undefined,后端处理
  605. }
  606. return rst;
  607. }
  608. //unitPriceFile or feeRateFile
  609. function getUpdateFiles(tenders, project){
  610. let unitFiles = [], feeFiles = [], rst = [];
  611. for(let i = 0, len = tenders.length; i < len; i++){
  612. //恢复单价文件
  613. if(project && project.data.unitPriceFiles.length > 0 && fIsExist(project.data.unitPriceFiles, tenders[i].data.property.unitPriceFile.id, fileType.unitPriceFile)){
  614. unitFiles.push(tenders[i].data.property.unitPriceFile.id);
  615. }
  616. //恢复费率文件
  617. if(project && project.data.feeRateFiles.length > 0 && fIsExist(project.data.feeRateFiles, tenders[i].data.property.feeFile.id, fileType.feeRateFile)){
  618. feeFiles.push(tenders[i].data.property.feeFile.id);
  619. }
  620. }
  621. let ufIds = Array.from(new Set(unitFiles));
  622. let ffIds = Array.from(new Set(feeFiles));
  623. for(let i = 0, len = ufIds.length; i < len; i++){
  624. rst.push(getUpdateObj(fileType.unitPriceFile, {id: ufIds[i]}, {deleteInfo: null}));
  625. }
  626. for(let i = 0, len = ffIds.length; i < len; i++){
  627. rst.push(getUpdateObj(fileType.feeRateFile, {id: ffIds[i]}, {deleteInfo: null}));
  628. }
  629. return rst;
  630. }