ConditionUpgrade.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. <?php
  2. namespace addons\DoubleCopy\common\logic;
  3. use addons\Boss\common\enums\BossEnum;
  4. use addons\DoubleCopy\common\enums\DoubleCopyEnum;
  5. use addons\DoubleCopy\common\models\DoubleCopyLevel;
  6. use addons\DoubleCopy\common\models\DoubleCopyUser;
  7. use addons\UpgradeGift\common\events\UpgradeGiftEvent;
  8. use addons\UpgradeGift\common\listeners\UpgradeGiftListener;
  9. use common\enums\AddonsEnum;
  10. use common\enums\OrderStatusEnum;
  11. use common\enums\RabbitMqEnum;
  12. use common\enums\StatusEnum;
  13. use common\enums\UpgradeEnum;
  14. use common\helpers\FormatHelper;
  15. use common\models\common\UpgradeCondition;
  16. use common\models\mall\MallAddons;
  17. use common\models\order\OrderDetail;
  18. use common\models\user\UserPartitionRelationship;
  19. use common\traits\ErrorTrait;
  20. use Yii;
  21. use Exception;
  22. use yii\db\Expression;
  23. /**
  24. * 条件升级
  25. * @Author lun
  26. * @DateTime 2021-11-16 19:07:32
  27. * @copyright: Copyright (c) 2020 广东七件事集团
  28. */
  29. class ConditionUpgrade{
  30. use ErrorTrait;
  31. /**
  32. * 条件升级执行
  33. * @Author: lun
  34. * @DateTime: 2021/11/18 0018 16:56
  35. * @Copyright: copyright (c) 2021 广东七件事集团
  36. * @param $order
  37. * @return bool | array
  38. */
  39. public function execute(array $order)
  40. {
  41. $trans = Yii::$app->db->beginTransaction();
  42. try {
  43. //开启条件升级
  44. $mall_id = $order['mall_id'];
  45. $user_id = $order['user_id'];
  46. $upgrade_user_id_arr = UserPartitionRelationship::getParentIdArr($user_id);
  47. $upgrade_user_id_arr [] = $user_id;
  48. $upgrade_user_id_arr = array_reverse($upgrade_user_id_arr);
  49. $model_list = DoubleCopyUser::find()->where(['user_id' => $upgrade_user_id_arr, 'status' => StatusEnum::ENABLED])->orderBy([new Expression("FIND_IN_SET(user_id,'".implode(',',$upgrade_user_id_arr)."')")])->indexBy('user_id')->all();
  50. if (empty($model_list)) {
  51. $trans->commit();
  52. return true;
  53. }
  54. $upgrade_user_ids = [];
  55. // 获取等级
  56. $where = [];
  57. $where[] = ['mall_id' => $mall_id];
  58. $where[] = ['status' => StatusEnum::ENABLED];
  59. $params = [];
  60. $configs = \Yii::$app->services->setting->addons->get($mall_id, DoubleCopyEnum::ADDONS_NAME, 'basic');
  61. if($configs && isset($configs['is_open_level_limit']) && !empty($configs['is_open_level_limit'])){
  62. $params['order'] = 'level asc';
  63. $is_open_level_limit = true;
  64. }else{
  65. $params['order'] = 'level desc';
  66. $is_open_level_limit = false;
  67. }
  68. $params['where'] = $where;
  69. $level_list = DoubleCopyLevel::lists($params);
  70. if (empty($level_list)) {
  71. $trans->commit();
  72. return true;
  73. }
  74. foreach ($model_list as $identity) {
  75. $flag = false;
  76. $upgrade_status = 0;
  77. foreach ($level_list as $identity_level_arr) {
  78. // 当前等级大于或等于可以升级的等级则直接退出
  79. if(!$is_open_level_limit && $identity->level >= $identity_level_arr['level']){
  80. break;
  81. }
  82. if($is_open_level_limit && $identity->level >= $identity_level_arr['level']){
  83. continue;
  84. }
  85. $can_upgrade_level = $identity_level_arr['level'];// 要升级的等级
  86. //开启条件升级
  87. if ($identity_level_arr['upgrade_type_condition']&&$identity_level_arr['is_auto_upgrade']) {
  88. $upgrade_status = DoubleCopyEnum::UPGRADE_STATUS_CONDITION;
  89. $res = self::check($identity->user_id, $identity_level_arr, $order['id']);
  90. if ($res) {
  91. $flag = true;
  92. break;
  93. }
  94. }
  95. }
  96. if ($flag && $can_upgrade_level > $identity->level) {
  97. $identity->level = $can_upgrade_level;
  98. $identity->upgrade_status = $upgrade_status;
  99. $identity->upgrade_level_at = time();
  100. $identity->upgrade_boss_at = !$identity->upgrade_boss_at && $can_upgrade_level >= 2 ? $identity->upgrade_level_at : 0;
  101. if (!$identity->save()) throw new Exception("{用户ID:$identity->user_id},订单ID:{$order['id']},二二复制条件升级失败");
  102. $upgrade_user_ids[] = $identity->user_id;
  103. }
  104. if($is_open_level_limit) continue;
  105. }
  106. $trans->commit();
  107. return $upgrade_user_ids;
  108. } catch (Exception $e) {
  109. $trans->rollBack();
  110. $exception = FormatHelper::exception($e, "二二复制条件升级");
  111. echo $exception;
  112. $this->setError($exception);
  113. Yii::error($exception);
  114. return false;
  115. }
  116. }
  117. /**
  118. * 检查用户是否符合升级条件
  119. * @Author: lun
  120. * @DateTime: 2022/7/8 0008 15:44
  121. * @Copyright: copyright (c) 2021 广东七件事集团
  122. * @param $user_id
  123. * @param $level_arr
  124. * @param $order_id
  125. * @return bool
  126. */
  127. public static function check($user_id, $level_arr, $order_id = 0)
  128. {
  129. if (empty($level_arr['condition_type'])) return false;
  130. $condition_type = $level_arr['condition_type'];
  131. $keys_arr = json_decode($level_arr['checked_condition_keys'], true);
  132. $values_arr = json_decode($level_arr['checked_condition_values'], true);
  133. $arr = [];//升级条件
  134. foreach ($values_arr as $K => $v) {
  135. $arr[$v['key']] = $v['value'];
  136. }
  137. $is_return = false;
  138. sort($keys_arr);
  139. foreach ($keys_arr as $id) {
  140. $function = 'condition' . ($id+1);
  141. $params['user_id'] = $user_id;
  142. $params['arr'] = $arr[$id];
  143. $params['order_id'] = $order_id;
  144. if (!method_exists(self::class, $function)) continue;
  145. $is_bool = self::$function($params);
  146. //满足其一
  147. if ($condition_type == 1) {
  148. if ($is_bool) {
  149. $is_return = true;
  150. break;
  151. } else {
  152. $is_return = false;
  153. }
  154. }
  155. //满足所有
  156. if ($condition_type == 2) {
  157. if ($is_bool) {
  158. $is_return = true;
  159. } else {
  160. $is_return = false;
  161. break;
  162. }
  163. }
  164. }
  165. return $is_return;
  166. }
  167. /**
  168. * 条件1: 升级前身份等级为代理,直推N个代理后升级
  169. * @Author: lun
  170. * @DateTime: 2022/7/8 0008 9:30
  171. * @Copyright: copyright (c) 2021 广东七件事集团
  172. * @param $params
  173. * @param $user_id_arr
  174. * @param $arr
  175. * @param $key
  176. * @return bool
  177. */
  178. public static function condition1($params)
  179. {
  180. $user_id = $params['user_id'];
  181. $arr = $params['arr'];
  182. $is_bool = false;
  183. // 获取当前用户等级
  184. $user = DoubleCopyUser::find()->where(['user_id' => $user_id, 'status' => StatusEnum::ENABLED])->asArray()->one();
  185. if (empty($user)) return $is_bool;
  186. // 当前用户身份必须为代理
  187. if ($user['level'] != DoubleCopyEnum::LEVEL_AGENT) return $is_bool;
  188. // 获取直推下级的助力人数
  189. $count = DoubleCopyUser::find()->where(['pid' => $user_id, 'status' => StatusEnum::ENABLED])->andWhere(['>=', 'level', DoubleCopyEnum::LEVEL_AGENT])->count();
  190. if ($count >= $arr['val0']) $is_bool = true;// 符合条件
  191. return $is_bool;
  192. }
  193. /**
  194. * 条件2:当前等级为X,直推前N个市场都成为Y等级
  195. * @Author: lun
  196. * @DateTime: 2022/7/8 0008 15:37
  197. * @Copyright: copyright (c) 2021 广东七件事集团
  198. * @param $params
  199. * @return bool
  200. */
  201. public static function condition2($params)
  202. {
  203. $user_id = $params['user_id'];
  204. $arr = $params['arr'];
  205. $is_bool = false;
  206. // 获取当前用户等级
  207. $user = DoubleCopyUser::find()->where(['user_id' => $user_id, 'status' => StatusEnum::ENABLED])->asArray()->one();
  208. if (empty($user)) return $is_bool;
  209. // 当前用户身份必须为设置等级
  210. if ($user['level'] < $arr['val0']) return $is_bool;
  211. // 获取直推下级的助力人数
  212. $list = DoubleCopyUser::find()->where(['pid' => $user_id, 'status' => StatusEnum::ENABLED])->orderBy('pos asc')->asArray()->all();
  213. if (empty($list)) return $is_bool;
  214. $count = 0;// 符合条件的数量
  215. foreach ($list as $key => $item) {
  216. if ($item['pos'] > $arr['val1']) break;// 只获取直推的前N个市场
  217. if ($item['level'] >= $arr['val2']) $count ++;// 符合条件的市场进行累加
  218. }
  219. if ($count >= $arr['val1']) $is_bool = true;// 符合条件
  220. return $is_bool;
  221. }
  222. /**
  223. * 购买指定商品,商品ID组_______
  224. * @param $params
  225. * @return bool
  226. */
  227. public static function condition3($params)
  228. {
  229. $user_id = $params['user_id'];
  230. $arr = $params['arr'];
  231. $is_bool = false;
  232. // 获取当前用户等级
  233. $user = DoubleCopyUser::find()->where(['user_id' => $user_id, 'status' => StatusEnum::ENABLED])->asArray()->one();
  234. if (empty($user)) return $is_bool;
  235. $goods_ids = $arr['val0'];
  236. if(!$goods_ids) return $is_bool;
  237. $goods_ids = explode(',',$goods_ids);
  238. // 购买指定商品订单 (修改补充订单。已发货、已收货、待自提、自提成功状态)
  239. $detail = OrderDetail::find()->where(['user_id' => $user_id,'goods_id' => $goods_ids])
  240. ->andWhere(['order_status' => [OrderStatusEnum::ACCOMPLISH,OrderStatusEnum::PAY,
  241. OrderStatusEnum::SHIPMENTS, OrderStatusEnum::SING, OrderStatusEnum::TAKE, OrderStatusEnum::TAKE_FINISH]])->one();
  242. if (empty($detail)) return $is_bool;
  243. return true;
  244. }
  245. protected static function condition4($params)
  246. {
  247. if (empty($params['order_id'])) return false;
  248. $user_id = $params['user_id'];
  249. $arr = $params['arr'];
  250. if (!isset($arr['val0']) || !isset($arr['val1'])) return false;
  251. $goods_ids = $arr['val0'];
  252. $finish_order_money = $arr['val1'];
  253. $total_money = OrderDetail::find()->select('goods_price')->where(['order_id' => $params['order_id'], 'user_id' => $user_id, 'goods_id' => explode(',', $goods_ids), 'order_status' => OrderStatusEnum::ACCOMPLISH, 'status' => StatusEnum::ENABLED])->sum('goods_price') ?? 0;
  254. if ($total_money >= $finish_order_money) return true;
  255. return false;
  256. }
  257. }