pm_main.js 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915
  1. /**
  2. * 项目管理相关js
  3. *
  4. * @author CaiAoLin
  5. * @date 2017/8/22
  6. * @version
  7. */
  8. let Tree = null;
  9. let movetoZTree = null;
  10. let copytoZTree = null;
  11. let engineering = [];
  12. let feeRateData = [];
  13. let projectType = {
  14. folder: 'Folder',
  15. tender: 'Tender',
  16. project: 'Project',
  17. engineering: 'Engineering'
  18. };
  19. let ProjTreeSetting = {
  20. tree: {
  21. id: 'ID',
  22. pid: 'ParentID',
  23. nid: 'NextSiblingID',
  24. btnColumn: 1,
  25. nullId: -1
  26. },
  27. columns: [
  28. {
  29. head: '',
  30. data: '',
  31. width: '40',
  32. event: {}
  33. },
  34. {
  35. head: '工程列表',
  36. data: 'name',
  37. width: '78%',
  38. event: {
  39. getText: function (html, node, text) {
  40. let className = '';
  41. switch (node.data.projType) {
  42. case projectType.folder:
  43. className = "fa fa-folder-open-o";
  44. break;
  45. case projectType.tender:
  46. className = "fa fa-sticky-note-o";
  47. break;
  48. case projectType.project:
  49. className = "fa fa-cubes";
  50. break;
  51. case projectType.engineering:
  52. className = "fa fa-cube";
  53. break;
  54. }
  55. let icon = '<i class ="tree-icon '+ className +'"></i>';
  56. html.push((node && node.data && node.data.projType === projectType.folder) ? '&nbsp;' : '');
  57. html.push('<a ');
  58. if (node && node.data) {
  59. //html.push('href="/main?project=', node.id(), '"');
  60. html.push('href="javacript:void(0);"');
  61. }
  62. html.push('>', icon, '&nbsp;', text, '<a>');
  63. },
  64. getIcon: function (html, node) {
  65. if (node.data.projType === projectType.tender) {
  66. html.push('<span class="poj-icon">└</span>');
  67. }
  68. },
  69. tdBindEvent: function (td, node) {
  70. if (node.data.projType === projectType.tender) {
  71. $('a:eq(1)', td).bind('click', function () {
  72. BeforeOpenProject(node.id(), {'fullFolder': GetFullFolder(node.parent)}, function () {
  73. window.location.href = '/main?project=' + node.id();
  74. });
  75. return false;
  76. });
  77. }
  78. }
  79. }
  80. },
  81. {
  82. head: '最近使用',
  83. data: 'lastDateTime',
  84. width: '10%',
  85. event: {
  86. getText: function (html, node, text) {
  87. if (node.data.projType === projectType.tender) {
  88. html.push(text ? new Date(text).Format('yyyy-MM-dd') : '');
  89. }
  90. }
  91. }
  92. },
  93. {
  94. head: '创建日期',
  95. data: 'createDateTime',
  96. width: '10%',
  97. event: {
  98. getText: function (html, node, text) {
  99. if (node.data.projType === projectType.tender) {
  100. html.push(text ? new Date(text).Format('yyyy-MM-dd') : '');
  101. }
  102. }
  103. }
  104. }
  105. ],
  106. viewEvent: {
  107. beforeSelect: function (node) {
  108. if (node && node.row) {
  109. $('td:eq(0)', node.row).children().remove();
  110. }
  111. },
  112. onSelectNode: function (node) {
  113. $(".tools-btn > a").not(".disabled").addClass("disabled");
  114. switch(node.data.projType) {
  115. case projectType.project:
  116. $("#add-engineering-btn").removeClass("disabled");
  117. $("#add-project-btn").removeClass("disabled");
  118. break;
  119. case projectType.folder:
  120. $("#add-folder-btn").removeClass("disabled");
  121. $("#add-project-btn").removeClass("disabled");
  122. break;
  123. case projectType.engineering:
  124. $("#add-tender-btn").removeClass("disabled");
  125. $("#add-engineering-btn").removeClass("disabled");
  126. break;
  127. case projectType.tender:
  128. $("#add-tender-btn").removeClass("disabled");
  129. $("#move-to-btn").removeClass("disabled");
  130. $("#copy-to-btn").removeClass("disabled");
  131. $("#share-btn").removeClass("disabled");
  132. $("#cooperate-btn").removeClass("disabled");
  133. break;
  134. }
  135. $("#del-btn").removeClass("disabled");
  136. $("#rename-btn").removeClass("disabled");
  137. $('td:eq(0)', node.row).append($('<i class="fa fa-sort" data-toggle="tooltip" data-placement="top" title="长安拖动"></i>'));
  138. }
  139. }
  140. };
  141. $(document).ready(function() {
  142. init();
  143. // 新增建设项目点击
  144. $('#add-project-btn').click(function () {
  145. let selectedItem = Tree.selected();
  146. try {
  147. let selectedType = selectedItem !== null && selectedItem.data !== undefined ?
  148. selectedItem.data.projType : projectType.folder;
  149. if (selectedType !== projectType.folder && selectedType !== projectType.project) {
  150. throw '建设项目只能添加到最外层或文件夹中';
  151. }
  152. $('#add-project-dialog').modal('show');
  153. } catch (error) {
  154. alert(error);
  155. }
  156. });
  157. // 新增建设项目操作
  158. $('#addProjOk').click(function () {
  159. AddProject();
  160. });
  161. // 选择计价方式
  162. $("input[name='valuation_type']").click(function() {
  163. let type = $(this).val();
  164. let targetData = type === 'bill' ? JSON.parse(billValuation) : JSON.parse(rationValuation);
  165. let html = '<option value="">请选择计划规则</option>';
  166. for(let valuation of targetData) {
  167. if (valuation === null) {
  168. continue;
  169. }
  170. html += '<option value="'+ valuation._id +'">'+ valuation.name +'</option>';
  171. }
  172. $("#valuation").html(html);
  173. });
  174. // 新增单项项目点击
  175. $("#add-engineering-btn").click(function() {
  176. let selectedItem = Tree.selected();
  177. try {
  178. if (selectedItem === null) {
  179. throw '请选择要添加到的项目工程';
  180. }
  181. let selectedType = selectedItem.data !== undefined ? selectedItem.data.projType : '';
  182. if (selectedType !== projectType.project && selectedType !== projectType.engineering) {
  183. throw '单项项目只能添加到建设项目中';
  184. }
  185. $("#add-engineering-dialog").modal("show");
  186. } catch (error) {
  187. alert(error);
  188. }
  189. });
  190. // 新增单项工程操作
  191. $("#add-engineering-confirm").click(function() {
  192. AddEngineering();
  193. });
  194. // 新增单位工程点击
  195. $("#add-tender-btn").click(function() {
  196. let selectedItem = Tree.selected();
  197. try {
  198. if (selectedItem === null) {
  199. throw '请选择要添加到的单项工程';
  200. }
  201. let selectedType = selectedItem.data !== undefined ? selectedItem.data.projType : '';
  202. if (selectedType !== projectType.engineering && selectedType !== projectType.tender) {
  203. throw '单项项目只能添加到单项工程中';
  204. }
  205. $("#add-tender-dialog").modal("show");
  206. } catch (error) {
  207. alert(error);
  208. }
  209. });
  210. // 新增单位工程弹层改变
  211. $('#add-tender-dialog').on('show.bs.modal', function() {
  212. // 当前选中的建设项目
  213. let selectedItem = Tree.selected();
  214. let projectInfo = null;
  215. if (selectedItem.data.projType === projectType.tender) {
  216. projectInfo = selectedItem !== null && selectedItem.parent !== undefined && selectedItem.parent.parent !== undefined ?
  217. selectedItem.parent.parent : null;
  218. } else {
  219. projectInfo = selectedItem !== null && selectedItem.parent !== undefined ? selectedItem.parent : null;
  220. }
  221. if (projectInfo !== null) {
  222. let savedProjectData = localStorage.getItem(projectInfo.data.name);
  223. console.log(savedProjectData);
  224. savedProjectData = JSON.parse(savedProjectData);
  225. // 填入计价规则
  226. let valuationHtml = '<option value="'+ savedProjectData.valuation +'">'+ savedProjectData.valuationName +'</option>';
  227. $("#tender-valuation").html(valuationHtml);
  228. // 填入工程专业
  229. let engineeringHtml = getEngineeringHtml(savedProjectData.engineeringList);
  230. $("#tender-engineering").html(engineeringHtml);
  231. $("input[name='tender_valuation_type']").attr('disabled', 'disabled').removeAttr('checked', 'checked');
  232. $("input[name='tender_valuation_type'][value='"+ savedProjectData.valuationType +"']")
  233. .attr("checked", "checked").removeAttr('disabled', 'disabled');
  234. // 填入费率文件
  235. let feeHtml = '<option>请选择费率文件</option>';
  236. // for (let fee of savedProjectData.feeLib) {
  237. // feeHtml += '<option value="'+ fee.id +'">'+ fee.name +'</option>';
  238. // }
  239. $("#tender-fee-rate").html(feeHtml);
  240. }
  241. });
  242. // 新增单位工程
  243. $("#add-tender-confirm").click(function() {
  244. AddTender();
  245. });
  246. // 新增文件夹按钮点击
  247. $("#add-folder-btn").click(function() {
  248. let selectedItem = Tree.selected();
  249. try {
  250. let selectedType = selectedItem !== null && selectedItem.data !== undefined ?
  251. selectedItem.data.projType : projectType.folder;
  252. if (selectedType !== projectType.folder) {
  253. throw '文件夹只能添加在最外层或者添加在文件夹中';
  254. }
  255. $("#add-folder-dialog").modal("show");
  256. } catch (error) {
  257. alert(error);
  258. }
  259. });
  260. // 新增文件夹操作
  261. $("#add-folder-confirm").click(function() {
  262. AddFolder();
  263. });
  264. // 删除按钮点击
  265. $('#del-btn').click(function() {
  266. if (Tree && Tree.selected()) {
  267. $('#del').modal('show');
  268. }
  269. });
  270. // 删除时文字替换
  271. $('#del').on('show.bs.modal', function() {
  272. let hasTenderChild = function (children) {
  273. for (let i = 0; i < children.length; i++) {
  274. if (children[i].children.length === 0) {
  275. if (children[i].data.projType === 'Tender') {
  276. return true;
  277. }
  278. } else if (hasTenderChild(children[i].children)) {
  279. return true;
  280. }
  281. }
  282. return false;
  283. };
  284. // 显示内容
  285. let tenderHintElement = $('#tenderHint');
  286. let folderHintElement = $('#folderHint');
  287. if (Tree.selected().children.length === 0) {
  288. tenderHintElement.show();
  289. tenderHintElement.text('删除 "' + Tree.selected().data.name +'" ?');
  290. folderHintElement.hide();
  291. } else {
  292. tenderHintElement.hide();
  293. folderHintElement.show();
  294. folderHintElement.text('删除 "'+ Tree.selected().data.name +'" 以及它包含的子项?');
  295. }
  296. // 显示是否可以找回
  297. if (hasTenderChild([Tree.selected()])) {
  298. $('#restoreHint').show();
  299. } else {
  300. $('#restoreHint').hide();
  301. }
  302. });
  303. // 删除操作
  304. $('#delete-confirm').click(function () {
  305. let updateData = null;
  306. let dialog = $('#del');
  307. if (Tree) {
  308. updateData = GetDeleteUpdateData(Tree.selected());
  309. UpdateProjectData(updateData, function () {
  310. dialog.modal('hide');
  311. Tree.removeNode(Tree.selected());
  312. });
  313. }
  314. });
  315. // 重命名按钮点击
  316. $('#rename-btn').click(function() {
  317. if (!Tree) {
  318. return false;
  319. }
  320. if (!Tree.selected()) {
  321. alert('请选择需要重命名的数据');
  322. return false;
  323. }
  324. $('#rename-dialog').modal('show');
  325. });
  326. // 重命名操作
  327. $("#rename-confirm").click(function() {
  328. let select = Tree.selected();
  329. let newName = $('#rename-name').val();
  330. let dialog = $('#rename-dialog');
  331. if (newName === '') {
  332. alert('请输入重命名的名称');
  333. return false;
  334. }
  335. if (newName === select.data.name) {
  336. dialog.modal('hide');
  337. return false;
  338. }
  339. RenameProject(select.id(), newName, function () {
  340. dialog.modal('hide');
  341. select.data.name = newName;
  342. Tree.refreshNodesDom([select]);
  343. });
  344. });
  345. // 移动到按钮点击
  346. $('#move-to-btn').click(function () {
  347. if (Tree && Tree.selected()) {
  348. $('#move-to-dialog').modal('show');
  349. }
  350. });
  351. // 移动到窗口内容重组
  352. $('#move-to-dialog').on('show.bs.modal', function () {
  353. movetoZTree = ConvertTreeToZtree(Tree, $('#treeDemo'), Tree.selected());
  354. });
  355. // 移动到操作
  356. $('#move-to-confirm').click(function () {
  357. let updateData = null;
  358. let dialog = $('#move-to-dialog');
  359. let target = GetTargetTreeNode($.fn.zTree.getZTreeObj('treeDemo'));
  360. let cur = Tree.selected();
  361. if (!target) {
  362. dialog.modal('hide');
  363. return false;
  364. }
  365. if (target.data.projType !== projectType.engineering) {
  366. alert("请移动到单项工程中!");
  367. return false;
  368. }
  369. let parent = target;
  370. let next = target.firstChild();
  371. if (parent !== cur.parent || (next !== cur && next !== cur.nextSibling)){
  372. let typeInfo = {
  373. updateType: 'update',
  374. projectType: null
  375. };
  376. updateData = GetUpdateData(parent, next, '', Tree.selected().id(), typeInfo);
  377. UpdateProjectData(updateData, function (data) {
  378. dialog.modal('hide');
  379. Tree.move(Tree.selected(), parent, next);
  380. });
  381. } else {
  382. dialog.modal('hide');
  383. }
  384. });
  385. // 复制到按钮点击
  386. $('#copy-to-btn').click(function () {
  387. let selectedItem = Tree.selected();
  388. try {
  389. let selectedType = selectedItem !== null && selectedItem.data !== undefined ?
  390. selectedItem.data.projType : '';
  391. if (selectedType !== projectType.tender) {
  392. throw '请选择单位工程进行复制';
  393. }
  394. } catch (error) {
  395. alert(error);
  396. return false;
  397. }
  398. $('#copy-to-dialog').modal('show');
  399. });
  400. // 复制到弹层替换
  401. $('#copy-to-dialog').on('show.bs.modal', function () {
  402. copytoZTree = ConvertTreeToZtree(Tree, $('#treeDemo2'), null);
  403. });
  404. // 复制到操作
  405. $("#copy-to-confirm").click(function() {
  406. let dialog = $('#copy-to-dialog');
  407. let target = GetTargetTreeNode($.fn.zTree.getZTreeObj('treeDemo2'));
  408. let parent = null;
  409. let next = null;
  410. let pre = null;
  411. let cur = Tree.selected();
  412. if (!target) {
  413. return false;
  414. }
  415. if (target.data.projType !== projectType.engineering) {
  416. alert("请移动到单项工程中!");
  417. return false;
  418. }
  419. if (target.data.projType !== projectType.tender && target.children.length !== 0 &&
  420. target.firstChild().data.projType !== projectType.tender) {
  421. dialog.modal('hide');
  422. }
  423. if (target.data.projType === projectType.tender) {
  424. parent = target.parent;
  425. next = target.nextSibling;
  426. } else {
  427. parent = target;
  428. next = target.firstChild();
  429. }
  430. if (parent !== cur.parent || (next !== cur && next !== cur.nextSibling)){
  431. CommonAjax.post('/pm/api/getNewProjectID', {count: 1, user_id: userID}, function (IDs) {
  432. let typeInfo = {
  433. updateType: 'copy',
  434. projType: cur.data.projectType
  435. };
  436. let updateData = GetUpdateData(parent, next, cur.data.name, IDs.lowID, typeInfo);
  437. updateData['srcProjectId'] = cur.id();
  438. pre = GetNeedUpdatePreNode(parent, next);
  439. if (pre) {
  440. updateData = {};
  441. updateData['updateType'] = 'update';
  442. updateData['updateData'] = {};
  443. updateData['updateData'][Tree.setting.tree.id] = pre.id();
  444. updateData['updateData'][Tree.setting.tree.nid] = node.tree.maxNodeId() + 1;
  445. }
  446. Tree.maxNodeId(IDs.lowID - 1);
  447. CommonAjax.post('/pm/api/copyProjects', {updateData: updateData, user_id: userID}, function (data) {
  448. dialog.modal('hide');
  449. data.forEach(function (nodeData) {
  450. if (nodeData.updateType === 'copy') {
  451. Tree.addNodeData(nodeData.updateData, parent, next);
  452. }
  453. });
  454. }, function () {
  455. dialog.modal('hide');
  456. });
  457. });
  458. }
  459. });
  460. });
  461. /**
  462. * 初始化数据
  463. *
  464. * @return {void}
  465. */
  466. function init() {
  467. let table = $('#ProjTree');
  468. $('thead', table).remove();
  469. $('tbody', table).remove();
  470. GetAllProjectData(function (data) {
  471. Tree = $.fn.treeTable.init(table, ProjTreeSetting, data);
  472. });
  473. // 显示默认两个可选菜单
  474. $(".tools-btn > a").not(".disabled").addClass("disabled");
  475. $("#add-folder-btn").removeClass("disabled");
  476. $("#add-project-btn").removeClass("disabled");
  477. engineering = engineeringList !== null && engineeringList !== undefined ? JSON.parse(engineeringList) : [];
  478. }
  479. /**
  480. * 新增建设项目
  481. *
  482. * @return {boolean}
  483. */
  484. function AddProject() {
  485. let name = $('#project-name').val();
  486. if (name === '') {
  487. alert('请填写工程');
  488. return false;
  489. }
  490. let valuation = $("#valuation").val();
  491. if (valuation === '') {
  492. alert("请选择计价规则");
  493. return false;
  494. }
  495. let valuationName = $("#valuation").children("option:selected").text();
  496. let valuationType = $("input[name='valuation_type']:checked").val();
  497. let engineeringList = [];
  498. let valuationData = valuationType === 'bill' ? JSON.parse(billValuation) : JSON.parse(rationValuation);
  499. for(let tmp of valuationData) {
  500. if (tmp._id === valuation) {
  501. engineeringList = tmp.engineering_list;
  502. break;
  503. }
  504. }
  505. let callback = function() {
  506. $("#add-project-dialog").modal("hide");
  507. // 记录选择后的信息
  508. let projectInfo = {
  509. valuation: valuation,
  510. valuationType: valuationType,
  511. valuationName: valuationName,
  512. engineeringList: engineeringList,
  513. };
  514. localStorage.setItem(name, JSON.stringify(projectInfo));
  515. };
  516. let selectedItem = Tree.selected();
  517. // 如果选择的是建设项目则新增同级数据
  518. if (selectedItem !== null && selectedItem.data.projType === projectType.project) {
  519. AddSiblingsItem(name, projectType.project, callback);
  520. } else {
  521. AddChildrenItem(name, projectType.project, callback);
  522. }
  523. }
  524. /**
  525. * 新增子元素
  526. *
  527. * @param {String} name
  528. * @param {String} type
  529. * @param {function} callback
  530. * @return {void}
  531. */
  532. function AddChildrenItem(name, type, callback) {
  533. let parent = Tree.selected() ? Tree.selected() : Tree._root;
  534. let next = Tree.selected() ? Tree.selected().firstChild() : Tree.firstNode();
  535. GetNewProjectId(function(IDs) {
  536. let typeInfo = {
  537. updateType: 'new',
  538. projectType: type
  539. };
  540. let updateData = GetUpdateData(parent, next, name, IDs.lowID, typeInfo);
  541. Tree.maxNodeId(IDs.lowID - 1);
  542. UpdateProjectData(updateData, function(datas){
  543. datas.forEach(function (data) {
  544. if (data.updateType === 'new') {
  545. Tree.addNodeData(data.updateData, parent, next);
  546. }
  547. });
  548. callback();
  549. });
  550. });
  551. }
  552. /**
  553. * 新增同级元素
  554. *
  555. * @param {String} name
  556. * @param {String} type
  557. * @param {function} callback
  558. * @return {void}
  559. */
  560. function AddSiblingsItem(name, type, callback) {
  561. let selected = Tree.selected();
  562. let parent = selected ? selected.parent : Tree._root;
  563. let next = selected ? selected.nextSibling : Tree.firstNode();
  564. GetNewProjectId(function(IDs) {
  565. let typeInfo = {
  566. updateType: 'new',
  567. projectType: type
  568. };
  569. let updateData = GetUpdateData(parent, next, name, IDs.lowID, typeInfo);
  570. Tree.maxNodeId(IDs.lowID - 1);
  571. UpdateProjectData(updateData, function(datas){
  572. datas.forEach(function (data) {
  573. if (data.updateType === 'new') {
  574. Tree.addNodeData(data.updateData, parent, next);
  575. }
  576. });
  577. callback();
  578. });
  579. });
  580. }
  581. /**
  582. * 新增单项工程
  583. *
  584. * @return {boolean}
  585. */
  586. function AddEngineering() {
  587. let name = $('#engineering-name').val();
  588. if (name === '') {
  589. alert('请填写单项工程名称');
  590. return false;
  591. }
  592. let callback = function() {
  593. $("#add-engineering-dialog").modal("hide");
  594. };
  595. let selectedItem = Tree.selected();
  596. // 如果选择的是单项工程则新增同级数据
  597. if (selectedItem !== null && selectedItem.data.projType === projectType.engineering) {
  598. AddSiblingsItem(name, projectType.engineering, callback);
  599. } else {
  600. AddChildrenItem(name, projectType.engineering, callback);
  601. }
  602. }
  603. /**
  604. * 新增单位工程
  605. *
  606. * @return {boolean}
  607. */
  608. function AddTender() {
  609. let name = $('#tender-name').val();
  610. if (name === '') {
  611. alert('请填写单位工程名称');
  612. return false;
  613. }
  614. let callback = function() {
  615. $("#add-tender-dialog").modal("hide");
  616. };
  617. let selectedItem = Tree.selected();
  618. // 如果选择的是单项工程则新增同级数据
  619. if (selectedItem !== null && selectedItem.data.projType === projectType.tender) {
  620. AddSiblingsItem(name, projectType.tender, callback);
  621. } else {
  622. AddChildrenItem(name, projectType.tender, callback);
  623. }
  624. }
  625. /**
  626. * 新增文件夹
  627. *
  628. * @return {boolean}
  629. */
  630. function AddFolder() {
  631. let name = $('#folder-name').val();
  632. if (name === '') {
  633. alert('请填写文件夹名称');
  634. return false;
  635. }
  636. let selectedItem = Tree.selected();
  637. if (selectedItem !== null) {
  638. // 判断是否超过3层
  639. if (selectedItem.parent !== null && selectedItem.parent.parent !== null &&
  640. selectedItem.parent.parent.parent !== null) {
  641. alert("文件夹不能超过3层");
  642. return false;
  643. }
  644. AddChildrenItem(name, projectType.folder, function() {
  645. $("#add-folder-dialog").modal("hide");
  646. });
  647. } else {
  648. AddSiblingsItem(name, projectType.folder, function() {
  649. $("#add-folder-dialog").modal("hide");
  650. });
  651. }
  652. }
  653. /**
  654. * 组织更新数据
  655. *
  656. * @param {Object} parent
  657. * @param {Object} next
  658. * @param {String} name
  659. * @param {Object} type
  660. * @return {Object}
  661. */
  662. function GetUpdateData(parent, next, name, newId, type) {
  663. let data = [];
  664. let updateData = {};
  665. updateData['updateType'] = type.updateType === undefined ? 'new' : type.updateType;
  666. updateData['updateData'] = {};
  667. if (newId !== '') {
  668. updateData['updateData'][Tree.setting.tree.id] = newId;
  669. }
  670. updateData['updateData'][Tree.setting.tree.pid] = parent ? parent.id() : -1;
  671. updateData['updateData'][Tree.setting.tree.nid] = next ? next.id() : -1;
  672. if (name !== '') {
  673. updateData['updateData']['name'] = name;
  674. }
  675. if (type !== null && type.projectType !== null) {
  676. updateData['updateData']['projType'] = type.projectType !== undefined ? type.projectType : 'Tender';
  677. }
  678. data.push(updateData);
  679. return data;
  680. }
  681. /**
  682. * 获取删除数据
  683. *
  684. * @return {Object} node
  685. * @return {Object}
  686. */
  687. function GetDeleteUpdateData(node) {
  688. let datas = [], updateData,
  689. pre = node.preSibling(),
  690. deleteNodeData = function (node) {
  691. var data = {};
  692. data['updateType'] = 'delete';
  693. data['updateData'] = {};
  694. data['updateData'][Tree.setting.tree.id] = node.id();
  695. if (node.data.projType === 'Tender') {
  696. data['updateData']['FullFolder'] = GetFullFolder(node.parent);
  697. }
  698. return data;
  699. },
  700. addDeleteChildren = function (children) {
  701. children.forEach(function(child){
  702. datas.push(deleteNodeData(child));
  703. addDeleteChildren(child.children);
  704. });
  705. };
  706. if (pre && pre.id() !== -1) {
  707. updateData = {};
  708. updateData['updateType'] = 'update';
  709. updateData['updateData'] = {};
  710. updateData['updateData'][Tree.setting.tree.id] = pre.id();
  711. updateData['updateData'][Tree.setting.tree.nid] = node ? node.nid() : -1;
  712. datas.push(updateData);
  713. }
  714. datas.push(deleteNodeData(node));
  715. addDeleteChildren(node.children);
  716. return datas;
  717. };
  718. /**
  719. * 获取父级所有名称
  720. *
  721. * @return {Array}
  722. */
  723. function GetFullFolder (node) {
  724. let fullFolder = [];
  725. let cur = node;
  726. while (cur && cur.data) {
  727. fullFolder.unshift(cur.data.name);
  728. cur = cur.parent;
  729. }
  730. return fullFolder;
  731. }
  732. /**
  733. * 获取需要更新的前节点
  734. *
  735. * @param {Object} parent
  736. * @param {Object} next
  737. * @return {Object}
  738. */
  739. function GetNeedUpdatePreNode(parent, next) {
  740. if (next) {
  741. return next.preSibling();
  742. } else if (parent) {
  743. return parent.firstChild();
  744. } else {
  745. return null;
  746. }
  747. }
  748. /**
  749. * 获取最新id
  750. *
  751. * @param {function} callback
  752. * @return {void}
  753. */
  754. function GetNewProjectId(callback) {
  755. CommonAjax.post('/pm/api/getNewProjectID', {count: 1}, function(data) {
  756. callback(data);
  757. });
  758. }
  759. /**
  760. * 重命名项目
  761. *
  762. * @param {Number} projectId
  763. * @param {String} newName
  764. * @param {function} callback
  765. * @return {void}
  766. */
  767. function RenameProject(projectId, newName, callback) {
  768. $.ajax({
  769. type: "POST",
  770. url: '/pm/api/renameProject',
  771. data: {'data': JSON.stringify({"user_id": userID, "id": projectId, "newName": newName})},
  772. dataType: 'json',
  773. cache: false,
  774. timeout: 5000,
  775. success: function(result){
  776. if (result.error === 0) {
  777. callback();
  778. } else {
  779. alert('error' + result.message);
  780. }
  781. },
  782. error: function(iqXHR, textStatus, errorThrown){
  783. alert('error ' + textStatus + " " + errorThrown)
  784. }
  785. });
  786. }
  787. /**
  788. * 转换当前树结构为zTree结构
  789. *
  790. * @param {Object} Tree
  791. * @param {Object} zTreeObj
  792. * @param {Object} filterNode
  793. * @return {Mixed}
  794. */
  795. function ConvertTreeToZtree(Tree, zTreeObj, filterNode) {
  796. let setting = {
  797. data: {
  798. simpleData: {
  799. enable:true,
  800. idKey: "id",
  801. pIdKey: "pId",
  802. rootPId: "-1"
  803. }
  804. }};
  805. let zTreeData = [],
  806. exportNodesData = function (nodes) {
  807. nodes.forEach(function (node) {
  808. if (node !== filterNode) {
  809. var data = {};
  810. data['id'] = node.data[Tree.setting.tree.id];
  811. data['pId'] = node.pid();
  812. data['name'] = node.data['name'];
  813. data['isParent'] = node.data.projType === 'Folder';//(node.data.projType === 'Folder' && node.children.length === 0);
  814. data['open'] = node.data.projType === 'Folder';//node.children.length !== 0;
  815. zTreeData.push(data);
  816. exportNodesData(node.children);
  817. }
  818. })
  819. };
  820. exportNodesData(Tree._root.children);
  821. return $.fn.zTree.init(zTreeObj, setting, zTreeData);
  822. }
  823. /**
  824. * 获取指定zTree节点
  825. *
  826. * @param {Object} zTreeObj
  827. * @return {object}
  828. */
  829. function GetTargetTreeNode(zTreeObj) {
  830. if (!zTreeObj || !Tree) {
  831. return null;
  832. }
  833. let ztree_selected = zTreeObj.getSelectedNodes().length === 0 ? null : zTreeObj.getSelectedNodes()[0];
  834. return ztree_selected ? Tree.findNode(ztree_selected.id) : null;
  835. }
  836. /**
  837. * 根据指定id获取对应的工程专业
  838. *
  839. * @param {Array} engineeringList
  840. * @return {String}
  841. */
  842. function getEngineeringHtml(engineeringList) {
  843. let result = '<option>请选择对应的工程专业</option>';
  844. if (engineeringList.length <= 0) {
  845. return result;
  846. }
  847. let engineeringObject = {};
  848. for(let tmp of engineering) {
  849. engineeringObject[tmp.value] = tmp.name;
  850. }
  851. for(let tmp of engineeringList) {
  852. if (engineeringObject[tmp.engineering] !== undefined) {
  853. result += '<option value="'+ tmp.engineering_id +'">'+ engineeringObject[tmp.engineering] +'</option>';
  854. }
  855. }
  856. return result;
  857. }