ConditionUpgradeLogic.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. <?php
  2. namespace addons\ServeBonus\common\logic;
  3. use addons\CloudStock\common\models\CloudStockAgent;
  4. use addons\CloudStock\common\models\CloudStockPriceDifferenceUserTeamStatistics;
  5. use addons\ServeBonus\common\models\ServeBonus;
  6. use common\enums\AddonsEnum;
  7. use common\enums\StatusEnum;
  8. use common\enums\UpgradeEnum;
  9. use common\helpers\ArrayHelper;
  10. use common\helpers\FormatHelper;
  11. use common\models\common\UpgradeCondition;
  12. use common\models\statistics\UserStatistics;
  13. use common\models\user\UserPartitionRelationship;
  14. use common\models\user\UserTeamStatistics;
  15. use common\traits\ErrorTrait;
  16. use Exception;
  17. use yii;
  18. /**
  19. * Class ConditionUpgradeLogic
  20. * @Author: lun
  21. * @DateTime: 2023/4/4 0004 15:27
  22. * @Copyright: copyright (c) 2021 广东七件事集团
  23. * @package addons\ServeBonus\common\logic
  24. */
  25. class ConditionUpgradeLogic
  26. {
  27. use ErrorTrait;
  28. /**
  29. * 购物升级执行
  30. * 样式:execute(AddonsEnum::ADDONS_NAME_BOSS, (new AddonsBoss()), (new AddonsBossLevel()), $order);
  31. * @Author: lun
  32. * @DateTime: 2021/11/18 0018 16:56
  33. * @Copyright: copyright (c) 2021 广东七件事集团
  34. * @param $identity_desc - 用户身份描述
  35. * @param $identity_obj - 用户身份空对象
  36. * @param $level_obj - 用户权重空对象
  37. * @param $order
  38. * @param int $shopping_upgrade_uid 购物升级用户
  39. * @return bool | array
  40. */
  41. public function execute(string $identity_desc, object $identity_obj, object $level_obj, array $order, $shopping_upgrade_uid = 0)
  42. {
  43. try {
  44. //开启条件升级
  45. $mall_id = $order['mall_id'];
  46. $user_id = $order['user_id'];
  47. // 获取基础配置
  48. $configs = \Yii::$app->services->setting->addons->get($mall_id, $identity_desc, 'basic');
  49. $upgrade_user_id_arr = UserPartitionRelationship::getParentIdArr($user_id);
  50. if(empty($configs['is_open_level_limit']) || !empty($configs['is_open_level_limit']) && $user_id != $shopping_upgrade_uid) $upgrade_user_id_arr [] = $user_id;// 如果开启了逐级升级,并且购物升级就是本人则不能进行条件升级
  51. $upgrade_user_id_arr = array_reverse($upgrade_user_id_arr);
  52. $model_list = $identity_obj::find()->where(['user_id' => $upgrade_user_id_arr, 'status' => StatusEnum::ENABLED])->indexBy('user_id')->all();
  53. $model_arr = $upgrade_user_ids = [];
  54. foreach ($upgrade_user_id_arr as $id){
  55. if(!isset($model_list[$id])){
  56. }
  57. if(!empty($model_list[$id])) {
  58. $model_arr[] = $model_list[$id];
  59. }else{
  60. $model = new $identity_obj;
  61. $model->mall_id = $mall_id;
  62. $model->user_id = $id;
  63. $model->level = 0;
  64. $model->upgrade_level_at = 0;
  65. $model_arr[] = $model;
  66. }
  67. }
  68. $where = [];
  69. $where[] = ['mall_id' => $mall_id];
  70. $where[] = ['status' => StatusEnum::ENABLED];
  71. $params = [];
  72. if($configs && isset($configs['is_open_level_limit']) && !empty($configs['is_open_level_limit'])){
  73. $params['order'] = 'level asc';
  74. $is_open_level_limit = true;
  75. }else{
  76. $params['order'] = 'level desc';
  77. $is_open_level_limit = false;
  78. }
  79. $params['where'] = $where;
  80. $level_list = $level_obj::lists($params);
  81. if (empty($level_list)) return [];
  82. foreach ($model_arr as $identity) {
  83. $flag = false;
  84. $can_upgrade_level = 0;
  85. $upgrade_status = 0;
  86. $upgrade_level = 0;// 升级次数
  87. if($level_list){
  88. foreach ($level_list as $identity_level_arr) {
  89. // 当前权重大于或等于可以升级的权重则直接退出
  90. if(!$is_open_level_limit && $identity->level >= $identity_level_arr['level']){
  91. break;
  92. }
  93. if($is_open_level_limit && $identity->level >= $identity_level_arr['level']){
  94. continue;
  95. }
  96. $can_upgrade_level = $identity_level_arr['level'];
  97. $upgrade_level ++;
  98. //开启条件升级
  99. if ($identity_level_arr['upgrade_type_condition']&&$identity_level_arr['is_auto_upgrade']) {
  100. $upgrade_status = UpgradeEnum::UPGRADE_STATUS_CONDITION;
  101. $res = UpgradeCondition::check($identity->user_id, $identity_level_arr, $mall_id, $identity_level_arr['level'],$order['id']);
  102. if ($res) {
  103. $flag = true;
  104. break;
  105. }
  106. }
  107. }
  108. }
  109. if ($flag && $can_upgrade_level > $identity->level) {
  110. // 开启了逐级升级,跳级升级的用户无法升级
  111. if($is_open_level_limit && $upgrade_level > 1) continue;
  112. $identity->level = $can_upgrade_level;
  113. $identity->upgrade_status = $upgrade_status;
  114. $identity->upgrade_level_at = time();
  115. if (!$identity->save()) throw new Exception("{用户ID:$identity->user_id},订单ID:{$order['id']},". AddonsEnum::getAddonsNameMap($identity_desc) ."条件升级失败");
  116. $upgrade_user_ids[] = $identity->user_id;
  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. public static function condition704($params)
  129. {
  130. $key = $params['key'];
  131. $arr = $params['arr'];
  132. $cloud_stock_level = $arr[$key]['value'][$params['condition_data'][$params['key']]['setting'][0]['name']];
  133. $day_num = $arr[$key]['value'][$params['condition_data'][$params['key']]['setting'][1]['name']];
  134. $line_num = $arr[$key]['value'][$params['condition_data'][$params['key']]['setting'][2]['name']];
  135. $child_cloud_stock_level = $arr[$key]['value'][$params['condition_data'][$params['key']]['setting'][3]['name']];
  136. $accumulated_performance = $arr[$key]['value'][$params['condition_data'][$params['key']]['setting'][4]['name']];
  137. $max_accumulated_performance = $arr[$key]['value'][$params['condition_data'][$params['key']]['setting'][5]['name']];
  138. $user_id = $params['user_id'];
  139. $agent = CloudStockAgent::findOne(['user_id' => $user_id, 'status' => StatusEnum::ENABLED, 'level' => $cloud_stock_level]);
  140. $is_bool = false;
  141. if (empty($agent)) {
  142. return $is_bool;
  143. }
  144. $upgrade_at = $agent['upgrade_at'];
  145. $end_at = $upgrade_at + 86400 * $day_num;
  146. $direct_user_ids = UserPartitionRelationship::getChildIdArr($user_id, 1, $upgrade_at, $end_at);
  147. if (count($direct_user_ids) < $line_num) {
  148. return $is_bool;
  149. }
  150. foreach ($direct_user_ids as $uid) {
  151. $child_user_ids = UserPartitionRelationship::getChildIdArr($uid, 0, $upgrade_at, $end_at);
  152. $child_user_ids[] = $uid;
  153. $count = CloudStockAgent::find()->where(['user_id' => $child_user_ids, 'status' => StatusEnum::ENABLED, 'level' => $child_cloud_stock_level])
  154. ->count();
  155. if (empty($count)) {
  156. return $is_bool;
  157. }
  158. }
  159. $self_performance = 0;
  160. $performance_arr = self::getTeamPerformance($direct_user_ids, $user_id, $self_performance);
  161. $max = array_pop($performance_arr);
  162. $max_money = $max['money'] ?? 0;
  163. $total_money = array_sum(array_column($performance_arr, 'money'));
  164. $max_accumulated_performance = $max_accumulated_performance * 10000;
  165. $accumulated_performance = $accumulated_performance * 10000;
  166. if ($max_money > $max_accumulated_performance) {
  167. $max_money = $max_accumulated_performance;
  168. }
  169. if (($total_money + $max_money + $self_performance) < $accumulated_performance) {
  170. return false;
  171. }
  172. return true;
  173. }
  174. public static function condition705($params)
  175. {
  176. $key = $params['key'];
  177. $arr = $params['arr'];
  178. $cloud_stock_level = $arr[$key]['value'][$params['condition_data'][$params['key']]['setting'][0]['name']];
  179. $day_num = $arr[$key]['value'][$params['condition_data'][$params['key']]['setting'][1]['name']];
  180. $line_num = $arr[$key]['value'][$params['condition_data'][$params['key']]['setting'][2]['name']];
  181. $serve_bonus_level = $arr[$key]['value'][$params['condition_data'][$params['key']]['setting'][3]['name']];
  182. $accumulated_performance = $arr[$key]['value'][$params['condition_data'][$params['key']]['setting'][4]['name']];
  183. $max_accumulated_performance = $arr[$key]['value'][$params['condition_data'][$params['key']]['setting'][5]['name']];
  184. $user_id = $params['user_id'];
  185. $agent = CloudStockAgent::findOne(['user_id' => $user_id, 'status' => StatusEnum::ENABLED, 'level' => $cloud_stock_level]);
  186. $is_bool = false;
  187. if (empty($agent)) {
  188. return $is_bool;
  189. }
  190. $upgrade_at = $agent['upgrade_at'];
  191. $end_at = $upgrade_at + 86400 * $day_num;
  192. $direct_user_ids = UserPartitionRelationship::getChildIdArr($user_id, 1, $upgrade_at, $end_at);
  193. if (count($direct_user_ids) < $line_num) {
  194. return $is_bool;
  195. }
  196. foreach ($direct_user_ids as $uid) {
  197. $child_user_ids = UserPartitionRelationship::getChildIdArr($uid, 0, $upgrade_at, $end_at);
  198. $child_user_ids[] = $uid;
  199. $count = ServeBonus::find()->where(['user_id' => $child_user_ids, 'status' => StatusEnum::ENABLED, 'level' => $serve_bonus_level])
  200. ->count();
  201. if (empty($count)) {
  202. return $is_bool;
  203. }
  204. }
  205. $self_performance = 0;
  206. $performance_arr = self::getTeamPerformance($direct_user_ids, $user_id, $self_performance);
  207. $max = array_pop($performance_arr);
  208. $max_money = $max['money'] ?? 0;
  209. $total_money = array_sum(array_column($performance_arr, 'money'));
  210. $max_accumulated_performance = $max_accumulated_performance * 10000;
  211. $accumulated_performance = $accumulated_performance * 10000;
  212. if ($max_money > $max_accumulated_performance) {
  213. $max_money = $max_accumulated_performance;
  214. }
  215. if (($total_money + $max_money + $self_performance) < $accumulated_performance) {
  216. return false;
  217. }
  218. return true;
  219. }
  220. protected static function getTeamPerformance($direct_user_ids, $user_id, &$self_performance)
  221. {
  222. $user_team_statistics_list = UserTeamStatistics::lists([
  223. 'where' => [
  224. ['user_id' => $direct_user_ids]
  225. ],
  226. 'index' => 'user_id'
  227. ]);//直推的团队业绩
  228. $user_statistics_list = UserStatistics::lists([
  229. 'where' => [
  230. ['user_id' => array_merge($direct_user_ids, [$user_id])]
  231. ],
  232. 'index' => 'user_id'
  233. ]);//直推自己的业绩
  234. $cloud_user_team_statistics_list = CloudStockPriceDifferenceUserTeamStatistics::lists([
  235. 'where' => [
  236. ['user_id' => array_merge($direct_user_ids, [$user_id])]
  237. ],
  238. 'index' => 'user_id'
  239. ]);//直推差价礼包业绩
  240. $performance_arr = [];
  241. foreach ($direct_user_ids as $uid) {
  242. $pay_money = 0;
  243. if (isset($user_statistics_list[$uid])) {
  244. $pay_money += $user_statistics_list[$uid]['pay_money'];
  245. }
  246. if (isset($user_team_statistics_list[$uid])) {
  247. $pay_money += $user_team_statistics_list[$uid]['team_pay_selling_price'];
  248. }
  249. if (isset($cloud_user_team_statistics_list[$uid])) {
  250. $pay_money += $cloud_user_team_statistics_list[$uid]['team_pay_selling_price'];
  251. $pay_money += $cloud_user_team_statistics_list[$uid]['self_selling_price'];
  252. }
  253. $performance_arr[] = ['user_id' => $uid, 'money' => $pay_money];
  254. }
  255. $performance_arr = ArrayHelper::arraySort($performance_arr, 'money');
  256. if (isset($user_statistics_list[$user_id]['pay_money'])) {
  257. $self_performance = $user_statistics_list[$user_id]['pay_money'];
  258. }
  259. if (isset($cloud_user_team_statistics_list[$user_id]['self_selling_price'])) {
  260. $self_performance = $cloud_user_team_statistics_list[$user_id]['self_selling_price'];
  261. }
  262. return $performance_arr;
  263. }
  264. }