pm_gc.js 48 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208
  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. const gcTreeObj = {
  163. tree: null,
  164. workBook: null,
  165. setting: {
  166. tree: {
  167. id: 'ID',
  168. pid: 'ParentID',
  169. nid: 'NextSiblingID',
  170. rootId: -1,
  171. autoUpdate: false
  172. },
  173. header: [
  174. {name: '工程列表', dataCode: 'name', width: 800, vAlign: 'center', hAlign: 'left'},
  175. {name: '删除日期', dataCode: 'deleteDateTime', width: 170, vAlign: 'center', hAlign: 'left'},
  176. {name: '创建日期', dataCode: 'createDateTime', width: 170, vAlign: 'center', hAlign: 'left'},
  177. {name: '恢复', dataCode: 'recovery', width: 170, vAlign: 'center', hAlign: 'left'},
  178. {name: '单价文件', dataCode: 'unitPriceFile', width: 170, vAlign: 'center', hAlign: 'left'},
  179. {name: '费率文件', dataCode: 'feeRateFile', width: 170, vAlign: 'center', hAlign: 'left'}
  180. ],
  181. //选中行颜色
  182. style: {
  183. defalutBackColor: 'White',
  184. selectedColor: '#BBFFFF'
  185. },
  186. options: {
  187. tabStripVisible: false,
  188. allowCopyPasteExcelStyle : false,
  189. allowExtendPasteRange: false,
  190. allowUserDragDrop : false,
  191. allowUserDragFill: false,
  192. scrollbarMaxAlign : true
  193. }
  194. },
  195. renderSheetFuc: function (sheet, fuc) {
  196. sheet.suspendPaint();
  197. sheet.suspendEvent();
  198. fuc();
  199. sheet.resumePaint();
  200. sheet.resumeEvent();
  201. },
  202. setOptions: function (workbook, opts) {
  203. for(let opt in opts){
  204. workbook.options[opt] = opts[opt];
  205. }
  206. },
  207. bindEvent: function (workBook) {
  208. const _events = GC.Spread.Sheets.Events;
  209. let sheet = workBook.getActiveSheet();
  210. //改变选中节点set selected
  211. sheet.bind(_events.SelectionChanging, this.onSelectionChanging);
  212. },
  213. buildHeader: function (sheet, headers) {
  214. let me = this;
  215. let fuc = function () {
  216. sheet.options.isProtected = true;
  217. sheet.options.protectionOptions = {
  218. allowResizeRows: true,
  219. allowResizeColumns: true
  220. };
  221. sheet.setColumnCount(headers.length);
  222. sheet.setRowHeight(0, 40, GC.Spread.Sheets.SheetArea.colHeader);
  223. for(let i = 0, len = headers.length; i < len; i++){
  224. sheet.setValue(0, i, headers[i].name, GC.Spread.Sheets.SheetArea.colHeader);
  225. sheet.setColumnWidth(i, headers[i].width, GC.Spread.Sheets.SheetArea.colHeader);
  226. }
  227. };
  228. me.renderSheetFuc(sheet, fuc);
  229. },
  230. buildSheet: function () {
  231. if(!this.workBook){
  232. this.workBook = new GC.Spread.Sheets.Workbook($('#gcSpread')[0], {sheetCount: 1});
  233. this.setOptions(this.workBook, this.setting.options);
  234. this.buildHeader(this.workBook.getActiveSheet(), this.setting.header);
  235. this.bindEvent(this.workBook);
  236. }
  237. },
  238. getSelStyle: function (backColor) {
  239. let style = new GC.Spread.Sheets.Style();
  240. style.backColor = backColor;
  241. style.borderLeft = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
  242. style.borderTop = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
  243. style.borderRight = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
  244. style.borderBottom = new GC.Spread.Sheets.LineBorder("#D4D4D4", GC.Spread.Sheets.LineStyle.thin);
  245. return style;
  246. },
  247. //设置选中行底色
  248. setSelStyle: function (sel, backColor) {
  249. let me = this;
  250. let sheet = me.workBook.getSheet(0);
  251. me.renderSheetFuc(sheet, function () {
  252. let style = me.getSelStyle(backColor);
  253. /*sel.row = sel.row === -1 ? 0 : sel.row;*/
  254. for(let i = 0; i < sel.rowCount; i++){
  255. let row = i + sel.row;
  256. sheet.setStyle(row, -1, style);
  257. }
  258. });
  259. },
  260. initSelection: function (newSel, oldSel = null) {
  261. let me = this;
  262. let node = me.tree.items[newSel.row];
  263. me.tree.selected = node;
  264. //恢复底色
  265. if(oldSel){
  266. me.setSelStyle(oldSel, me.setting.style.defalutBackColor);
  267. }
  268. //设置选中行底色
  269. if(newSel){
  270. me.setSelStyle(newSel, me.setting.style.selectedColor);
  271. }
  272. $(".tools-btn > a").not(".disabled").addClass("disabled");
  273. $("#add-engineering-btn").addClass("disabled");
  274. $('#add-tender-btn').removeClass('disabled');
  275. if(node){
  276. switch(node.data.projType) {
  277. case projectType.project:
  278. $("#del-btn").removeClass("disabled");
  279. $("#add-engineering-btn").removeClass("disabled");
  280. break;
  281. case projectType.folder:
  282. if(!node.children || node.children.length === 0){
  283. $("#del-btn").removeClass("disabled");
  284. }
  285. break;
  286. case projectType.engineering:
  287. $("#del-btn").removeClass("disabled");
  288. $("#add-engineering-btn").removeClass("disabled");
  289. break;
  290. case projectType.tender:
  291. $("#add-engineering-btn").removeClass("disabled");
  292. $("#move-to-btn").removeClass("disabled");
  293. $("#copy-to-btn").removeClass("disabled");
  294. $("#share-btn").removeClass("disabled");
  295. $("#cooperate-btn").removeClass("disabled");
  296. $("#del-btn").removeClass("disabled");
  297. break;
  298. }
  299. $("#rename-btn").removeClass("disabled");
  300. }
  301. },
  302. onSelectionChanging: function (sender, args) {
  303. let me = gcTreeObj;
  304. me.initSelection(args.newSelections[0], args.oldSelections[0]);
  305. },
  306. //点击恢复列,弹出恢复项目窗口
  307. recoveryProj: function (node) {
  308. let tenderNodes = m_getTenders(node);
  309. $('#rePoj .modal-header').empty();
  310. $('p', '#rePoj .modal-body').remove();
  311. $('#rePoj .modal-header').html(v_getTitle(node));
  312. $('#rePoj .modal-body').html(v_getMoBody(node, tenderNodes));
  313. $('#rePoj').modal('show');
  314. },
  315. //点击单价文件恢复,弹出恢复单价文件窗口
  316. recoveryUnitPrc: function (node) {
  317. let unitPriceFiles = node.data.unitPriceFiles;
  318. $('#reFile h5').text('恢复单价文件');
  319. $('tr', '#reFile tbody').remove();
  320. $('#reFile tbody').html(v_getFiles(fileType.unitPriceFile, unitPriceFiles));
  321. $('#reFile').modal('show');
  322. },
  323. recoveryFeeRate: function (node) {
  324. let feeRateFiles = node.data.feeRateFiles;
  325. $('#reFile h5').text('恢复费率文件');
  326. $('tr', '#reFile tbody').remove();
  327. $('#reFile tbody').html(v_getFiles(fileType.feeRateFile, feeRateFiles));
  328. $('#reFile').modal('show');
  329. },
  330. getTreeNodeCell: function (tree) {
  331. let indent = 20;
  332. let levelIndent = -5;
  333. let halfBoxLength = 5;
  334. let halfExpandLength = 3;
  335. let imgWidth = 18;
  336. let imgHeight = 14;
  337. let TreeNodeCellType = function () {
  338. };
  339. TreeNodeCellType.prototype = new GC.Spread.Sheets.CellTypes.Text();
  340. TreeNodeCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
  341. if (style.backColor) {
  342. ctx.save();
  343. ctx.fillStyle = style.backColor;
  344. ctx.fillRect(x, y, w, h);
  345. ctx.restore();
  346. } else {
  347. ctx.clearRect(x, y, w, h);
  348. }
  349. let drawLine = function (canvas, x1, y1, x2, y2, color) {
  350. ctx.save();
  351. ctx.translate(0.5, 0.5);
  352. ctx.beginPath();
  353. ctx.moveTo(x1, y1);
  354. ctx.lineTo(x2, y2);
  355. ctx.strokeStyle = color;
  356. ctx.stroke();
  357. ctx.restore();
  358. };
  359. let drawExpandBox = function (ctx, x, y, w, h, centerX, centerY, expanded) {
  360. let rect = {}, h1, h2, offset = 1;
  361. rect.top = centerY - halfBoxLength;
  362. rect.bottom = centerY + halfBoxLength;
  363. rect.left = centerX - halfBoxLength;
  364. rect.right = centerX + halfBoxLength;
  365. if (rect.left < x + w) {
  366. rect.right = Math.min(rect.right, x + w);
  367. ctx.save();
  368. ctx.translate(0.5, 0.5);
  369. ctx.strokeStyle = 'black';
  370. ctx.beginPath();
  371. ctx.moveTo(rect.left, rect.top);
  372. ctx.lineTo(rect.left, rect.bottom);
  373. ctx.lineTo(rect.right, rect.bottom);
  374. ctx.lineTo(rect.right, rect.top);
  375. ctx.lineTo(rect.left, rect.top);
  376. ctx.stroke();
  377. ctx.fillStyle = 'white';
  378. ctx.fill();
  379. ctx.restore();
  380. // Draw Horizontal Line
  381. h1 = centerX - halfExpandLength;
  382. h2 = Math.min(centerX + halfExpandLength, x + w);
  383. if (h2 > h1) {
  384. drawLine(ctx, h1, centerY, h2, centerY, 'black');
  385. }
  386. // Draw Vertical Line
  387. if (!expanded && (centerX < x + w)) {
  388. drawLine(ctx, centerX, centerY - halfExpandLength, centerX, centerY + halfExpandLength, 'black');
  389. }
  390. }
  391. }
  392. let node = tree.items[options.row];
  393. let showTreeLine = true;
  394. if (!node) { return; }
  395. let centerX = Math.floor(x) + node.depth() * indent + node.depth() * levelIndent + indent / 2;
  396. let x1 = centerX + indent / 2;
  397. let centerY = Math.floor((y + (y + h)) / 2);
  398. let y1;
  399. // Draw Sibling Line
  400. if (showTreeLine) {
  401. // Draw Horizontal Line
  402. if (centerX < x + w) {
  403. drawLine(ctx, centerX, centerY, Math.min(x1, x + w), centerY, 'gray');
  404. let img;
  405. if(node.data.projType === projectType.folder){
  406. img = document.getElementById('folder_open_pic');
  407. imgWidth = 15;
  408. }
  409. else if(node.data.projType === projectType.project){
  410. img = document.getElementById('proj_pic');
  411. imgWidth = 18;
  412. }
  413. else if(node.data.projType === projectType.engineering){
  414. img = document.getElementById('eng_pic');
  415. imgWidth = 14;
  416. }
  417. else if(node.data.projType === projectType.tender){
  418. img = document.getElementById('tender_pic');
  419. imgWidth = 14;
  420. }
  421. ctx.drawImage(img, centerX+indent/2+3, centerY - 7, imgWidth,imgHeight);
  422. }
  423. // Draw Vertical Line
  424. if (centerX < x + w) {
  425. y1 = node.isLast() ? centerY : y + h;
  426. if (node.isFirst() && !node.parent.parent) {
  427. drawLine(ctx, centerX, centerY, centerX, y1, 'gray');
  428. } else {
  429. drawLine(ctx, centerX, y, centerX, y1, 'gray');
  430. }
  431. }
  432. }
  433. // Draw Expand Box
  434. if (node.children.length > 0) {
  435. drawExpandBox(ctx, x, y, w, h, centerX, centerY, node.expanded);
  436. }
  437. // Draw Parent Line
  438. if (showTreeLine) {
  439. var parent = node.parent, parentCenterX = centerX - indent - levelIndent;
  440. while (parent.parent) {
  441. if (!parent.isLast()) {
  442. if (parentCenterX < x + w) {
  443. drawLine(ctx, parentCenterX, y, parentCenterX, y + h, 'gray');
  444. }
  445. }
  446. parent = parent.parent;
  447. parentCenterX -= (indent + levelIndent);
  448. }
  449. };
  450. // Draw Text
  451. //x = x + (node.depth() + 1) * indent + node.depth() * levelIndent;
  452. x = x + (node.depth() + 1) * indent + node.depth() * levelIndent + imgWidth + 3;
  453. GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
  454. };
  455. TreeNodeCellType.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) {
  456. return {
  457. x: x,
  458. y: y,
  459. row: context.row,
  460. col: context.col,
  461. cellStyle: cellStyle,
  462. cellRect: cellRect,
  463. sheetArea: context.sheetArea,
  464. isReservedLocation: true
  465. };
  466. };
  467. TreeNodeCellType.prototype.processMouseDown = function (hitinfo) {
  468. let offset = -1;
  469. let node = tree.items[hitinfo.row];
  470. tree.selected = node;
  471. let centerX = hitinfo.cellRect.x + offset + node.depth() * indent + node.depth() * levelIndent + indent / 2;
  472. let centerY = (hitinfo.cellRect.y + offset + (hitinfo.cellRect.y + offset + hitinfo.cellRect.height)) / 2;;
  473. if (!node || node.children.length === 0) { return; }
  474. if (hitinfo.x > centerX - halfBoxLength && hitinfo.x < centerX + halfBoxLength && hitinfo.y > centerY - halfBoxLength && hitinfo.y < centerY + halfBoxLength) {
  475. node.setExpanded(!node.expanded);
  476. TREE_SHEET_HELPER.massOperationSheet(hitinfo.sheet, function () {
  477. let iCount = node.posterityCount(), i, child;
  478. for (i = 0; i < iCount; i++) {
  479. child = tree.items[hitinfo.row + i + 1];
  480. hitinfo.sheet.setRowVisible(hitinfo.row + i + 1, child.visible, hitinfo.sheetArea);
  481. }
  482. hitinfo.sheet.invalidateLayout();
  483. });
  484. hitinfo.sheet.repaint();
  485. }
  486. };
  487. return new TreeNodeCellType();
  488. },
  489. getBaseCell: function () {
  490. let MyBaseCell = function () {
  491. };
  492. MyBaseCell.prototype = new GC.Spread.Sheets.CellTypes.Text();
  493. MyBaseCell.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) {
  494. return {
  495. x: x,
  496. y: y,
  497. row: context.row,
  498. col: context.col,
  499. cellStyle: cellStyle,
  500. cellRect: cellRect,
  501. sheetArea: context.sheetArea,
  502. isReservedLocation: true
  503. };
  504. };
  505. MyBaseCell.prototype.processMouseDown = function (hitinfo) {
  506. let dataCode = gcTreeObj.setting.header[hitinfo.col]['dataCode'];
  507. let node = gcTreeObj.tree.items[hitinfo.row];
  508. let text = hitinfo.sheet.getText(hitinfo.row, hitinfo.col);
  509. let value = hitinfo.sheet.getValue(hitinfo.row, hitinfo.col);
  510. let acStyle = hitinfo.sheet.getActualStyle(hitinfo.row, hitinfo.col),
  511. zoom = hitinfo.sheet.zoom();
  512. let textLength = this.getAutoFitWidth(value, text, acStyle, zoom, {sheet: hitinfo.sheet, row: hitinfo.row, col: hitinfo.col, sheetArea: GC.Spread.Sheets.SheetArea.viewport});
  513. if(hitinfo.x - hitinfo.cellRect.x > 0 && hitinfo.x - hitinfo.cellRect.x < textLength){
  514. if(dataCode === 'recovery'){
  515. gcTreeObj.recoveryProj(node);
  516. }
  517. else if(dataCode === 'unitPriceFile'){
  518. gcTreeObj.recoveryUnitPrc(node);
  519. }
  520. else if(dataCode === 'feeRateFile'){
  521. gcTreeObj.recoveryFeeRate(node);
  522. }
  523. }
  524. };
  525. MyBaseCell.prototype.processMouseMove = function (hitInfo) {
  526. let dataCode = gcTreeObj.setting.header[hitInfo.col]['dataCode'];
  527. if(dataCode === 'recovery' || dataCode === 'unitPriceFile' || dataCode === 'feeRateFile'){
  528. let sheet = hitInfo.sheet;
  529. let div = sheet.getParent().getHost();
  530. let canvasId = div.id + "vp_vp";
  531. let canvas = $(`#${canvasId}`)[0];
  532. //改变鼠标图案
  533. let text = hitInfo.sheet.getText(hitInfo.row, hitInfo.col);
  534. let value = hitInfo.sheet.getValue(hitInfo.row, hitInfo.col);
  535. let acStyle = hitInfo.sheet.getActualStyle(hitInfo.row, hitInfo.col),
  536. zoom = hitInfo.sheet.zoom();
  537. let textLength = this.getAutoFitWidth(value, text, acStyle, zoom, {sheet: hitInfo.sheet, row: hitInfo.row, col: hitInfo.col, sheetArea: GC.Spread.Sheets.SheetArea.viewport});
  538. if (sheet && hitInfo.x - hitInfo.cellRect.x > 0 && hitInfo.x - hitInfo.cellRect.x < textLength) {
  539. canvas.style.cursor='pointer';
  540. return true;
  541. }else{
  542. canvas.style.cursor='default';
  543. }
  544. }
  545. return false;
  546. };
  547. return new MyBaseCell();
  548. },
  549. setCellValue: function (cell, node) {
  550. const sheet = this.workBook.getActiveSheet();
  551. const {row, col} = cell;
  552. const dataCode = this.setting.header[col]['dataCode'];
  553. let value = '';
  554. if(dataCode === 'deleteDateTime' || dataCode === 'createDateTime'){
  555. if (node.data.projType === projectType.tender && deleted(node)) {
  556. let date = dataCode === 'deleteDateTime' ? node.data.deleteInfo.deleteDateTime : node.data.createDateTime;
  557. let localDateTime = new Date(date).toLocaleDateString();
  558. value = new Date(localDateTime).Format('yyyy-MM-dd');
  559. }
  560. }
  561. else if(dataCode === 'recovery'){
  562. if(deleted(node)){
  563. value = '恢复';
  564. }
  565. }
  566. else if(dataCode === 'unitPriceFile'){
  567. if(node.data.projType === projectType.project && node.data.unitPriceFiles !== undefined && node.data.unitPriceFiles.length > 0){
  568. value = '恢复';
  569. }
  570. }
  571. else if(dataCode === 'feeRateFile'){
  572. if(node.data.projType === projectType.project && node.data.feeRateFiles !== undefined && node.data.feeRateFiles.length > 0){
  573. value = '恢复';
  574. }
  575. }
  576. else {
  577. value = node.data[dataCode] ? node.data[dataCode] : '';
  578. }
  579. sheet.setValue(row, col, value);
  580. },
  581. showTreeData: function (nodes, headers) {
  582. let me = this;
  583. let sheet = me.workBook.getActiveSheet();
  584. let fuc = function(){
  585. sheet.setRowCount(nodes.length);
  586. for(let i = 0; i < nodes.length; i++){
  587. let treeNodeCell = me.getTreeNodeCell(me.tree);
  588. sheet.getCell(i, 0).cellType(treeNodeCell);
  589. for(let j = 0; j < headers.length; j++){
  590. sheet.getRange(-1, j, -1, 1).hAlign(GC.Spread.Sheets.HorizontalAlign[headers[j]['hAlign']]);
  591. sheet.getRange(-1, j, -1, 1).vAlign(GC.Spread.Sheets.VerticalAlign[headers[j]['vAlign']]);
  592. if(j !== 0){
  593. sheet.getCell(i, j).cellType(me.getBaseCell());
  594. }
  595. let dataCode = headers[j].dataCode;
  596. me.setCellValue({row: i, col: j}, nodes[i]);
  597. }
  598. }
  599. };
  600. me.renderSheetFuc(sheet, fuc);
  601. },
  602. refreshNodeData: function (node) {
  603. let me = this;
  604. let sheet = me.workBook.getActiveSheet();
  605. let header = me.setting.header;
  606. let rIdx = me.tree.items.indexOf(node);
  607. me.renderSheetFuc(sheet, function () {
  608. for(let i = 0; i < header.length; i++){
  609. me.setCellValue({row: rIdx, col: i}, node);
  610. }
  611. });
  612. },
  613. remove: function (node) {
  614. let me = this;
  615. let sheet = me.workBook.getActiveSheet();
  616. //删除行号
  617. let rIdx = me.tree.items.indexOf(node);
  618. //删除行数
  619. let count = node.posterityCount() + 1;
  620. me.tree.removeNode(node);
  621. me.renderSheetFuc(sheet, function () {
  622. sheet.deleteRows(rIdx, count);
  623. sheet.setRowCount(me.tree.items.length);
  624. me.initSelection({row: sheet.getActiveRowIndex(), rowCount: 1});
  625. });
  626. },
  627. move: function (orgRow, newRow) {
  628. this.workBook.getActiveSheet().deleteRows(orgRow, 1);
  629. this.addRow(this.tree.items[newRow]);
  630. }
  631. };
  632. $(document).ready(function () {
  633. $('#tab_pm_gc').on('show.bs.tab', function () {
  634. //侧滑隐藏
  635. $('.slide-sidebar').removeClass('open');
  636. $('.slide-sidebar').css('width', '0');
  637. gc_init();
  638. projTreeObj.tree = null;
  639. });
  640. e_recFiles($('#reFileBtn'));
  641. e_recProj($('#rePojBtn'));
  642. });
  643. function gc_init(){
  644. $.bootstrapLoading.start();
  645. a_getGC(function (datas) {
  646. m_buildVirtualTree(datas);
  647. let normalDatas = m_VTreeToDatas(datas);
  648. gcTreeObj.tree = pmTree.createNew(gcTreeObj.setting, normalDatas);
  649. gcTreeObj.tree.selected = gcTreeObj.tree.items[0];
  650. gcTreeObj.buildSheet();
  651. gcTreeObj.showTreeData(gcTreeObj.tree.items, gcTreeObj.setting.header);
  652. //初始选择
  653. let initSel = gcTreeObj.workBook.getSheet(0).getSelections()[0] ? gcTreeObj.workBook.getSheet(0).getSelections()[0] : {row: 0, rowCount: 1};
  654. gcTreeObj.initSelection(initSel);
  655. $.bootstrapLoading.end();
  656. });
  657. }
  658. //项目恢复模态框标题
  659. function v_getTitle(node){
  660. let html = '';
  661. html += '<h5 class="modal-title">恢复 ';
  662. if(node.data.projType === projectType.project){
  663. html += '<i class="fa fa-cubes"></i>建设项目</h5>';
  664. }
  665. else if(node.data.projType === projectType.engineering){
  666. html += '<i class="fa fa-cube"></i>单项工程</h5>';
  667. }
  668. else if(node.data.projType === projectType.tender){
  669. html += '<i class="fa fa-sticky-note-o"></i>单位工程</h5>';
  670. }
  671. html += '<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>';
  672. return html;
  673. }
  674. //项目恢复模态框主体
  675. function v_getMoBody(oprNode, nodes){
  676. let html = '';
  677. if(oprNode.data.projType === projectType.tender){
  678. decDate = '(' + new Date().Format('MM-dd hh:mm:ss') + '恢复)';
  679. let recName = oprNode.data.name + decDate;
  680. html += '<p>恢复后将重命名为 <b>' + recName + '</b></p>';
  681. }
  682. else {
  683. if(oprNode.data.projType === projectType.project){
  684. html += '<p><i class="fa fa-cubes"></i> ' + oprNode.data.name + '下的单位工程都将恢复都将恢复,恢复后将重命名为</p>';
  685. }
  686. else if(oprNode.data.projType === projectType.engineering){
  687. html += '<p><i class="fa fa-cube"></i> ' + oprNode.data.name + '下的单位工程都将恢复都将恢复,恢复后将重命名为</p>';
  688. }
  689. html += ('<p>');
  690. for(let i = 0, len = nodes.length; i < len; i++){
  691. let recName = nodes[i].data.name + '(' + new Date().Format('MM-dd hh:mm:ss') +'恢复)';
  692. html += '<b>' + recName + '</b>、';
  693. }
  694. html = html.slice(0, html.length - 1);
  695. html += ('</p>');
  696. }
  697. html += ('<p>点“确定”按钮,确认从回收站中恢复</p>');
  698. return html;
  699. }
  700. //单价、费率文件恢复弹出框数据
  701. function v_getFiles(type, files){
  702. let html = '';
  703. for(let i = 0, len = files.length; i < len; i ++){
  704. let recName = type === fileType.unitPriceFile ? files[i].name + '单价文件' : files[i].name + '费率文件';
  705. let fileId = type === fileType.unitPriceFile ? files[i].id : files[i].ID;
  706. let recTimeA = formatDate(new Date(files[i].deleteInfo.deleteDateTime), 'yyyy-MM-dd');
  707. let recTimeB = formatDate(new Date(files[i].deleteInfo.deleteDateTime), 'HH:mm:ss');
  708. html += '<tr><td>'+ recName +'</td><td>' + recTimeA + '<br>' + recTimeB + '</td><td><input name="fileItems" type="checkbox" fileId = "' + fileId + '" fileType = "' + type + '"></td></tr>';
  709. }
  710. return html;
  711. }
  712. //恢复单价、费率文件后前端显示变化
  713. function v_recFiles(project, fileIds, type){
  714. let projFiles;
  715. if(type === fileType.unitPriceFile){
  716. projFiles = project.data.unitPriceFiles;
  717. }
  718. else if(type === fileType.feeRateFile){
  719. projFiles = project.data.feeRateFiles;
  720. }
  721. if(projFiles && projFiles.length > 0){
  722. let tempFiles = [];
  723. for(let i = 0, len = projFiles.length; i < len; i++){
  724. let isExist = false;
  725. for(let j = 0, jLen = fileIds.length; j < jLen; j++){
  726. let id = projFiles[i].id || projFiles[i].ID || null;
  727. if(id && id === fileIds[j]){
  728. isExist = true;
  729. break;
  730. }
  731. }
  732. if(!isExist){
  733. tempFiles.push(projFiles[i]);
  734. }
  735. }
  736. if(type === fileType.unitPriceFile){
  737. project.data.unitPriceFiles = tempFiles;
  738. }
  739. else if(type === fileType.feeRateFile){
  740. project.data.feeRateFiles = tempFiles;
  741. }
  742. }
  743. }
  744. function v_removeNode(node){
  745. gcTreeObj.remove(node);
  746. let parent = node.parent || null;
  747. if(parent && parent.children.length === 0 && parent.data !== undefined){
  748. if(parent.data.projType === projectType.project && fileEmpty(parent)){
  749. v_removeNode(parent);
  750. }
  751. else if(parent.data.projType !== projectType.project){
  752. v_removeNode(parent);
  753. }
  754. }
  755. }
  756. function v_refreshNode(node){
  757. if(deleted(node)){
  758. delete node.data.deleteInfo;
  759. }
  760. gcTreeObj.refreshNodeData(node);
  761. let parent = node.parent || null;
  762. if(parent && parent.data !== undefined){
  763. v_refreshNode(parent);
  764. }
  765. }
  766. //将获取的回收站中的数据建虚拟树
  767. function m_buildVirtualTree(datas){
  768. for(let i = 0, len = datas.length; i < len; i++){
  769. if(datas[i].projType === projectType.project){
  770. datas[i].ParentID = -1;
  771. }
  772. let children = datas[i].children || null;
  773. if(children){
  774. m_buildVirtualTree(children);
  775. }
  776. let next = datas[i+1] || null;
  777. if(next){
  778. datas[i].NextSiblingID = next.ID;
  779. }
  780. else {
  781. datas[i].NextSiblingID = -1;
  782. }
  783. }
  784. }
  785. function m_VTreeToDatas(datas){
  786. let rst = [];
  787. let projs = datas;
  788. rst = rst.concat(projs);
  789. for(let i = 0, len = projs.length; i < len; i++){
  790. let p_engs = projs[i].children || null;
  791. if(p_engs){
  792. rst = rst.concat(p_engs);
  793. for(let j = 0, jLen = p_engs.length; j < jLen; j ++){
  794. let e_tenders = p_engs[j].children || null;
  795. if(e_tenders){
  796. rst = rst.concat(e_tenders);
  797. }
  798. }
  799. }
  800. }
  801. return rst;
  802. }
  803. //获得当前节点的tenders数据,模态提示框用
  804. function m_getTenders(node){
  805. if(node.data.projType === projectType.tender) return [node];
  806. else {
  807. let rst = [];
  808. if(node.children.length > 0){
  809. node.children.forEach(function (cNode) {
  810. if(cNode.children.length > 0){
  811. cNode.children.forEach(function (ccNode) {
  812. if(ccNode.data.projType === projectType.tender) rst.push(ccNode);
  813. });
  814. }
  815. else if(cNode.children.length === 0 && cNode.data.projType === projectType.tender){
  816. rst.push(cNode);
  817. }
  818. });
  819. }
  820. return rst;
  821. }
  822. }
  823. //获得要更新的数据(包含恢复的数据,维护项目管理树的数据)
  824. function m_getRecDatas(oprNode){
  825. let rst = Object.create(null);
  826. let rstProj = [], rstFile = [];
  827. let path;
  828. if(oprNode.data.projType === projectType.tender){
  829. path = recPath.t;
  830. let engineering = oprNode.parent || null;
  831. if(!engineering) return null;
  832. let project = engineering.parent || null;
  833. if(!project) return null;
  834. if(engineering && deleted(engineering)){
  835. path = recPath.t_e;
  836. }
  837. //恢复建设项目
  838. if(project && deleted(project)){
  839. path = recPath.t_e_p;
  840. }
  841. //恢复单价、费率文件
  842. rstFile = rstFile.concat(getUpdateFiles([oprNode], project));
  843. if(path === recPath.t){
  844. rstProj = rstProj.concat(getUpdateDatas(projectType.tender, oprNode, true, true));
  845. }
  846. else if(path === recPath.t_e){
  847. rstProj = rstProj.concat(getUpdateDatas(projectType.tender, oprNode, true, false));
  848. rstProj = rstProj.concat(getUpdateDatas(projectType.engineering, engineering, true, true));
  849. }
  850. else if(path === recPath.t_e_p){
  851. rstProj = rstProj.concat(getUpdateDatas(projectType.tender, oprNode, true, false));
  852. rstProj = rstProj.concat(getUpdateDatas(projectType.engineering, engineering, true, false));
  853. rstProj = rstProj.concat(getUpdateDatas(projectType.project, project, true, false));
  854. }
  855. }
  856. else if(oprNode.data.projType === projectType.engineering){
  857. path = recPath.e;
  858. let project = oprNode.parent || null;
  859. if(!project) return null;
  860. //恢复建设项目
  861. if(project && deleted(project)){
  862. path = recPath.e_p;
  863. }
  864. let tenders = oprNode.children;
  865. if(tenders.length > 0){
  866. for(let i = 0, len = tenders.length; i < len; i++){
  867. rstProj = rstProj.concat(getUpdateDatas(projectType.tender, tenders[i], true, false));
  868. }
  869. rstProj = deWeightName(rstProj);
  870. //恢复单价、费率文件
  871. rstFile = rstFile.concat(getUpdateFiles(tenders, project));
  872. }
  873. if(path === recPath.e){
  874. rstProj= rstProj.concat(getUpdateDatas(projectType.engineering, oprNode, true, true));
  875. }
  876. else if(path === recPath.e_p){
  877. rstProj= rstProj.concat(getUpdateDatas(projectType.engineering, oprNode, true, false));
  878. rstProj= rstProj.concat(getUpdateDatas(projectType.project, project, true, false));
  879. }
  880. }
  881. else if(oprNode.data.projType === projectType.project){
  882. path = recPath.p;
  883. let engineerings = oprNode.children;
  884. if(engineerings.length > 0){
  885. let allTenders = [], rstEngs = [];
  886. for(let i = 0, len = engineerings.length; i < len; i++){
  887. //恢复单项工程
  888. rstEngs = rstEngs.concat(getUpdateDatas(projectType.engineering, engineerings[i], false, false));
  889. let tenders = engineerings[i].children;
  890. allTenders = allTenders.concat(tenders);
  891. let rstTends = [];
  892. for(let j = 0, jLen = tenders.length; j < jLen; j++){
  893. //恢复单位工程
  894. rstTends = rstTends.concat(getUpdateDatas(projectType.tender, tenders[j], false, false));
  895. }
  896. //去除重名
  897. rstTends = deWeightName(rstTends);
  898. rstProj = rstProj.concat(rstTends);
  899. }
  900. //去除重名
  901. rstEngs = deWeightName(rstEngs);
  902. rstProj = rstProj.concat(rstEngs);
  903. //恢复单价、费率文件
  904. rstFile = rstFile.concat(getUpdateFiles(allTenders, oprNode));
  905. }
  906. //恢复建设项目
  907. rstProj = rstProj.concat(getUpdateDatas(projectType.project, oprNode, false, false));
  908. }
  909. rst.proj = rstProj;
  910. rst.file = rstFile;
  911. return rst;
  912. }
  913. //获得勾选的单价、费率文件的id
  914. function m_getFilesObjs(nodes){
  915. let rst = [];
  916. for(let i = 0, len = nodes.length; i < len; i++){
  917. let fileId = $(nodes[i]).attr('fileId') || null;
  918. if(fileId){
  919. let dispName = $('td:eq(0)', $(nodes[i])[0].parentNode.parentNode)[0].textContent;
  920. let name = dispName.slice(0, dispName.length - 4);
  921. if($(nodes[i]).attr('fileType') === fileType.unitPriceFile){
  922. fileId = parseInt(fileId);
  923. }
  924. let obj = Object.create(null);
  925. obj.id = fileId;
  926. obj.name = name;
  927. rst.push(obj);
  928. }
  929. }
  930. return rst;
  931. }
  932. function m_project(node){
  933. if(node && node.data.projType === projectType.project) return node;
  934. if(!node) return null;
  935. let parent = node.parent || null;
  936. if(!parent) return null;
  937. if(parent && parent.data.projType === projectType.project) return parent;
  938. let gParent = parent.parent || null;
  939. if(!gParent) return null;
  940. if(gParent && gParent.data.projType === projectType.project) return gParent;
  941. return null;
  942. }
  943. //点击单价文件、费率文件下的恢复操作(确认)
  944. function e_recFiles(btn){
  945. btn.bind('click', function () {
  946. decDate = '(' + new Date().Format('MM-dd hh:mm:ss') + '恢复)';
  947. let recObjs = m_getFilesObjs($('[name = "fileItems"]:checked'));
  948. let recIds = [];
  949. for(let i of recObjs){
  950. recIds.push(i.id);
  951. }
  952. let type = $('[name = "fileItems"]:checked').attr('fileType');
  953. let selected = gcTreeObj.tree.selected;
  954. //backend
  955. let updateDatas = [];
  956. for(let i = 0, len = recObjs.length; i < len; i++){
  957. let findData = type === fileType.unitPriceFile ? {id: recObjs[i].id} : {ID: recObjs[i].id};
  958. updateDatas.push(getUpdateObj(type, findData, {deleteInfo: null, name: delPostFix(recObjs[i].name) + decDate}));
  959. }
  960. //恢复建设项目
  961. if(updateDatas.length > 0 && deleted(selected)){
  962. updateDatas.push(getUpdateObj(projectType.project, {ID: selected.data.ID}, {deleteInfo: null, name: delPostFix(selected.data.name) + decDate}));
  963. }
  964. updateDatas = deWeightName(updateDatas);
  965. a_rec(updateDatas, caller);
  966. function caller(){
  967. //front
  968. if(recIds.length > 0){
  969. v_recFiles(selected, recIds, type);
  970. if(deleted(selected)){
  971. delete selected.data.deleteInfo;
  972. }
  973. if(fileEmpty(selected) && selected.children.length === 0){
  974. gcTreeObj.remove(selected);
  975. }
  976. else {
  977. gcTreeObj.refreshNodeData(selected);
  978. }
  979. }
  980. }
  981. });
  982. }
  983. //点击项目下的恢复操作(确认)
  984. function e_recProj(btn){
  985. btn.bind('click', function () {
  986. let selected = gcTreeObj.tree.selected;
  987. //backend
  988. let updateObj = m_getRecDatas(selected);
  989. let updateDatas = updateObj.proj.concat(updateObj.file);
  990. let fileObj = getRecFileObj(updateObj.file);
  991. //保存成功后回调front
  992. a_rec(updateDatas, caller);
  993. function caller() {
  994. let project = m_project(selected);
  995. if(project){
  996. if(fileObj[fileType.unitPriceFile].length > 0){
  997. v_recFiles(project, fileObj[fileType.unitPriceFile], fileType.unitPriceFile);
  998. }
  999. if(fileObj[fileType.feeRateFile].length > 0){
  1000. v_recFiles(project, fileObj[fileType.feeRateFile], fileType.feeRateFile);
  1001. }
  1002. }
  1003. v_removeNode(selected);
  1004. v_refreshNode(selected);
  1005. }
  1006. });
  1007. }
  1008. function a_getGC(callback){
  1009. CommonAjax.post('/pm/api/getGCDatas', {user_id: userID}, function (rstData) {
  1010. if(callback){
  1011. callback(rstData);
  1012. }
  1013. });
  1014. }
  1015. function a_rec(nodes, callback){
  1016. CommonAjax.post('/pm/api/recGC', {user_id: userID, nodes: nodes}, function (rstData) {
  1017. if(callback){
  1018. callback();
  1019. }
  1020. });
  1021. }
  1022. //去除重名,回收站不处理重名,只保证恢复到项目管理中不出现重名
  1023. function deWeightName(datas){
  1024. let rst = [];
  1025. let _deWeight = Object.create(null), prefix = 'name_';
  1026. //按同名分组
  1027. for(let i = 0, len = datas.length; i < len; i++){
  1028. let data = datas[i];
  1029. let _names = _deWeight[prefix + data.updateData.name] || null;
  1030. if(!_names){
  1031. _names = _deWeight[prefix + data.updateData.name] = [];
  1032. }
  1033. if(_names){
  1034. _names.push(data);
  1035. }
  1036. }
  1037. for(let _name in _deWeight){
  1038. let sameNameDatas = _deWeight[_name];
  1039. let count = 0;
  1040. for(let i = 0, len = sameNameDatas.length; i < len; i++){
  1041. let postFix = '(' + count + ')';
  1042. if(i > 0){
  1043. sameNameDatas[i].updateData.name = sameNameDatas[i].updateData.name + postFix;
  1044. }
  1045. count ++;
  1046. rst.push(sameNameDatas[i]);
  1047. }
  1048. }
  1049. return rst;
  1050. }
  1051. //去除名称后缀(Date恢复)
  1052. function delPostFix (str){
  1053. let rst = '';
  1054. rst = delPostRecFix(delPostNameFix(str));
  1055. return rst;
  1056. }
  1057. function delPostRecFix (str){
  1058. let rst = '';
  1059. let re = /(+[0-9]{2}-[0-9]{2}\s+[0-9]{2}:[0-9]{2}:[0-9]{2}恢复)/g;
  1060. rst = str.replace(re, '');
  1061. return rst;
  1062. }
  1063. function delPostNameFix (str){
  1064. let rst = '';
  1065. let re = /(+[0-9][0-9]*)/g;
  1066. rst = str.replace(re, '');
  1067. return rst;
  1068. }
  1069. function deleted(node){
  1070. return node.data.deleteInfo !== undefined && node.data.deleteInfo && node.data.deleteInfo.deleted;
  1071. }
  1072. function fileEmpty(node){
  1073. return node.data.unitPriceFiles.length === 0 && node.data.feeRateFiles.length === 0;
  1074. }
  1075. function fIsExist(files, id, type){
  1076. let isExist = false;
  1077. for(let i = 0, len = files.length; i < len; i++){
  1078. if((type === fileType.unitPriceFile && files[i].id === parseInt(id)) || (type === fileType.feeRateFile && files[i].ID === id)){
  1079. isExist = true;
  1080. break;
  1081. }
  1082. }
  1083. return isExist;
  1084. }
  1085. function getRecFileObj(files){
  1086. let rst = Object.create(null);
  1087. let rst_UF = [], rst_FF = [];
  1088. for(let i = 0, len = files.length; i < len; i++){
  1089. if(files[i].findData !== undefined){
  1090. if(files[i].updateType === fileType.unitPriceFile && files[i].findData.id !== undefined){
  1091. rst_UF.push(files[i].findData.id);
  1092. }
  1093. else if(files[i].updateType === fileType.feeRateFile && files[i].findData.ID !== undefined){
  1094. rst_FF.push(files[i].findData.ID);
  1095. }
  1096. }
  1097. }
  1098. rst[fileType.unitPriceFile] = rst_UF;
  1099. rst[fileType.feeRateFile] = rst_FF;
  1100. return rst;
  1101. }
  1102. function getUpdateObj(updateType, findData, updateData){
  1103. let obj = Object.create(null);
  1104. obj.updateType = updateType;
  1105. obj.findData = findData;
  1106. obj.updateData = updateData;
  1107. return obj;
  1108. }
  1109. function getUpdateDatas(updateType, node, mtNID, mtPM){
  1110. let rst = [];
  1111. decDate = '(' + new Date().Format('MM-dd hh:mm:ss') + '恢复)';
  1112. let newName = delPostFix(node.data.name) + decDate;
  1113. if(updateType === projectType.tender || updateType === projectType.engineering){
  1114. //维护项目管理树
  1115. if(mtPM){
  1116. rst.push(getUpdateObj(updateType, {ParentID: node.data.ParentID, NextSiblingID: -1, deleteInfo: null}, {NextSiblingID: node.data.ID}));
  1117. }
  1118. //恢复
  1119. if(mtNID){
  1120. rst.push(getUpdateObj(updateType, {ID: node.data.ID}, {name: newName, deleteInfo: null, NextSiblingID: -1}));
  1121. }
  1122. else {
  1123. rst.push(getUpdateObj(updateType, {ID: node.data.ID}, {name: newName, deleteInfo: null}));
  1124. }
  1125. }
  1126. else if(updateType === projectType.project){
  1127. //恢复
  1128. rst.push(getUpdateObj(updateType, {ID: node.data.ID}, {deleteInfo: null, name: newName}));//NextSibling为undefined,后端处理
  1129. }
  1130. return rst;
  1131. }
  1132. //unitPriceFile or feeRateFile
  1133. function getUpdateFiles(tenders, project){
  1134. let rstUF = [], rstFF = [], rst = [];
  1135. let _unitFiles = Object.create(null), _feeFiles = Object.create(null), prefix = '_id';
  1136. decDate = '(' + new Date().Format('MM-dd hh:mm:ss') + '恢复)';
  1137. for(let i = 0, len = tenders.length; i < len; i++){
  1138. //恢复单价文件
  1139. if(project && project.data.unitPriceFiles.length > 0 && fIsExist(project.data.unitPriceFiles, tenders[i].data.property.unitPriceFile.id, fileType.unitPriceFile)){
  1140. //unitFiles.push(tenders[i].data.property.unitPriceFile.id);
  1141. let propId = tenders[i].data.property.unitPriceFile.id;
  1142. let propName = tenders[i].data.property.unitPriceFile.name;
  1143. let _uf = _unitFiles[prefix + propId] || null;
  1144. if(!_uf){
  1145. let obj = Object.create(null);
  1146. obj.id = parseInt(propId);
  1147. obj.name = propName;
  1148. _unitFiles[prefix + propId] = obj;
  1149. }
  1150. }
  1151. //恢复费率文件
  1152. if(project && project.data.feeRateFiles.length > 0 && fIsExist(project.data.feeRateFiles, tenders[i].data.property.feeFile.id, fileType.feeRateFile)){
  1153. //feeFiles.push(tenders[i].data.property.feeFile.id);
  1154. let propId = tenders[i].data.property.feeFile.id;
  1155. let propName = tenders[i].data.property.feeFile.name;
  1156. let _ff = _feeFiles[prefix + propId] || null;
  1157. if(!_ff){
  1158. let obj = Object.create(null);
  1159. obj.id = propId;
  1160. obj.name = propName;
  1161. _feeFiles[prefix + propId] = obj;
  1162. }
  1163. }
  1164. }
  1165. for(let uf in _unitFiles){
  1166. rstUF.push(getUpdateObj(fileType.unitPriceFile, {id: _unitFiles[uf].id}, {deleteInfo: null, name: delPostFix(_unitFiles[uf].name) + decDate}));
  1167. }
  1168. for(let ff in _feeFiles){
  1169. rstFF.push(getUpdateObj(fileType.feeRateFile, {ID: _feeFiles[ff].id}, {deleteInfo: null, name: delPostFix(_feeFiles[ff].name) + decDate}));
  1170. }
  1171. rst = rst.concat(deWeightName(rstUF));
  1172. rst = rst.concat(deWeightName(rstFF));
  1173. return rst;
  1174. }