后端返回格式
/**
* 订单扣减记录列表(带筛选和分页)
* @return \think\Response
*/
public function OrderDeductLog ()
{
if (Request::isPost()) { // $py = input('post.py'); , 'name', 'phone', 'card', 'limit', 'page', 'status'
// $data = Request::post(); //['type','count']
// 1. 获取前端请求参数(筛选条件+分页参数)
$params = Request::post([
'count' => '0', // 订单号
// 'order_no' => '', // 订单号
'cardid' => '', // 客户ID
// 'deduct_type' => '', // 扣减类型
'start_time' => '', // 开始时间
'end_time' => '', // 结束时间
// 'page' => 1, // 当前页
// 'limit' => 50 // 每页条数
]);
if($params['count'] == 0){
$datas = [
'code' => 0,
'msg' => '',
'count' => 0,
'data' => 0
];
return json($datas);
}
// halt($params);
// 2. 构建查询条件
$query = Db::name('order_deduct_log');
// 客户ID筛选(精确匹配)
if (!empty($params['cardid'])) {
$query->where('cardid', $params['cardid']);
$queryCard = Db::name('base_guests');
$queryCard->where('card', $params['cardid']);
$card = $queryCard->select();
// halt ($card);
}
$combined = ($card['points'] ?? '') . '-' . ($card['balance'] ?? '');
// // 时间范围筛选(操作时间)
// if (!empty($params['start_time']) && !empty($params['end_time'])) {
// $query->whereBetween('operate_time', [$params['start_time'], $params['end_time'] . ' 23:59:59']);
// } elseif (!empty($params['start_time'])) {
// $query->where('operate_time', '>=', $params['start_time']);
// } elseif (!empty($params['end_time'])) {
// $query->where('operate_time', '<=', $params['end_time'] . ' 23:59:59');
// }
//
// // 3. 执行分页查询(按操作时间倒序,最新记录在前)
// $list = $query->order('operate_time', 'desc')
// ->paginate([
// 'list_rows' => $params['limit'] ?? 100, // 默认为10条每页
// 'page' => $params['page'] ?? 1, // 默认为第1页
// 'var_page' => 'page'
// ]);
// Log::info('接收到的所有参数:', $params); // 添加调试
// 时间范围筛选
if (!empty($params['start_time']) && !empty($params['end_time'])) {
$startTime = $params['start_time'] . ' 00:00:00';
$endTime = $params['end_time'] . ' 23:59:59';
// Log::info('时间筛选条件:', ['start' => $startTime, 'end' => $endTime]);
$query->whereBetween('operate_time', [$startTime, $endTime]);
} elseif (!empty($params['start_time'])) {
$query->where('operate_time', '>=', $params['start_time'] . ' 00:00:00');
} elseif (!empty($params['end_time'])) {
$query->where('operate_time', '<=', $params['end_time'] . ' 23:59:59');
}
// $sql = $query->buildSql(); // 调试最终SQL
// Log::info('最终SQL:', ['sql' => $sql]);
// 执行查询
$list = $query->order('operate_time', 'desc')
->paginate([
'list_rows' => $params['limit'] ?? 100,
'page' => $params['page'] ?? 1,
'var_page' => 'page'
]);
// 格式化返回数据(适配LayUI表格组件要求)
$datas = [
'code' => 0,
'msg' => $combined,
'count' => $list->total(),
'data' => $list->items()
];
// $datas = [
// 'code' => 0, // 状态码,0表示成功(与前端parseData判断一致)
// 'msg' => $combined, // 提示消息
// 'data' => [
// 'total' => $list->total(), // 总记录数
// 'list' => $list->items() // 当前页数据列表
// ]
// ];
return json($datas);
// return json($list);
// $res = (new SalesYearReportBusiness())->SalesYearReportAjax($data);
// $count = count($res);
// $datas = [
// 'code' => 0,
// 'msg' => '',
// 'count' => $count,
// 'data' => $res
// ];
// return json($datas);
// halt($brand);
}
$select = $this->BaseInfo('1,17,18,19,20,21,22,23,24');
$staff = $this->BaseStaff('A,B,0,1'); // , 'staff' => $staff
$data['url'] = request()->pathinfo();
View::assign(['data' => $data, 'staff' => $staff, 'select' => $select]);
return View::fetch();
}
// /**
// * 获取扣减类型字典(用于前端下拉框)
// * @return \think\Response
// */
// public function getDeductType()
// {
// // 扣减类型映射(与数据库字段注释对应)
// $typeList = [
// ['id' => 0, 'name' => '其它'],
// ['id' => 1, 'name' => '仅余额'],
// ['id' => 2, 'name' => '仅积分'],
// ['id' => 3, 'name' => '同时扣减余额和积分']
// ];
// return $this->success('获取成功', $typeList);
// }
}前端接收数据
// 定义格式化函数
function formatNumber(value, decimals) {
if (value === null || value === undefined || value === '' || isNaN(parseFloat(value))) {
return decimals === 0 ? '0' : '0.' + '0'.repeat(decimals);
}
return parseFloat(value).toFixed(decimals);
}
var tableIns = table.render({
elem: '#deductLogTable',
url: '/Manage/OrderDeductLog', // 后端接口地址
method: 'post',
cols: [[
// 表格列配置(与数据库字段对应,添加友好显示)
// {field: 'id', title: 'ID', width: 80, align: 'center'},
{field: 'order_no', title: '订单号', width: 120, align: 'center', style: 'font-size: 12px; font-weight:bold; color: orange'},
// {field: 'cardid', title: '客户ID', width: 100, align: 'center'},
{field: 'point_before', title: '扣前积分', width: 100, align: 'center', templet: function(d){
return formatNumber(d.point_before, 0);
}},
{field: 'point_bonus', title: '新增积分', width: 100, align: 'center', templet: function(d){
return formatNumber(d.point_bonus, 0);
}},
{field: 'point_deduct', title: '扣减积分', width: 100, align: 'center', templet: function(d){
return formatNumber(d.point_deduct, 0);
}},
{field: 'point_after', title: '扣后积分', width: 100, align: 'center', templet: function(d){
return formatNumber(d.point_after, 0);
}},
{field: 'details', title: '备注', width: 130, align: 'center', templet: function(d){
return d.details || '';
}},
{field: 'operator', title: '操作人', width: 80, align: 'center'},
{field: 'salesman', title: '销售员', width: 80, align: 'center', templet: function(d){
return d.salesman || '-'; // 空值显示“-”
}},
{field: 'deduct_type', title: '扣减类型', width: 110, align: 'center', templet: function(d){
var typeMap = {0:'其它', 1:'仅余额', 2:'仅积分', 3:'余额和积分'};
return typeMap[d.deduct_type] || '未知'; // 扣减类型映射(与后端一致)
}},
{field: 'remark', title: '操作', width: 100, align: 'center'},
{field: 'operate_time', title: '操作时间', width: 120, align: 'center', templet: function(d){
return (d.operate_time || '-').substring(0, 10);
}},
{field: 'balance_before', title: '扣前余额', width: 100, align: 'center', templet: function(d){
return formatNumber(d.balance_before, 2);
}},
{field: 'balance_deduct', title: '扣减余额', width: 100, align: 'center', templet: function(d){
return formatNumber(d.balance_deduct, 2);
}},
{field: 'balance_after', title: '扣后余额', width: 100, align: 'center', templet: function(d){
return formatNumber(d.balance_after, 2);
}}
]],
// request: {
// pageName: 'page', // 页码参数名(与后端一致)
// limitName: 'limit' // 每页条数参数名(与后端一致)
// },
// response: {
// statusName: 'code', // 状态码字段名(与后端一致)
// statusCode: 0, // 成功状态码(与后端一致)
// msgName: 'msg', // 提示信息字段名
// countName: 'data.total', // 总记录数字段名
// dataName: 'data.list' // 数据列表字段名
// },
parseData: function(res) { // res 是后端返回的完整数据
// 1. 处理状态码(假设后端返回格式:{code: 200, msg: "成功", data: {...}})
if (res.code !== 0) {
// 非成功状态,显示错误消息
layer.msg(res.msg || '数据加载失败', {icon: 2});
return {
code: 0, // 告诉LayUI表格加载失败
count: 0,
data: []
};
}
// 2. 成功状态,正常返回数据(适配LayUI表格格式)
// return res.data.list;
// return {
// code: res.code, // 成功状态码(通常为0或200)
// msg: res.msg, // 成功消息
// count: res.data.total, // 总条数
// data: res.data.list // 表格数据列表
// };
return {
code: res.code, // 保持与后端一致的成功状态码
msg: res.msg, // 提示消息
count: res.count, // 直接使用顶层的count作为总条数
data: res.data // 直接使用顶层的data作为表格数据
};
},
toolbar: true, // 显示表格头部工具栏
defaultToolbar: ['filter', 'print', 'exports'], // 表格右键菜单
skin: 'line', // 表格风格(线框风格)
even: true // 开启隔行变色
});
// 4. 搜索按钮点击事件
$("#searchBtn").on('click', function(){
// 获取筛选条件
var params = {
// order_no: $("#order_no").val().trim(),
cardid: $("#cardid").val().trim(),
deduct_type: $("#deduct_type").val(),
start_time: '',
end_time: '',
count: 1
};
// 处理时间范围(分割为开始时间和结束时间)
var timeRange = $("#time_range").val().split(' - ');
if(timeRange.length === 2){
params.start_time = timeRange[0];
params.end_time = timeRange[1];
}
// 重新加载表格数据(带筛选条件)
tableIns.reload({
where: params, // 筛选条件
// page: {
// curr: 1 // 重置为第1页
// }
});
});
评论区