section_tree.js 36 KB

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