withSearch(['state', 'out_bill_no'], $params); return $query->append(['state_text'])->order('id', 'desc')->paginate($page); } public function getTransferBillStats(array $params): array { return $this->field('state, count(*) as count, sum(transfer_amount) as amount') ->group('state') ->select() ->toArray(); } public function refreshTransferBill(int $id): array { // TODO 刷新转账单状态 return $this->find($id)->toArray(); } public function approveTransferBill(int $id): self { $transferBill = $this->findOrEmpty($id); if ($transferBill->isEmpty()) { throw new Exception('提现单不存在'); } if ($transferBill->state !== TransferBillStatusEnum::APPLYING) { throw_logic_exception('非法操作'); } // 转账场景报备信息 $event = new TrasferSceneReportEvent($transferBill); Event::trigger($event); $result = $this->tranceferBill( outBillNo: $transferBill->out_bill_no, transferSceneId:$event->getTransferSceneId(), openid: $transferBill->openid, transferAmount: $transferBill->transfer_amount, transferRemark: $transferBill->transfer_remark, transferScenceReportInfos: $event->getTransferSceneReportInfos(), userName: $transferBill->user_name, userRecvPerception: $event->getUserRecvPerception(), ); $transferBill->transfer_scene_id = $event->getTransferSceneId(); $transferBill->user_recv_perception = $event->getUserRecvPerception(); $transferBill->transfer_bill_no = $result->transfer_bill_no; $datetime = new \DateTime($result->create_time); $transferBill->accept_time = $datetime->format('Y-m-d H:i:s'); $transferBill->state = $result->state; $transferBill->package_info = $result->package_info; $transferBill->save(); return $transferBill; } public function rejectTransferBill(int $id, string $failReason): self { $transferBill = $this->findOrEmpty($id); if ($transferBill->isEmpty()) { throw new Exception('提现单不存在'); } if ($transferBill->state !== TransferBillStatusEnum::APPLYING) { throw_logic_exception('非法操作'); } $transferBill->state = TransferBillStatusEnum::FAIL; $transferBill->fail_reason = $failReason; Db::transaction(function () use ($transferBill) { $transferBill->save(); Event::trigger(new TransferBillFailedEvent($transferBill->id)); }); return $transferBill; } }