CommunityHeadCommission.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <?php
  2. namespace addons\Community\common\models;
  3. use addons\Community\common\enums\CommunityEnum;
  4. use addons\Community\common\enums\ConfigEnum;
  5. use common\enums\OrderStatusEnum;
  6. use common\models\order\Order;
  7. use common\models\user\User;
  8. use services\common\UserWalletService;
  9. use Yii;
  10. /**
  11. * This is the model class for table "qimall_addons_community_head_commission".
  12. *
  13. * @property int $id 主键
  14. * @property int $status 状态[-1:删除;0:禁用;1启用]
  15. * @property int $created_at 创建时间
  16. * @property int $updated_at 修改时间
  17. * @property int $mall_id 所属商城
  18. * @property int $user_id 所属用户
  19. * @property int $head_id 自提点ID
  20. * @property int $commission 提成金额
  21. * @property int $order_id 订单ID
  22. * @property string $intro 提成说明
  23. * @property int $buyer_user_id 买家ID
  24. * @property int $is_inflow 买家ID
  25. * @property int $reward_type 买家ID
  26. */
  27. class CommunityHeadCommission extends \common\models\base\BaseActiveRecord
  28. {
  29. /**
  30. * {@inheritdoc}
  31. */
  32. public static function tableName()
  33. {
  34. return 'qimall_addons_community_head_commission';
  35. }
  36. /**
  37. * {@inheritdoc}
  38. */
  39. public function rules()
  40. {
  41. return [
  42. [['status', 'created_at', 'updated_at', 'mall_id', 'user_id', 'head_id', 'commission', 'order_id', 'buyer_user_id', 'is_inflow', 'reward_type'], 'integer'],
  43. [['intro'], 'string', 'max' => 255],
  44. ];
  45. }
  46. /**
  47. * {@inheritdoc}
  48. */
  49. public function attributeLabels()
  50. {
  51. return [
  52. 'id' => 'ID',
  53. 'status' => 'Status',
  54. 'created_at' => 'Created At',
  55. 'updated_at' => 'Updated At',
  56. 'mall_id' => 'Mall ID',
  57. 'user_id' => 'User ID',
  58. 'head_id' => 'Head ID',
  59. 'commission' => 'Commission',
  60. 'order_id' => 'Order ID',
  61. 'intro' => 'Intro',
  62. 'buyer_user_id' => 'Buyer User ID',
  63. ];
  64. }
  65. /**
  66. * @return \yii\db\ActiveQuery
  67. */
  68. public function getHead(): \yii\db\ActiveQuery
  69. {
  70. return $this->hasOne(CommunityHead::class, ['id' => 'head_id']);
  71. }
  72. /**
  73. * @return \yii\db\ActiveQuery
  74. */
  75. public function getUser(): \yii\db\ActiveQuery
  76. {
  77. return $this->hasOne(User::class, ['id' => 'user_id']);
  78. }
  79. /**
  80. * @return \yii\db\ActiveQuery
  81. */
  82. public function getOrder(): \yii\db\ActiveQuery
  83. {
  84. return $this->hasOne(Order::class, ['id' => 'order_id']);
  85. }
  86. /**
  87. * 记录分佣
  88. * @param int $mall_id
  89. * @param CommunityHeadOrder $headOrder
  90. * @param Order $order
  91. * @param int $order_status
  92. * @return void
  93. * @throws \Exception
  94. */
  95. public static function create(int $mall_id, CommunityHeadOrder $headOrder, Order $order, int $order_status)
  96. {
  97. $config = Yii::$app->services->setting->addons->get($mall_id, CommunityEnum::ADDONS_NAME, 'basic');
  98. if ($order_status != $config['settlement_type']) return;
  99. // switch ($config['settlement_type']) {
  100. // case OrderStatusEnum::PAY: // 订单支付
  101. // break;
  102. // case OrderStatusEnum::TAKE_FINISH: // 订单收货
  103. // break;
  104. // }
  105. $reward = 0;
  106. switch ($config['head_commission_type']) {
  107. case ConfigEnum::HEAD_COMMISSION_TYPE_FIXED: // 固定金额
  108. $reward = $config['commission'];
  109. break;
  110. case ConfigEnum::HEAD_COMMISSION_TYPE_RATE: // 百分比
  111. $base_amount = 0;
  112. switch ($config['calculate_type']) {
  113. case ConfigEnum::CALCULATE_TYPE_PAY_AMOUNT: // 实际支付金额
  114. $base_amount = $order->pay_money;
  115. break;
  116. case ConfigEnum::CALCULATE_TYPE_GOODS_PRICE: // 商品售价
  117. // 计算商品售价
  118. foreach ($order->detail as $item) {
  119. $base_amount += bcmul($item->price, $item->num, 2);
  120. }
  121. break;
  122. case ConfigEnum::CALCULATE_TYPE_GOODS_PROFIT: // 商品利润
  123. foreach ($order->detail as $item) {
  124. $base_amount += bcmul(bcsub($item->price, $item->cost_price, 2), $item->num, 2);
  125. }
  126. break;
  127. }
  128. $reward = bcmul($base_amount, bcmul($config['commission'], 0.01, 2), 2);
  129. break;
  130. }
  131. if ($reward > 0) {
  132. $model = new CommunityHeadCommission();
  133. $model->mall_id = $mall_id;
  134. $model->user_id = $headOrder->user_id;
  135. $model->head_id = $headOrder->head_id;
  136. $model->commission = bcmul($reward, 100);
  137. $model->order_id = $order->id;
  138. $model->intro = "用户ID为[{$order->user_id}]的自提人完成订单编号为[{$order->order_no}]的订单获得提成";
  139. $model->buyer_user_id = $order->user_id;
  140. if (!$model->save()) throw new \Exception('记录佣金失败');
  141. // 这里写入佣金
  142. $desc = "用户 ({$model->user_id}) ,获得自提订单 ($order->id) 奖励, 奖励类型:(佣金), 共奖励 ({$reward}) 元佣金";
  143. $insert_wallet [] = [
  144. 'mall_id' => $model->mall_id,
  145. 'user_id' => $model->user_id,
  146. 'is_frozen' => false,
  147. 'wallet_type' => UserWalletService::WALLET_TYPE_COMMISSION,
  148. 'money' => $reward,
  149. 'desc' => $desc,
  150. 'source_table' => self::tableName(),
  151. 'source_table_id' => $model->id, // 取出订单ID?
  152. 'from_type' => CommunityEnum::ADDONS_NAME,
  153. 'capital_type' => CommunityEnum::COMMUNITY_PICKUP_PRIZE,
  154. 'contributor_name' => '',
  155. 'order_no' => $order->order_no, // 这里需要订单号
  156. ];
  157. $res = UserWalletService::batchHandleByQueue($insert_wallet);
  158. if (empty($res)) throw new \Exception(UserWalletService::getStaticError());
  159. }
  160. }
  161. }