ConditionUpgradeLogic.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. <?php
  2. namespace addons\Distribution\common\logic;
  3. use common\enums\AddonsEnum;
  4. use common\enums\LevelUpgradeLogEnum;
  5. use common\enums\StatusEnum;
  6. use common\enums\UpgradeEnum;
  7. use common\helpers\FormatHelper;
  8. use common\models\common\UpgradeCondition;
  9. use common\models\user\UserPartitionRelationship;
  10. use common\traits\ErrorTrait;
  11. use Exception;
  12. use yii;
  13. class ConditionUpgradeLogic
  14. {
  15. use ErrorTrait;
  16. /**
  17. * 购物升级执行
  18. * 样式:execute(AddonsEnum::ADDONS_NAME_BOSS, (new AddonsBoss()), (new AddonsBossLevel()), $order);
  19. * @Author: lun
  20. * @DateTime: 2021/11/18 0018 16:56
  21. * @Copyright: copyright (c) 2021 广东七件事集团
  22. * @param $identity_desc - 用户身份描述
  23. * @param $identity_obj - 用户身份空对象
  24. * @param $level_obj - 用户等级空对象
  25. * @param $order
  26. * @param int $shopping_upgrade_uid 购物升级用户
  27. * @return bool | array
  28. */
  29. public function execute(string $identity_desc, object $identity_obj, object $level_obj, $order, $shopping_upgrade_uid = 0, object $upgrade_log_obj = null)
  30. {
  31. try {
  32. //开启条件升级
  33. $mall_id = $order['mall_id'];
  34. $user_id = $order['user_id'];
  35. // 获取基础配置
  36. $configs = \Yii::$app->services->setting->addons->get($mall_id, $identity_desc, 'basic');
  37. $upgrade_user_id_arr = UserPartitionRelationship::getParentIdArr($user_id);
  38. if(empty($configs['is_open_level_limit']) || !empty($configs['is_open_level_limit']) && $user_id != $shopping_upgrade_uid) $upgrade_user_id_arr [] = $user_id;// 如果开启了逐级升级,并且购物升级就是本人则不能进行条件升级
  39. $upgrade_user_id_arr = array_reverse($upgrade_user_id_arr);
  40. $model_list = $identity_obj::find()->where(['user_id' => $upgrade_user_id_arr, 'status' => StatusEnum::ENABLED])->indexBy('user_id')->all();
  41. $model_arr = $upgrade_user_ids = [];
  42. foreach ($upgrade_user_id_arr as $id){
  43. if(!isset($model_list[$id])){
  44. }
  45. if(!empty($model_list[$id])) {
  46. $model_arr[] = $model_list[$id];
  47. }else{
  48. $model = new $identity_obj;
  49. $model->mall_id = $mall_id;
  50. $model->user_id = $id;
  51. $model->level = 0;
  52. $model->upgrade_level_at = 0;
  53. $model_arr[] = $model;
  54. }
  55. }
  56. $where = [];
  57. $where[] = ['mall_id' => $mall_id];
  58. $where[] = ['status' => StatusEnum::ENABLED];
  59. $params = [];
  60. if($configs && isset($configs['is_open_level_limit']) && !empty($configs['is_open_level_limit'])){
  61. $params['order'] = 'level asc';
  62. $is_open_level_limit = true;
  63. }else{
  64. $params['order'] = 'level desc';
  65. $is_open_level_limit = false;
  66. }
  67. $params['where'] = $where;
  68. $level_list = $level_obj::lists($params);
  69. if (empty($level_list)) return [];
  70. foreach ($model_arr as $identity) {
  71. $flag = false;
  72. $can_upgrade_level = 0;
  73. $upgrade_status = 0;
  74. $upgrade_level = 0;// 升级次数
  75. if($level_list){
  76. foreach ($level_list as $identity_level_arr) {
  77. // 当前等级大于或等于可以升级的等级则直接退出
  78. if(!$is_open_level_limit && $identity->level >= $identity_level_arr['level']){
  79. break;
  80. }
  81. if($is_open_level_limit && $identity->level >= $identity_level_arr['level']){
  82. continue;
  83. }
  84. $can_upgrade_level = $identity_level_arr['level'];
  85. $upgrade_level ++;
  86. //开启条件升级
  87. if ($identity_level_arr['upgrade_type_condition']&&$identity_level_arr['is_auto_upgrade']) {
  88. $upgrade_status = UpgradeEnum::UPGRADE_STATUS_CONDITION;
  89. $res = UpgradeCondition::check($identity->user_id, $identity_level_arr, $mall_id, $identity_level_arr['level'],$order['id']);
  90. if ($res) {
  91. $flag = true;
  92. break;
  93. }
  94. }
  95. }
  96. }
  97. if ($flag && $can_upgrade_level > $identity->level) {
  98. $original_identity_level = $identity->level;
  99. // 开启了逐级升级,跳级升级的用户无法升级
  100. if($is_open_level_limit && $upgrade_level > 1) continue;
  101. $identity->level = $can_upgrade_level;
  102. $identity->upgrade_status = $upgrade_status;
  103. $identity->upgrade_level_at = time();
  104. if (!$identity->save()) throw new Exception("{用户ID:$identity->user_id},订单ID:{$order['id']},". AddonsEnum::getAddonsNameMap($identity_desc) ."条件升级失败");
  105. $upgrade_user_ids[] = $identity->user_id;
  106. if ($upgrade_log_obj !== null) {
  107. $upgrade_log_obj_clone = clone $upgrade_log_obj;
  108. $upgrade_log_obj_clone->mall_id = $mall_id;
  109. $upgrade_log_obj_clone->user_id = $identity->user_id;
  110. $upgrade_log_obj_clone->before_level = $original_identity_level;
  111. $upgrade_log_obj_clone->after_level = $can_upgrade_level;
  112. $upgrade_log_obj_clone->upgrade_type = LevelUpgradeLogEnum::CONDITION_UPGRADE;;
  113. $upgrade_log_obj_clone->order_id = $order['id'];
  114. $upgrade_log_obj_clone->upgrade_condition = $identity_level_arr ?? [];
  115. $upgrade_log_obj_clone->save();
  116. }
  117. }
  118. }
  119. return $upgrade_user_ids;
  120. } catch (Exception $e) {
  121. $exception = FormatHelper::exception($e, AddonsEnum::getAddonsNameMap($identity_desc) . "条件升级失败");
  122. echo $exception;
  123. $this->setError($exception);
  124. Yii::error($exception);
  125. return false;
  126. }
  127. }
  128. }