AchievementLogic.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <?php
  2. namespace addons\Distribution\common\logic;
  3. use addons\Distribution\common\models\Distribution;
  4. use addons\Distribution\common\models\DistributionUpgradeCount;
  5. use addons\Distribution\common\models\DistributionUpgradeLimit;
  6. use common\enums\StatusEnum;
  7. use common\models\user\UserPartitionRelationship;
  8. use common\traits\ErrorTrait;
  9. use Exception;
  10. use yii;
  11. class AchievementLogic
  12. {
  13. use ErrorTrait;
  14. /**
  15. * 团队业绩条件升级记录
  16. * @Author: lun
  17. * @DateTime: 2023/4/1 0001 15:40
  18. * @Copyright: copyright (c) 2021 广东七件事集团
  19. * @param $order
  20. * @return bool
  21. */
  22. public static function limitHandle($order)
  23. {
  24. $mall_id = $order['mall_id'];
  25. $user_id = $order['user_id'];
  26. $pay_money = $order['pay_money'];
  27. // 获取配置
  28. $set_team_achievement = Yii::$app->services->setting->addons->get($mall_id, 'Distribution', 'basic.set_team_achievement');
  29. if (empty($set_team_achievement)) return true;// 不开启统计直接跳过
  30. try {
  31. $trans = Yii::$app->db->beginTransaction();
  32. // 获取消费者上级
  33. $parent_ids = UserPartitionRelationship::getParentIdArr($user_id);
  34. if (empty($parent_ids)) {
  35. $trans->commit();
  36. return true;
  37. }
  38. // 获取上级的所有属于分销商的用户
  39. $parent_ids = Distribution::find()->select('user_id')->where(['user_id' => $parent_ids, 'status' => StatusEnum::ENABLED])
  40. ->andWhere(['>','level',0])
  41. ->column();
  42. if (empty($parent_ids)) {
  43. $trans->commit();
  44. return true;
  45. }
  46. // 获取上级分销商的等级
  47. $serve_users = Distribution::find()->select('mall_id,user_id,level')->where(['user_id' => $parent_ids, 'status' => StatusEnum::ENABLED])->indexBy('user_id')->asArray()->all();
  48. // 增加上级的业绩
  49. $time = time();
  50. foreach ($parent_ids as $parent_id) {
  51. $add_achievement = false;// 是否可增加业绩
  52. // 检查是否存在该用户已为分销商增加过业绩
  53. $limit = DistributionUpgradeLimit::find()->where(['user_id' => $user_id, 'serve_uid' => $parent_id, 'status' => StatusEnum::ENABLED])->one();
  54. $parent_level = empty($serve_users[$parent_id]['level']) ? 0 : $serve_users[$parent_id]['level'];
  55. // 查询是否之前已贡献过业绩
  56. if (empty($limit)) {
  57. // 增加一条上级的业绩
  58. $inster[] = [
  59. 'mall_id' => $mall_id,
  60. 'user_id' => $user_id,
  61. 'serve_uid' => $parent_id,
  62. 'level' => $parent_level,
  63. 'achievement' => $pay_money,
  64. 'created_at' => $time,
  65. 'updated_at' => $time,
  66. ];
  67. $add_achievement = true;
  68. } else {
  69. // 当用户已经为该上级生成业绩,并且此业绩生成的等级=上级等级时,则表示此上级还处于当前等级可以继续增加业绩
  70. if ($limit['level'] == $parent_level) {
  71. $limit->achievement += $pay_money;
  72. if (!$limit->save()) throw new yii\db\Exception($limit->getErrorMessage());
  73. $add_achievement = true;
  74. }
  75. }
  76. // 增加上级统计业绩
  77. if ($add_achievement) {
  78. $res = DistributionUpgradeCount::setData($mall_id, $parent_id, 0, $pay_money);
  79. if ($res == false) throw new Exception('保存业绩报错:'.DistributionUpgradeCount::getStaticError());
  80. }
  81. }
  82. if ($inster) {
  83. $field = ['mall_id','user_id','serve_uid','level','achievement','created_at','updated_at'];
  84. $res = Yii::$app->db->createCommand()->batchInsert(DistributionUpgradeLimit::tableName(), $field, $inster)->execute();
  85. if ($res == false) throw new \yii\db\Exception(DistributionUpgradeLimit::getStaticError());
  86. }
  87. $trans->commit();
  88. return true;
  89. } catch (Exception $e) {
  90. $trans->rollBack();
  91. Yii::error('条件升级业绩报错参数:' . json_encode($order));
  92. Yii::error($e->getMessage());
  93. return false;
  94. }
  95. }
  96. }