define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'cascader'], function ($, undefined, Backend, Table, Form) { function clearInfo() { $('[name^="row["]').val(''); $("#c-city").citypicker('reset'); $("#item_id").val(''); $('.zd-cascader-menu').find('li.in-active-path').removeClass('in-active-path'); $('.zd-cascader-panel').find('.is-selected-icon').remove(); $("#item_id_value").val(''); $(".selectpicker").val('').selectpicker('refresh'); } function copyToClipboard(text) { // 创建一个隐藏的 textarea 元素 const textarea = document.createElement('textarea'); textarea.value = text; document.body.appendChild(textarea); // 选中内容并复制 textarea.select(); document.execCommand('copy'); // 移除 textarea 元素 document.body.removeChild(textarea); Toastr.info('复制成功'); } // 拼装文本 function assembleOrderMessage(data) { let message = ''; if (!data.coupon) { message = `订单编号: ${data.order_no} 渠道来源:${data.source_total_name} 服务名称: ${data.item_title} 客户昵称: ${data.customer} 客户电话: ${data.tel} 客户地址: ${data.address} ${data.receive_type == 1 ? '已收定金' : '已收全款'} 下单金额: ¥${formatNumber(data.online_amount)} 订单备注: ${data.remark || '无'} 预约时间: ${data.plan_time || '无'} `; } else { message = `订单编号: ${data.order_no} 渠道来源:${data.source_total_name} 服务名称: ${data.item_title} 客户昵称: ${data.customer} 客户电话: ${data.tel} 客户地址: ${data.address} ${data.receive_type == 1 ? '已收定金' : '已收全款'} 下单金额: ¥${formatNumber(data.online_amount)} 优惠活动: ${data.coupon?.code || '无'} 订单备注: ${data.remark ||'无'} 预约时间: ${data.plan_time || '无'} `; } return message; } function formatNumber(value, decimals = 1) { let num = parseFloat(value); if (isNaN(num)) return '0.0'.slice(0, decimals + 2); // e.g. '0.0' or '0.00' return num.toFixed(decimals); } var Controller = { index: function () { // 初始化表格参数配置 Table.api.init({ extend: { index_url: 'order/index' + location.search, add_url: 'order/add', edit_url: 'order/edit', //del_url: 'order/del', multi_url: 'order/multi', import_url: 'order/import', push_url: 'order/status', addabnormal: 'order/addAbnormal', table: 'order', } }); var table = $("#table"); // 初始化表格 table.bootstrapTable({ url: $.fn.bootstrapTable.defaults.extend.index_url, pk: 'id', sortName: 'id', fixedRightNumber: 1, fixedNumber: 5, fixedColumns: true, renderDefault: true, searchFormVisible: true, search: false, showExport: false, columns: [ [ {checkbox: true}, {field: 'order_no', title: __('Order_no'), operate: 'LIKE'}, {field: 'id', title: __('Id'),searchable: false}, { field: 'status', title: __('Status'), fixed: true, searchList: { "0": __('Status 0'), "10": __('Status 10'), "20": __('Status 20'), "30": __('Status 30'), "40": __('Status 40'), "41": __('Status 41'), "50": __('Status 50'), "60": __('Status 60'), "70": __('Status 70'), "-10": __('Status -10'), /*"-20": __('Status -20'), "-30": __('Status -30')*/ }, defaultValue: 10, formatter: Table.api.formatter.status, custom: { "10": "my_dispatch" } }, { field: 'order_remark', title: '标记', operate: 'like', autocomplete: false }, { field: 'create_time', title: __('Create_time'), operate: 'RANGE', addclass: 'datetimerange', autocomplete: false }, { field: 'is_overtime', title: '是否超时', searchList: { "1": '超时', "0": '未超时', }, formatter: Table.api.formatter.label, searchable: true, custom: { '1': 'danger', '0': 'success' }, operate: '=', }, {field: 'customer', title: __('Customer'), operate: 'LIKE'}, { field: 'dispatch_type', title: '派单方式', searchList: { "1": '手动派单', "2": '自动派单', }, formatter: Table.api.formatter.label }, {field: 'item_title', title: __('Item_title'), operate: false}, {field: 'user.nickname', title: '录单员',operate: 'LIKE'}, {field: 'dispatch_admin_user', title: '派单员',operate: 'LIKE'}, {field: 'tel', title: __('Tel'), operate: 'LIKE'}, {field: 'area.merge_name', title: __('Area_id'), searchable: false}, { field: 'address', title: __('Address'), operate: false, table: table, class: 'autocontent', formatter: Table.api.formatter.content }, { field: 'receive_type', title: '收款方式', searchList: { "1": '已收定金', "2": '已收全款', }, formatter: Table.api.formatter.label }, { field: 'total', title: '总收款', operate: false, formatter: Table.api.formatter.Text }, // {field: 'worker_id', title: __('Worker_id')}, {field: 'source_total_name', title: __('Source'), operate: false,}, // {field: 'source_uid', title: __('Source_uid'), operate: 'LIKE'}, { field: 'detail', title: __('Detail'), operate: false, table: table, class: 'autocontent', formatter: Table.api.formatter.content }, { field: 'remark', title: __('Remark'), operate: false, table: table, class: 'autocontent', formatter: Table.api.formatter.content }, { field: 'images', title: __('Images'), operate: false, events: Table.api.events.image, formatter: Table.api.formatter.images }, // { // field: 'update_time', // title: __('Update_time'), // operate: false, // addclass: 'datetimerange', // autocomplete: false // }, { field: 'audit_time', title: '完成时间', operate: 'RANGE', addclass: 'datetimerange', autocomplete: false }, { field: 'area_id', title: __('地区'), searchList: function (column) { return Template('categorytpl', {}); }, formatter: function (value, row, index) { return '无'; }, visible: false }, { field: 'item_id', title: '服务项目', searchList: function (column) { return Template('items_picker', {}); }, formatter: function (value, row, index) { return '无'; }, visible: false }, { field: 'source', title: '订单渠道', searchList: function (column) { return Template('source', {}); }, formatter: function (value, row, index) { return '无'; }, visible: false }, { field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate, align: "left", buttons: [ { name: 'edit', text: "修改", icon: 'fa fa-pencil', title: __('Edit'), extend: 'data-toggle="tooltip" data-container="body"', classname: 'btn btn-xs btn-info btn-editone', dropdown: "更多", visible: function (row) { if (Config.permissions.edit && row.status != 60 && row.status != 70) { return true; } return false; }, }, { name: 'push', icon: 'fa fa-copy', title: '复制订单', text: "复制订单", url: 'order/copy', extend: 'data-toggle="tooltip" data-container="body"', classname: 'btn btn-dialog', callback: function ($data) { // console.log($data); }, visible:function (row) { return Config.permissions.copy; }, dropdown: "更多" }, { name: "warning", text: "发起异常", title: "发起异常", extend: 'data-toggle="tooltip" data-container="body"', classname: 'btn btn-xs btn-dialog', icon: 'fa fa-add', url: 'order/warning', visible: function (row) { if (Config.permissions.warning && row.status == 10) { return true; } return false; }, dropdown: "更多", refresh: true, }, { name: "mapdispatch", text: "地图派单", title: "派单", extend: 'data-toggle="tooltip" data-container="body"', classname: 'btn btn-xs btn-info btn-dialog', icon: 'fa fa-add', url: function (row) { return 'orders/dispatch/map?order_id=' + row.id; }, visible: function (row) { if (Config.permissions.map && row.status == 10) { return true; } return false; }, callback: function () { table.bootstrapTable('refresh'); } }, { name: "dispatch", text: "派单", title: "派单", extend: 'data-toggle="tooltip" data-container="body"', classname: 'btn btn-xs btn-info btn-dialog', icon: 'fa fa-add', url: function (row) { return 'orders/dispatch/add?order_id=' + row.id; }, visible: function (row) { if (Config.permissions.dispatch && row.status == 10) { return true; } return false; }, refresh: true, }, { name: "reminder", text: "催单", title: "催单", extend: 'data-toggle="tooltip" data-container="body"', classname: 'btn btn-ajax', icon: 'fa fa-bolt', url: 'order/reminder', dropdown: "更多", success: function (data, ret) { if (ret.code === 1) { Layer.alert('催单成功'); } else { Layer.alert(ret.msg); } return false; //如果需要阻止成功提示,则必须使用return false; //return false; }, error: function (data, ret) { Layer.alert(ret.msg); return false; }, visible: function (row) { if (Config.permissions.reminder && row.status == 10) { return true; } return false; }, }, { name: "order_remark", text: "标记", title: "标记", classname: 'btn btn-xs btn-click', icon: 'fa fa-comment', click: function (e, row) { Layer.open({ type: 1, title: '请输入备注信息(可为空)', area: ['400px', '250px'], btn: ['确定', '取消'], content: '
' + '' + '
', yes: function (index, layero) { var text = $('#remark-input').val(); Fast.api.ajax({ type: 'POST', url: 'order/orderRemark/ids/' + row.id, data: {id: row.id, remark: text}, }, function (data, ret) { Layer.close(index); Toastr.success("备注提交成功"); table.bootstrapTable('refresh'); return false; }); } }); }, dropdown: "更多", visible: function (row) { if (Config.permissions.reminder && row.status == 10) { return true; } return false; }, }, { name: "copy_text", text: "复制信息", title: "复制信息", extend: 'data-toggle="tooltip" data-container="body"', classname: 'btn btn-xs btn-info btn-click', icon: 'fa fa-text', click: function (data, item) { const text = assembleOrderMessage(item); copyToClipboard(text); } }, { name: 'delete', text: '取消订单', title: '取消订单', classname: 'btn btn-dialog', icon: 'fa fa-trash', url: 'order/delete', dropdown: "更多", visible: function (row) { if (Config.permissions.delete && row.status >= 0 && row.status < 60) { return true; } return false; }, }, { name: "error", text: "订单报错", title: "订单报错", extend: 'data-toggle="tooltip" data-container="body"', classname: 'btn btn-dialog', icon: 'fa fa-bolt', url: 'order/addAbnormal', refresh: true, dropdown: "更多", visible: function (row) { if (Config.permissions.addAbnormal && row.status != 60 && row.status != 70) { return true; } return false; }, }, { name: "log", text: "订单记录", title: "订单记录", extend: 'data-toggle="tooltip" data-container="body"', classname: 'btn btn-xs btn-dialog', // icon: 'fa fa-bolt', url: 'order/log', dropdown: "更多", }, { name: 'invoice', text: '申请开票', title: '申请开票', classname: 'btn btn-dialog', icon: 'fa fa-send', url: 'order/invoice/', dropdown: "更多", visible: function (row) { if (Config.permissions.invoice && row.status == 60 || row.status == 70) { return true; } return false; }, }, { name: 'aftersale', text: '申请售后', title: '申请售后', classname: 'btn btn-dialog', icon: 'fa fa-phone-square', url: 'aftersales/aftersale/add', dropdown: "更多", visible: function (row) { if (Config.permissions.aftersale && row.status !== -10 && row.status !== 70 && row.aftersale_id <= 0) { return true; } return false; }, }, ], } ] ], }); // 为表格绑定事件 Table.api.bindevent(table); table.off('dbl-click-row.bs.table'); let cloneQueryParams = null; //绑定tab事件 $('a[data-toggle="tab"]').on('show.bs.tab', function (event) { let type = $(this).attr("data-value"); let options = table.bootstrapTable('getOptions'); $('.nav-tabs li').attr('class', ''); $(this).parent().attr("class", 'active'); options.pageNumber = 1; if (cloneQueryParams == null) { cloneQueryParams = options.queryParams; } if (type == 1){ $("form.form-commonsearch [name='status']").val(10).trigger("change"); $("form.form-commonsearch [name='is_timeout']").val('').trigger("change"); }else if(type == 2){ $("form.form-commonsearch [name='status']").val(10).trigger("change"); $("form.form-commonsearch [name='is_timeout']").val(1).trigger("change"); }else { $("form.form-commonsearch [name='status']").val('').trigger("change"); $("form.form-commonsearch [name='is_timeout']").val('').trigger("change"); } table.bootstrapTable('refresh', {}); return false; }); let idleTimer = null; function resetIdleTimer() { clearTimeout(idleTimer); idleTimer = setTimeout(function () { // 30秒无操作后执行刷新 table.bootstrapTable('refresh', {}); }, 30 * 1000); // 30 秒 } ['mousemove', 'keydown', 'click', 'scroll'].forEach(function (event) { document.addEventListener(event, resetIdleTimer, false); }); $("#select_city").on("cp:updated", function () { var citypicker = $(this).data("citypicker"); var code = citypicker.getCode("district") || citypicker.getCode("city") || citypicker.getCode("province"); $("#select_area_id").val(code); }); resetIdleTimer(); var _data = items; $('#select_item').zdCascader({ data: _data, onChange: function ($this, data, allPathData) { // console.log(data,allPathData); $('#select_item_id').val(data.value); }, clear: true, clickParent: true }); $('#btn-export').on('click', function () { var options = $("#table").bootstrapTable('getOptions'); // 提取列信息(不含 checkbox) var columns = []; $.each(options.columns[0], function (i, item) { if (item.field && !item.checkbox && !item.visible === false) { columns.push({ field: item.field, title: item.title }); } }); var params = { columns: JSON.stringify(columns), filter: options.queryParams({}).filter || {}, op: options.queryParams({}).op || {}, sort: options.sortName, order: options.sortOrder }; // console.log($.param(params)) var url = '/admin/order/export?' + $.param(params); window.open(url); // 发起文件下载 }); }, add: function () { $("#mybuttom").on("click", function () { const res = $("form[role=form]").isValid(); if ($('#lng').val() && $('#lng').val() !== '') { if (res) { Form.api.submit($("form[role=form]"), function (data) { copyToClipboard(assembleOrderMessage(data)); Toastr.success('录入成功'); return false; }); } } else { Toastr.success('请选择有效地址'); } return false; }); $("#mysubmit").on("click", function () { const res = $("form[role=form]").isValid(); if ($('#lng').val() && $('#lng').val() !== '') { if (res) { // Form.api.submit($("form[role=form]"), function (data, ret) { // clearInfo(); // copyToClipboard(assembleOrderMessage(data)); // Toastr.success('录入成功'); // return false; // }); Form.api.submit($("form[role=form]"), function (data, ret) { // 成功提交后重新加载当前页面 copyToClipboard(assembleOrderMessage(data)); Toastr.success('录入成功'); location.reload(); return false; }); } } else { Toastr.success('请选择有效地址'); } return false; }); $("#smart").on("click", function () { Fast.api.ajax({ url: "order/smart", // 你的 API 地址 type: "post", contentType: 'application/json', dataType: "json", data: JSON.stringify({ str: $('#smart_text').val() }) }, function (data) { if (data.mobile !== '') { $('#c-tel').val(data.mobile); } // if (data.name !== '') { // $('#c-customer').val(data.name); // } if (data.item.id !== 0) { $('#item_id_value').val(data.item.id); $('#item_id').val(data.item.item); } if (data.idn) { $('#c-source-id').val(data.idn); } if (data.lat) { $("#lat").val(data.lat); } if (data.lng) { $("#lng").val(data.lng); } if (data.area_id) { $("#area_id").val(data.area_id); } if (data.plan_time) { $("#time").val(data.plan_time); } if (data.addr && data.addr !== '') { $("#c-address").val(data.addr); $("#area_name").val(data.addr); } if (data.ext){ Toastr.error('该客户电话为分机号,请输入客户真实号码!'); }else { Toastr.info('识别成功'); } return false; }); }); Controller.api.bindevent(); Controller.api.map(); }, edit: function () { Controller.api.bindevent(); Controller.api.map(); }, copy: function () { Controller.api.bindevent(); Controller.api.map(); }, saleafter: function () { Controller.api.bindevent(); }, addabnormal: function () { Form.api.bindevent($("#add-form")); }, warning: function () { Form.api.bindevent($("#add-form")); }, delete: function () { Form.api.bindevent($("form[role=form]")); }, invoice: function () { function toggleInvoiceFields() { const type = $('#c-source').val(); if (type === '1') { // 公司发票 $('#c-tax_number').closest('.form-group').show(); $('#c-company_address').closest('.form-group').show(); $('#c-company_phone').closest('.form-group').show(); $('#c-bank_name').closest('.form-group').show(); $('#c-bank_account').closest('.form-group').show(); } else { // 个人发票 $('#c-tax_number').closest('.form-group').hide(); $('#c-company_address').closest('.form-group').hide(); $('#c-company_phone').closest('.form-group').hide(); $('#c-bank_name').closest('.form-group').hide(); $('#c-bank_account').closest('.form-group').hide(); } } // 初始化时执行一次 toggleInvoiceFields(); // 监听 select 改变 $('#c-source').on('change', function () { toggleInvoiceFields(); }); Form.api.bindevent($("form[role=form]")); }, api: { bindevent: function () { Form.api.bindevent($("form[role=form]")); }, map: function () { $("#c-city").on("cp:updated", function () { var citypicker = $(this).data("citypicker"); var code = citypicker.getCode("district") || citypicker.getCode("city") || citypicker.getCode("province"); $("#area_id").val(code); $("#area_name").val(citypicker.getVal()); }); $(document).on('click', "#area_map", function (e) { var that = this; var callback = $(that).data('callback'); var input_id = $(that).data("input-id") ? $(that).data("input-id") : ""; var lat_id = $(that).data("lat-id") ? $(that).data("lat-id") : ""; var lng_id = $(that).data("lng-id") ? $(that).data("lng-id") : ""; var zoom_id = $(that).data("zoom-id") ? $(that).data("zoom-id") : ""; var lat = lat_id ? $("#" + lat_id).val() : ''; var lng = lng_id ? $("#" + lng_id).val() : ''; var city_code = $("#area_id").val(); var zoom = zoom_id ? $("#" + zoom_id).val() : ''; var url = "/addons/address/index/select?"; url += (lat && lng) ? 'lat=' + lat + '&lng=' + lng + (input_id ? "&address=" + $("#" + input_id).val() : "") + (zoom ? "&zoom=" + zoom : "") : '' ; if (city_code) { url += city_code ? "&city_code=" + city_code : ""; } // console.log(url); Fast.api.open(url, '位置选择', { callback: function (res, data) { input_id && $("#" + input_id).val(res.address).trigger("change"); lat_id && $("#" + lat_id).val(res.lat).trigger("change"); lng_id && $("#" + lng_id).val(res.lng).trigger("change"); zoom_id && $("#" + zoom_id).val(res.zoom).trigger("change"); $('#area_id').val(res.city_code); try { //执行回调函数 if (typeof callback === 'function') { callback.call(that, res); } } catch (e) { } } }); }); var _data = items; $('#item_id').zdCascader({ data: _data, onChange: function ($this, data, allPathData) { // console.log(data,allPathData); $('#item_id_value').val(data.value); } }); $('#item_id').val($('#item_id').data('value')); const mainSelect = document.getElementById('receive_type'); const otherSelect = document.getElementById('coupon'); function toggleOtherSelect() { if (mainSelect.value === '2') { otherSelect.style.display = 'none'; } else { otherSelect.style.display = ''; } } mainSelect.addEventListener('change', toggleOtherSelect); toggleOtherSelect(); $('input[name="row[set_time]"]').on('change', toggleTime); function toggleTime() { var val = $('input[name="row[set_time]"]:checked').val(); if (val == 1) { $('#set-time').show(); } else { $('#set-time').hide(); } } toggleTime(); const amapKey = 'c299da50c080dfccf9b1d00560ff9639'; let isComposing = false; let addressSelected = false; let selectedIndex = -1; $('#c-address') .on('compositionstart', () => { isComposing = true; }) .on('compositionend', () => { isComposing = false; // 不执行 handleInput,由 input 触发 }) .on('input', debounce(function (e) { if (!isComposing) handleInput(e); }, 300)) .on('blur', function () { // 如果还没有选择地址,且列表中有内容,则默认选择第一个 // 如果还没有选择地址,且列表中有内容,则默认选择第一个 if (!addressSelected && $('#suggestionList li').length > 0) { choseFirst(); } $('#suggestionList').hide(); }) .on('focus', function () { // 如果还没有选择地址,且列表中有内容,则默认选择第一个 $('#suggestionList').show(); }) .on('keydown', function (e) { const $items = $('#suggestionList li'); const len = $items.length; if (!len) return; if (e.key === 'ArrowDown') { e.preventDefault(); selectedIndex = (selectedIndex + 1) % len; updateActiveItem($items); } else if (e.key === 'ArrowUp') { e.preventDefault(); selectedIndex = (selectedIndex - 1 + len) % len; updateActiveItem($items); } else if (e.key === 'Enter') { if (selectedIndex >= 0 && selectedIndex < len) { e.preventDefault(); $items.eq(selectedIndex).trigger('mousedown'); } } }); function updateActiveItem($items) { $items.removeClass('active'); if (selectedIndex >= 0) { const $active = $items.eq(selectedIndex); $active.addClass('active'); // 自动滚动使其可见 const container = $('#suggestionList')[0]; const item = $active[0]; if (item && container) { const itemTop = item.offsetTop; const itemBottom = itemTop + item.offsetHeight; const containerTop = container.scrollTop; const containerBottom = containerTop + container.clientHeight; if (itemTop < containerTop) { container.scrollTop = itemTop; } else if (itemBottom > containerBottom) { container.scrollTop = itemBottom - container.clientHeight; } } } } function handleInput(e) { selectedIndex = -1; addressSelected = false; const keyword = $(e.target).val(); if (!keyword.trim() || /^[\s\p{P}]+$/u.test(keyword)) return; if (!keyword) return $('#c-address').empty(); $.getJSON('https://restapi.amap.com/v3/assistant/inputtips', { key: amapKey, keywords: keyword, datatype: 'all', city: '全国', }, function (res) { if (res.tips) { let html = ''; res.tips.forEach(tip => { if (tip.location) { html += `
  • ${tip.district} ${tip.name}
  • `; } }); $('#suggestionList').html(html).show(); } }); } function debounce(fn, delay = 300) { let timer = null; return function (...args) { clearTimeout(timer); timer = setTimeout(() => { fn.apply(this, args); }, delay); }; } $('#suggestionList').on('mousedown', 'li', function (e) { const name = $(this).data('name'); const location = $(this).data('location'); // "经度,纬度" const area_id = $(this).data('area_id'); // "经度,纬度" const [lng, lat] = location.split(','); $('#c-address').val(name); $('#lng').val(lng); $('#lat').val(lat); $('#area_id').val(area_id); // 隐藏提示列表 $('#suggestionList').hide(); selectedIndex = -1; addressSelected = true; }); function choseFirst() { const first = $('#suggestionList li').first(); const name = first.data('name'); const location = first.data('location'); // "经度,纬度" const area_id = first.data('area_id'); // "经度,纬度" const [lng, lat] = location.split(','); console.log('chose'); $('#lng').val(lng); $('#lat').val(lat); $('#area_id').val(area_id); // 隐藏提示列表 $('#suggestionList').hide(); selectedIndex = -1; addressSelected = true; } } } }; return Controller; });