LevelUpLogic.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. <?php
  2. namespace addons\Rebate\common\logic;
  3. use addons\Rebate\common\models\RebateUser;
  4. use addons\Rebate\common\models\RebateUserLevel;
  5. use common\enums\AddonsEnum;
  6. use common\enums\OrderStatusEnum;
  7. use common\enums\StatusEnum;
  8. use common\helpers\FormatHelper;
  9. use common\models\common\UpgradeCondition;
  10. use common\models\order\Order;
  11. use common\models\order\OrderDetail;
  12. use common\models\user\UserPartitionRelationship;
  13. use common\traits\ErrorTrait;
  14. use yii\db\Exception;
  15. use Yii;
  16. use yii\helpers\Json;
  17. class LevelUpLogic
  18. {
  19. use ErrorTrait;
  20. /**
  21. * @param $order_id
  22. * @param $settlement_type // 结算类型,1=支付完成,2=订单完成
  23. * @return bool
  24. */
  25. public static function execute($order_id, $settlement_type)
  26. {
  27. $t = Yii::$app->db->beginTransaction();
  28. try {
  29. // 获取订单内容
  30. $where = ['id' => $order_id];
  31. $order = Order::find()->select("id,user_id,mall_id,order_no,pay_time")
  32. ->where($where)
  33. ->with(['detail' => function($query){
  34. $query->select("order_id,goods_id,num,goods_price,goods_name,price,pic_url");
  35. }])
  36. ->asArray()->one();
  37. if(empty($order)) throw new Exception("订单不存在");
  38. // 获取订单内容
  39. $order['order_status'] = $settlement_type;
  40. self::buyGoodsUpgrade($order);
  41. self::conditionUpgrade($order);
  42. $t->commit();
  43. return true;
  44. } catch (Exception $e) {
  45. $t->rollBack();
  46. self::setStaticError($e->getMessage());
  47. return false;
  48. }
  49. }
  50. public static function buyGoodsUpgrade(array $order, $order_by = 'level desc')
  51. {
  52. $identity_desc = 'Rebate';
  53. try {
  54. $mall_id = $order['mall_id'];
  55. $user_id = $order['user_id'];
  56. $upgrade_uid = 0;
  57. $model = RebateUser::findOne(['mall_id' => $mall_id, 'user_id' => $user_id, 'status' => StatusEnum::ENABLED]);
  58. if (empty($model)) {
  59. $model = new RebateUser();
  60. $model->mall_id = $mall_id;
  61. $model->user_id = $user_id;
  62. $model->level = 0;
  63. $model->upgrade_at = 0;
  64. $model->loadDefaultValues();
  65. }
  66. $where = [];
  67. $where[] = ['mall_id' => $mall_id];
  68. $where[] = ['status' => StatusEnum::ENABLED];
  69. $where[] = ['>', 'level', $model->level];
  70. $params = [];
  71. $params['where'] = $where;
  72. $params['order'] = $order_by;
  73. // 获取等级
  74. $level_list = RebateUserLevel::lists($params);
  75. $where = [];
  76. $where[] = ['mall_id' => $mall_id];
  77. $where[] = ['order_id' => $order['id']];
  78. $where[] = ['user_id' => $user_id];
  79. $params = [];
  80. $params['where'] = $where;
  81. $order_detail_list = OrderDetail::lists($params);
  82. $buy_goods_id_arr = array_column($order_detail_list, 'goods_id');
  83. $can_upgrade_level = 0;
  84. $upgrade_status = 0;
  85. $flag = false;
  86. //开启购买升级商品
  87. if (!empty($level_list)) {
  88. foreach ($level_list as $level_arr) {
  89. $can_upgrade_level = $level_arr['level'];
  90. //开启购买升级商品
  91. if ($level_arr['upgrade_type_goods'] && $level_arr['is_auto_upgrade']) {
  92. $upgrade_status = 2;
  93. $goods_id_arr = Json::decode($level_arr['goods_ids'], true);
  94. $res = UpgradeCondition::buyGoods($level_arr['goods_type'], $buy_goods_id_arr, $goods_id_arr);
  95. if ($res) {
  96. if ($level_arr['buy_goods_type'] == 0 && $order['order_status'] == OrderStatusEnum::ACCOMPLISH) {
  97. $flag = true;
  98. break;
  99. }
  100. if ($level_arr['buy_goods_type'] == 1 && $order['order_status'] == OrderStatusEnum::PAY) {
  101. $flag = true;
  102. break;
  103. }
  104. }
  105. }
  106. }
  107. if ($flag) {
  108. $model->level = $can_upgrade_level;
  109. $model->upgrade_status = $upgrade_status;
  110. $model->upgrade_at = time();
  111. if (!$model->save()) throw new Exception("{用户ID:$user_id},订单ID:{$order['id']}," . AddonsEnum::getAddonsNameMap($identity_desc) . "购物升级失败");
  112. $upgrade_uid = $user_id;
  113. }
  114. }
  115. return $upgrade_uid;
  116. } catch (Exception $e) {
  117. $exception = FormatHelper::exception($e, AddonsEnum::getAddonsNameMap($identity_desc) . "购物升级失败");
  118. var_dump($exception);
  119. return false;
  120. }
  121. }
  122. public static function conditionUpgrade(array $order, $order_by = 'level desc')
  123. {
  124. $identity_desc = 'Rebate';
  125. try {
  126. //开启条件升级
  127. $mall_id = $order['mall_id'];
  128. $user_id = $order['user_id'];
  129. $upgrade_user_id_arr = UserPartitionRelationship::getParentIdArr($user_id);
  130. $upgrade_user_id_arr[] = $user_id;
  131. $upgrade_user_id_arr = array_reverse($upgrade_user_id_arr);
  132. $model_list = RebateUser::find()->where(['user_id' => $upgrade_user_id_arr, 'status' => StatusEnum::ENABLED])->indexBy('user_id')->all();
  133. $model_arr = $upgrade_user_ids = [];
  134. foreach ($upgrade_user_id_arr as $id) {
  135. if (!isset($model_list[$id])) {
  136. }
  137. if (!empty($model_list[$id])) {
  138. $model_arr[] = $model_list[$id];
  139. } else {
  140. $model = new RebateUser();
  141. $model->mall_id = $mall_id;
  142. $model->user_id = $id;
  143. $model->level = 0;
  144. $model->upgrade_at = 0;
  145. $model_arr[] = $model;
  146. }
  147. }
  148. foreach ($model_arr as $identity) {
  149. $where = [];
  150. $where[] = ['mall_id' => $mall_id];
  151. $where[] = ['status' => StatusEnum::ENABLED];
  152. $where[] = ['>', 'level', $identity->level];
  153. $params = [];
  154. $params['where'] = $where;
  155. $params['order'] = $order_by;
  156. $level_list = RebateUserLevel::lists($params);
  157. $flag = false;
  158. $can_upgrade_level = 0;
  159. $upgrade_status = 0;
  160. if ($level_list) {
  161. foreach ($level_list as $identity_level_arr) {
  162. $can_upgrade_level = $identity_level_arr['level'];
  163. //开启条件升级
  164. if ($identity_level_arr['upgrade_type_condition'] && $identity_level_arr['is_auto_upgrade']) {
  165. $upgrade_status = 1;
  166. $res = self::check($identity->user_id, $identity_level_arr, $mall_id, $identity_level_arr['level']);
  167. if ($res) {
  168. $flag = true;
  169. break;
  170. }
  171. }
  172. }
  173. }
  174. if ($flag && $can_upgrade_level > $identity->level) {
  175. $identity->level = $can_upgrade_level;
  176. $identity->upgrade_status = $upgrade_status;
  177. $identity->upgrade_at = time();
  178. if (!$identity->save()) throw new Exception("{用户ID:$identity->user_id},订单ID:{$order['id']}," . AddonsEnum::getAddonsNameMap($identity_desc) . "条件升级失败");
  179. $upgrade_user_ids[] = $identity->user_id;
  180. }
  181. }
  182. return $upgrade_user_ids;
  183. } catch (Exception $e) {
  184. $exception = FormatHelper::exception($e, AddonsEnum::getAddonsNameMap($identity_desc) . "条件升级失败");
  185. echo $exception;
  186. return false;
  187. }
  188. }
  189. public static function check($user_id, $agent_level_arr, $mall_id = 0, $upgrade_level = 0)
  190. {
  191. if (empty($agent_level_arr['condition_type'])) return false;
  192. $condition_type = $agent_level_arr['condition_type'];
  193. $keys_arr = json_decode($agent_level_arr['checked_condition_keys'], true);
  194. $values_arr = json_decode($agent_level_arr['checked_condition_values'], true);
  195. if (empty($values_arr)) return false;
  196. $arr = [];//升级条件
  197. foreach ($values_arr as $K => $v) {
  198. $arr[$v['key']] = $v;
  199. }
  200. $is_return = false;
  201. sort($keys_arr);
  202. foreach ($keys_arr as $id) {
  203. $function = 'condition' . $id;
  204. $params['user_id'] = $user_id;
  205. $params['arr'] = $arr;
  206. $params['key'] = $id;
  207. $params['children_id_arr1'] = [];
  208. $params['children_id_arr2'] = [];
  209. $params['user_id_arr'] = [];
  210. $params['children_id_arr'] = [];
  211. $params['name1'] = '';
  212. $params['name2'] = '';
  213. $params['model_class'] = '';
  214. $params['data'] = [];
  215. $params['mall_id'] = $mall_id;
  216. $params['upgrade_level'] = $upgrade_level;
  217. if (!method_exists(static::class, $function)) continue;
  218. $is_bool = static::$function($params);
  219. //满足其一
  220. if ($condition_type == 1) {
  221. if ($is_bool) {
  222. $is_return = true;
  223. break;
  224. } else {
  225. $is_return = false;
  226. }
  227. }
  228. //满足所有
  229. if ($condition_type == 2) {
  230. if ($is_bool) {
  231. $is_return = true;
  232. } else {
  233. $is_return = false;
  234. break;
  235. }
  236. }
  237. }
  238. return $is_return;
  239. }
  240. public static function condition1($params)
  241. {
  242. $is_bool = false;
  243. if (empty($params['user_id']) || empty($params['arr']) || empty($params['key'])) return $is_bool;
  244. $user_id_arr = UserPartitionRelationship::getChildIdArr($params['user_id'], 1);
  245. if (empty($user_id_arr)) return $is_bool;
  246. $arr = $params['arr'];
  247. $key = $params['key'];
  248. $level = $arr[$key]['value']['direct_rebate_user_level'];
  249. $direct_rebate_user_level_num = $arr[$key]['value']['direct_rebate_user_level_num'];
  250. $counts = RebateUser::find()->where(['user_id' => $user_id_arr, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]])
  251. ->andWhere(['>=', 'level', $level])
  252. ->count();
  253. if ($counts >= $direct_rebate_user_level_num) $is_bool = true;
  254. return $is_bool;
  255. }
  256. }