ConditionUpgradeLogic.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <?php
  2. namespace addons\WechatVideoShop\common\logic;
  3. use addons\WechatVideoShop\common\models\WechatVideoShopUpgradeCondition;
  4. use common\enums\AddonsEnum;
  5. use common\enums\StatusEnum;
  6. use common\enums\UpgradeEnum;
  7. use common\helpers\FormatHelper;
  8. use common\models\user\UserPartitionRelationship;
  9. use common\traits\ErrorTrait;
  10. use Exception;
  11. use yii;
  12. class ConditionUpgradeLogic
  13. {
  14. use ErrorTrait;
  15. /**
  16. * 购物升级执行
  17. * 样式:execute(AddonsEnum::ADDONS_NAME_BOSS, (new AddonsBoss()), (new AddonsBossLevel()), $order);
  18. * @Author: lun
  19. * @DateTime: 2021/11/18 0018 16:56
  20. * @Copyright: copyright (c) 2021 广东七件事集团
  21. * @param $identity_desc - 用户身份描述
  22. * @param $identity_obj - 用户身份空对象
  23. * @param $level_obj - 用户等级空对象
  24. * @param $order
  25. * @param int $shopping_upgrade_uid 购物升级用户
  26. * @return bool | array
  27. */
  28. public function execute(string $identity_desc, object $identity_obj, object $level_obj, $order, $shopping_upgrade_uid = 0)
  29. {
  30. try {
  31. //开启条件升级
  32. $mall_id = $order['mall_id'];
  33. $user_id = $order['user_id'];
  34. $parent_id = $order['wechat_video_shop_parent_id'] ?? 0;
  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)
  39. $upgrade_user_id_arr [] = $user_id;// 如果开启了逐级升级,并且购物升级就是本人则不能进行条件升级
  40. // if (!empty($parent_id) && !in_array($parent_id, $upgrade_user_id_arr)) { // 判断是否在其上级
  41. // $upgrade_user_id_arr[] = $parent_id;
  42. // }
  43. $upgrade_user_id_arr = array_reverse($upgrade_user_id_arr);
  44. $model_list = $identity_obj::find()->where(['user_id' => $upgrade_user_id_arr, 'status' => StatusEnum::ENABLED])->indexBy('user_id')->all();
  45. $model_arr = $upgrade_user_ids = [];
  46. foreach ($upgrade_user_id_arr as $id){
  47. if(!empty($model_list[$id])) {
  48. $model_arr[] = $model_list[$id];
  49. }
  50. }
  51. if (empty($model_arr)) return [];
  52. $where = [];
  53. $where[] = ['mall_id' => $mall_id];
  54. $where[] = ['status' => StatusEnum::ENABLED];
  55. $params = [];
  56. if($configs && isset($configs['is_open_level_limit']) && !empty($configs['is_open_level_limit'])){
  57. $params['order'] = 'level asc';
  58. $is_open_level_limit = true;
  59. }else{
  60. $params['order'] = 'level desc';
  61. $is_open_level_limit = false;
  62. }
  63. $params['where'] = $where;
  64. $level_list = $level_obj::lists($params);
  65. if (empty($level_list)) return [];
  66. foreach ($model_arr as $identity) {
  67. $flag = false;
  68. $can_upgrade_level = 0;
  69. $upgrade_status = 0;
  70. $upgrade_level = 0;// 升级次数
  71. foreach ($level_list as $identity_level_arr) {
  72. // 当前等级大于或等于可以升级的等级则直接退出
  73. if(!$is_open_level_limit && $identity->level >= $identity_level_arr['level']){
  74. break;
  75. }
  76. if($is_open_level_limit && $identity->level >= $identity_level_arr['level']){
  77. continue;
  78. }
  79. $can_upgrade_level = $identity_level_arr['level'];
  80. $upgrade_level ++;
  81. //开启条件升级
  82. if ($identity_level_arr['upgrade_type_condition']&&$identity_level_arr['is_auto_upgrade']) {
  83. $upgrade_status = UpgradeEnum::UPGRADE_STATUS_CONDITION;
  84. $res = WechatVideoShopUpgradeCondition::check($identity->user_id, $identity_level_arr, $mall_id, $identity_level_arr['level']);
  85. if ($res) {
  86. $flag = true;
  87. break;
  88. }
  89. }
  90. }
  91. if ($flag && $can_upgrade_level > $identity->level) {
  92. // 开启了逐级升级,跳级升级的用户无法升级
  93. if($is_open_level_limit && $upgrade_level > 1) continue;
  94. $identity->level = $can_upgrade_level;
  95. $identity->upgrade_status = $upgrade_status;
  96. $identity->upgrade_level_at = time();
  97. if (!$identity->save()) throw new Exception("{用户ID:$identity->user_id},订单ID:{$order['id']},". AddonsEnum::getAddonsNameMap($identity_desc) ."条件升级失败");
  98. $upgrade_user_ids[] = $identity->user_id;
  99. }
  100. }
  101. return $upgrade_user_ids;
  102. // 这里走视频号关系链
  103. if (!empty($parent_id)) { // 上级不为空的情况下
  104. $parent = $identity_obj::getOne([
  105. ['user_id' => $parent_id],
  106. ['status' => StatusEnum::ENABLED]
  107. ]);
  108. $w_model_arr = [];
  109. if (!empty($parent)) {
  110. $w_model_arr[] = $parent;
  111. }
  112. foreach ($w_model_arr as $identity) {
  113. $flag = false;
  114. $can_upgrade_level = 0;
  115. $upgrade_status = 0;
  116. $upgrade_level = 0;// 升级次数
  117. foreach ($level_list as $identity_level_arr) {
  118. // 当前等级大于或等于可以升级的等级则直接退出
  119. if(!$is_open_level_limit && $identity->level >= $identity_level_arr['level']){
  120. break;
  121. }
  122. if($is_open_level_limit && $identity->level >= $identity_level_arr['level']){
  123. continue;
  124. }
  125. $can_upgrade_level = $identity_level_arr['level'];
  126. $upgrade_level ++;
  127. //开启条件升级
  128. if ($identity_level_arr['upgrade_type_condition']&&$identity_level_arr['is_auto_upgrade']) {
  129. $upgrade_status = UpgradeEnum::UPGRADE_STATUS_CONDITION;
  130. $res = WechatVideoShopUpgradeCondition::check($identity->user_id, $identity_level_arr,
  131. $mall_id, $identity_level_arr['level'], false);
  132. if ($res) {
  133. $flag = true;
  134. break;
  135. }
  136. }
  137. }
  138. if ($flag && $can_upgrade_level > $identity->level) {
  139. // 开启了逐级升级,跳级升级的用户无法升级
  140. if($is_open_level_limit && $upgrade_level > 1) continue;
  141. $identity->level = $can_upgrade_level;
  142. $identity->upgrade_status = $upgrade_status;
  143. $identity->upgrade_level_at = time();
  144. if (!$identity->save()) throw new Exception("视频号关系链 {用户ID:$identity->user_id},订单ID:{$order['id']},". AddonsEnum::getAddonsNameMap($identity_desc) ."条件升级失败");
  145. $upgrade_user_ids[] = $identity->user_id;
  146. }
  147. }
  148. }
  149. return $upgrade_user_ids;
  150. } catch (Exception $e) {
  151. $exception = FormatHelper::exception($e, AddonsEnum::getAddonsNameMap($identity_desc) . "条件升级失败");
  152. echo $exception;
  153. $this->setError($exception);
  154. Yii::error($exception);
  155. return false;
  156. }
  157. }
  158. protected function local()
  159. {
  160. }
  161. }