WechatpayTransferBillEntity.php 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <?php
  2. declare(strict_types=1);
  3. namespace SixShop\WechatPay\Entity;
  4. use SixShop\Core\Entity\BaseEntity;
  5. use SixShop\WechatPay\Enum\TransferBillStatusEnum;
  6. use SixShop\WechatPay\Event\TransferBillFailedEvent;
  7. use SixShop\WechatPay\Event\TrasferSceneReportEvent;
  8. use SixShop\WechatPay\Trait\ApiTrait;
  9. use think\facade\Db;
  10. use think\facade\Event;
  11. use think\Model;
  12. use think\Paginator;
  13. use function SixShop\Core\throw_logic_exception;
  14. /**
  15. * @mixin \SixShop\WechatPay\Model\WechatpayTransferBillModel
  16. */
  17. class WechatpayTransferBillEntity extends BaseEntity
  18. {
  19. use ApiTrait;
  20. public function getTransferBillList(array $params, array $page): Paginator
  21. {
  22. $query = $this->withSearch(['state', 'out_bill_no'], $params);
  23. return $query->append(['state_text'])->order('id', 'desc')->paginate($page);
  24. }
  25. public function getTransferBillStats(array $params): array
  26. {
  27. return $this->field('state, count(*) as count, sum(transfer_amount) as amount')
  28. ->group('state')
  29. ->select()
  30. ->toArray();
  31. }
  32. public function refreshTransferBill(int $id): array
  33. {
  34. // TODO 刷新转账单状态
  35. return $this->find($id)->toArray();
  36. }
  37. public function approveTransferBill(int $id): self
  38. {
  39. $transferBill = $this->findOrEmpty($id);
  40. if ($transferBill->isEmpty()) {
  41. throw new Exception('提现单不存在');
  42. }
  43. if ($transferBill->state !== TransferBillStatusEnum::APPLYING) {
  44. throw_logic_exception('非法操作');
  45. }
  46. // 转账场景报备信息
  47. $event = new TrasferSceneReportEvent($transferBill);
  48. Event::trigger($event);
  49. $result = $this->tranceferBill(
  50. outBillNo: $transferBill->out_bill_no,
  51. transferSceneId:$event->getTransferSceneId(),
  52. openid: $transferBill->openid,
  53. transferAmount: $transferBill->transfer_amount,
  54. transferRemark: $transferBill->transfer_remark,
  55. transferScenceReportInfos: $event->getTransferSceneReportInfos(),
  56. userName: $transferBill->user_name,
  57. userRecvPerception: $event->getUserRecvPerception(),
  58. );
  59. $transferBill->transfer_scene_id = $event->getTransferSceneId();
  60. $transferBill->user_recv_perception = $event->getUserRecvPerception();
  61. $transferBill->transfer_bill_no = $result->transfer_bill_no;
  62. $datetime = new \DateTime($result->create_time);
  63. $transferBill->accept_time = $datetime->format('Y-m-d H:i:s');
  64. $transferBill->state = $result->state;
  65. $transferBill->package_info = $result->package_info;
  66. $transferBill->save();
  67. return $transferBill;
  68. }
  69. public function rejectTransferBill(int $id, string $failReason): self
  70. {
  71. $transferBill = $this->findOrEmpty($id);
  72. if ($transferBill->isEmpty()) {
  73. throw new Exception('提现单不存在');
  74. }
  75. if ($transferBill->state !== TransferBillStatusEnum::APPLYING) {
  76. throw_logic_exception('非法操作');
  77. }
  78. $transferBill->state = TransferBillStatusEnum::FAIL;
  79. $transferBill->fail_reason = $failReason;
  80. Db::transaction(function () use ($transferBill) {
  81. $transferBill->save();
  82. Event::trigger(new TransferBillFailedEvent($transferBill->id));
  83. });
  84. return $transferBill;
  85. }
  86. }