| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- <?php
- namespace addons\Rebate\common\logic;
- use addons\Rebate\common\models\RebateUser;
- use addons\Rebate\common\models\RebateUserLevel;
- use common\enums\AddonsEnum;
- use common\enums\OrderStatusEnum;
- use common\enums\StatusEnum;
- use common\helpers\FormatHelper;
- use common\models\common\UpgradeCondition;
- use common\models\order\Order;
- use common\models\order\OrderDetail;
- use common\models\user\UserPartitionRelationship;
- use common\traits\ErrorTrait;
- use yii\db\Exception;
- use Yii;
- use yii\helpers\Json;
- class LevelUpLogic
- {
- use ErrorTrait;
- /**
- * @param $order_id
- * @param $settlement_type // 结算类型,1=支付完成,2=订单完成
- * @return bool
- */
- public static function execute($order_id, $settlement_type)
- {
- $t = Yii::$app->db->beginTransaction();
- try {
- // 获取订单内容
- $where = ['id' => $order_id];
- $order = Order::find()->select("id,user_id,mall_id,order_no,pay_time")
- ->where($where)
- ->with(['detail' => function($query){
- $query->select("order_id,goods_id,num,goods_price,goods_name,price,pic_url");
- }])
- ->asArray()->one();
- if(empty($order)) throw new Exception("订单不存在");
- // 获取订单内容
- $order['order_status'] = $settlement_type;
- self::buyGoodsUpgrade($order);
- self::conditionUpgrade($order);
- $t->commit();
- return true;
- } catch (Exception $e) {
- $t->rollBack();
- self::setStaticError($e->getMessage());
- return false;
- }
- }
- public static function buyGoodsUpgrade(array $order, $order_by = 'level desc')
- {
- $identity_desc = 'Rebate';
- try {
- $mall_id = $order['mall_id'];
- $user_id = $order['user_id'];
- $upgrade_uid = 0;
- $model = RebateUser::findOne(['mall_id' => $mall_id, 'user_id' => $user_id, 'status' => StatusEnum::ENABLED]);
- if (empty($model)) {
- $model = new RebateUser();
- $model->mall_id = $mall_id;
- $model->user_id = $user_id;
- $model->level = 0;
- $model->upgrade_at = 0;
- $model->loadDefaultValues();
- }
- $where = [];
- $where[] = ['mall_id' => $mall_id];
- $where[] = ['status' => StatusEnum::ENABLED];
- $where[] = ['>', 'level', $model->level];
- $params = [];
- $params['where'] = $where;
- $params['order'] = $order_by;
- // 获取等级
- $level_list = RebateUserLevel::lists($params);
- $where = [];
- $where[] = ['mall_id' => $mall_id];
- $where[] = ['order_id' => $order['id']];
- $where[] = ['user_id' => $user_id];
- $params = [];
- $params['where'] = $where;
- $order_detail_list = OrderDetail::lists($params);
- $buy_goods_id_arr = array_column($order_detail_list, 'goods_id');
- $can_upgrade_level = 0;
- $upgrade_status = 0;
- $flag = false;
- //开启购买升级商品
- if (!empty($level_list)) {
- foreach ($level_list as $level_arr) {
- $can_upgrade_level = $level_arr['level'];
- //开启购买升级商品
- if ($level_arr['upgrade_type_goods'] && $level_arr['is_auto_upgrade']) {
- $upgrade_status = 2;
- $goods_id_arr = Json::decode($level_arr['goods_ids'], true);
- $res = UpgradeCondition::buyGoods($level_arr['goods_type'], $buy_goods_id_arr, $goods_id_arr);
- if ($res) {
- if ($level_arr['buy_goods_type'] == 0 && $order['order_status'] == OrderStatusEnum::ACCOMPLISH) {
- $flag = true;
- break;
- }
- if ($level_arr['buy_goods_type'] == 1 && $order['order_status'] == OrderStatusEnum::PAY) {
- $flag = true;
- break;
- }
- }
- }
- }
- if ($flag) {
- $model->level = $can_upgrade_level;
- $model->upgrade_status = $upgrade_status;
- $model->upgrade_at = time();
- if (!$model->save()) throw new Exception("{用户ID:$user_id},订单ID:{$order['id']}," . AddonsEnum::getAddonsNameMap($identity_desc) . "购物升级失败");
- $upgrade_uid = $user_id;
- }
- }
- return $upgrade_uid;
- } catch (Exception $e) {
- $exception = FormatHelper::exception($e, AddonsEnum::getAddonsNameMap($identity_desc) . "购物升级失败");
- var_dump($exception);
- return false;
- }
- }
- public static function conditionUpgrade(array $order, $order_by = 'level desc')
- {
- $identity_desc = 'Rebate';
- try {
- //开启条件升级
- $mall_id = $order['mall_id'];
- $user_id = $order['user_id'];
- $upgrade_user_id_arr = UserPartitionRelationship::getParentIdArr($user_id);
- $upgrade_user_id_arr[] = $user_id;
- $upgrade_user_id_arr = array_reverse($upgrade_user_id_arr);
- $model_list = RebateUser::find()->where(['user_id' => $upgrade_user_id_arr, 'status' => StatusEnum::ENABLED])->indexBy('user_id')->all();
- $model_arr = $upgrade_user_ids = [];
- foreach ($upgrade_user_id_arr as $id) {
- if (!isset($model_list[$id])) {
- }
- if (!empty($model_list[$id])) {
- $model_arr[] = $model_list[$id];
- } else {
- $model = new RebateUser();
- $model->mall_id = $mall_id;
- $model->user_id = $id;
- $model->level = 0;
- $model->upgrade_at = 0;
- $model_arr[] = $model;
- }
- }
- foreach ($model_arr as $identity) {
- $where = [];
- $where[] = ['mall_id' => $mall_id];
- $where[] = ['status' => StatusEnum::ENABLED];
- $where[] = ['>', 'level', $identity->level];
- $params = [];
- $params['where'] = $where;
- $params['order'] = $order_by;
- $level_list = RebateUserLevel::lists($params);
- $flag = false;
- $can_upgrade_level = 0;
- $upgrade_status = 0;
- if ($level_list) {
- foreach ($level_list as $identity_level_arr) {
- $can_upgrade_level = $identity_level_arr['level'];
- //开启条件升级
- if ($identity_level_arr['upgrade_type_condition'] && $identity_level_arr['is_auto_upgrade']) {
- $upgrade_status = 1;
- $res = self::check($identity->user_id, $identity_level_arr, $mall_id, $identity_level_arr['level']);
- if ($res) {
- $flag = true;
- break;
- }
- }
- }
- }
- if ($flag && $can_upgrade_level > $identity->level) {
- $identity->level = $can_upgrade_level;
- $identity->upgrade_status = $upgrade_status;
- $identity->upgrade_at = time();
- if (!$identity->save()) throw new Exception("{用户ID:$identity->user_id},订单ID:{$order['id']}," . AddonsEnum::getAddonsNameMap($identity_desc) . "条件升级失败");
- $upgrade_user_ids[] = $identity->user_id;
- }
- }
- return $upgrade_user_ids;
- } catch (Exception $e) {
- $exception = FormatHelper::exception($e, AddonsEnum::getAddonsNameMap($identity_desc) . "条件升级失败");
- echo $exception;
- return false;
- }
- }
- public static function check($user_id, $agent_level_arr, $mall_id = 0, $upgrade_level = 0)
- {
- if (empty($agent_level_arr['condition_type'])) return false;
- $condition_type = $agent_level_arr['condition_type'];
- $keys_arr = json_decode($agent_level_arr['checked_condition_keys'], true);
- $values_arr = json_decode($agent_level_arr['checked_condition_values'], true);
- if (empty($values_arr)) return false;
- $arr = [];//升级条件
- foreach ($values_arr as $K => $v) {
- $arr[$v['key']] = $v;
- }
- $is_return = false;
- sort($keys_arr);
- foreach ($keys_arr as $id) {
- $function = 'condition' . $id;
- $params['user_id'] = $user_id;
- $params['arr'] = $arr;
- $params['key'] = $id;
- $params['children_id_arr1'] = [];
- $params['children_id_arr2'] = [];
- $params['user_id_arr'] = [];
- $params['children_id_arr'] = [];
- $params['name1'] = '';
- $params['name2'] = '';
- $params['model_class'] = '';
- $params['data'] = [];
- $params['mall_id'] = $mall_id;
- $params['upgrade_level'] = $upgrade_level;
- if (!method_exists(static::class, $function)) continue;
- $is_bool = static::$function($params);
- //满足其一
- if ($condition_type == 1) {
- if ($is_bool) {
- $is_return = true;
- break;
- } else {
- $is_return = false;
- }
- }
- //满足所有
- if ($condition_type == 2) {
- if ($is_bool) {
- $is_return = true;
- } else {
- $is_return = false;
- break;
- }
- }
- }
- return $is_return;
- }
- public static function condition1($params)
- {
- $is_bool = false;
- if (empty($params['user_id']) || empty($params['arr']) || empty($params['key'])) return $is_bool;
- $user_id_arr = UserPartitionRelationship::getChildIdArr($params['user_id'], 1);
- if (empty($user_id_arr)) return $is_bool;
- $arr = $params['arr'];
- $key = $params['key'];
- $level = $arr[$key]['value']['direct_rebate_user_level'];
- $direct_rebate_user_level_num = $arr[$key]['value']['direct_rebate_user_level_num'];
- $counts = RebateUser::find()->where(['user_id' => $user_id_arr, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]])
- ->andWhere(['>=', 'level', $level])
- ->count();
- if ($counts >= $direct_rebate_user_level_num) $is_bool = true;
- return $is_bool;
- }
- }
|