AchievementLogic.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. <?php
  2. namespace addons\ServeBonus\common\logic;
  3. use addons\ServeBonus\common\enums\ServeBonusEnum;
  4. use addons\ServeBonus\common\models\ServeBonus;
  5. use addons\ServeBonus\common\models\ServeBonusLevel;
  6. use addons\ServeBonus\common\models\ServeBonusLevelSetting;
  7. use addons\ServeBonus\common\models\ServeBonusUpgradeCount;
  8. use addons\ServeBonus\common\models\ServeBonusUpgradeLimit;
  9. use common\enums\StatusEnum;
  10. use common\models\statistics\UserStatisticsTotal;
  11. use common\models\statistics\UserTeamStatistics;
  12. use common\models\user\UserPartitionRelationship;
  13. use common\models\user\UserTeamMonthStatistics;
  14. use common\traits\ErrorTrait;
  15. use Exception;
  16. use yii;
  17. /**
  18. * Class AchievementLogic
  19. * @Author: lun
  20. * @DateTime: 2023/4/1 0001 14:38
  21. * @Copyright: copyright (c) 2021 广东七件事集团
  22. * @package addons\ServeBonus\common\logic
  23. */
  24. class AchievementLogic
  25. {
  26. use ErrorTrait;
  27. /**
  28. * 团队业绩条件升级记录
  29. * @Author: lun
  30. * @DateTime: 2023/4/1 0001 15:40
  31. * @Copyright: copyright (c) 2021 广东七件事集团
  32. * @param $order
  33. * @return bool
  34. */
  35. public static function limitHandle($order)
  36. {
  37. $mall_id = $order['mall_id'];
  38. $user_id = $order['user_id'];
  39. $pay_money = $order['pay_money'];
  40. // 获取配置
  41. $set_team_achievement = Yii::$app->services->setting->addons->get($mall_id, 'ServeBonus', 'basic.set_team_achievement');
  42. if (empty($set_team_achievement)) return true;// 不开启统计直接跳过
  43. try {
  44. $trans = Yii::$app->db->beginTransaction();
  45. // 获取消费者上级
  46. $parent_ids = UserPartitionRelationship::getParentIdArr($user_id);
  47. if (empty($parent_ids)) {
  48. $trans->commit();
  49. return true;
  50. }
  51. // 获取上级的所有属于服务商的用户
  52. $parent_ids = ServeBonus::find()->select('user_id')->where(['user_id' => $parent_ids, 'status' => StatusEnum::ENABLED])->column();
  53. if (empty($parent_ids)) {
  54. $trans->commit();
  55. return true;
  56. }
  57. // 获取上级服务商的等级
  58. $serve_users = ServeBonus::find()->select('mall_id,user_id,level')->where(['user_id' => $parent_ids, 'status' => StatusEnum::ENABLED])->indexBy('user_id')->asArray()->all();
  59. // 增加上级的业绩
  60. $time = time();
  61. foreach ($parent_ids as $parent_id) {
  62. $add_achievement = false;// 是否可增加业绩
  63. // 检查是否存在该用户已为服务商增加过业绩
  64. $limit = ServeBonusUpgradeLimit::find()->where(['user_id' => $user_id, 'serve_uid' => $parent_id, 'status' => StatusEnum::ENABLED])->one();
  65. $parent_level = empty($serve_users[$parent_id]['level']) ? 0 : $serve_users[$parent_id]['level'];
  66. // 查询是否之前已贡献过业绩
  67. if (empty($limit)) {
  68. // 增加一条上级的业绩
  69. $inster[] = [
  70. 'mall_id' => $mall_id,
  71. 'user_id' => $user_id,
  72. 'serve_uid' => $parent_id,
  73. 'level' => $parent_level,
  74. 'achievement' => $pay_money,
  75. 'created_at' => $time,
  76. 'updated_at' => $time,
  77. ];
  78. $add_achievement = true;
  79. } else {
  80. // 当用户已经为该上级生成业绩,并且此业绩生成的等级=上级等级时,则表示此上级还处于当前等级可以继续增加业绩
  81. if ($limit['level'] == $parent_level) {
  82. $limit->achievement += $pay_money;
  83. if (!$limit->save()) throw new yii\db\Exception($limit->getErrorMessage());
  84. $add_achievement = true;
  85. }
  86. }
  87. // 增加上级统计业绩
  88. if ($add_achievement) {
  89. $res = ServeBonusUpgradeCount::setData($mall_id, $parent_id, 0, $pay_money);
  90. if ($res == false) throw new Exception('保存业绩报错:'.ServeBonusUpgradeCount::getStaticError());
  91. }
  92. }
  93. if ($inster) {
  94. $field = ['mall_id','user_id','serve_uid','level','achievement','created_at','updated_at'];
  95. $res = Yii::$app->db->createCommand()->batchInsert(ServeBonusUpgradeLimit::tableName(), $field, $inster)->execute();
  96. if ($res == false) throw new \yii\db\Exception(ServeBonusUpgradeLimit::getStaticError());
  97. }
  98. $trans->commit();
  99. return true;
  100. } catch (Exception $e) {
  101. $trans->rollBack();
  102. Yii::error('条件升级业绩报错参数:' . json_encode($order));
  103. Yii::error($e->getMessage());
  104. return false;
  105. }
  106. }
  107. /**
  108. * 获取用户业绩
  109. * @param int $user_id
  110. * @param int $mall_id
  111. * @return array
  112. */
  113. public static function getUserAchievement($user_id, $mall_id)
  114. {
  115. $configs = Yii::$app->services->setting->addons->get($mall_id, ServeBonusEnum::ADDONS_NAME, 'basic');
  116. $team_statistics = UserTeamStatistics::find()->where(['mall_id' => $mall_id, 'user_id' => $user_id])->asArray()->one();
  117. $user_statistics = UserStatisticsTotal::find()->where(['mall_id' => $mall_id, 'user_id' => $user_id])->asArray()->one();
  118. $data = [];
  119. if ($configs['achievement_count_method'] == 0) { // 支付完成
  120. $data['total_price'] = bcadd(($team_statistics['user_team_order_price_total'] ?? 0), ($user_statistics['pay_money'] ?? 0), 2);
  121. } else { // 订单完成
  122. $data['total_price'] = bcadd(($team_statistics['team_finish_order_price_total'] ?? 0), ($user_statistics['finish_order_money'] ?? 0), 2);
  123. }
  124. $month_statistics = UserTeamMonthStatistics::find()->where(['mall_id' => $mall_id, 'user_id' => $user_id, 'month' => date('Y-m'), 'status' => StatusEnum::ENABLED])->one();
  125. $last_month = date('Y-m', strtotime('last month'));
  126. $last_month_statistics = UserTeamMonthStatistics::find()->where(['mall_id' => $mall_id, 'user_id' => $user_id, 'month' => $last_month, 'status' => StatusEnum::ENABLED])->one();
  127. // 获取服务商等级设置的限制条件
  128. $serve_bonus = ServeBonus::find()->where(['user_id' => $user_id, 'mall_id' => $mall_id, 'status' => StatusEnum::ENABLED])->asArray()->one();
  129. $accumulation_condition_money = 0;
  130. if ($serve_bonus) {
  131. $serve_bonus_level_setting = ServeBonusLevelSetting::find()->where(['mall_id' => $mall_id, 'level' => $serve_bonus['level'], 'status' => StatusEnum::ENABLED])->asArray()->one();
  132. if ($serve_bonus_level_setting['accumulation_condition'] == 1) {
  133. $accumulation_condition_money = $serve_bonus_level_setting['accumulation_condition_money'];
  134. }
  135. }
  136. if ($configs['achievement_count_method'] == 0) { // 支付完成
  137. $price = $month_statistics->price ?? 0;
  138. $last_price = $last_month_statistics->price ?? 0;
  139. } else { // 订单完成
  140. $price = $month_statistics->finish_price ?? 0;
  141. $last_price = $last_month_statistics->finish_price ?? 0;
  142. }
  143. $data['month_achievement'] = $price >= $accumulation_condition_money ? 1 : 0;
  144. $data['last_month_achievement'] = $last_price >= $accumulation_condition_money ? 1 : 0;
  145. $data['month_price'] = $price ?? 0;
  146. $data['last_month_price'] = $last_price ?? 0;
  147. return $data;
  148. }
  149. }