let configs_count = {} let config_dialog = 0 define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'jstree'], function ($, undefined, Backend, Table, Form) { //读取选中的条目 $.jstree.core.prototype.get_all_checked = function (full) { var obj = this.get_selected(), i, j; for (i = 0, j = obj.length; i < j; i++) { obj = obj.concat(this.get_node(obj[i]).parents); } obj = $.grep(obj, function (v, i, a) { return v != '#'; }); obj = obj.filter(function (itm, i, a) { return i == a.indexOf(itm); }); return full ? $.map(obj, $.proxy(function (i) { return this.get_node(i); }, this)) : obj; }; var Controller = { index: function () { // 初始化表格参数配置 Table.api.init({ extend: { index_url: 'exam/paper/index' + location.search, add_url: 'exam/paper/add', edit_url: 'exam/paper/edit', del_url: 'exam/paper/del', multi_url: 'exam/paper/multi', import_url: 'exam/paper/import', table: 'exam_paper', } }); var table = $("#table"); //在普通搜索渲染后 table.on('post-common-search.bs.table', function (event, table) { let form = $("form", table.$commonsearch); $("input[name='cate_id']", form).addClass("selectpage").data("source", "exam/cate/selectpage").data("params", {"custom[kind]": "QUESTION","isTree":true}).data("orderBy", "sort desc"); // $("input[name='exam_type_id']", form).addClass("selectpage").data("source", "exam_type/index").data("orderBy", "sort desc"); Form.events.cxselect(form); Form.events.selectpage(form); }); //当内容渲染完成给编辑按钮添加`data-area`属性,点击列表编辑按钮时全屏 table.on('post-body.bs.table', function (e, settings, json, xhr) { $(".btn-add").data("area", ["100%", "100%"]); $(".btn-editone").data("area", ["100%", "100%"]); }); // 初始化表格 table.bootstrapTable({ url: $.fn.bootstrapTable.defaults.extend.index_url, pk: 'id', sortName: 'id', search: false, showExport: false,//隐藏导出 showToggle: false,//隐藏浏览模式 showColumns: false,//隐藏显示隐藏模式 searchFormVisible: true,//默认显示搜索表单 columns: [ [ {checkbox: true}, {field: 'id', title: __('Id'), operate: false}, {field: 'cate_id', title: __('Cate_id'), autocomplete: false, visible: false}, {field: 'cate.name', title: __('Cate_id'), operate: false}, {field: 'title', title: __('Title'), autocomplete: false, operate: 'LIKE'}, {field: 'image', title: __('Image'), operate: false, events: Table.api.events.image, formatter: Table.api.formatter.image}, // {field: 'configs', title: __('Configs'), operate: 'LIKE'}, {field: 'quantity', title: __('Quantity'), operate: false}, {field: 'total_score', title: __('Total_score'), operate: false}, {field: 'pass_score', title: __('Pass_score'), operate: false}, {field: 'limit_count', title: __('Limit_count'), operate: false}, { field: 'mode', title: __('Mode'), searchList: {"RANDOM": __('Random'), "FIX": __('Fix')}, formatter: Table.api.formatter.normal }, { field: 'limit_time', title: __('Limit_time'), operate: false, autocomplete: false, formatter: function (value) { return Controller.api.formatDuring(value) } }, { field: 'start_time', title: __('Start_time'), operate: 'RANGE', addclass: 'datetimerange', autocomplete: false, formatter: Table.api.formatter.datetime }, { field: 'end_time', title: __('End_time'), operate: 'RANGE', addclass: 'datetimerange', autocomplete: false, formatter: Table.api.formatter.datetime }, // {field: 'is_only_room', title: __('Is_only_room'), searchList: {"1":__('Yes'),"0":__('No')}, formatter: Table.api.formatter.toggle}, { field: 'status', title: __('Status'), searchList: {"NORMAL": __('Normal'), "HIDDEN": __('Hidden')}, formatter: Table.api.formatter.status }, { field: 'createtime', title: __('Createtime'), operate: 'RANGE', addclass: 'datetimerange', autocomplete: false, formatter: Table.api.formatter.datetime }, // {field: 'updatetime', title: __('Updatetime'), operate:'RANGE', addclass:'datetimerange', autocomplete:false, formatter: Table.api.formatter.datetime}, { field: 'operate', title: __('Operate'), table: table, buttons:[ { name:'selectuser', text:'选择用户', title:'选择用户', icon:'fa fa-exclamation-circle', classname:'btn btn-xs btn-info btn-dialog btn-selectuser', url:'exam/paper/selectuser/id/{ids}?dialog=1', target:'_self', }, { name:'grade', text:'成绩', title:'成绩', icon:'fa fa-exclamation-circle', classname:'btn btn-xs btn-info btn-dialog btn-grade', url:'exam/grade/index/paper_id/{ids}?dialog=1', target:'_self', }, { name:'nograde', text:'缺考', title:'缺考', icon:'fa fa-exclamation-circle', classname:'btn btn-xs btn-info btn-dialog btn-nograde', url:'exam/paper/nograde/id/{ids}', target:'_self', } ], events: Table.api.events.operate, formatter: Table.api.formatter.operate } ] ], onLoadSuccess:function(){ // 这里就是数据渲染结束后的回调函数 $(".btn-selectuser").data("area", ['80%','80%']); $(".btn-grade").data("area", ['90%','90%']); $(".btn-nograde").data("area", ['90%','90%']); } }); // 为表格绑定事件 Table.api.bindevent(table); }, recyclebin: function () { // 初始化表格参数配置 Table.api.init({ extend: { 'dragsort_url': '' } }); var table = $("#table"); // 初始化表格 table.bootstrapTable({ url: 'exam/paper/recyclebin' + location.search, pk: 'id', sortName: 'id', columns: [ [ {checkbox: true}, {field: 'id', title: __('Id')}, {field: 'title', title: __('Title'), align: 'left'}, { field: 'deletetime', title: __('Deletetime'), operate: 'RANGE', addclass: 'datetimerange', formatter: Table.api.formatter.datetime }, { field: 'operate', width: '130px', title: __('Operate'), table: table, events: Table.api.events.operate, buttons: [ { name: 'Restore', text: __('Restore'), classname: 'btn btn-xs btn-info btn-ajax btn-restoreit', icon: 'fa fa-rotate-left', url: 'exam/paper/restore', refresh: true }, /*{ name: 'Destroy', text: __('Destroy'), classname: 'btn btn-xs btn-danger btn-ajax btn-destroyit', icon: 'fa fa-times', url: 'exam/paper/destroy', refresh: true }*/ ], formatter: Table.api.formatter.operate } ] ] }); // 为表格绑定事件 Table.api.bindevent(table); }, add: function () { Controller.api.bindevent() Controller.api.bindConfigs() Controller.api.bindTime() }, selectuser: function () { Controller.apisu.bindevent(); }, nograde: function () { Controller.api.bindevent() }, edit: function () { Controller.api.bindevent() Controller.api.bindConfigs() Controller.api.getCountScore() Controller.api.renderCountScore() Controller.api.bindTime() }, apisu: { bindevent: function () { Form.api.bindevent($("form[role=form]"), null, null, function () { if ($("#treeview").length > 0) { var r = $("#treeview").jstree("get_all_checked"); $("input[name='row[user_rule]']").val(r.join(',')); } return true; }); //渲染权限节点树 //销毁已有的节点树 $("#treeview").jstree("destroy"); Controller.apisu.rendertree(nodeData); //全选和展开 $(document).on("click", "#checkall", function () { $("#treeview").jstree($(this).prop("checked") ? "check_all" : "uncheck_all"); }); $(document).on("click", "#expandall", function () { $("#treeview").jstree($(this).prop("checked") ? "open_all" : "close_all"); }); $("select[name='row[pid]']").trigger("change"); }, rendertree: function (content) { $("#treeview") .on('redraw.jstree', function (e) { $(".layer-footer").attr("domrefresh", Math.random()); }) .jstree({ "themes": {"stripes": true}, "checkbox": { "keep_selected_style": false, }, "types": { "root": { "icon": "fa fa-folder-open", }, "menu": { "icon": "fa fa-folder-open", }, "file": { "icon": "fa fa-file-o", } }, "plugins": ["checkbox", "types"], "core": { 'check_callback': true, "data": content } }); }, }, api: { bindevent: function () { Form.api.bindevent($("form[role=form]"), function () { }, function () { }, function () { let mode = $('input[name="row[mode]"]:checked').val() console.log('submit mode', mode) if (mode === 'FIX') { $('#valid').click() return valid_result; } else { let configs = $('#c-configs').val() console.log('configs', configs) if (!configs) { Layer.alert('请配置试卷出题规则') return false } let quantity = $('.span_quantity').text() if (quantity !== $('#c-quantity').val()) { Layer.alert('试卷出题规则的选取题数与试卷题目数量不一致') return false } let total_score = $('.span_total_score').text() if (total_score !== $('#c-total_score').val()) { Layer.alert('试卷出题规则的总分与试卷总分不一致') return false } let limit_time_hour = $('#c-limit_time_hour').val() let limit_time_minute = $('#c-limit_time_minute').val() let limit_time = (limit_time_hour ? limit_time_hour : 0) * 3600 + (limit_time_minute ? limit_time_minute : 0) * 60 $('#c-limit_time').val(limit_time) } return true }); }, // 选题模式设置 bindConfigs: function () { // 选题模式弹窗 $('.btn-configs').click(function () { let quantity = $('#c-quantity').val() let total_score = $('#c-total_score').val() if (!quantity || !total_score) { Layer.msg('请先设置题目数量和试卷总分') return false } config_dialog = Layer.open({ type: 1, shade: false, title: '随机选题配置', area: ['600px', '600px'], zIndex: 1, content: $('#configsDialog'), cancel: function () { } }) }) // 选题库获取题数 $(document).on("change", "#config-cate_id", function () { Controller.api.getCountScore() }) // 选取题更改 $('.input_count').change(function () { let type = $(this).data('type') let count = $(this).val() let score = $('.input_' + type + '_score').val() Controller.api.calcCountScore(type, count, score) }) // 每题分数更改 $('.input_score').change(function () { let type = $(this).data('type') let count = Controller.api.formatVal($('.input_' + type).val()) let score = Controller.api.formatVal($(this).val()) Controller.api.calcCountScore(type, count, score) }) // 分难度更改 $('.checkbox_difficulty').change(function () { let type = $(this).data('type') let value = $(this).is(':checked') let ul = $('.ul_' + type + '_difficulty') let input_count = Controller.api.formatVal($('.input_' + type)) let input_score = Controller.api.formatVal($('.input_' + type + '_score')) let span_score = Controller.api.formatVal($('.span_' + type + '_score')) if (value) { ul.removeClass('hide').show() input_count.attr('disabled', 'disabled') input_score.attr('disabled', 'disabled') span_score.hide() // 触发计算 $(ul.find('.input_count')[0]).trigger('change') } else { ul.addClass('hide').hide() input_count.removeAttr('disabled', 'disabled') input_score.removeAttr('disabled', 'disabled') span_score.show() } // $('.input_count').trigger('change') }) // 保存选题配置 TODO 弃用 $('#btnSaveConfig').click(function () { Controller.api.saveConfig() }) }, // 保存选题配置 saveConfig() { let configs = { cate_ids: $('#config-cate_id').val(), all: {}, judge: { difficulty: {} }, single: { difficulty: {} }, multi: { difficulty: {} }, fill: { difficulty: {} }, short: { difficulty: {} }, material: { difficulty: {} }, } // 总 $('#divAll').find('span').each(function (index, ele) { let key = $(ele).attr('class').replace('span_', '') configs.all[key] = parseInt(Controller.api.formatVal($(ele).text())) }) // 题型配置 $('.input_kind_count').each(function (index, ele) { let type = $(ele).data('type') configs[type]['count'] = parseInt(Controller.api.formatVal($(ele).val())) configs[type]['score'] = parseInt(Controller.api.formatVal($(ele).next('span').find('.input_score').val())) configs[type]['total_score'] = configs[type]['count'] * configs[type]['score'] configs[type]['use_difficulty'] = $(ele).parent().find('.checkbox_difficulty').is(':checked') }) // 难度配置 $('.ul_difficulty').find('.input_count').each(function (index, ele) { let type_key = $(ele).data('type').split('_') let type = type_key[0] let key = type_key[1] configs[type].difficulty[key] = { count: parseInt(Controller.api.formatVal($(ele).val())), score: parseInt(Controller.api.formatVal($(ele).next('.input_score').val())) } configs[type].difficulty[key]['total_score'] = configs[type].difficulty[key].count * configs[type].difficulty[key].score }) console.log('configs', configs) $('#c-configs').val(JSON.stringify(configs)) Layer.close(config_dialog) }, // 根据题库设置题数、分数 getCountScore() { let cate_ids = $('#config-cate_id').val() if (cate_ids) { configs_count = {} Fast.api.ajax({ url: 'exam/question/getCount', type: 'post', data: {cate_ids: cate_ids} }, function (data, ret) { configs_count = data if (!configs_count) { return false } let quantity = $('#c-quantity').val() let total_score = $('#c-total_score').val() let sing_score = parseInt(total_score / quantity) for (let key of Object.keys(configs_count)) { let value = configs_count[key] $('.span_' + key + '_total').text(value) $('.input_' + key).attr('max', value) $('.input_' + key + '_score').attr('max', sing_score)//.val(sing_score) } return false }); } }, calcCountScore(type, count, score) { // 计算题型总分 $('.span_' + type + '_total_score').text(count * score) // 计算分难度的总分 if (type.indexOf('_') > 0) { let parent_type = type.split('_')[0] let ul = $('.ul_' + parent_type + '_difficulty') let parent_count_input = $('.input_' + parent_type) let parent_score_span = $('.span_' + parent_type + '_total_score') let sum_count = 0 let sum_score = 0 ul.find('.input_count').each(function (index, ele) { let single_score = $(ele).next('input').val() sum_count += parseInt($(ele).val()) sum_score += parseInt($(ele).val()) * single_score }) parent_count_input.val(sum_count) parent_score_span.text(sum_score) } // 总题数 let kind_total_count = 0 $('.input_kind_count').each(function (index, ele) { kind_total_count += parseInt($(ele).val()) }) $('.span_quantity').text(kind_total_count) // 计算总分 let kind_total_score = 0 $('.span_kind_total_score').each(function (index, ele) { kind_total_score += parseInt($(ele).text()) }) $('.span_total_score').text(kind_total_score) // 保存配置 Controller.api.saveConfig() }, // 根据配置设置题数渲染数据 renderCountScore() { // 考试时间渲染 const limit_time = $('#c-limit_time').val() ? $('#c-limit_time').val() : 0 if (limit_time) { let hour = Math.floor(limit_time / 3600) let minute = Math.floor(limit_time / 60) % 60 $('#c-limit_time_hour').val(hour) $('#c-limit_time_minute').val(minute) } let configs_val = $('#c-configs').val() console.log('configs_val', configs_val) const config_json = configs_val && typeof configs_val === 'string' ? JSON.parse(configs_val) : {} if (config_json && config_json.cate_ids) { for (const key in config_json) { if (key === 'all') { $('.span_quantity').text(config_json.all.quantity) $('.span_total_score').text(config_json.all.total_score) } else { const kind_config = config_json[key] $('.input_count[data-type="' + key + '"]').val(kind_config['count']) $('.input_score[data-type="' + key + '"]').val(kind_config['score']) $('.span_' + key + '_total_score').text(kind_config['total_score']) if (kind_config['use_difficulty'] === true) { $('.checkbox_' + key).click() const difficulty_config = kind_config['difficulty'] for (const k in difficulty_config) { let difficulty_count = difficulty_config[k].count ? difficulty_config[k].count : 0 let difficulty_score = difficulty_config[k].score ? difficulty_config[k].score : 0 let difficulty_total_score = difficulty_count * difficulty_score $('.input_' + key + '_' + k).val(difficulty_count) $('.input_' + key + '_' + k + '_score').val(difficulty_score) $('.span_' + key + '_' + k + '_total_score').text(difficulty_total_score) } } } } // 触发计算 // $($('.ul_judge_difficulty').find('.input_count')[0]).trigger('change') } }, // 限定时间事件,59分转小时 bindTime() { $('#c-limit_time_minute').change(function (ele) { let minute = $(this).val() if (minute >= 60) { $('#c-limit_time_minute').val(0) let hour_ctrl = $('#c-limit_time_hour') hour_ctrl.val(parseInt(hour_ctrl.val()) + 1) } }) }, // 绑定固定选题配置按钮事件 bindFixButton() { $('.btn-fix-configs').click(function () { Fast.api.open('exam/question/select', '选择试题', { area: ['90%', '90%'], callback: function (data) { if (!data) { return } } }) }); }, // 秒数转时分秒格式 formatDuring (second) { var hours = parseInt((second % (60 * 60 * 24)) / (60 * 60)); var minutes = parseInt((second % (60 * 60)) / (60)); var seconds = (second % (60)); return hours + "时 " + minutes + "分 " + seconds + "秒"; }, // 获取数字值 formatVal (val) { return isNaN(val) ? 0 : val }, } }; return Controller; });