You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
3.6 KiB

  1. <?php
  2. namespace App\Service;
  3. use App\Commons\Log;
  4. use App\Constants\LogLabel;
  5. use App\Model\OrderMain;
  6. use App\Model\ServiceReward;
  7. use App\Model\UserRelationBind;
  8. use Hyperf\DbConnection\Db;
  9. use Hyperf\Di\Annotation\Inject;
  10. class SeparateAccountsService implements SeparateAccountsServiceInterface
  11. {
  12. /**
  13. * @Inject
  14. * @var Log
  15. */
  16. protected $log;
  17. /**
  18. * @Inject
  19. * @var UserServiceInterface
  20. */
  21. protected $userService;
  22. /**
  23. * @Inject
  24. * @var FinancialRecordServiceInterface
  25. */
  26. protected $financialRecordService;
  27. /**
  28. * @inheritDoc
  29. */
  30. public function orderOnlinePaid($global_order_id)
  31. {
  32. // TODO: Implement orderOnlinePaid() method.
  33. }
  34. /**
  35. * @inheritDoc
  36. */
  37. public function orderOnlineCompleted($global_order_id)
  38. {
  39. // 线上订单完成(用户点击确认收货完成/管理后台点击完成/配送员点击完成/自动收货等),进行相关分账
  40. // 订单
  41. $orderMain = OrderMain::query()
  42. ->where(['global_order_id' => $global_order_id])
  43. ->whereIn('state', [OrderMain::ORDER_STATE_COMPLETE,OrderMain::ORDER_STATE_EVALUATED,OrderMain::ORDER_STATE_UNREFUND])
  44. ->first();
  45. if (empty($orderMain)) {
  46. return;
  47. }
  48. Db::beginTransaction();
  49. try {
  50. // =======社区服务点分账 / Start=======
  51. // 前提:用户线上下单并且订单完成
  52. // 奖励规则A:用户是平台新用户,奖励社区服务点平台新用户奖励x元+平台新用户首单奖励y元+订单商品金额z%的分成
  53. // 奖励规则B:用户是非新用户,奖励社区服务点订单实际支付金额z%的分成
  54. // =======社区服务点分账 / Start=======
  55. // 当前用户的社区服务点绑定关系
  56. $communityBind = UserRelationBind::query()
  57. ->where(['bind_type' => UserRelationBind::BIND_TYPE_COMMUNITY, 'user_id' => $orderMain->user_id])
  58. ->first();
  59. if ($communityBind) {
  60. // 奖励/分账金额
  61. $award = ServiceReward::query()->where(['type' => ServiceReward::TYPE_COMMUNITY])->first();
  62. if (empty($award)) {
  63. Db::rollBack();
  64. return false;
  65. }
  66. $award = $award->set_reward;
  67. // 平台新用户
  68. if ($this->userService->isPlatformNewUser($orderMain->user_id, $orderMain->id)) {
  69. $this->financialRecordService->communityAwardByPlatNewUser($communityBind->source_id, $orderMain->global_order_id, $award['new_user_reward']);
  70. $this->financialRecordService->communityAwardByPlatNewUserFirstOLOrder($communityBind->source_id, $orderMain->global_order_id, $award['first_reward']);
  71. }
  72. // 账单分成
  73. $money = bcmul($orderMain->money, $award['flow_reward']);
  74. $this->financialRecordService->communitySeparateAccountsByOrderComp($communityBind->source_id, $orderMain->global_order_id, $money);
  75. }
  76. // =======社区服务点分账 / End=======
  77. Db::commit();
  78. return true;
  79. } catch (\Exception $e) {
  80. $this->log->event(LogLabel::SEPARATE_ACCOUNTS_LOG, ['exception' => $e->getMessage(), 'order_main' => json_encode($orderMain)]);
  81. Db::rollBack();
  82. return false;
  83. }
  84. }
  85. /**
  86. * @inheritDoc
  87. */
  88. public function orderOfflinePaid($global_order_id)
  89. {
  90. // TODO: Implement orderOfflinePaid() method.
  91. }
  92. }