WechatpayTransferBillEntity.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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\TransferSceneReportEvent;
  8. use SixShop\WechatPay\Trait\ApiTrait;
  9. use think\db\Query;
  10. use think\facade\Db;
  11. use think\facade\Event;
  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->with(['user' => function (Query $query) {
  24. $query->field(['id', 'avatar','username', 'mobile','nickname']);
  25. }])->append(['state_text'])->order('id', 'desc')->paginate($page);
  26. }
  27. public function getTransferBillStats(array $params): array
  28. {
  29. return $this->field('state, count(*) as count, sum(transfer_amount + fee) as amount')
  30. ->group('state')
  31. ->select()
  32. ->toArray();
  33. }
  34. public function refreshTransferBill(int $id): self
  35. {
  36. $transferBill = $this->findOrEmpty($id);
  37. if ($transferBill->isEmpty()) {
  38. throw_logic_exception('提现单不存在');
  39. }
  40. $result = match ($transferBill->state) {
  41. TransferBillStatusEnum::SUCCESS,
  42. TransferBillStatusEnum::FAIL,
  43. TransferBillStatusEnum::CANCELLED => throw_logic_exception('提现单已是最终状态不允许刷新'),
  44. TransferBillStatusEnum::APPLYING => throw_logic_exception('提现单申请中不允许刷新'),
  45. default => $this->queryTransferBill($transferBill->out_bill_no),
  46. };
  47. $transferBill->state = TransferBillStatusEnum::from($result->state);
  48. $transferBill->fail_reason = match ($transferBill->state) {
  49. TransferBillStatusEnum::FAIL,
  50. TransferBillStatusEnum::CANCELLED => $result->fail_reason,
  51. default => '',
  52. };
  53. Db::transaction(function () use ($transferBill) {
  54. if ($transferBill->state === TransferBillStatusEnum::FAIL
  55. || $transferBill->state === TransferBillStatusEnum::CANCELLED) {
  56. Event::trigger(new TransferBillFailedEvent($transferBill->id));
  57. }
  58. $transferBill->save();
  59. });
  60. return $transferBill;
  61. }
  62. public function approveTransferBill(int $id): self
  63. {
  64. $transferBill = $this->findOrEmpty($id);
  65. if ($transferBill->isEmpty()) {
  66. throw new Exception('提现单不存在');
  67. }
  68. if ($transferBill->state !== TransferBillStatusEnum::APPLYING) {
  69. throw_logic_exception('非法操作');
  70. }
  71. // 转账场景报备信息
  72. $event = new TransferSceneReportEvent($transferBill);
  73. Event::trigger($event);
  74. $result = $this->transferBill(
  75. outBillNo: $transferBill->out_bill_no,
  76. transferSceneId:$event->getTransferSceneId(),
  77. openid: $transferBill->openid,
  78. transferAmount: $transferBill->transfer_amount,
  79. transferRemark: $transferBill->transfer_remark,
  80. transferSceneReportInfos: $event->getTransferSceneReportInfos(),
  81. userName: $transferBill->user_name,
  82. userRecvPerception: $event->getUserRecvPerception(),
  83. );
  84. $transferBill->transfer_scene_id = $event->getTransferSceneId();
  85. $transferBill->user_recv_perception = $event->getUserRecvPerception();
  86. $transferBill->transfer_bill_no = $result->transfer_bill_no;
  87. $datetime = new \DateTime($result->create_time);
  88. $transferBill->accept_time = $datetime->format('Y-m-d H:i:s');
  89. $transferBill->state = $result->state;
  90. $transferBill->package_info = $result->package_info;
  91. $transferBill->save();
  92. return $transferBill;
  93. }
  94. public function rejectTransferBill(int $id, string $failReason): self
  95. {
  96. $transferBill = $this->findOrEmpty($id);
  97. if ($transferBill->isEmpty()) {
  98. throw new Exception('提现单不存在');
  99. }
  100. if ($transferBill->state !== TransferBillStatusEnum::APPLYING) {
  101. throw_logic_exception('非法操作');
  102. }
  103. $transferBill->state = TransferBillStatusEnum::FAIL;
  104. $transferBill->fail_reason = $failReason;
  105. Db::transaction(function () use ($transferBill) {
  106. $transferBill->save();
  107. Event::trigger(new TransferBillFailedEvent($transferBill->id));
  108. });
  109. return $transferBill;
  110. }
  111. }