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', strtotime($item['create_time'])); $item['update_time_text'] = date('Y-m-d H:i:s', strtotime($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'])) : '-'; // 三要素验证方式文本 $ytypeMap = [1 => '身份证后6位', 2 => '银行卡后6位', 3 => '营业执照后6位']; $info['ytype_text'] = $ytypeMap[$info['ytype'] ?? 0] ?? '-'; // 用户信息 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', 'pay_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; } /** * 已支付充值失败退款失败订单 * @return array|mixed */ public function getFailedOrderList() { $cacheKey = "caches:orders:failedList"; $datas = RedisService::get($cacheKey); if ($datas) { return $datas; } $datas = $this->model->where(['refund_status'=>3,'status'=>5,'mark' => 1]) ->select(['id', 'order_no', 'transaction_id', 'pay_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 failedOrderRefund($orders) { $success = []; 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_remark'=>PaymentService::make()->getError(), 'refund_money' => $refundStatus ? $total : 0,'refund_at'=>date('Y-m-d H:i:s'), 'update_time' => time()]; if (!PayOrdersModel::where(['id' => $order['id']])->update($updateData)) { $errors[$order['order_no']] = '充值失败退款处理失败'; } else { $success[$order['order_no']] = "退款{$total}成功"; $errors[$order['order_no']] = $refundStatus ? '充值失败原路退款' : '充值失败退款失败'; } sleep(2); } } $this->error = '充值订单退款处理成功'; return ['success' => $success, 'errors' => $errors]; } /** * 验证订单状态 * @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_remark'=>PaymentService::make()->getError(), 'refund_money' => $refundStatus ? $total : 0,'refund_at'=>date('Y-m-d H:i:s'), 'update_time' => time()]; if (!PayOrdersModel::where(['id' => $order['id']])->update($updateData)) { $errors[$order['order_no']] = '充值失败退款处理失败'; } else { $errors[$order['order_no']] = $refundStatus ? '充值失败原路退款' : '充值失败退款失败'; } sleep(2); } } $this->error = '订单状态验证处理成功'; return ['success' => $success, 'errors' => $errors]; } }