Upgrage.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. <?php
  2. namespace addons\Distribution\common\logic\upgrage;
  3. use addons\Distribution\common\models\Distribution;
  4. use addons\Distribution\common\models\DistributionLevel;
  5. use addons\Distribution\common\models\DistributionLevelUpgradeLog;
  6. use addons\Distribution\common\enums\DistributionEnum;
  7. use addons\Distribution\common\logic\ConditionUpgradeLogic;
  8. use addons\UpgradeGift\common\listeners\UpgradeGiftListener;
  9. use common\enums\AddonsEnum;
  10. use common\enums\LevelUpgradeLogEnum;
  11. use common\enums\OrderStatusEnum;
  12. use common\enums\RabbitMqEnum;
  13. use common\enums\StatusEnum;
  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\User;
  19. use common\models\user\UserPartitionRelationship;
  20. /**
  21. * 订单支付事件-分销商升级
  22. * Class OrderPaidListener
  23. * @Author: hua
  24. * @DateTime: 2021/10/19 19:03
  25. * @Copyright: copyright (c) 2021 广东七件事集团
  26. * @package addons\Distribution\common\listeners\order
  27. */
  28. class Upgrage
  29. {
  30. /**
  31. * @desc:执行
  32. * @Author: hua
  33. * @Date: 2021/11/18
  34. * @Time: 15:55
  35. * @Copyright: copyright (c) 2021 广东七件事集团
  36. * @param $order
  37. * @param $order_status
  38. */
  39. public function execute($order)
  40. {
  41. $t = \Yii::$app->db->beginTransaction();
  42. try {
  43. $upgrade_uids = [];
  44. $user_id = $order['user_id'];
  45. $mall_id = $order['mall_id'];
  46. $order_by = 'level desc';
  47. if (MallAddons::isInstall($mall_id, DistributionEnum::ADDONS_NAME) == 0) return true;
  48. $setting = \Yii::$app->services->setting->addons->get($mall_id, DistributionEnum::ADDONS_NAME, 'basic');
  49. //开启购买升级商品
  50. $buy_uid = $this->buyGoodsUpgrade($mall_id, $order, $user_id, $order_by,$setting, (new DistributionLevelUpgradeLog()));
  51. if (!empty($buy_uid)) $upgrade_uids[] = $buy_uid;
  52. //开启条件升级
  53. $cond_upgrade = new ConditionUpgradeLogic();
  54. $cond_uids = $cond_upgrade->execute('Distribution', (new Distribution()), (new DistributionLevel()), $order, $buy_uid, (new DistributionLevelUpgradeLog()));
  55. if (!empty($cond_uids)) $upgrade_uids = array_merge($upgrade_uids, $cond_uids);
  56. $t->commit();
  57. // 触发升级礼包
  58. if ($upgrade_uids && MallAddons::isInstall($mall_id,AddonsEnum::ADDONS_NAME_UPGRADEGIFT)) {
  59. $gift['mall_id'] = $mall_id;
  60. $gift['user_ids'] = implode(',', $upgrade_uids);
  61. $gift['gift_type'] = AddonsEnum::ADDONS_NAME_DISTRIBUTION;
  62. \Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_TASK, RabbitMqEnum::TASK_QUEUE, $gift, UpgradeGiftListener::class, 'async_handle');
  63. }
  64. } catch (\Exception $e) {
  65. $t->rollBack();
  66. $exception = FormatHelper::exception($e, 'Distribution:Upgrage->execute,err:' . $e->getMessage());
  67. echo $exception;
  68. \Yii::error($exception);
  69. }
  70. }
  71. /**
  72. * @desc:购买商品升级
  73. * @Author: hua
  74. * @Date: 2021/11/2
  75. * @Time: 10:58
  76. * @Copyright: copyright (c) 2021 广东七件事集团
  77. * @param $mall_id
  78. * @param $order
  79. * @param $user_id
  80. * @param $order_by
  81. * @param $setting
  82. * @return false | int
  83. */
  84. private function buyGoodsUpgrade($mall_id, $order, $user_id, $order_by,$setting, object $upgrade_log_obj)
  85. {
  86. $order_id = $order['id'];
  87. $upgrade_uid = 0;
  88. $distribution_model = Distribution::findOne(['user_id' => $user_id, 'mall_id' => $mall_id, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]);
  89. if (empty($distribution_model)) {
  90. // if(empty($setting['is_apply'])) {//成为分销商的条件,1:申请;0无条件
  91. $user = User::findOne($user_id);
  92. if($user->is_inviter){
  93. $distribution_model = new Distribution();
  94. $distribution_model->mall_id = $mall_id;
  95. $distribution_model->user_id = $user_id;
  96. $distribution_model->level = 0;
  97. $distribution_model->upgrade_level_at = 0;
  98. }else{
  99. return [];
  100. }
  101. // }
  102. }
  103. $where = [];
  104. $where[] = ['mall_id' => $mall_id];
  105. $where[] = ['status' => StatusEnum::ENABLED];
  106. $where[] = ['>', 'level', $distribution_model->level??0];
  107. $params = [];
  108. $params['where'] = $where;
  109. $params['order'] = $order_by;
  110. $distribution_level_list = DistributionLevel::lists($params);
  111. $where = [];
  112. $where[] = ['mall_id' => $mall_id];
  113. $where[] = ['order_id' => $order['id']];
  114. $where[] = ['user_id' => $user_id];
  115. $params = [];
  116. $params['where'] = $where;
  117. $order_detail_list = OrderDetail::lists($params);
  118. $buy_goods_id_arr = array_column($order_detail_list, 'goods_id');
  119. $can_upgrade_level = 0;
  120. $upgrade_status = 0;
  121. $flag = false;
  122. //开启购买升级商品
  123. if (!empty($distribution_level_list)) {
  124. foreach ($distribution_level_list as $distribution_level_arr) {
  125. $can_upgrade_level = $distribution_level_arr['level'];
  126. //开启购买升级商品
  127. if ($distribution_level_arr['upgrade_type_goods'] && $distribution_level_arr['is_auto_upgrade']) {
  128. $upgrade_status = DistributionEnum::UPGRADE_STATUS_GOODS;
  129. $goods_id_arr = json_decode($distribution_level_arr['goods_ids'], true);
  130. $level_goods_list = json_decode($distribution_level_arr['goods_list'], true);
  131. $condition_num_map = !is_array($level_goods_list) ? [] : array_column($level_goods_list, 'condition_num', 'id');
  132. $extParams = [
  133. 'is_custom_condition_num' => $distribution_level_arr['is_custom_condition_num'] ?? 0,
  134. 'buy_goods_type' => $distribution_level_arr['buy_goods_type'],
  135. 'condition_num_map' => $condition_num_map,
  136. 'mall_id' => $mall_id,
  137. 'user_id' => $user_id,
  138. ];
  139. $res = UpgradeCondition::buyGoods($distribution_level_arr['goods_type'], $buy_goods_id_arr, $goods_id_arr, $extParams);
  140. if ($res) {
  141. //购买升级商品触发升级:0订单完成 1下单完成
  142. if ($order['order_status'] == OrderStatusEnum::ACCOMPLISH) {
  143. if ($distribution_level_arr['buy_goods_type'] == 0) {
  144. $flag = true;
  145. break;
  146. }
  147. } else {
  148. if ($distribution_level_arr['buy_goods_type'] == 1 && $order['pay_status'] == OrderStatusEnum::PAY) {
  149. $flag = true;
  150. break;
  151. }
  152. }
  153. }
  154. }
  155. }
  156. if ($flag && $can_upgrade_level > $distribution_model->level) {
  157. $original_identity_level = $distribution_model->level;
  158. $distribution_model->level = $can_upgrade_level;
  159. $distribution_model->upgrade_status = $upgrade_status;
  160. $distribution_model->upgrade_level_at = time();
  161. if (!$distribution_model->save()) {
  162. \Yii::error("{user_id:$user_id}-{order_id:$order_id}" . ',分销商升级,失败');
  163. return false;
  164. }
  165. $upgrade_uid = $user_id;
  166. if ($upgrade_log_obj !== null) {
  167. $upgrade_log_obj_clone = clone $upgrade_log_obj;
  168. $upgrade_log_obj_clone->mall_id = $mall_id;
  169. $upgrade_log_obj_clone->user_id = $distribution_model->user_id;
  170. $upgrade_log_obj_clone->before_level = $original_identity_level;
  171. $upgrade_log_obj_clone->after_level = $can_upgrade_level;
  172. $upgrade_log_obj_clone->upgrade_type = LevelUpgradeLogEnum::CONDITION_UPGRADE;
  173. $upgrade_log_obj_clone->order_id = $order['id'];
  174. $upgrade_log_obj_clone->upgrade_condition = $distribution_level_arr ?? [];
  175. $upgrade_log_obj_clone->save();
  176. }
  177. }
  178. }
  179. return $upgrade_uid;
  180. }
  181. /**
  182. * @desc:条件升级
  183. * @Author: hua
  184. * @Date: 2021/11/2
  185. * @Time: 10:58
  186. * @Copyright: copyright (c) 2021 广东七件事集团
  187. * @param $mall_id
  188. * @param $user_id
  189. * @param $order
  190. * @param $order_by
  191. * @param $setting
  192. */
  193. private function conditionUpgrade($mall_id, $user_id, $order, $order_by,$setting)
  194. {
  195. //开启条件升级
  196. // $upgrade_user_id_arr = UserRelationship::getParentIdArr($user_id);
  197. $upgrade_user_id_arr = UserPartitionRelationship::getParentIdArr($user_id);
  198. $upgrade_user_id_arr [] = $user_id;
  199. $upgrade_user_id_arr = array_reverse($upgrade_user_id_arr);
  200. $distribution_list = Distribution::find()->where(['user_id' => $upgrade_user_id_arr, 'status' => StatusEnum::ENABLED])->indexBy('user_id')->all();
  201. $distribution_arr = $upgrade_user_ids = [];
  202. foreach ($upgrade_user_id_arr as $id){
  203. if(!empty($distribution_list[$id])){
  204. $distribution_arr[] = $distribution_list[$id];
  205. }else{
  206. // if(empty($setting['is_apply'])){//成为分销商的条件,1:申请;0无条件
  207. $user = User::findOne($id);
  208. if($user->is_inviter){//并且具有推广资格
  209. $distribution = new Distribution();
  210. $distribution->mall_id = $mall_id;
  211. $distribution->user_id = $id;
  212. $distribution->level = 0;
  213. $distribution->upgrade_level_at=0;
  214. $distribution_arr[] = $distribution;
  215. }else{
  216. continue;
  217. }
  218. // }
  219. }
  220. }
  221. foreach ($distribution_arr as $distribution) {
  222. $where = [];
  223. $where[] = ['mall_id' => $mall_id];
  224. $where[] = ['status' => StatusEnum::ENABLED];
  225. $where[] = ['>', 'level', $distribution->level??0];
  226. $params = [];
  227. $params['where'] = $where;
  228. $params['order'] = $order_by;
  229. $distribution_level_list = DistributionLevel::lists($params);
  230. $flag = false;
  231. $can_upgrade_level = 0;
  232. $upgrade_status = 0;
  233. if ($distribution_level_list) {
  234. foreach ($distribution_level_list as $distribution_level_arr) {
  235. $can_upgrade_level = $distribution_level_arr['level'];
  236. //开启条件升级
  237. if ($distribution_level_arr['upgrade_type_condition'] && $distribution_level_arr['is_auto_upgrade']) {
  238. $upgrade_status = DistributionEnum::UPGRADE_STATUS_CONDITION;
  239. $res = UpgradeCondition::check($distribution->user_id, $distribution_level_arr, $mall_id, $distribution_level_arr['level']);
  240. if ($res) {
  241. $flag = true;
  242. break;
  243. }
  244. }
  245. }
  246. }
  247. if ($flag && $can_upgrade_level > $distribution->level) {
  248. $order_id = $order['id'];
  249. $distribution->level = $can_upgrade_level;
  250. $distribution->upgrade_status = $upgrade_status;
  251. $distribution->upgrade_level_at = time();
  252. if (!$distribution->save()) {
  253. \Yii::error("{user_id:$distribution->user_id}-{order_id:$order_id}" . ',分销商升级,失败');
  254. } else {
  255. $upgrade_user_ids[] = $distribution->user_id;
  256. }
  257. }
  258. }
  259. return $upgrade_user_ids;
  260. }
  261. }