section_tree.js 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868
  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. //job
  18. jobContentOprObj.radiosChange(jobContentOprObj.radios, jobContentOprObj.tableAll, jobContentOprObj.tablePartial);
  19. $('#addConBtn').click(jobContentOprObj.bindAddConBtn());
  20. $('#updateConBtn').click(jobContentOprObj.bindUpdateConBtn());
  21. $('#txtareaAll').bind('change', function () {
  22. let met = this;
  23. let jobContent = $(met).val();
  24. $(met).attr('disabled', true);
  25. let updateCodes = [];
  26. for(let i = 0, len = jobContentOprObj.currentRationItems.length; i < len; i++){
  27. updateCodes.push(jobContentOprObj.currentRationItems[i].code);
  28. }
  29. jobContentOprObj.updateJobContent(me.rationLibId, jobContentOprObj.getUpdateArr(updateCodes, jobContent), function () {
  30. $(met).attr('disabled', false);
  31. jobContentOprObj.currentJobContent = jobContent;
  32. })
  33. });
  34. }
  35. }
  36. }
  37. var zTreeOprObj = {
  38. treeObj: null,
  39. getRationTree: function(rationLibId){
  40. var me = this;
  41. $.ajax({
  42. type:"POST",
  43. url:"api/getRationTree",
  44. data:{"rationLibId": rationLibId},
  45. dataType:"json",
  46. cache:false,
  47. timeout:20000,
  48. success:function(result,textStatus,status){
  49. if(status.status == 200) {
  50. if (result.data.length > 0) {
  51. storageUtil.setSessionCache("RationGrp","repositoryID",result.data[0].rationRepId);
  52. }
  53. zTreeHelper.createTree(result.data, setting, "rationChapterTree", me);
  54. //初始化,初始节点点击
  55. let rootNode = me.treeObj.getNodes()[0];
  56. if(rootNode && rootNode.isFirstNode){
  57. me.treeObj.selectNode(rootNode);
  58. me.onClick(null, 'rationChapterTree', rootNode);
  59. }
  60. explanatoryOprObj.bindEvents($('#explanationShow'), $('#ruleTextShow'));
  61. }
  62. },
  63. error:function(err){
  64. alert(err.responseJSON.error);
  65. }
  66. })
  67. },
  68. addRootNode: function() {
  69. $('#addRootA').css("opacity", "0.2");
  70. $('#addRootA').addClass("disabled");
  71. var me = zTreeOprObj, rawNode = {ParentID: -1, NextSiblingID: -1, name: "新增节点"}, lastNodeId = -1;
  72. if (me.treeObj) {
  73. var rootNodes = me.treeObj.getNodes();
  74. if (rootNodes.length > 0) {
  75. lastNodeId = rootNodes[rootNodes.length - 1].ID;
  76. }
  77. }
  78. me.addNewNode(rawNode, lastNodeId, function(err, rst){
  79. if (!(err)) {
  80. if(rootNodes.length > 0){
  81. rootNodes[rootNodes.length - 1].NextSiblingID = rst.data.ID;
  82. }
  83. var newNodes = [], isSilent = false;
  84. newNodes.push({ rationRepId: rst.data.rationRepId, Previous_ID: lastNodeId, ID: rst.data.ID, ParentID:-1, NextSiblingID:-1, name:"新增节点",isParent:false, items:[]});
  85. if (me.treeObj) {
  86. me.treeObj.addNodes(null, -1, newNodes, isSilent);
  87. } else {
  88. me.treeObj = $.fn.zTree.init($("#rationChapterTree"), setting, newNodes);
  89. }
  90. $('#addRootA').css("opacity", "");
  91. $('#addRootA').removeClass("disabled");
  92. }
  93. });
  94. },
  95. addNewNode : function(rawNode, lastNodeId, callback){
  96. $.ajax({
  97. type:"POST",
  98. url:"api/createNewNode",
  99. data:{"rationLibId":pageOprObj.rationLibId,"lastNodeId": lastNodeId, "lastOpr": userAccount, "rawNodeData": JSON.stringify(rawNode)},
  100. dataType:"json",
  101. cache:false,
  102. timeout:1000,
  103. success: function(result,textStatus,status){
  104. callback(false, result);
  105. },
  106. error:function(err){
  107. callback(err);
  108. }
  109. })
  110. },
  111. beforeRename: function(treeId, treeNode, newName, isCancel) {
  112. if (newName.length == 0) {
  113. return false;
  114. }
  115. return true;
  116. },
  117. onRename : function(e, treeId, treeNode, isCancel) {
  118. var nodes = [];
  119. nodes.push(treeNode);
  120. zTreeOprObj.updateNodes(nodes);
  121. },
  122. onBeforeRemove: function(treeId, treeNode){
  123. var nodeIds = [], preNode = treeNode.getPreNode(), preNodeId = -1;
  124. if (preNode) {
  125. preNodeId = preNode.ID;
  126. }
  127. private_fetchAllSubItems = function(pItem){
  128. nodeIds.push(pItem.ID);
  129. if (pItem.items && pItem.items.length > 0) {
  130. for (var i = 0; i < pItem.items.length; i++) {
  131. private_fetchAllSubItems(pItem.items[i]);
  132. }
  133. }
  134. };
  135. nodeIds.push(treeNode.ID);
  136. for (var i = 0; i < treeNode.items.length; i++) {
  137. private_fetchAllSubItems(treeNode.items[i]);
  138. }
  139. $.ajax({
  140. type:"POST",
  141. url:"api/deleteNodes",
  142. data:{"repId": pageOprObj.rationLibId, "lastOpr": userAccount, "nodes": JSON.stringify(nodeIds), "preNodeId": preNodeId, "preNodeNextId": treeNode.NextSiblingID},
  143. dataType:"json",
  144. cache:false,
  145. timeout:5000,
  146. success:function(result,textStatus,status){
  147. var pNode = treeNode.getParentNode();
  148. if (pNode && pNode.items && pNode.items.length == 1) {
  149. pNode.isParent = false;
  150. }
  151. },
  152. error:function(){
  153. }
  154. });
  155. return true;
  156. },
  157. onRemove: function(e, treeId, treeNode){
  158. var me = zTreeOprObj, pNode = me.treeObj.getNodeByTId(treeNode.parentTId);
  159. if (pNode && pNode.items && pNode.items.length == 0) {
  160. pNode.isParent = false;
  161. me.treeObj.refresh();
  162. //me.treeObj.updateNode(pNode, false); //这方法有后遗症,多次操作后会造成节点新增子节点时,父节点icon显示不正确
  163. }
  164. },
  165. beforeDrop: function (treeId, treeNodes, targetNode, moveType) {
  166. let me = zTreeOprObj;
  167. if(moveType){
  168. me.treeObj.setting.edit.enable = false;
  169. let treeNode = treeNodes[0], updateNodes = [];
  170. //升级
  171. if(treeNode.level !== targetNode.level && moveType === 'prev'){
  172. if(treeNode.Previous_ID !== -1){
  173. treeNode.getPreNode().NextSiblingID = treeNode.NextSiblingID;
  174. updateNodes.push(treeNode.getPreNode());
  175. }
  176. if(treeNode.NextSiblingID !== -1){
  177. treeNode.getNextNode().Previous_ID = treeNode.Previous_ID;
  178. }
  179. if(targetNode.Previous_ID !== -1){
  180. targetNode.getPreNode().NextSiblingID = treeNode.ID;
  181. updateNodes.push(targetNode.getPreNode());
  182. }
  183. treeNode.ParentID = targetNode.getParentNode() ? targetNode.getParentNode().ID : -1;
  184. treeNode.NextSiblingID = targetNode.ID;
  185. treeNode.Previous_ID = targetNode.Previous_ID;
  186. targetNode.Previous_ID = treeNode.ID;
  187. updateNodes.push(treeNode);
  188. //updateNodes.push(targetNode);
  189. }
  190. //升级
  191. else if(treeNode.level !== targetNode.level && moveType === 'next'){
  192. if(treeNode.Previous_ID !== -1){
  193. treeNode.getPreNode().NextSiblingID = treeNode.NextSiblingID;
  194. updateNodes.push(treeNode.getPreNode());
  195. }
  196. if(treeNode.NextSiblingID !== -1){
  197. treeNode.getNextNode().Previous_ID = treeNode.Previous_ID;
  198. }
  199. if(targetNode.NextSiblingID !== -1){
  200. targetNode.getNextNode().Previous_ID = treeNode.ID;
  201. }
  202. treeNode.NextSiblingID = targetNode.NextSiblingID;
  203. treeNode.Previous_ID = targetNode.ID;
  204. treeNode.ParentID = targetNode.getParentNode() ? targetNode.getParentNode().ID : -1;
  205. targetNode.NextSiblingID = treeNode.ID;
  206. updateNodes.push(treeNode);
  207. updateNodes.push(targetNode);
  208. }
  209. //上移
  210. else if(treeNode.level === targetNode.level && moveType === 'prev'){
  211. if(targetNode.Previous_ID !== -1){
  212. let targetPrev = me.treeObj.getNodeByParam('ID', targetNode.Previous_ID, null);
  213. targetPrev.NextSiblingID = treeNode.ID;
  214. updateNodes.push(targetPrev);
  215. }
  216. targetNode.NextSiblingID = treeNode.NextSiblingID;
  217. treeNode.NextSiblingID = targetNode.ID;
  218. treeNode.Previous_ID = targetNode.Previous_ID;
  219. targetNode.Previous_ID = treeNode.ID;
  220. updateNodes.push(treeNode);
  221. updateNodes.push(targetNode);
  222. }
  223. //下移
  224. else if(treeNode.level === targetNode.level && moveType === 'next'){
  225. if(treeNode.Previous_ID !== -1){
  226. let treeNodePrev = me.treeObj.getNodeByParam('ID', treeNode.Previous_ID, null);
  227. treeNodePrev.NextSiblingID = targetNode.ID;
  228. updateNodes.push(treeNodePrev);
  229. }
  230. treeNode.Previous_ID = targetNode.ID;
  231. treeNode.NextSiblingID = targetNode.NextSiblingID;
  232. targetNode.Previous_ID = treeNode.Previous_ID;
  233. targetNode.NextSiblingID = treeNode.ID;
  234. updateNodes.push(treeNode);
  235. updateNodes.push(targetNode);
  236. }
  237. //
  238. else if(moveType === 'inner'){
  239. if( treeNode.Previous_ID !== -1){
  240. treeNode.getPreNode().NextSiblingID = treeNode.NextSiblingID;
  241. updateNodes.push(treeNode.getPreNode());
  242. }
  243. if(treeNode.NextSiblingID !== -1){
  244. treeNode.getNextNode().Previous_ID = treeNode.Previous_ID;
  245. }
  246. if(targetNode.items.length > 0){
  247. targetNode.items[targetNode.items.length -1].NextSiblingID = treeNode.ID;
  248. treeNode.Previous_ID = targetNode.items[targetNode.items.length -1].ID;
  249. updateNodes.push(targetNode.items[targetNode.items.length -1]);
  250. }
  251. else{
  252. treeNode.Previous_ID = -1;
  253. }
  254. treeNode.ParentID = targetNode.ID;
  255. treeNode.NextSiblingID = -1;
  256. updateNodes.push(treeNode);
  257. }
  258. if(updateNodes.length > 0){
  259. me.updateNodes(updateNodes, function () {
  260. me.treeObj.setting.edit.enable= true;
  261. });
  262. }
  263. }
  264. },
  265. onDrop: function (event, treeId, treeNodes, targetNode, moveType) {
  266. },
  267. updateNodes: function(nodes, callback){
  268. if (nodes && nodes.length > 0) {
  269. var reqData = []
  270. for (var i = 0; i < nodes.length; i++) {
  271. var node = {};
  272. node.rationRepId = nodes[i].rationRepId;
  273. node.ID = nodes[i].ID;
  274. node.ParentID = nodes[i].ParentID;
  275. node.NextSiblingID = nodes[i].NextSiblingID;
  276. node.name = nodes[i].name;
  277. if (nodes[i].__v != null) node.__v = nodes[i].__v + 1
  278. else node.__v = 0;
  279. reqData.push(node);
  280. }
  281. $.ajax({
  282. type:"POST",
  283. url:"api/updateNodes",
  284. data:{"repId": pageOprObj.rationLibId,"lastOpr": userAccount, "nodes": JSON.stringify(reqData)},
  285. dataType:"json",
  286. cache:false,
  287. timeout:5000,
  288. success:function(result,textStatus,status){
  289. if(callback){
  290. callback();
  291. }
  292. console.log(status + ' : ' + result);
  293. },
  294. error:function(){
  295. }
  296. })
  297. }
  298. },
  299. addHoverDom: function(treeId, treeNode) {
  300. if(typeof treeNode.doing !== 'undefined' && treeNode.doing){
  301. return false;
  302. }
  303. hoverOpr();
  304. function hoverOpr(){
  305. var me = zTreeOprObj, sObj = $("#" + treeNode.tId + "_span");
  306. if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length>0) return;
  307. var addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='新增子节点' onfocus='this.blur();'></span>";
  308. sObj.after(addStr);
  309. var btn = $("#addBtn_"+treeNode.tId);
  310. if (btn) btn.bind("click", function(){
  311. treeNode.doing = true;
  312. var rawNode = {ParentID: treeNode.ID, NextSiblingID: -1, name: "新增子节点"}, lastNodeId = -1, lastNode = null;
  313. if (treeNode.items.length > 0) {
  314. lastNodeId = treeNode.items[treeNode.items.length - 1].ID;
  315. lastNode = treeNode.items[treeNode.items.length - 1];
  316. }
  317. zTreeOprObj.addNewNode(rawNode, lastNodeId, function(err, rst){
  318. if (!(err)) {
  319. var newNodes = [], isSilent = false;
  320. if (lastNode) {
  321. lastNode.NextSiblingID = rst.ID;
  322. }
  323. newNodes.push({ rationRepId: rst.data.rationRepId, ID: rst.data.ID, Previous_ID: lastNodeId, ParentID: rst.data.ParentID, NextSiblingID:-1, name:"新增子节点",isParent:false, items:[]});
  324. treeNode.isParent = true;
  325. if (me.treeObj) {
  326. me.treeObj.addNodes(treeNode, -1, newNodes, isSilent);
  327. } else {
  328. me.treeObj = $.fn.zTree.init($("#rationChapterTree"), setting, newNodes);
  329. }
  330. }
  331. treeNode.doing = false;
  332. hoverOpr();
  333. });
  334. });
  335. }
  336. },
  337. removeHoverDom: function(treeId, treeNode) {
  338. $("#addBtn_"+treeNode.tId).unbind().remove();
  339. },
  340. onClick: function(event,treeId,treeNode) {
  341. explanatoryOprObj.setAttribute(explanatoryOprObj.currentTreeNode ? explanatoryOprObj.currentTreeNode : treeNode, treeNode, treeNode.explanation, treeNode.ruleText);
  342. explanatoryOprObj.clickUpdate($('#explanationShow'), $('#ruleTextShow'));
  343. explanatoryOprObj.showText($('#explanationShow'), $('#ruleTextShow'), treeNode.explanation, treeNode.ruleText);
  344. jobContentOprObj.currentSituation = typeof treeNode.jobContentSituation !== 'undefined'? treeNode.jobContentSituation : jobContentOprObj.situations.NONE;
  345. jobContentOprObj.setAttribute(jobContentOprObj.currentTreeNode ? jobContentOprObj.currentTreeNode : treeNode, treeNode);
  346. jobContentOprObj.clickUpdate($('#txtareaAll'));
  347. var sectionID = treeNode.ID;
  348. if (!(treeNode.items) || treeNode.items.length == 0) {
  349. rationOprObj.workBook.getSheet(0).clearSelection();
  350. rationOprObj.getRationItems(sectionID);
  351. } else {
  352. jobContentOprObj.setRadiosDisabled(true, jobContentOprObj.radios);
  353. jobContentOprObj.hideTable($('#tableAll'), $('#tablePartial'));
  354. sheetCommonObj.cleanSheet(rationOprObj.workBook.getSheet(0), rationOprObj.setting, -1);
  355. sheetCommonObj.shieldAllCells(rationOprObj.workBook.getSheet(0));
  356. }
  357. sheetCommonObj.cleanSheet(rationGLJOprObj.sheet, rationGLJOprObj.setting, -1);
  358. sheetCommonObj.shieldAllCells(rationGLJOprObj.sheet);
  359. rationGLJOprObj.sheet.getParent().focus(false);
  360. }
  361. };
  362. //定额章节节点说明、计算规则
  363. let explanatoryOprObj = {
  364. preTreeNode: null,
  365. currentTreeNode: null,//定额章节树节点
  366. currentExplanation: null,
  367. currentRuleText: null,
  368. setAttribute: function (preNode, currentNode, explanation, ruleText) {
  369. let me = explanatoryOprObj;
  370. me.preTreeNode = preNode;
  371. me.currentTreeNode = currentNode;
  372. me.currentExplanation = explanation;
  373. me.currentRuleText = ruleText;
  374. },
  375. clickUpdate: function (exarea, ruarea) {//解决编辑完后在未失去焦点的时候直接定额章节树
  376. let me = explanatoryOprObj;
  377. if(exarea.is(':focus')){
  378. let explanation = exarea.val();
  379. if(explanation !== me.currentExplanation){
  380. me.preTreeNode.explanation = explanation;
  381. me.unbindEvents(exarea, ruarea);
  382. exarea.blur();
  383. me.updateExplanation(me.preTreeNode.rationRepId, me.preTreeNode.ID, explanation, function () {
  384. me.bindEvents(exarea, ruarea);
  385. });
  386. }
  387. }
  388. if(ruarea.is(':focus')){
  389. let ruleText = ruarea.val();
  390. if(ruleText !== me.currentRuleText){
  391. me.preTreeNode.ruleText = ruleText;
  392. me.unbindEvents(exarea, ruarea);
  393. ruarea.blur();
  394. me.updateRuleText(me.preTreeNode.rationRepId, me.preTreeNode.ID, ruleText, function () {
  395. me.bindEvents(exarea, ruarea);
  396. });
  397. }
  398. }
  399. },
  400. unbindEvents: function (exarea, ruarea) {
  401. exarea.unbind();
  402. ruarea.unbind();
  403. },
  404. bindEvents: function (exarea, ruarea) {
  405. let me = explanatoryOprObj;
  406. exarea.bind('change', function () {
  407. let explanation = exarea.val();
  408. let node = me.currentTreeNode;
  409. exarea.attr('disabled', true);
  410. me.updateExplanation(node.rationRepId, node.ID, explanation, function () {
  411. node.explanation = explanation;
  412. exarea.attr('disabled', false);
  413. });
  414. });
  415. ruarea.bind('change', function () {
  416. let ruleText = ruarea.val();
  417. let node = me.currentTreeNode;
  418. ruarea.attr('disabled', true);
  419. me.updateRuleText(node.rationRepId, node.ID, ruleText, function () {
  420. node.ruleText = ruleText;
  421. ruarea.attr('disabled', false);
  422. });
  423. });
  424. },
  425. showText: function (exarea, ruarea, explanation, ruleText) {
  426. exarea.val(explanation && explanation !== 'undefined' ? explanation : '');
  427. ruarea.val(ruleText && ruleText !== 'undefined' ? ruleText : '');
  428. },
  429. //更新说明
  430. updateExplanation: function (repId, nodeId, explanation, callback) {
  431. $.ajax({
  432. type: 'post',
  433. url: 'api/updateExplanation',
  434. data: {lastOpr: userAccount, repId: repId, nodeId: nodeId, explanation: explanation},
  435. dataType: 'json',
  436. success: function () {
  437. callback();
  438. }
  439. });
  440. },
  441. //更新计算规则
  442. updateRuleText: function (repId, nodeId, explanation, callback) {
  443. $.ajax({
  444. type: 'post',
  445. url: 'api/updateRuleText',
  446. data: {lastOpr: userAccount, repId: repId, nodeId: nodeId, explanation: explanation},
  447. dataType: 'json',
  448. success: function () {
  449. callback();
  450. }
  451. });
  452. }
  453. };
  454. //工作内容
  455. let jobContentOprObj = {
  456. situations: {ALL: 'ALL', PARTIAL: 'PARTIAL', NONE: 'NONE'},//所有ALL(包括未定义本项工作内容)、部分PARTIA,不可用NONE(无定额时)
  457. currentSituation: null,//本项适用情况
  458. currentTreeNode: null,
  459. preTreeNode: null,
  460. radios: $("input[name = 'optionsRadios']"),
  461. tableAll: $('#tableAll'),
  462. tablePartial: $('#tablePartial'),
  463. currentOprTr: null,
  464. currentJobContent: null,
  465. currentRationItems: null,
  466. addCon: $('#addCon'),//勾选编码模态框
  467. updateCon: $('#updateCon'),//编辑编码模态框
  468. setAttribute: function (preNode, currentNode) {
  469. let me = jobContentOprObj;
  470. me.preTreeNode = preNode;
  471. me.currentTreeNode = currentNode;
  472. },
  473. clickUpdate: function (txtarea) {//解决编辑完后在未失去焦点的时候直接定额章节树
  474. let me = jobContentOprObj;
  475. if(txtarea.is(':focus')){
  476. let jobContent = txtarea.val();
  477. if(jobContent !== me.jobContent){
  478. me.preTreeNode.jobContent = jobContent;
  479. me.unbindEvents(txtarea);
  480. txtarea.blur();
  481. let updateCodes = [];
  482. for(let i = 0, len = me.currentRationItems.length; i < len; i++){
  483. updateCodes.push(me.currentRationItems[i].code);
  484. me.currentRationItems[i].jobContent = jobContent;
  485. }
  486. me.updateJobContent(pageOprObj.rationLibId, me.getUpdateArr(updateCodes, jobContent), function () {
  487. me.bindAllEvents(txtarea);
  488. })
  489. }
  490. }
  491. },
  492. getGroup: function (rationItems) {
  493. let rst = [];//rst = [{jobContent: String, items: Array}]
  494. for(let i = 0, len = rationItems.length; i < len; i++){
  495. if(typeof rationItems[i].jobContent !== 'undefined' && rationItems[i].jobContent.toString().trim().length > 0){
  496. let isExist = false;
  497. for(let j = 0, jLen = rst.length; j < jLen; j++){
  498. if(rst[j].jobContent === rationItems[i].jobContent){
  499. isExist = true;
  500. rst[j].items.push(rationItems[i].code);
  501. break;
  502. }
  503. }
  504. if(!isExist){
  505. rst.push({jobContent: rationItems[i].jobContent, items: [rationItems[i].code]});
  506. }
  507. }
  508. }
  509. return rst;
  510. },
  511. hideTable: function (tableAll, tablePartial) {
  512. if(tableAll){
  513. tableAll.hide();
  514. }
  515. if(tablePartial){
  516. tablePartial.hide();
  517. }
  518. },
  519. //建table
  520. buildTablePartial: function (table, group) {
  521. let me = jobContentOprObj;
  522. table.empty();
  523. let $thead = $("<thead><tr><th></th><th>编码</th><th>工作内容</th>/tr></thead>");
  524. let $tbody = $("<tbody></tbody>");
  525. let count = 1;
  526. for(let i = 0, len = group.length; i < len; i++){
  527. let $newTr = me.getNewTr($tbody, group[i].items, group[i].jobContent);
  528. $tbody.append($newTr);
  529. count++;
  530. }
  531. let $trEnd = $("<tr><td>"+ count +"</td><td><a href data-toggle='modal' data-target='#editBianma' class='m-0'>点击勾选编码</a></td><td><textarea class='form-control'></textarea></td></tr>");//勾选行
  532. $($trEnd.children().children()[0]).bind('click', function () {
  533. me.onclickFuncAdd($(this));
  534. me.currentOprTr = $trEnd;
  535. me.currentJobContent = $(me.currentOprTr.children()[2]).children().val();
  536. });
  537. $tbody.append($trEnd);
  538. table.append($thead);
  539. table.append($tbody);
  540. },
  541. //新增一行tr
  542. getNewTr: function (tbody, codes, jobContent) {
  543. let me = jobContentOprObj;
  544. let count = tbody.children().length > 0 ? tbody.children().length : 1;
  545. let $textTd = $("<td></td>");
  546. let $textarea = $("<textarea class='form-control'></textarea>");
  547. $textarea.val(jobContent);
  548. $textTd.append($textarea);
  549. let $tr = $("<tr><td>" + count + "</td><td><a href data-toggle='modal' data-target='#editBianmaQ' class='m-0'>编辑编码</a></td></tr>");
  550. $tr.children().children().bind('click', function () {
  551. me.currentOprTr = $tr;
  552. me.currentJobContent = $(me.currentOprTr.children()[2]).children().val();
  553. me.onclickFuncEdit($(this));
  554. });
  555. //文本变化;
  556. $textarea.bind('change', function () {
  557. let codes = me.getUpdateCodes($($(this).parent().parent().children()[1]).children());
  558. let jobContent = $(this).val();
  559. me.updateJobContent(pageOprObj.rationLibId, me.getUpdateArr(codes, jobContent), function () {
  560. if(jobContent.trim().length === 0){
  561. me.buildTablePartial(me.tablePartial, me.getGroup(me.currentRationItems));
  562. }
  563. });
  564. });
  565. $tr.append($textTd);
  566. for(let i = 0, len = codes.length; i < len; i ++){
  567. let $p = $("<p class='m-0'>" + codes[i] + "</p>");
  568. $tr.children()[1].append($p[0]);
  569. }
  570. me.setTextareaHeight($textarea, codes.length + 1);
  571. return $tr[0];
  572. },
  573. onclickFuncAdd: function (obj) {
  574. let me = jobContentOprObj;
  575. let txtarea = $(obj.parent().parent().children().children()[1]);
  576. let jobContent = txtarea.val();
  577. if(jobContent.trim().length > 0){//工作内容不为空才可添加编码
  578. let codesObj = me.getAddCodes(me.currentRationItems);
  579. me.buildCheckCodesCon(me.addCon, codesObj.checkedCodes, codesObj.disabledCodes)
  580. obj.attr('data-target', '#editBianma');
  581. }
  582. else{
  583. obj.attr('data-target', '');
  584. alert("工作内容不能为空!");
  585. }
  586. },
  587. onclickFuncEdit: function (obj) {
  588. let me = jobContentOprObj;
  589. me.buildEditableCodesCon(me.currentRationItems, me.updateCon, me.getUpdateCodes(obj));
  590. },
  591. //获取编码td中的编码
  592. getUpdateCodes: function (jq) {
  593. let rst = [];
  594. let nodes = jq.parent().children();
  595. for(let i = 1, len = nodes.length; i < len; i++){
  596. rst.push(nodes[i].textContent);
  597. }
  598. return rst;
  599. },
  600. //建一个编码checkbox Div
  601. buildCodeOption: function (code, attr) {
  602. let $div = $("<div class='col'><label class='form-check-label'><input class='form-check-input' type='checkbox' value= "+ code +"> "+ code +"</label></div>");
  603. let $checkBox = $div.children().children();
  604. if(attr){
  605. $checkBox.attr(attr, true);
  606. }
  607. return $div;
  608. },
  609. //建修改编码弹窗
  610. buildEditableCodesCon: function (rationItems, container,codes) {
  611. let me = jobContentOprObj;
  612. let codeDivs = [];
  613. container.empty();
  614. for(let i = 0, len = codes.length; i < len; i++){
  615. codeDivs.push({code: codes[i], attr: 'checked'});
  616. }
  617. for(let i = 0, len = rationItems.length; i < len; i++){
  618. if(codes.indexOf(rationItems[i].code) === -1){
  619. if(typeof rationItems[i].jobContent !== 'undefined' && rationItems[i].jobContent.toString().trim().length > 0){
  620. codeDivs.push({code: rationItems[i].code, attr: 'disabled'});
  621. }
  622. else{
  623. codeDivs.push({code: rationItems[i].code, attr: ''});
  624. }
  625. }
  626. }
  627. //排序
  628. codeDivs.sort(function (a, b) {
  629. let rst = 0;
  630. if(a.code > b.code) rst = 1;
  631. else if(a.code < b.code) rst = -1;
  632. return rst;
  633. });
  634. for(let i = 0, len = codeDivs.length; i < len; i++){
  635. container.append(me.buildCodeOption(codeDivs[i].code, codeDivs[i].attr));
  636. }
  637. },
  638. //建勾选编码弹窗
  639. buildCheckCodesCon: function (container, checkedCodes, disabledCodes) {
  640. let me = jobContentOprObj;
  641. container.empty();
  642. for(let i = 0, len = checkedCodes.length; i < len; i++){
  643. let $codeDiv = me.buildCodeOption(checkedCodes[i], 'checked');
  644. container.append($codeDiv);
  645. }
  646. for(let i = 0, len = disabledCodes.length; i < len; i++){
  647. let $codeDiv = me.buildCodeOption(disabledCodes[i], 'disabled');
  648. container.append($codeDiv);
  649. }
  650. },
  651. getAddCodes: function (rationItems) {
  652. let me = jobContentOprObj;
  653. let rst = {checkedCodes: [], disabledCodes: []};
  654. for(let i = 0, len = rationItems.length; i < len; i++){
  655. if(typeof rationItems[i].jobContent !== 'undefined' && rationItems[i].jobContent.toString().trim().length > 0){
  656. rst.disabledCodes.push(rationItems[i].code);
  657. }
  658. else{
  659. rst.checkedCodes.push(rationItems[i].code);
  660. }
  661. }
  662. return rst;
  663. },
  664. //获取选择后的编码窗口的编码及状态
  665. getCodesAfterS: function (checkNodes) {
  666. let rst = {checked: [], unchecked: []};
  667. for(let i = 0, len = checkNodes.length; i < len; i++){
  668. if(checkNodes[i].checked){
  669. rst.checked.push(checkNodes[i].value);
  670. }
  671. else if(!checkNodes[i].checked && !checkNodes[i].disabled){
  672. rst.unchecked.push(checkNodes[i].value);
  673. }
  674. }
  675. return rst;
  676. },
  677. setRadiosChecked: function (situation, radios) {
  678. let me = jobContentOprObj;
  679. if(situation === me.situations.ALL){
  680. radios[0].checked = true;
  681. radios[1].checked = false;
  682. $('#txtareaAll').val(me.currentRationItems.length > 0 ? me.currentRationItems[0].jobContent : '');
  683. me.currentJobContent = me.currentRationItems.length > 0 ? me.currentRationItems[0].jobContent : '';
  684. me.tableAll.show();
  685. me.tablePartial.hide();
  686. }
  687. else if(situation === me.situations.PARTIAL){
  688. radios[0].checked = false;
  689. radios[1].checked = true;
  690. me.tableAll.hide();
  691. me.tablePartial.show();
  692. }
  693. else if(situation === me.situations.NONE){
  694. radios[0].checked = false;
  695. radios[1].checked = false;
  696. me.tableAll.hide();
  697. me.tablePartial.hide();
  698. }
  699. },
  700. //radios是否可用,只有在定额章节树的底层节点才可用
  701. setRadiosDisabled: function (val, radios) {
  702. let me =jobContentOprObj;
  703. if(val){
  704. radios[0].checked = false;
  705. radios[1].checked = false;
  706. me.currentSituation = me.situations.NONE;
  707. }
  708. radios.attr('disabled', val);
  709. },
  710. radiosChange: function (radios, tableAll, tablePartial) {
  711. let me = jobContentOprObj;
  712. radios.change(function () {
  713. let val = $("input[name = 'optionsRadios']:checked").val();
  714. let selectedNode = zTreeOprObj.treeObj.getSelectedNodes()[0];
  715. me.updateSituation(pageOprObj.rationLibId, selectedNode.ID, val, function () {
  716. selectedNode.jobContentSituation = val;
  717. me.currentSituation = val;
  718. if(val === me.situations.ALL){
  719. let updateCodes = [];
  720. for(let i = 0, len = me.currentRationItems.length; i < len; i++){
  721. updateCodes.push(me.currentRationItems[i].code);
  722. }
  723. me.updateJobContent(pageOprObj.rationLibId, me.getUpdateArr(updateCodes, ''), function () {
  724. me.currentJobContent = '';
  725. $('#txtareaAll').val('');
  726. tableAll.show();
  727. tablePartial.hide();
  728. });
  729. }
  730. else{
  731. me.buildTablePartial(me.tablePartial, me.getGroup(me.currentRationItems));
  732. tableAll.hide();
  733. tablePartial.show();
  734. }
  735. });
  736. });
  737. },
  738. setTextareaHeight: function (textarea, nodesCount) {
  739. const perHeight = 21.6;
  740. textarea.height(nodesCount * 21.6);
  741. },
  742. bindEvents: function (txtarea) {
  743. let me = jobContentOprObj;
  744. txtarea.bind('change', function () {
  745. let jobContent = txtarea.val();
  746. let jqNodes = txtarea.parent().parent().children()[1].children;
  747. let updateCodes = me.getUpdateCodes(jqNodes);
  748. txtarea.attr('disabled', true);
  749. me.updateJobContent(pageOprObj.rationLibId, me.getUpdateArr(updateCodes, jobContent), function () {
  750. txtarea.attr('disabled', false);
  751. });
  752. });
  753. },
  754. bindAllEvents: function (txtarea) {
  755. let me = jobContentOprObj;
  756. txtarea.bind('change', function () {
  757. let met = this;
  758. let jobContent = $(met).val();
  759. $(met).attr('disabled', true);
  760. let updateCodes = [];
  761. for(let i = 0, len = me.currentRationItems.length; i < len; i++){
  762. updateCodes.push(me.currentRationItems[i].code);
  763. me.currentRationItems[i].jobContent = jobContent;
  764. }
  765. me.currentJobContent = jobContent;
  766. me.updateJobContent(me.rationLibId, me.getUpdateArr(updateCodes, jobContent), function () {
  767. $(met).attr('disabled', false);
  768. });
  769. });
  770. },
  771. unbindEvents: function (txtarea) {
  772. txtarea.unbind();
  773. },
  774. //定额工作内容相关操作
  775. rationJobContentOpr: function (rationItems) {
  776. let me = jobContentOprObj;
  777. me.setRadiosDisabled(me.currentRationItems.length > 0 ? false : true, me.radios);
  778. me.setRadiosChecked(me.currentSituation, me.radios);
  779. me.buildTablePartial(me.tablePartial, me.getGroup(rationItems));
  780. },
  781. getUpdateArr: function (updateCodes, jobContent) {
  782. let rst = [];
  783. for(let i = 0, len = updateCodes.length; i < len; i++){
  784. rst.push({code: updateCodes[i], jobContent: jobContent});
  785. }
  786. return rst;
  787. },
  788. bindAddConBtn: function () {
  789. let me = jobContentOprObj;
  790. return function () {
  791. let codesObj = me.getCodesAfterS(me.addCon.children().children().children());
  792. let $tbody = $('#tablePartial tbody');
  793. let lastEle = $tbody[0].lastElementChild;
  794. let txtare = lastEle.lastElementChild.children[0];
  795. if(me.currentJobContent.trim().length > 0){//工作内容不为空才可添加编码
  796. let updateArr = me.getUpdateArr(codesObj.checked, me.currentJobContent);
  797. me.updateJobContent(pageOprObj.rationLibId, updateArr, function () {
  798. me.buildTablePartial(me.tablePartial, me.getGroup(me.currentRationItems));
  799. $(txtare).val('');
  800. });
  801. }
  802. else{
  803. alert("工作内容不能为空!");
  804. }
  805. }
  806. },
  807. bindUpdateConBtn: function () {
  808. let me = jobContentOprObj;
  809. return function () {
  810. let codesObj = me.getCodesAfterS(me.updateCon.children().children().children());
  811. let updateC = me.getUpdateArr(codesObj.checked, me.currentJobContent),
  812. updateUnC = me.getUpdateArr(codesObj.unchecked, ''),
  813. updateArr = updateC.concat(updateUnC);
  814. me.updateJobContent(pageOprObj.rationLibId, updateArr, function () {
  815. me.buildTablePartial(me.tablePartial, me.getGroup(me.currentRationItems));
  816. });
  817. }
  818. },
  819. //更新缓存的定额
  820. updateRationItem: function (rationItems, updateArr) {
  821. for(let i = 0, len = rationItems.length; i < len; i++){
  822. for(let j = 0, jLen = updateArr.length; j < jLen; j++){
  823. if(rationItems[i].code === updateArr[j].code){
  824. rationItems[i].jobContent = updateArr[j].jobContent;
  825. break;
  826. }
  827. }
  828. }
  829. },
  830. updateJobContent: function (repId, updateArr, callback){
  831. let me = jobContentOprObj;
  832. $.ajax({
  833. type: 'post',
  834. url: 'api/updateJobContent',
  835. data: {lastOpr: userAccount, repId: repId, updateArr: JSON.stringify(updateArr)},
  836. dataType: 'json',
  837. success: function (result) {
  838. if(!result.error){
  839. me.updateRationItem(me.currentRationItems, updateArr);
  840. callback();
  841. }
  842. }
  843. });
  844. },
  845. updateSituation: function (repId, nodeId, situation, callback) {
  846. let me = jobContentOprObj;
  847. $.ajax({
  848. type: 'post',
  849. url: 'api/updateSituation',
  850. data: {lastOpr: userAccount, repId: repId, nodeId: nodeId, situation: situation},
  851. dataType: 'json',
  852. success: function (result) {
  853. if(!result.error){
  854. if(callback){
  855. callback();
  856. }
  857. }
  858. }
  859. })
  860. }
  861. };