model = new PayOrdersModel(); } /** * 获取列表 */ public function getList() { $params = request()->all(); $page = $params['page'] ?? 1; $limit = $params['limit'] ?? 20; $type = $params['type'] ?? ''; $status = $params['status'] ?? ''; $keyword = $params['keyword'] ?? ''; $startTime = $params['start_time'] ?? ''; $endTime = $params['end_time'] ?? ''; $query = PayOrdersModel::where('mark', 1); // 类型筛选 if ($type !== '') { $query->where('type', $type); } // 状态筛选 if ($status !== '') { $query->where('status', $status); } // 关键词搜索 if (!empty($keyword)) { $query->where(function($q) use ($keyword) { $q->where('order_no', 'like', "%{$keyword}%") ->orWhere('account', 'like', "%{$keyword}%") ->orWhere('transaction_id', 'like', "%{$keyword}%") ->orWhereHas('user', function($sq) use ($keyword) { $sq->where('nickname', 'like', "%{$keyword}%") ->orWhere('mobile', 'like', "%{$keyword}%"); }); }); } // 时间范围 if (!empty($startTime)) { $query->where('create_time', '>=', strtotime($startTime)); } if (!empty($endTime)) { $query->where('create_time', '<=', strtotime($endTime . ' 23:59:59')); } $total = $query->count(); $list = $query->with(['user:id,nickname,mobile']) ->orderBy('create_time', 'desc') ->offset(($page - 1) * $limit) ->limit($limit) ->get() ->toArray(); // 格式化数据 foreach ($list as &$item) { $item['total'] = number_format($item['total'], 2, '.', ''); $item['discount'] = number_format($item['discount'], 2, '.', ''); $item['pay_total'] = number_format($item['pay_total'], 2, '.', ''); $item['charge_amount'] = number_format($item['charge_amount'] ?? 0, 2, '.', ''); $item['refund_money'] = number_format($item['refund_money'] ?? 0, 2, '.', ''); $item['create_time_text'] = date('Y-m-d H:i:s', (int)$item['create_time']); $item['update_time_text'] = date('Y-m-d H:i:s', (int)$item['update_time']); $item['pay_at_text'] = $item['pay_at'] ? date('Y-m-d H:i:s', strtotime($item['pay_at'])) : '-'; // 用户信息 if (isset($item['user'])) { $item['user_nickname'] = $item['user']['nickname'] ?? ''; $item['user_mobile'] = $item['user']['mobile'] ?? ''; } } return [ 'code' => 0, 'msg' => '获取成功', 'data' => $list, 'count' => $total ]; } /** * 获取详情 */ public function getInfo($id = null) { if ($id === null) { $id = request()->input('id'); } $info = PayOrdersModel::where('id', $id) ->where('mark', 1) ->with(['user:id,nickname,mobile', 'meal']) ->first(); if (!$info) { return ['code' => 1, 'msg' => '记录不存在']; } $info = $info->toArray(); $info['total'] = number_format($info['total'], 2, '.', ''); $info['discount'] = number_format($info['discount'], 2, '.', ''); $info['pay_total'] = number_format($info['pay_total'], 2, '.', ''); $info['charge_amount'] = number_format($info['charge_amount'] ?? 0, 2, '.', ''); $info['refund_money'] = number_format($info['refund_money'] ?? 0, 2, '.', ''); $info['create_time_text'] = date('Y-m-d H:i:s', (int)$info['create_time']); $info['update_time_text'] = date('Y-m-d H:i:s', (int)$info['update_time']); $info['pay_at_text'] = $info['pay_at'] ? date('Y-m-d H:i:s', strtotime($info['pay_at'])) : '-'; // 用户信息 if (isset($info['user'])) { $info['user_nickname'] = $info['user']['nickname'] ?? ''; $info['user_mobile'] = $info['user']['mobile'] ?? ''; } return [ 'code' => 0, 'msg' => '获取成功', 'data' => $info ]; } /** * 删除 */ public function delete() { $id = request()->input('id'); $order = PayOrdersModel::where('id', $id) ->where('mark', 1) ->first(); if (!$order) { return ['code' => 1, 'msg' => '记录不存在']; } $order->mark = 0; $order->save(); return ['code' => 0, 'msg' => '删除成功']; } /** * 批量删除 */ public function deleteAll($ids = null) { if ($ids === null) { $ids = request()->input('ids', []); } $count = PayOrdersModel::whereIn('id', $ids) ->where('mark', 1) ->update(['mark' => 0]); return [ 'code' => 0, 'msg' => "成功删除{$count}条记录" ]; } /** * 已支付或充值中的订单 * @return array|mixed */ public function getCheckOrderList() { $cacheKey = "caches:orders:payCheckList"; $datas = RedisService::get($cacheKey); if($datas){ return $datas; } $datas = $this->model->where(['mark'=>1]) ->whereIn('status',[2,3]) ->select(['id','order_no','transaction_id','total as money','status']) ->orderBy('id','desc') ->limit(500) ->get() ->keyBy('order_no'); $datas = $datas? $datas->toArray() : []; if($datas){ $datas = array_chunk($datas, 100); RedisService::set($cacheKey, $datas, rand(20,30)); } return $datas; } /** * 验证订单状态 * @param $orders * @return array * @throws \Yansongda\Pay\Exception\ContainerException * @throws \Yansongda\Pay\Exception\InvalidParamsException * @throws \Yansongda\Pay\Exception\ServiceNotFoundException */ public function checkOrder($orders) { $nos = array_keys($orders); $noStr = implode(',', $nos); $result = DyrPayService::make()->query($noStr); $datas = isset($result['data'])?$result['data']:[]; $errors = []; $success = []; if($datas){ foreach($datas as $item){ $no = isset($item['out_trade_num'])?$item['out_trade_num']:''; $remark = isset($item['remark'])?$item['remark']:'充值失败'; $order_number = isset($item['order_number'])?$item['order_number']:''; $charge_amount = isset($item['charge_amount'])?$item['charge_amount']:0; $charge_kami = isset($item['charge_kami'])?$item['charge_kami']:''; $state = isset($item['state'])?$item['state']:-1; if(in_array($state, [1,3])){ $success[$no]= $state; $updateData = ['status'=> $state==3?6:4,'order_trade_no'=>$order_number,'charge_kami'=>$charge_kami,'charge_amount'=>$charge_amount,'update_time'=>time()]; if(!PayOrdersModel::where(['order_no'=>$no])->update($updateData)){ $errors[$no] = '充值失败退款处理失败'; } unset($orders[$no]); }else if($state == 0){ unset($orders[$no]); $errors[$no] = '充值中'; }else{ $errors[$no] = $remark; } } } // 未查询到充值记录,批量退款 if($orders){ foreach($orders as $order){ $total = isset($order['money'])?$order['money']:0; $refundStatus = PaymentService::make()->refund($order,'pay'); $updateData = ['refund_status'=> $refundStatus?1:3,'status'=>5,'failed_remark'=> '充值失败原路退款','refund_money'=>$refundStatus?$total:0,'update_time'=>time()]; if(!PayOrdersModel::where(['id'=>$order['id']])->update($updateData)){ $errors[$order['order_no']] = '充值失败退款处理失败'; }else{ $errors[$order['order_no']] = $refundStatus?'充值失败原路退款':'充值失败退款失败'; } } } $this->error = '订单状态验证处理成功'; return ['success'=>$success,'errors'=>$errors]; } }