db->beginTransaction(); try { $configs = \Yii::$app->services->setting->addons->get($mall_id, AddonsEnum::ADDONS_NAME_CLOUD_STOCK_TWO, 'basic'); if (empty($configs['is_enable'])) throw new Exception('没开启云库存'); $upgrade_bag_list = CloudStockTwoUpgradeBag::lists(['where' => [['mall_id' => $mall_id], ['goods_id' => $goods_id_arr], ['status' => StatusEnum::ENABLED]], 'order' => 'level asc']); $cloud_stock_agent = CloudStockTwoAgent::findOne(['user_id' => $user_id, 'status' => StatusEnum::ENABLED]); if (empty($cloud_stock_agent)) { $cloud_stock_agent = new CloudStockTwoAgent(); $cloud_stock_agent->user_id = $user_id; $cloud_stock_agent->mall_id = $mall_id; } $before_level = $cloud_stock_agent->level ?? 0; //购买升级礼包升级 $time = time(); if (!empty($upgrade_bag_list)) { $level_up_give_stock_by_parent = $configs['level_up_give_stock_by_parent'] ?? 0; self::upgradeBagUp($mall_id, $user_id, $order_id, $upgrade_bag_list, $cloud_stock_agent, $time, $before_level, $level_up_give_stock_by_parent,$order_type); } $level = 0; if (!empty($cloud_stock_agent->level)) $level = $cloud_stock_agent->level; $level_list = CloudStockTwoLevel::lists(['where' => [ ['mall_id' => $mall_id], ['>', 'level', $level], ['status' => StatusEnum::ENABLED] ], 'order' => 'level desc' ]); //购买商品升级 if (!empty($level_list)) { self::conditionUp($user_id, $goods_id_arr, $cloud_stock_agent, $time, $before_level, $level_list,$order_id,$order_type); } $t->commit(); //触发升级上级代理商是否满足升级 $parent_agent_list = self::getUserParentAgentList($mall_id,$user_id); foreach ($parent_agent_list as $agent) { $level = 0; if (!empty($agent->level)) $level = $agent['level']; $level_list = CloudStockTwoLevel::lists(['where' => [ ['mall_id' => $mall_id], ['>', 'level', $level], ['status' => StatusEnum::ENABLED] ], 'order' => 'level desc' ]); self::conditionUp($agent['user_id'], [], $agent, $time, $agent['before_level'], $level_list,$order_id,$order_type); } return true; } catch (\Exception $e) { $t->rollBack(); $exception = FormatHelper::exception($e, $e->getMessage() . $e->getFile() . $e->getLine()); //echo $exception; \Yii::error($exception); return false; } } public static function getUserParentAgentList($mall_id,$agent_user_id) { $parent_id_arr = UserPartitionRelationship::getParentIdArr($agent_user_id); $parent_id_arr = array_reverse($parent_id_arr); $parent_agent_list = CloudStockTwoAgent::lists(['where' => [['user_id' => $parent_id_arr],['status'=>StatusEnum::ENABLED]], 'index' => 'user_id'], false); $list = []; foreach ($parent_id_arr as $user_id) { if (isset($parent_agent_list[$user_id])) { $list[] = $parent_agent_list[$user_id]; }else{ $model = new CloudStockTwoAgent(); $model->loadDefaultValues(); $model->mall_id = $mall_id; $model->user_id = $user_id; $model->level = 0; $model->before_level = 0; $list[] = $model; } } return $list; } public static function upgradeBagUp($mall_id, $user_id, $order_id, $upgrade_bag_list, $cloud_stock_agent, $time, $before_level, $level_up_give_stock_by_parent,$order_type) { $level = 0; $give_arr = []; foreach ($upgrade_bag_list as $item) { $level = $item['level']; // if (!empty($item['give_goods_id'])) { // $give_arr[$item['give_goods_id']] = $item['give_goods_num']; // } if (!empty($item['give_goods_info'])) { $item['give_goods_info'] = json_decode($item['give_goods_info'],true) ?? []; foreach($item['give_goods_info'] as $info){ if(!empty($info['num'])){ $give_arr[$info['goods_id']] = $info['num']; } } } } $cloud_stock_level_model = CloudStockTwoLevel::findOne(['mall_id' => $mall_id, 'level' => $level, 'status' => StatusEnum::ENABLED]); if (empty($cloud_stock_level_model)) return false; if ($cloud_stock_agent->level >= $level) return true; $cloud_stock_agent->level = $level; $cloud_stock_agent->upgrade_status = CloudStockTwoEnum::UPGRADE_STATUS_GOODS; $cloud_stock_agent->upgrade_at = $time; $cloud_stock_agent->before_level = $before_level; $res = $cloud_stock_agent->save(); if ($res) { self::updateQuota($cloud_stock_agent); self::sendMessage($mall_id, $cloud_stock_level_model['name'], $cloud_stock_agent['user_id']); //触发直推上级奖励 //支付金额 if($order_type == 'fill'){ $order = CloudStockTwoFillOrder::findOne(['id'=>$order_id]); $price = $order->pay_money ?? 0; }else{ $order = OrderDetail::findOne(['order_id'=>$order_id]); $price = $order->goods_price; $goods_id = $order->goods_id; } if($order){ $LevelRewardLogicObj = new LevelRewardLogic($mall_id,$cloud_stock_agent,$order_type,$order_id,$cloud_stock_level_model['name'],$price,$order->goods_id,$order->num); $LevelRewardLogicObj->addRewardLog(); //返回直推奖励 self::$reward_unit_price += $LevelRewardLogicObj->reward_unit_price; } } //赠送库存 foreach ($give_arr as $goods_id => $num) { if (!empty($level_up_give_stock_by_parent)) { //走补货的逻辑 $order_no = StringHelper::generateOrderNo('CSFL'); $params = [ 'user_id' => $user_id, 'pay_money' => 0, 'order_no' => $order_no, 'is_pay' => CloudStockTwoEnum::FILL_STATUS_PAY, 'goods_id' => $goods_id, 'num' => $num, ]; $order = CloudStockTwoFillOrder::setData($mall_id, $params); if ($order) { $obj = new FillOrderLogic(); $obj->handle($order); } } else { //最初的方案 //生成代理商商品库存 $params = [ 'mall_id' => $mall_id, 'user_id' => $user_id, 'goods_id' => $goods_id, 'num' => $num, 'order_id' => $order_id, 'changes_type' => CloudStockTwoEnum::STOCK_CHANGE_TYPE105, 'changes_dir' => CloudStockTwoEnum::STOCK_CHANGE_ADD, 'order_type' => CloudStockTwoEnum::STOCK_ORDER_TYPE_USER, ]; $res = CloudStockTwoAgentGoods::addData($params); if (!$res) throw new \Exception(CloudStockTwoAgentGoods::getStaticError()); } } } public static function conditionUp($user_id, $goods_id_arr, $cloud_stock_agent, $time, $before_level, $level_list,$order_id,$order_type) { $can_to_level = 0; $type = 1; $is_can_up = false; $mall_id = 0; $params['user_id'] = $user_id; $params['goods_id_arr'] = $goods_id_arr; $params['order_type'] = $order_type; $params['order_id'] = $order_id; $is_can_up = false; $level_name = ''; foreach ($level_list as $level_item) { $can_to_level = $level_item['level']; $level_name = $level_item['name']; $mall_id = $level_item['mall_id']; if (empty($level_item['upgrade_type_condition'])) continue; if (!empty($level_item['condition_type'])) { $condition_type = $level_item['condition_type']; $checked_condition_values = json_decode($level_item['checked_condition_values'], true); $checked_condition_keys = json_decode($level_item['checked_condition_keys'], true); foreach ($checked_condition_keys as $key) { $method = 'condition' . $key; $is_bool = self::$method($checked_condition_values, $key, $params); //满足其一 if ($condition_type == 1) { if ($is_bool) { $is_can_up = true; break; } else { $is_can_up = false; } } //满足所有 if ($condition_type == 2) { if ($is_bool) { $is_can_up = true; } else { $is_can_up = false; break; } } } if($is_can_up) break; } } if ($is_can_up && $can_to_level > $cloud_stock_agent->level) { $cloud_stock_agent->level = $can_to_level; $cloud_stock_agent->upgrade_status = CloudStockTwoEnum::UPGRADE_STATUS_CONDITION; $cloud_stock_agent->upgrade_at = $time; $cloud_stock_agent->before_level = $before_level; $res = $cloud_stock_agent->save(); if ($res) { self::updateQuota($cloud_stock_agent); self::sendMessage($mall_id, $level_name, $cloud_stock_agent['user_id']); //触发直推上级奖励 //支付金额 if($order_type == 'fill'){ $order = CloudStockTwoFillOrder::findOne(['id'=>$order_id]); $price = $order->pay_money ?? 0; }else{ $order = OrderDetail::findOne(['order_id'=>$order_id]); $price = $order->goods_price; $goods_id = $order->goods_id; } if($order){ $LevelRewardLogicObj = new LevelRewardLogic($mall_id,$cloud_stock_agent,$order_type,$order_id,$level_name,$price,$order->goods_id,$order->num); $LevelRewardLogicObj->addRewardLog(); //返回直推奖励 self::$reward_unit_price += $LevelRewardLogicObj->reward_unit_price; } } } } public static function updateQuota($cloud_stock_agent) { $level = CloudStockTwoLevel::findOne(['mall_id' => $cloud_stock_agent['mall_id'], 'level' => $cloud_stock_agent['level'], 'status' => [StatusEnum::ENABLED]]); if (!empty($level)) { $give_quota = json_decode($level['give_quota'], true); foreach ($give_quota as $item) { if (!empty($item['is_use']) && !empty($item['num'])) { $params = []; $params['mall_id'] = $cloud_stock_agent['mall_id']; $params['user_id'] = $cloud_stock_agent['user_id']; $params['num'] = $item['num']; $params['level'] = $item['level']; $res = CloudStockTwoAgentQuota::setData($params); if ($res == false) throw new Exception(CloudStockTwoAgentQuota::getStaticError()); } } } } public static function sendMessage($mall_id, $level_name, $user_id) { try { $SmsConfig = new Sms($mall_id); $easy_sms = $SmsConfig->easySms; $message = new LevelUpgradeMessage($mall_id, $level_name); $user = User::findOne(['id' => $user_id]); $easy_sms->send($user['mobile'], $message); } catch (NoGatewayAvailableException $e) { $res = $e->getExceptions(); if (!empty($res)) { foreach ($res as $exception) { if (is_string($exception->getMessage())) { \Yii::error('云库存升级短信发送失败:' . $exception->getMessage()); } } } } catch (\Exception $e) { \Yii::error('云库存升级短信发送失败:' . $e->getMessage()); } } protected static function condition0($checked_condition_values, $key, $params) { //购买指定商品 $upgrade = false; //取出等级升级商品id $value_goods_ids = []; if (isset($checked_condition_values[$key]['value'])) $value_goods_ids = array_column($checked_condition_values[$key]['value'], 'goods_id'); if (empty($value_goods_ids)) $upgrade = false; $goods_id_arr = $params['goods_id_arr']; foreach ($goods_id_arr as $goods_id) { if (in_array($goods_id, $value_goods_ids)) { if($params['order_type'] == 'fill'){ $order = CloudStockTwoFillOrder::findOne([['id' => $params['order_id']]]); $order->is_first = 1; $order->save(); } $upgrade = true; break; } } return $upgrade; } protected static function condition1($checked_condition_values, $key, $params) { $user_id = $params['user_id']; $child_user_ids = User::find()->where(['parent_id'=>$user_id])->asArray()->all(); $level_arr = []; $use_level_arr = []; foreach ($checked_condition_values[$key]['value'] as $val) { if ($val['is_use']) $use_level_arr[] = $val['level']; } $user_id_arr = array_column($child_user_ids, 'id'); $agent_list = CloudStockTwoAgent::lists(['where' => [['user_id' => $user_id_arr], ['level' => $use_level_arr], ['status' => StatusEnum::ENABLED]]]); foreach ($agent_list as $val) { if (isset($level_arr[$val['level']])) { $level_arr[$val['level']] += 1; } else { $level_arr[$val['level']] = 1; } } $upgrade = true; foreach ($checked_condition_values[$key]['value'] as $val) { if ($val['is_use'] && !empty($val['num'])) { if (empty($level_arr[$val['level']]) || $level_arr[$val['level']] < $val['num']) { $upgrade = false; continue; } } } return $upgrade; } // protected static function condition2($checked_condition_values, $key, $params) // { // $user_id = $params['user_id']; // $value_goods_ids = array_column($checked_condition_values[$key]['value'], 'id'); // //条件 radio_type=1 表示或(满足其一);radio_type=2 表示与(同时满足) // $radio_type = isset($checked_condition_values[$key]["radio_type"]) ? $checked_condition_values[$key]["radio_type"] : 1; // $fill_order_list = CloudStockTwoFillOrder::lists(['where' => [['user_id' => $user_id], ['goods_id' => $value_goods_ids], ['is_pay' => 1]], // 'select' => 'sum(num) as num,goods_id', // 'group' => 'goods_id', // 'index' => 'goods_id' // ]); // //0待付款 1待发货 2 已发货 3已收货 4已完成 -1申请售后 -2售后中 -3售后完成 -4 已关闭 -5撤销售后】 // $order_detail_list = OrderDetail::lists(['where' => [['user_id' => $user_id], ['goods_id' => $value_goods_ids], ['order_status' => [1, 2, 3, 4, -5]]], // 'select' => 'sum(num) as num,goods_id', // 'group' => 'goods_id', // 'index' => 'goods_id' // ]); // if ($radio_type == 1) { // $upgrade = false; // foreach ($checked_condition_values[$key]['value'] as $row) { // $num = 0; // if (!empty($fill_order_list[$row['id']]['num'])) $num += $fill_order_list[$row['id']]['num']; // if (!empty($order_detail_list[$row['id']]['num'])) $num += $order_detail_list[$row['id']]['num']; // if ($num >= $row['num']) { // $upgrade = true; // break; // } // } // } else { // $upgrade = true; // if (empty($checked_condition_values[$key]['value'])) { // $upgrade = false; // } else { // foreach ($checked_condition_values[$key]['value'] as $row) { // $num = 0; // if (!empty($fill_order_list[$row['goods_id']])) $num += $fill_order_list[$row['goods_id']]; // if (!empty($order_detail_list[$row['goods_id']])) $num += $order_detail_list[$row['goods_id']]; // if ($num < $row['num']) { // $upgrade = false; // break; // } // } // } // } // return $upgrade; // } protected static function condition2($checked_condition_values, $key, $params) { $user_id = $params['user_id']; $child_user_ids = User::find()->where(['parent_id'=>$user_id])->asArray()->all(); $level_arr = []; $use_level_arr = []; foreach ($checked_condition_values[$key]['value'] as $val) { if ($val['is_use']) $use_level_arr[] = $val['level']; } $user_id_arr = array_column($child_user_ids, 'id'); $agent_list = CloudStockTwoAgent::lists(['where' => [['user_id' => $user_id_arr], ['level' => $use_level_arr], ['status' => StatusEnum::ENABLED]]]); $user_id_arr = array_column($agent_list, 'user_id'); $order_list = CloudStockTwoFillOrder::find() ->where(['user_id'=>$user_id_arr,'is_pay'=>1]) ->select('sum(pay_money) as pay_money,user_id') ->groupBy('user_id') ->indexBy('user_id') ->asArray() ->all(); foreach ($agent_list as $val) { $price = $order_list[$val['user_id']]['pay_money'] ?? 0; if (isset($level_arr[$val['level']])) { $level_arr[$val['level']] += $price; } else { $level_arr[$val['level']] = $price; } } $upgrade = true; foreach ($checked_condition_values[$key]['value'] as $val) { if ($val['is_use'] && !empty($val['num'])) { if (!isset($level_arr[$val['level']]) || empty($level_arr[$val['level']]) || $level_arr[$val['level']] < $val['num']) { $upgrade = false; continue; } } } return $upgrade; } protected static function condition3($checked_condition_values, $key, $params) { $user_id = $params['user_id']; $upgrade = false; if($params['order_type'] == 'fill'){ $nums = $checked_condition_values[$key]['nums'] ?? 0; $order = CloudStockTwoFillOrder::findOne([['id' => $params['order_id']]]); if ($order['pay_money']>=$nums && $user_id == $order['user_id']) $upgrade = true; $order->is_first = 1; $order->save(); } return $upgrade; } protected static function condition4($checked_condition_values, $key, $params) { $user_id = $params['user_id']; $first_child_user_ids = User::find()->where(['parent_id'=>$user_id])->asArray()->all(); $child_id_arr = UserPartitionRelationship::getChildIdArr($user_id); $level_arr = []; $direct_level = []; $use_level_arr = []; foreach ($checked_condition_values[$key]['value'] as $val) { if ($val['is_use']) $use_level_arr[] = $val['level']; } $user_id_arr = array_column($first_child_user_ids, 'id'); $agent_list = CloudStockTwoAgent::lists(['where' => [['user_id' => $child_id_arr], ['level' => $use_level_arr], ['status' => StatusEnum::ENABLED]]]); foreach ($agent_list as $val) { if (isset($level_arr[$val['level']])) { $level_arr[$val['level']] += 1; } else { $level_arr[$val['level']] = 1; } if(in_array($val['user_id'],$user_id_arr)){ if (isset($direct_level[$val['level']])) { $direct_level[$val['level']] += 1; } else { $direct_level[$val['level']] = 1; } } } $upgrade = true; foreach ($checked_condition_values[$key]['value'] as $val) { if ($val['is_use'] && !empty($val['num'])) { if (!isset($level_arr[$val['level']]) || empty($level_arr[$val['level']]) || $level_arr[$val['level']] < $val['num']) { $upgrade = false; continue; } } if ($val['is_use'] && !empty($val['direct_num'])) { if (!isset($direct_level[$val['level']]) || empty($direct_level[$val['level']]) || $direct_level[$val['level']] < $val['direct_num']) { $upgrade = false; continue; } } } return $upgrade; } }