侧边栏壁纸
博主头像
云BLOG 博主等级

行动起来,活在当下

  • 累计撰写 318 篇文章
  • 累计创建 6 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

THINKPHP8 + LAYUI 前后端表格查询数据返回格式

Administrator
2025-09-25 / 0 评论 / 0 点赞 / 1 阅读 / 0 字

后端返回格式

/**
     * 订单扣减记录列表(带筛选和分页)
     * @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页
            // }
        });
        
    });

0

评论区