setting_s2b.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. 'use strict';
  2. $(() => {
  3. autoFlashHeight();
  4. const limitObj = (function(list){
  5. const limits = list;
  6. let curLimit;
  7. const getConditionHtml = function(condition) {
  8. const html = [];
  9. for (const c of condition) {
  10. if (html.length > 0) html.push('</br>');
  11. html.push(`${c.alias} ${c.operation} ${c.value}`);
  12. }
  13. return html.join('');
  14. };
  15. const getOptionHtml = function(option) {
  16. const html = [];
  17. html.push('<td>', option.limit ? '<i class="fa fa-check"></i>' : '','</td>');
  18. html.push(`<td>`, getConditionHtml(option.condition), '</td>');
  19. html.push(`<td>${ (!option.limit ? '--' : option.lower + '%') } </td>`);
  20. html.push(`<td>${ (!option.limit ? '--' : option.upper + '%') } </td>`);
  21. html.push(`<td>${option.hint}</td>`);
  22. html.push(`<td><a href="javascript: void(0);" class="mr-1" data-toggle="tooltip" data-placement="bottom" data-original-title="编辑" name="editLimitOption"><i class="fa fa-pencil fa-fw"></i></a>
  23. <a href="javascript: void(0);" class="mr-1" data-toggle="tooltip" data-placement="bottom" data-original-title="删除" name="delLimitOption"><i class="fa fa-trash-o fa-fw text-danger"></i></a></td>`);
  24. return html.join('');
  25. };
  26. const loadLimitOption = function(limit) {
  27. const html = [];
  28. for (const option of limit.options) {
  29. html.push(`<tr class="text-center" optionId = "${option.id}">`, getOptionHtml(option), '</tr>');
  30. }
  31. $('#limitOptions').html(html.join(''));
  32. };
  33. const refreshLimit = function() {
  34. if (!curLimit) {
  35. $('#limitOptions').html('');
  36. } else {
  37. loadLimitOption(curLimit);
  38. $('dd[limitId]').removeClass('bg-warning');
  39. $(`dd[limitId=${curLimit.limit_id}]`).addClass('bg-warning');
  40. }
  41. };
  42. const setCurLimit = function(limit) {
  43. curLimit = limit;
  44. refreshLimit();
  45. };
  46. const getCurLimit = function() {
  47. return curLimit;
  48. };
  49. const getLimitCaptionHtml = function(limit) {
  50. return `<div class="d-flex justify-content-between align-items-center table-file" limitId="${limit.limit_id}"><div>${limit.name}</div>` +
  51. ' <div class="btn-group-table" style="display: none;">\n' +
  52. ' <a href="javascript: void(0);" class="mr-1" data-toggle="tooltip" data-placement="bottom" data-original-title="编辑" name="renameLimit"><i class="fa fa-pencil fa-fw"></i></a>\n' +
  53. ' <a href="javascript: void(0);" class="mr-1" data-toggle="tooltip" data-placement="bottom" data-original-title="删除" name="delLimit"><i class="fa fa-trash-o fa-fw text-danger"></i></a>\n' +
  54. '</div></div>';
  55. };
  56. const getLimitHtml = function(limit) {
  57. const html = [];
  58. html.push(`<dd class="list-group-item" limitId="${limit.limit_id}">`, getLimitCaptionHtml(limit), '</dd>');
  59. return html.join('');
  60. };
  61. const addLimit = function() {
  62. postData('/setting/limit/save', {add: 1}, function(result) {
  63. limits.push(result.add);
  64. $('#limit-list').append(getLimitHtml(result.add));
  65. });
  66. };
  67. const renameLimit = function(limit_id, name) {
  68. postData('/setting/limit/save', { update: { limit_id, name }}, function(result){
  69. const limit = limits.find(x => { return x.limit_id === result.update.limit_id; });
  70. limit.name = result.update.name;
  71. limit.options.forEach(x => { x.name === limit.name; });
  72. $(`dd[limitId=${limit.limit_id}]`).html(getLimitCaptionHtml(limit));
  73. });
  74. };
  75. const delLimit = function(limit_id){
  76. postData('/setting/limit/save', {del: limit_id}, function(result) {
  77. $(`dd[limitId=${result.del}]`).remove();
  78. const limitIndex = limits.findIndex(x => { return x.limit_id === limit_id; });
  79. limits.splice(limitIndex, 1);
  80. if (curLimit.limit_id === limit_id) {
  81. curLimit = null;
  82. refreshLimit();
  83. }
  84. });
  85. };
  86. const addOption = function(option) {
  87. const limit = limits.find(x => { return x.limit_id === option.limit_id; });
  88. limit.options.push(option);
  89. loadLimitOption(curLimit);
  90. };
  91. const updateOption = function(option) {
  92. const limit = limits.find(x => { return x.limit_id === option.limit_id; });
  93. const orgOption = limit.options.find(x => { return x.id === option.id; });
  94. if (!orgOption) return;
  95. _.assignIn(orgOption, option);
  96. loadLimitOption(curLimit);
  97. };
  98. const delOption = function (option) {
  99. const limit = limits.find(x => { return x.limit_id === option.limit_id; });
  100. const index = limit.options.findIndex(x => { return x.id === option.id; });
  101. limit.options.splice(index, 1);
  102. loadLimitOption(curLimit);
  103. };
  104. if (limits.length > 0) setCurLimit(limits[0]);
  105. return { setCurLimit, getCurLimit, addLimit, delLimit, renameLimit, addOption, updateOption, delOption, }
  106. })(limitList);
  107. const optionSaveObj = (function(){
  108. let limit_id, limit_name;
  109. const addCheckHtml = function(check) {
  110. const html = [];
  111. html.push('<tr>', `<td locInfo="${check.alias}&^&${check.field}&^&${check.check}&^&${check.operation}&^&${check.value}&^&${check.source}">${check.alias} ${check.operation} ${check.value}</td>`,
  112. '<td><a href="javascript: void(0);" class="mr-1" data-toggle="tooltip" data-placement="bottom" data-original-title="删除" name="loc-del"><i class="fa fa-trash-o fa-fw text-danger"></i></a></td>', '</tr>');
  113. $('#loc-list').append(html.join(''));
  114. };
  115. $('#loc-add').click(() => {
  116. const field = $('#loc-field').val();
  117. const locType = locInfo[field];
  118. if (!locType) {
  119. toastr.warning('未知判断条件');
  120. return;
  121. }
  122. const data = JSON.parse(JSON.stringify(locType));
  123. data.operation = $('#loc-operation').val();
  124. data.value = $('#loc-value').val();
  125. if (!data.value) {
  126. toastr.warning('请输入判断值');
  127. return;
  128. }
  129. data.value = _.toInteger(data.value);
  130. if (_.isNil(data.value) || data.value < 0) {
  131. toastr.warning('判断值仅限0、正整数');
  132. return;
  133. }
  134. addCheckHtml(data);
  135. });
  136. $('body').on('click', 'a[name=loc-del]', function() {
  137. $(this).parent().parent().remove();
  138. });
  139. const showOptionModal = function(option, limit) {
  140. if (!option && !limit) {
  141. toastr.warning('请先新增或选择配置后,再新增判断');
  142. return;
  143. }
  144. limit_id = option ? option.limit_id : limit.limit_id;
  145. limit_name = option ? option.name : limit.name;
  146. $('#lo-id').val(option ? option.id : '');
  147. $('#lo-limit')[0].checked = option && option.limit;
  148. $('#lo-lower').val(option ? option.lower : 0);
  149. $('#lo-upper').val(option ? option.upper : 100);
  150. $('#lo-hint').val(option ? option.hint : '');
  151. $('#loc-list').html('');
  152. if (option) {
  153. for (const c of option.condition) {
  154. if (!c.source) c.source = '3f';
  155. addCheckHtml(c);
  156. }
  157. }
  158. $('#save-limit-option').modal('show');
  159. };
  160. const getOptionData = function() {
  161. const data = {};
  162. try {
  163. data.limit = $('#lo-limit')[0].checked;
  164. data.lower = parseInt($('#lo-lower').val());
  165. data.upper = parseInt($('#lo-upper').val());
  166. data.hint = $('#lo-hint').val();
  167. data.condition = [];
  168. const clist = $('td[locinfo]');
  169. for (const c of clist) {
  170. const info = c.getAttribute('locinfo').split('&^&');
  171. data.condition.push({
  172. alias: info[0],
  173. field: info[1],
  174. check: info[2],
  175. operation: info[3],
  176. value: parseInt(info[4]),
  177. source: info[5],
  178. });
  179. }
  180. const id = $('#lo-id').val();
  181. if (id) {
  182. data.id = id;
  183. } else {
  184. data.limit_id = limit_id;
  185. }
  186. return data;
  187. } catch(err) {
  188. if (!data.lower) {
  189. toastr.warning('计量下限请输入0-100的整数');
  190. return;
  191. }
  192. if (!data.upper) {
  193. toastr.warning('计量上限请输入0-100的整数');
  194. return;
  195. }
  196. if (data.hint.length > 20) {
  197. toastr.warning('超限提示过长,请再精简');
  198. return;
  199. }
  200. toastr.warning('判断条件错误');
  201. return;
  202. }
  203. };
  204. return { show: showOptionModal, data: getOptionData, }
  205. })();
  206. $('#add-lo').click(() => {
  207. optionSaveObj.show(null, limitObj.getCurLimit());
  208. });
  209. $('body').on('click', 'a[name=editLimitOption]', function() {
  210. const optionId = $(this).parent().parent().attr('optionId');
  211. const curLimit = limitObj.getCurLimit();
  212. if (!curLimit) return;
  213. const option = curLimit.options.find(x => { return x.id == optionId; });
  214. optionSaveObj.show(option, curLimit);
  215. });
  216. $('body').on('click', 'a[name=delLimitOption]', function() {
  217. const optionId = $(this).parent().parent().attr('optionId');
  218. const curLimit = limitObj.getCurLimit();
  219. if (!curLimit) return;
  220. const option = curLimit.options.find(x => { return x.id == optionId; });
  221. if (curLimit.options.length === 1) {
  222. toastr.warning('当前配置,仅剩最后一个判断,如需删除,请直接删除配置');
  223. return;
  224. }
  225. postData('/setting/limit/saveOption', { del: option }, function (result) {
  226. if (result.del) limitObj.delOption(result.del);
  227. $('#save-limit-option').modal('hide');
  228. });
  229. });
  230. $('#save-lo-ok').click(function() {
  231. const loData = optionSaveObj.data();
  232. const updateData = {};
  233. if (loData.id) {
  234. updateData.update = loData;
  235. } else {
  236. updateData.add = loData;
  237. }
  238. postData('/setting/limit/saveOption', updateData, function (result) {
  239. if (result.add) limitObj.addOption(result.add);
  240. if (result.update) limitObj.updateOption(result.update);
  241. $('#save-limit-option').modal('hide');
  242. })
  243. });
  244. $('body').on('click', '.table-file', function(e) {
  245. if (this.getAttribute('renaming') === '1') return;
  246. if (e.target.tagName === 'A' || e.target.tagName === 'I' || e.target.tagName === 'INPUT') return;
  247. const limitId = this.getAttribute('limitId');
  248. const limit = limitList.find(x => { return x.limit_id === limitId; });
  249. limitObj.setCurLimit(limit);
  250. });
  251. $('body').on('mouseenter', ".table-file", function(){
  252. $(this).children(".btn-group-table").css("display","block");
  253. });
  254. $('body').on('mouseleave', ".table-file", function(){
  255. $(this).children(".btn-group-table").css("display","none");
  256. });
  257. $('body').on('click', 'a[name=renameLimit]', function(e){
  258. $(this).parents('.table-file').attr('renaming', '1');
  259. $(`#${this.getAttribute('aria-describedby')}`).remove();
  260. const limitId = $(this).parents('.table-file').attr('limitId');
  261. const limit = limitList.find(x => { return x.limit_id === limitId; });
  262. if (!limit) return;
  263. const html = [];
  264. html.push(`<div><input type="text" class="form-control form-control-sm" style="width: 160px" value="${limit.name}"/></div>`);
  265. html.push('<div class="btn-group-table" style="display: none;">',
  266. `<a href="javascript: void(0)" name="renameOk" class="mr-1"><i class="fa fa-check fa-fw"></i></a>`,
  267. `<a href="javascript: void(0)" class="mr-1" name="renameCancel"><i class="fa fa-remove fa-fw text-danger"></i></a>`, '</div>');
  268. $(`.table-file[limitId=${limitId}]`).html(html.join(''));
  269. e.stopPropagation();
  270. });
  271. $('body').on('click', 'a[name=renameOk]', function(){
  272. const limitId = $(this).parents('.table-file').attr('limitId');
  273. const newName = $(this).parents('.table-file').find('input').val();
  274. limitObj.renameLimit(limitId, newName);
  275. $(this).parents('.table-file').attr('renaming', '0');
  276. });
  277. $('body').on('click', 'a[name=renameCancel]', function() {
  278. $(this).parents('.table-file').attr('renaming', '0');
  279. const limitId = $(this).parents('.table-file').attr('limitId');
  280. const limit = limitList.find(x => { return x.limit_id === limitId; });
  281. if (!limit) return;
  282. const html = [];
  283. html.push(`<div>${limit.name}</div>`);
  284. html.push('<div class="btn-group-table" style="display: none;">',
  285. '<a href="javascript: void(0);" class="mr-1" data-toggle="tooltip" data-placement="bottom" data-original-title="编辑" name="renameLimit"><i class="fa fa-pencil fa-fw"></i></a>',
  286. '<a href="javascript: void(0);" class="mr-1" data-toggle="tooltip" data-placement="bottom" data-original-title="删除" name="delLimit"><i class="fa fa-trash-o fa-fw text-danger"></i></a>',
  287. '</div>');
  288. $(`.table-file[limitId=${limitId}]`).html(html.join(''));
  289. });
  290. $('body').on('click', 'a[name=delLimit]', function(e){
  291. e.stopPropagation();
  292. const limitId = $(this).parents('.table-file').attr('limitId');
  293. limitObj.delLimit(limitId);
  294. });
  295. $('#addLimit').click(function() {
  296. limitObj.addLimit();
  297. });
  298. });