section_tree.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. /**
  2. * Created by Tony on 2017/4/27.
  3. */
  4. var pageOprObj = {
  5. rationLibName : null,
  6. rationLibId : null,
  7. initPage : function() {
  8. var me = this, rationLibId = getQueryString("repository"),//获取定额库参数
  9. rationLibName = storageUtil.getSessionCache("RationGrp","repositoryID_" + rationLibId);
  10. if (rationLibName) {
  11. var html = $("#rationname")[0].outerHTML;
  12. html = html.replace("XXX定额库", rationLibName);
  13. $("#rationname")[0].outerHTML = html;
  14. me.rationLibName = rationLibName;
  15. me.rationLibId = rationLibId;
  16. zTreeOprObj.getRationTree(rationLibId);
  17. }
  18. }
  19. }
  20. var zTreeOprObj = {
  21. treeObj: null,
  22. getRationTree: function(rationLibId){
  23. var me = this;
  24. $.ajax({
  25. type:"POST",
  26. url:"api/getRationTree",
  27. data:{"rationLibId": rationLibId},
  28. dataType:"json",
  29. cache:false,
  30. timeout:20000,
  31. success:function(result,textStatus,status){
  32. if(status.status == 200) {
  33. if (result.data.length > 0) {
  34. storageUtil.setSessionCache("RationGrp","repositoryID",result.data[0].rationRepId);
  35. }
  36. zTreeHelper.createTree(result.data, setting, "rationChapterTree", me);
  37. //初始化,初始节点点击
  38. let rootNode = me.treeObj.getNodes()[0];
  39. if(rootNode && rootNode.isParent && rootNode.isFirstNode){
  40. me.treeObj.selectNode(rootNode);
  41. me.onClick(null, 'rationChapterTree', rootNode);
  42. }
  43. explanatoryOprObj.bindEvents($('#explanationShow'), $('#ruleTextShow'));
  44. }
  45. },
  46. error:function(err){
  47. alert(err.responseJSON.error);
  48. }
  49. })
  50. },
  51. addRootNode: function() {
  52. $('#addRootA').css("opacity", "0.2");
  53. $('#addRootA').addClass("disabled");
  54. var me = zTreeOprObj, rawNode = {ParentID: -1, NextSiblingID: -1, name: "新增节点"}, lastNodeId = -1;
  55. if (me.treeObj) {
  56. var rootNodes = me.treeObj.getNodes();
  57. if (rootNodes.length > 0) {
  58. lastNodeId = rootNodes[rootNodes.length - 1].ID;
  59. }
  60. }
  61. me.addNewNode(rawNode, lastNodeId, function(err, rst){
  62. if (!(err)) {
  63. if(rootNodes.length > 0){
  64. rootNodes[rootNodes.length - 1].NextSiblingID = rst.data.ID;
  65. }
  66. var newNodes = [], isSilent = false;
  67. newNodes.push({ rationRepId: rst.data.rationRepId, Previous_ID: lastNodeId, ID: rst.data.ID, ParentID:-1, NextSiblingID:-1, name:"新增节点",isParent:false, items:[]});
  68. if (me.treeObj) {
  69. me.treeObj.addNodes(null, -1, newNodes, isSilent);
  70. } else {
  71. me.treeObj = $.fn.zTree.init($("#rationChapterTree"), setting, newNodes);
  72. }
  73. $('#addRootA').css("opacity", "");
  74. $('#addRootA').removeClass("disabled");
  75. }
  76. });
  77. },
  78. addNewNode : function(rawNode, lastNodeId, callback){
  79. $.ajax({
  80. type:"POST",
  81. url:"api/createNewNode",
  82. data:{"rationLibId":pageOprObj.rationLibId,"lastNodeId": lastNodeId, "lastOpr": userAccount, "rawNodeData": JSON.stringify(rawNode)},
  83. dataType:"json",
  84. cache:false,
  85. timeout:1000,
  86. success: function(result,textStatus,status){
  87. callback(false, result);
  88. },
  89. error:function(err){
  90. callback(err);
  91. }
  92. })
  93. },
  94. beforeRename: function(treeId, treeNode, newName, isCancel) {
  95. if (newName.length == 0) {
  96. return false;
  97. }
  98. return true;
  99. },
  100. onRename : function(e, treeId, treeNode, isCancel) {
  101. var nodes = [];
  102. nodes.push(treeNode);
  103. zTreeOprObj.updateNodes(nodes);
  104. },
  105. onBeforeRemove: function(treeId, treeNode){
  106. var nodeIds = [], preNode = treeNode.getPreNode(), preNodeId = -1;
  107. if (preNode) {
  108. preNodeId = preNode.ID;
  109. }
  110. private_fetchAllSubItems = function(pItem){
  111. nodeIds.push(pItem.ID);
  112. if (pItem.items && pItem.items.length > 0) {
  113. for (var i = 0; i < pItem.items.length; i++) {
  114. private_fetchAllSubItems(pItem.items[i]);
  115. }
  116. }
  117. };
  118. nodeIds.push(treeNode.ID);
  119. for (var i = 0; i < treeNode.items.length; i++) {
  120. private_fetchAllSubItems(treeNode.items[i]);
  121. }
  122. $.ajax({
  123. type:"POST",
  124. url:"api/deleteNodes",
  125. data:{"repId": pageOprObj.rationLibId, "lastOpr": userAccount, "nodes": JSON.stringify(nodeIds), "preNodeId": preNodeId, "preNodeNextId": treeNode.NextSiblingID},
  126. dataType:"json",
  127. cache:false,
  128. timeout:5000,
  129. success:function(result,textStatus,status){
  130. var pNode = treeNode.getParentNode();
  131. if (pNode && pNode.items && pNode.items.length == 1) {
  132. pNode.isParent = false;
  133. }
  134. },
  135. error:function(){
  136. }
  137. });
  138. return true;
  139. },
  140. onRemove: function(e, treeId, treeNode){
  141. var me = zTreeOprObj, pNode = me.treeObj.getNodeByTId(treeNode.parentTId);
  142. if (pNode && pNode.items && pNode.items.length == 0) {
  143. pNode.isParent = false;
  144. me.treeObj.refresh();
  145. //me.treeObj.updateNode(pNode, false); //这方法有后遗症,多次操作后会造成节点新增子节点时,父节点icon显示不正确
  146. }
  147. },
  148. beforeDrop: function (treeId, treeNodes, targetNode, moveType) {
  149. let me = zTreeOprObj;
  150. if(moveType){
  151. me.treeObj.setting.edit.enable = false;
  152. let treeNode = treeNodes[0], updateNodes = [];
  153. //升级
  154. if(treeNode.level !== targetNode.level && moveType === 'prev'){
  155. if(treeNode.Previous_ID !== -1){
  156. treeNode.getPreNode().NextSiblingID = treeNode.NextSiblingID;
  157. updateNodes.push(treeNode.getPreNode());
  158. }
  159. if(treeNode.NextSiblingID !== -1){
  160. treeNode.getNextNode().Previous_ID = treeNode.Previous_ID;
  161. }
  162. if(targetNode.Previous_ID !== -1){
  163. targetNode.getPreNode().NextSiblingID = treeNode.ID;
  164. updateNodes.push(targetNode.getPreNode());
  165. }
  166. treeNode.ParentID = targetNode.getParentNode() ? targetNode.getParentNode().ID : -1;
  167. treeNode.NextSiblingID = targetNode.ID;
  168. treeNode.Previous_ID = targetNode.Previous_ID;
  169. targetNode.Previous_ID = treeNode.ID;
  170. updateNodes.push(treeNode);
  171. //updateNodes.push(targetNode);
  172. }
  173. //升级
  174. else if(treeNode.level !== targetNode.level && moveType === 'next'){
  175. if(treeNode.Previous_ID !== -1){
  176. treeNode.getPreNode().NextSiblingID = treeNode.NextSiblingID;
  177. updateNodes.push(treeNode.getPreNode());
  178. }
  179. if(treeNode.NextSiblingID !== -1){
  180. treeNode.getNextNode().Previous_ID = treeNode.Previous_ID;
  181. }
  182. if(targetNode.NextSiblingID !== -1){
  183. targetNode.getNextNode().Previous_ID = treeNode.ID;
  184. }
  185. treeNode.NextSiblingID = targetNode.NextSiblingID;
  186. treeNode.Previous_ID = targetNode.ID;
  187. treeNode.ParentID = targetNode.getParentNode() ? targetNode.getParentNode().ID : -1;
  188. targetNode.NextSiblingID = treeNode.ID;
  189. updateNodes.push(treeNode);
  190. updateNodes.push(targetNode);
  191. }
  192. //上移
  193. else if(treeNode.level === targetNode.level && moveType === 'prev'){
  194. if(targetNode.Previous_ID !== -1){
  195. let targetPrev = me.treeObj.getNodeByParam('ID', targetNode.Previous_ID, null);
  196. targetPrev.NextSiblingID = treeNode.ID;
  197. updateNodes.push(targetPrev);
  198. }
  199. targetNode.NextSiblingID = treeNode.NextSiblingID;
  200. treeNode.NextSiblingID = targetNode.ID;
  201. treeNode.Previous_ID = targetNode.Previous_ID;
  202. targetNode.Previous_ID = treeNode.ID;
  203. updateNodes.push(treeNode);
  204. updateNodes.push(targetNode);
  205. }
  206. //下移
  207. else if(treeNode.level === targetNode.level && moveType === 'next'){
  208. if(treeNode.Previous_ID !== -1){
  209. let treeNodePrev = me.treeObj.getNodeByParam('ID', treeNode.Previous_ID, null);
  210. treeNodePrev.NextSiblingID = targetNode.ID;
  211. updateNodes.push(treeNodePrev);
  212. }
  213. treeNode.Previous_ID = targetNode.ID;
  214. treeNode.NextSiblingID = targetNode.NextSiblingID;
  215. targetNode.Previous_ID = treeNode.Previous_ID;
  216. targetNode.NextSiblingID = treeNode.ID;
  217. updateNodes.push(treeNode);
  218. updateNodes.push(targetNode);
  219. }
  220. //
  221. else if(moveType === 'inner'){
  222. if( treeNode.Previous_ID !== -1){
  223. treeNode.getPreNode().NextSiblingID = treeNode.NextSiblingID;
  224. updateNodes.push(treeNode.getPreNode());
  225. }
  226. if(treeNode.NextSiblingID !== -1){
  227. treeNode.getNextNode().Previous_ID = treeNode.Previous_ID;
  228. }
  229. if(targetNode.items.length > 0){
  230. targetNode.items[targetNode.items.length -1].NextSiblingID = treeNode.ID;
  231. treeNode.Previous_ID = targetNode.items[targetNode.items.length -1].ID;
  232. updateNodes.push(targetNode.items[targetNode.items.length -1]);
  233. }
  234. else{
  235. treeNode.Previous_ID = -1;
  236. }
  237. treeNode.ParentID = targetNode.ID;
  238. treeNode.NextSiblingID = -1;
  239. updateNodes.push(treeNode);
  240. }
  241. if(updateNodes.length > 0){
  242. me.updateNodes(updateNodes, function () {
  243. me.treeObj.setting.edit.enable= true;
  244. });
  245. }
  246. }
  247. },
  248. onDrop: function (event, treeId, treeNodes, targetNode, moveType) {
  249. },
  250. updateNodes: function(nodes, callback){
  251. if (nodes && nodes.length > 0) {
  252. var reqData = []
  253. for (var i = 0; i < nodes.length; i++) {
  254. var node = {};
  255. node.rationRepId = nodes[i].rationRepId;
  256. node.ID = nodes[i].ID;
  257. node.ParentID = nodes[i].ParentID;
  258. node.NextSiblingID = nodes[i].NextSiblingID;
  259. node.name = nodes[i].name;
  260. if (nodes[i].__v != null) node.__v = nodes[i].__v + 1
  261. else node.__v = 0;
  262. reqData.push(node);
  263. }
  264. $.ajax({
  265. type:"POST",
  266. url:"api/updateNodes",
  267. data:{"repId": pageOprObj.rationLibId,"lastOpr": userAccount, "nodes": JSON.stringify(reqData)},
  268. dataType:"json",
  269. cache:false,
  270. timeout:5000,
  271. success:function(result,textStatus,status){
  272. if(callback){
  273. callback();
  274. }
  275. console.log(status + ' : ' + result);
  276. },
  277. error:function(){
  278. }
  279. })
  280. }
  281. },
  282. addHoverDom: function(treeId, treeNode) {
  283. if(typeof treeNode.doing !== 'undefined' && treeNode.doing){
  284. return false;
  285. }
  286. hoverOpr();
  287. function hoverOpr(){
  288. var me = zTreeOprObj, sObj = $("#" + treeNode.tId + "_span");
  289. if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length>0) return;
  290. var addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='新增子节点' onfocus='this.blur();'></span>";
  291. sObj.after(addStr);
  292. var btn = $("#addBtn_"+treeNode.tId);
  293. if (btn) btn.bind("click", function(){
  294. treeNode.doing = true;
  295. var rawNode = {ParentID: treeNode.ID, NextSiblingID: -1, name: "新增子节点"}, lastNodeId = -1, lastNode = null;
  296. if (treeNode.items.length > 0) {
  297. lastNodeId = treeNode.items[treeNode.items.length - 1].ID;
  298. lastNode = treeNode.items[treeNode.items.length - 1];
  299. }
  300. zTreeOprObj.addNewNode(rawNode, lastNodeId, function(err, rst){
  301. if (!(err)) {
  302. var newNodes = [], isSilent = false;
  303. if (lastNode) {
  304. lastNode.NextSiblingID = rst.ID;
  305. }
  306. newNodes.push({ rationRepId: rst.data.rationRepId, ID: rst.data.ID, Previous_ID: lastNodeId, ParentID: rst.data.ParentID, NextSiblingID:-1, name:"新增子节点",isParent:false, items:[]});
  307. treeNode.isParent = true;
  308. if (me.treeObj) {
  309. me.treeObj.addNodes(treeNode, -1, newNodes, isSilent);
  310. } else {
  311. me.treeObj = $.fn.zTree.init($("#rationChapterTree"), setting, newNodes);
  312. }
  313. }
  314. treeNode.doing = false;
  315. hoverOpr();
  316. });
  317. });
  318. }
  319. },
  320. removeHoverDom: function(treeId, treeNode) {
  321. $("#addBtn_"+treeNode.tId).unbind().remove();
  322. },
  323. onClick: function(event,treeId,treeNode) {
  324. explanatoryOprObj.setAttribute(explanatoryOprObj.currentTreeNode ? explanatoryOprObj.currentTreeNode : treeNode, treeNode, treeNode.explanation, treeNode.ruleText);
  325. explanatoryOprObj.clickUpdate($('#explanationShow'), $('#ruleTextShow'));
  326. explanatoryOprObj.showText($('#explanationShow'), $('#ruleTextShow'), treeNode.explanation, treeNode.ruleText);
  327. var sectionID = treeNode.ID;
  328. if (!(treeNode.items) || treeNode.items.length == 0) {
  329. rationOprObj.getRationItems(sectionID);
  330. } else {
  331. sheetCommonObj.cleanSheet(rationOprObj.workBook.getSheet(0), rationOprObj.setting, -1);
  332. sheetCommonObj.shieldAllCells(rationOprObj.workBook.getSheet(0));
  333. }
  334. sheetCommonObj.cleanSheet(rationGLJOprObj.sheet, rationGLJOprObj.setting, -1);
  335. sheetCommonObj.shieldAllCells(rationGLJOprObj.sheet);
  336. }
  337. };
  338. //定额章节节点说明、计算规则
  339. let explanatoryOprObj = {
  340. preTreeNode: null,
  341. currentTreeNode: null,//定额章节树节点
  342. currentExplanation: null,
  343. currentRuleText: null,
  344. setAttribute: function (preNode, currentNode, explanation, ruleText) {
  345. let me = explanatoryOprObj;
  346. me.preTreeNode = preNode;
  347. me.currentTreeNode = currentNode;
  348. me.currentExplanation = explanation;
  349. me.currentRuleText = ruleText;
  350. },
  351. clickUpdate: function (exarea, ruarea) {//解决编辑完后在未失去焦点的时候直接定额章节树
  352. let me = explanatoryOprObj;
  353. if(exarea.is(':focus')){
  354. let explanation = exarea.val();
  355. if(explanation !== me.currentExplanation){
  356. me.preTreeNode.explanation = explanation;
  357. me.unbindEvents(exarea, ruarea);
  358. exarea.blur();
  359. me.updateExplanation(me.preTreeNode.rationRepId, me.preTreeNode.ID, explanation, function () {
  360. me.bindEvents(exarea, ruarea);
  361. });
  362. }
  363. }
  364. if(ruarea.is(':focus')){
  365. let ruleText = ruarea.val();
  366. if(ruleText !== me.currentRuleText){
  367. me.preTreeNode.ruleText = ruleText;
  368. me.unbindEvents(exarea, ruarea);
  369. ruarea.blur();
  370. me.updateRuleText(me.preTreeNode.rationRepId, me.preTreeNode.ID, ruleText, function () {
  371. me.bindEvents(exarea, ruarea);
  372. });
  373. }
  374. }
  375. },
  376. unbindEvents: function (exarea, ruarea) {
  377. exarea.unbind();
  378. ruarea.unbind();
  379. },
  380. bindEvents: function (exarea, ruarea) {
  381. let me = explanatoryOprObj;
  382. exarea.bind('change', function () {
  383. let explanation = exarea.val();
  384. let node = me.currentTreeNode;
  385. exarea.attr('disabled', true);
  386. me.updateExplanation(node.rationRepId, node.ID, explanation, function () {
  387. node.explanation = explanation;
  388. exarea.attr('disabled', false);
  389. });
  390. });
  391. ruarea.bind('change', function () {
  392. let ruleText = ruarea.val();
  393. let node = me.currentTreeNode;
  394. ruarea.attr('disabled', true);
  395. me.updateRuleText(node.rationRepId, node.ID, ruleText, function () {
  396. node.ruleText = ruleText;
  397. ruarea.attr('disabled', false);
  398. });
  399. });
  400. },
  401. showText: function (exarea, ruarea, explanation, ruleText) {
  402. exarea.val(explanation && explanation !== 'undefined' ? explanation : '');
  403. ruarea.val(ruleText && ruleText !== 'undefined' ? ruleText : '');
  404. },
  405. //更新说明
  406. updateExplanation: function (repId, nodeId, explanation, callback) {
  407. $.ajax({
  408. type: 'post',
  409. url: 'api/updateExplanation',
  410. data: {lastOpr: userAccount, repId: repId, nodeId: nodeId, explanation: explanation},
  411. dataType: 'json',
  412. success: function () {
  413. callback();
  414. }
  415. });
  416. },
  417. //更新计算规则
  418. updateRuleText: function (repId, nodeId, explanation, callback) {
  419. $.ajax({
  420. type: 'post',
  421. url: 'api/updateRuleText',
  422. data: {lastOpr: userAccount, repId: repId, nodeId: nodeId, explanation: explanation},
  423. dataType: 'json',
  424. success: function () {
  425. callback();
  426. }
  427. });
  428. }
  429. };