setting_s2b.js 14 KB

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