pm_gc.js 27 KB

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