CodeIgniter 4 POS系统跨午夜时段日销售数据查询失败
解决跨午夜营业的日销售数据查询问题
问题分析
你的代码当前未接收指定查询日期,直接使用当前日期生成营业时间范围,导致无法查询特定营业日(如2023-01-05的营业时段:14:00至次日03:00)的完整数据,同时需确保时间范围生成逻辑正确适配跨天场景。
修复方案
1. 修改控制器:支持指定营业日期查询
更新getdailySales方法,新增查询日期参数,生成正确的跨天时间范围:
//Daily Sales public function getdailySales() { // 获取查询日期,默认取当前日期(可选) $queryDate = $this->request->getGet('date') ?? date('Y-m-d'); $settings = $this->settingsModel->where('user_id', $this->tenantId->tenant_id)->first(); $openingTime = $settings['opening_time']; // 确保格式为 "14:00:00" $closingTime = $settings['closing_time']; // 确保格式为 "03:00:00" // 生成营业日开始时间:查询日期 + 开门时间 $ot = date('Y-m-d H:i:s', strtotime($queryDate . ' ' . $openingTime)); // 生成营业日结束时间:查询日期+1天 + 关门时间 $ct = date('Y-m-d H:i:s', strtotime($queryDate . ' +1 day ' . $closingTime)); $data = $this->transactionsModel->getdailySalesByTenant($this->tenantId->tenant_id, $ot, $ct); $response = [ 'success' => true, 'data' => $data, ]; return $this->response->setJSON($response); }
2. 模型代码验证(无需修改,确保逻辑正确)
模型中的时间范围查询逻辑本身正确,只要传入的$ot和$ct是正确的跨天时间(如2023-01-05 14:00:00 至 2023-01-06 03:00:00),就能覆盖整个营业时段的数据:
//Get Daily Sales For Tenant ID - By Specific Opening/Closing time public function getdailySalesByTenant($t, $ot, $ct) { $builder = $this->db->table('orders as o'); $builder->select('o.*, u.first_name as waiter'); $builder->join('users as u', 'u.id = o.sold_by', 'left'); $builder->where('o.tenant_id', $t); $builder->where('o.created_at >=', $ot); $builder->where('o.created_at <=', $ct); return $builder->get()->getResult(); }
3. 使用示例
查询2023-01-05的营业数据,请求接口时携带date参数:
GET /your-controller-path/getdailySales?date=2023-01-05
接口会自动生成时间范围2023-01-05 14:00:00到2023-01-06 03:00:00,返回该时段内的所有销售订单。
注意事项
- 确保
settings表中存储的opening_time和closing_time为标准时分秒格式(如"14:00:00"、"03:00:00")。 - 数据库中
created_at字段需为datetime或timestamp类型,保证时间比较的准确性。
内容的提问来源于stack exchange,提问作者lwegaba
相关产品推荐
相关产品推荐

