'小模型', self::MODEL_ALLIANCE => '大模型', ); /** * @inheritdoc */ public static function tableName() { return '{{%user_string_code_plus}}'; } public function behaviors() { return [ [ 'class' => TimestampBehavior::class, 'attributes' => [ ActiveRecord::EVENT_BEFORE_INSERT => ['created_at'], ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'] ] ] ]; } /** * @inheritdoc */ public function rules() { return [ [['recommend_relation', 'recommend_relation_node'], 'string'], [ [ 'store_id', 'user_id', 'parent_id', 'layer', 'layer_node', 'created_at', 'updated_at', 'parent_node', 'team_num', 'area_key', 'layer_rank', 'saas_id' ], 'integer' ], ]; } /** * @inheritdoc */ public function attributeLabels() { return [ 'id' => 'ID', 'store_id' => '店铺id', 'user_id' => '用户id', 'parent_id' => '分销上级id', 'parent_node' => '父节点', 'recommend_relation_node' => '节点推荐关系', 'layer_node' => '节点层级', 'recommend_relation' => '分销推荐关系', 'layer' => '分销层级', 'area_key' => '区域Key', 'layer_rank' => '层级排位', 'team_num' => '团队人数', 'created_at' => '创建时间', 'updated_at' => '更新时间', 'saas_id' => 'saas用户id', ]; } /** * @param $store_id * @return bool */ public static function checkSettingByStoreId($store_id, $setting) { if (!$setting) { //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】未配置串码设置"], "app_debug.log"); return false; } if (!isset($setting['string_code_store_switch']) || $setting['string_code_store_switch'] != 1) { //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】未开启串码功能"], "app_debug.log"); return false; } if (!isset($setting['string_code_model'])) { //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】未设置串码模式"], "app_debug.log"); return false; } if (!is_array($setting['string_code_model'])) { //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】串码模式配置不是数组"], "app_debug.log"); return false; } // if (!isset($setting['string_code_max_layer']) || $setting['string_code_max_layer'] <= 0) { // //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】未设置串码最大层级"], "app_debug.log"); // return false; // } // if (!isset($setting['string_code_condition_value']) || $setting['string_code_condition_value'] <= 0) { // //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】未设置结点加入金额条件"], "app_debug.log"); // return false; // } // if (!isset($setting['string_code_root_user_id']) || $setting['string_code_root_user_id'] <= 0) { // //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】未设置根结点用户"], "app_debug.log"); // return false; // } // if (!isset($setting['string_code_scan_scale_1']) || $setting['string_code_scan_scale_1'] <= 0) { // //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】未设置当面付比例"], "app_debug.log"); // return false; // } // if (!isset($setting['string_code_order_scale_1']) || $setting['string_code_order_scale_1'] <= 0) { // //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】未设置订单比例"], "app_debug.log"); // return false; // } // if (!isset($setting['string_code_pv_scale_1']) || $setting['string_code_pv_scale_1'] <= 0) { // //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】未设置PV比例"], "app_debug.log"); // return false; // } // if ($store_id != self::ALLIANCE_STORE_ID) { // if (!isset($setting['string_code_scan_scale_0']) || $setting['string_code_scan_scale_0'] <= 0) { // //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】未设置当面付比例"], "app_debug.log"); // return false; // } // if (!isset($setting['string_code_order_scale_0']) || $setting['string_code_order_scale_0'] <= 0) { // //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】未设置订单比例"], "app_debug.log"); // return false; // } // if (!isset($setting['string_code_pv_scale_0']) || $setting['string_code_pv_scale_0'] <= 0) { // //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】未设置PV比例"], "app_debug.log"); // return false; // } // } return true; } /** * 加入节点 * @param $order * @return bool */ public static function joinNode($order, $is_scan = 0) { $store_id = $order->store_id; $user_id = $order->user_id; $order_id = $order->id; $order_no = $order->order_no; $temporder = json_encode($order); //debug_log([__METHOD__, __LINE__, "订单信息:【{$temporder}】- $store_id - $user_id - $order_id - $order_no - $is_scan "], "app_debug.log"); $saas_user_id = SaasUser::findSaasIdByUserId($user_id); $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}'); $setting = $setting ? Json::decode($setting['value']) : []; $check_res = self::checkSettingByStoreId($store_id, $setting); if (!$check_res) { //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】设置条件不满足"], "app_debug.log"); return false; } //门店模式 $string_code_shop_value = 0; if ($store_id != -1) { $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}'); $setting = $setting ? Json::decode($setting['value']) : []; $string_code_shop_value = $setting['string_code_shop_value'] ? $setting['string_code_shop_value'] : 0; } //debug_log([__METHOD__, __LINE__, "加入节点 门店模式:{$string_code_shop_value},0品牌模式 1门店模式"], "app_debug.log"); list($model_switch_shop, $model_switch_alliance) = self::getModelSwitchBySettingArray($setting['string_code_model']); if ($model_switch_shop) { $res = self::joinNodeByShopModel($store_id, $user_id, $setting, self::MODEL_SHOP); if ($res) { UserStringCodeOrderHistory::sendRedPacket($store_id, $user_id, self::MODEL_SHOP, $order_id, $order_no, $is_scan, $string_code_shop_value); } } if ($model_switch_alliance) { $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, self::ALLIANCE_STORE_ID, OptionSetting::SHARE_GROUP_NAME, '{}'); $setting = $setting ? Json::decode($setting['value']) : []; $res = self::joinNodeByAllianceModel(self::ALLIANCE_STORE_ID, $saas_user_id, $setting, self::MODEL_ALLIANCE); if ($res) { UserStringCodeOrderHistory::sendRedPacket($store_id, $user_id, self::MODEL_ALLIANCE, $order_id, $order_no, $is_scan, $string_code_shop_value); } } return true; } public static function joinNodeByShopModel($store_id, $user_id, $setting, $model_val, $string_code_shop_value = 0) { $user = User::findOne($user_id); $saas_user_id = SaasUser::findSaasIdByUserId($user_id); $model_name = self::MODEL_NAME_LIST[self::MODEL_SHOP]; $string_code_root_user_id = self::getRootUserId($store_id, self::MODEL_SHOP); $user_string_code = self::findOne(['store_id' => $store_id, 'user_id' => $user_id]); if ($user_string_code) { //debug_log([__METHOD__, __LINE__, "加入节点 串码模式:{$model_name},店铺:【{$store_id}】,用户:{$user_id}已加入串码节点"], "app_debug.log"); return false; } $root_string_code = self::findOne(['store_id' => $store_id, 'user_id' => $string_code_root_user_id]); if (!$root_string_code) { //debug_log([__METHOD__, __LINE__, "加入节点 串码模式:{$model_name},店铺:【{$store_id}】,用户:{$user_id},根节点用户:{$string_code_root_user_id}不存在"], "app_debug.log"); return false; } $consume_amount = self::getStoreConsumeAmount($store_id, $user_id); // //debug_log([__METHOD__, __LINE__, "加入节点 串码模式:{$model_name},消费金额:{$consume_amount}"], "app_debug.log"); if (bccomp($consume_amount, $setting['string_code_condition_value'], 4) == -1) { $msg = "加入节点 串码模式:{$model_name},店铺:【{$store_id}】,用户:{$user_id},消费:{$consume_amount} 未达到 {$setting['string_code_condition_value']} 元,加入串码节点失败"; //debug_log([__METHOD__, __LINE__, $msg], "app_debug.log"); return false; } $parent_id = !$user['parent_id'] ? $root_string_code['user_id'] : $user['parent_id']; // 深度优先,从左至右 list($real_parent_node, $layer_rank, $area_key) = self::getRealParentNodePlus($store_id, $user_id, $parent_id, $setting['string_code_max_layer'], $model_val, $string_code_shop_value); if (empty($real_parent_node->recommend_relation_node)) { $recommend_relation_node = ',' . $real_parent_node->user_id . ','; } else { $recommend_relation_node = $real_parent_node->recommend_relation_node . $real_parent_node->user_id . ','; } $parent_string_code = self::findOne(['store_id' => $store_id, 'user_id' => $parent_id]); if (empty($parent_string_code->recommend_relation)) { $recommend_relation = ',' . $parent_string_code->user_id . ','; } else { $recommend_relation = $real_parent_node->recommend_relation . $parent_string_code->user_id . ','; } // 保存节点数据 $user_string_code = new self(); $user_string_code->store_id = $store_id; $user_string_code->user_id = $user_id; $user_string_code->parent_id = $parent_id; $user_string_code->parent_node = $real_parent_node->user_id; $user_string_code->recommend_relation_node = $recommend_relation_node; $user_string_code->layer_node = $real_parent_node->layer_node + 1; $user_string_code->recommend_relation = $recommend_relation; $user_string_code->layer = $parent_string_code->layer + 1; $user_string_code->area_key = $area_key; $user_string_code->layer_rank = $layer_rank; $user_string_code->saas_id = $saas_user_id; if (!$user_string_code->save()) { $errors = json_encode($user_string_code->getErrors()); $msg = "加入节点 店铺:【{$store_id}】,用户:{$user_id},保存串码节点失败 {$errors}"; //debug_log([__METHOD__, __LINE__, $msg], "app_debug.log"); return false; } // 所有上级节点 团队人数 + 1 self::setTeamCountInc($store_id, $user_id); return true; } public static function joinNodeByAllianceModel($store_id, $saas_user_id, $setting, $model_val, $string_code_shop_value = 0) { $user_id = $saas_user_id; $user = SaasUser::findOne($saas_user_id); $model_name = self::MODEL_NAME_LIST[self::MODEL_ALLIANCE]; $string_code_root_user_id = self::getRootUserId($store_id, self::MODEL_ALLIANCE); $user_string_code = self::findOne(['store_id' => $store_id, 'user_id' => $user_id]); if ($user_string_code) { //debug_log([__METHOD__, __LINE__, "加入节点 串码模式:{$model_name},用户:{$user_id}已加入串码节点"], "app_debug.log"); return false; } $root_string_code = self::findOne(['store_id' => $store_id, 'user_id' => $string_code_root_user_id]); if (!$root_string_code) { //debug_log([__METHOD__, __LINE__, "加入节点 串码模式:{$model_name},用户:{$user_id}根节点不存在"], "app_debug.log"); return false; } $consume_amount = self::getStoreConsumeAmount($store_id, $user_id); // //debug_log([__METHOD__, __LINE__, "加入节点 串码模式:{$model_name}, 消费金额:{$consume_amount}"], "app_debug.log"); if (bccomp($consume_amount, $setting['string_code_condition_value'], 4) == -1) { $msg = "加入节点 串码模式:{$model_name},店铺:【{$store_id}】,用户:{$user_id},消费:{$consume_amount}未达到{$setting['string_code_condition_value']}元,加入串码节点失败"; //debug_log([__METHOD__, __LINE__, $msg], "app_debug.log"); return false; } $parent_id = !$user['parent_id'] ? $root_string_code['user_id'] : $user['parent_id']; // 深度优先,从左至右 list($real_parent_node, $layer_rank, $area_key) = self::getRealParentNodePlus($store_id, $user_id, $parent_id, $setting['string_code_max_layer'], $model_val, $string_code_shop_value); if (empty($real_parent_node['recommend_relation_node'])) { $recommend_relation_node = ',' . $real_parent_node->user_id . ','; } else { $recommend_relation_node = $real_parent_node['recommend_relation_node'] . $real_parent_node->user_id . ','; } $parent_string_code = self::findOne(['store_id' => $store_id, 'user_id' => $parent_id]); if (empty($parent_string_code['recommend_relation'])) { $recommend_relation = ',' . $parent_string_code->user_id . ','; } else { $recommend_relation = $real_parent_node['recommend_relation'] . $parent_string_code->user_id . ','; } // 保存节点数据 $user_string_code = new self(); $user_string_code->store_id = $store_id; $user_string_code->user_id = $user_id; $user_string_code->parent_id = $parent_id; $user_string_code->parent_node = $real_parent_node['user_id']; $user_string_code->recommend_relation_node = $recommend_relation_node; $user_string_code->layer_node = $real_parent_node['layer_node'] + 1; $user_string_code->recommend_relation = $recommend_relation; $user_string_code->layer = $parent_string_code['layer'] + 1; $user_string_code->area_key = $area_key; $user_string_code->layer_rank = $layer_rank; $user_string_code->saas_id = $saas_user_id; if (!$user_string_code->save()) { $errors = json_encode($user_string_code->getErrors()); $msg = "加入节点 店铺:【{$store_id}】,用户:{$user_id},保存串码节点失败 {$errors}"; //debug_log([__METHOD__, __LINE__, $msg], "app_debug.log"); return false; } // 所有上级节点 团队人数 + 1 self::setTeamCountInc($store_id, $user_id); return true; } /** * 消费金额 */ public static function getStoreConsumeAmount($store_id, $user_id) { // 订单金额 // $order_money = Order::find()->where( // [ // 'is_delete' => 0, // 'trade_status' => Order::ORDER_FLOW_CONFIRM, // ]) // ->andWhere(['in', 'user_id', $user_ids]) // ->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]]) // ->sum('pay_price'); // $scan_order_money = ScanOrder::find()->where( // [ // 'is_delete' => 0, // 'trade_status' => Order::ORDER_FLOW_CONFIRM, // 'is_pay' => 1 // ]) // ->andWhere(['in', 'user_id', $user_ids]) // ->sum('pay_price'); // $user = SaasUser::findOne(['id' => $saas_user_id]); // $order_total = bcadd($order_money, $scan_order_money, 4); // //debug_log([__METHOD__, __LINE__, "加入节点 串码模式:{$string_code_model}, 消费金额:{$order_total}"], "app_debug.log"); // 联盟分 $user_wallet = UserWallet::getCurrencyWallet($store_id, $user_id, Currency::CURRENCY_COIN); return $user_wallet['money_total'] ?: 0; } /** * 赠送贡献积分 * @param $order * @param $is_scan * @return false|void */ public static function giveCoin($order, $is_scan) { $store_id = $order->store_id; $order_id = $order->id; $user_id = $order->user_id; $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}'); $setting = $setting ? Json::decode($setting['value']) : []; $check_res = self::checkSettingByStoreId($store_id, $setting); if (!$check_res) { //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】设置条件不满足"], "app_debug.log"); return false; } list($model_switch_shop, $model_switch_alliance) = self::getModelSwitchBySettingArray($setting['string_code_model']); if ($model_switch_shop) { if ($is_scan) { $order_pv = $order->pay_price; $money = bcmul($order_pv, $setting['string_code_scan_scale_0'] / 100, 4); //debug_log([__METHOD__, __LINE__, self::MODEL_NAME_LIST[self::MODEL_SHOP] . " " . "赠送店铺分 当面付 联盟PV:【{$order_pv}】比例:【{$setting['string_code_scan_scale_0']}】"], "app_debug.log"); } else { $order_pv_0 = OrderDetail::find() ->andWhere(['order_id' => $order['id'], 'is_delete' => 0]) ->select([ 'sum(pv_0)', ])->scalar(); $money = bcmul($order_pv_0, $setting['string_code_order_scale_0'] / 100, 4); //debug_log([__METHOD__, __LINE__, self::MODEL_NAME_LIST[self::MODEL_SHOP] . " " . "赠送店铺分 商城单 联盟PV:【{$order_pv_0}】比例:【{$setting['string_code_order_scale_0']}】"], "app_debug.log"); } //debug_log([__METHOD__, __LINE__, self::MODEL_NAME_LIST[self::MODEL_SHOP] . " " . "赠送店铺分 店铺:【{$store_id}】分值:【{$money}】"], "app_debug.log"); $log_type = $is_scan ? UserWallet::TYPE_SCAN : UserWallet::TYPE_ORDER; $log_desc = self::MODEL_NAME_LIST[self::MODEL_SHOP] . " " . UserWallet::TYPE_NAME_LIST[$log_type] . "【{$order->order_no}】 赠送店铺分"; $source_table = $is_scan ? "\app\plugins\scanCodePay\models\Order" : "app\models\Order"; $currency = Currency::findOne(['code' => Currency::CURRENCY_COIN]); UserWallet::addLog($currency, $store_id, $user_id, $money, $log_desc, $log_type, $source_table, $order_id); } if ($model_switch_alliance) { $store_id = self::ALLIANCE_STORE_ID; if ($is_scan) { $order_pv = $order->pay_price; $money = bcmul($order_pv, $setting['string_code_scan_scale_1'] / 100, 4); //debug_log([__METHOD__, __LINE__, self::MODEL_NAME_LIST[self::MODEL_ALLIANCE] . " " . "赠送联盟分 当面付 联盟PV:【{$order_pv}】比例:【{$setting['string_code_scan_scale_1']}】"], "app_debug.log"); } else { $order_pv_1 = OrderDetail::find() ->andWhere(['order_id' => $order['id'], 'is_delete' => 0]) ->select([ 'sum(pv_1)', ])->scalar(); $money = bcmul($order_pv_1, $setting['string_code_order_scale_1'] / 100, 4); //debug_log([__METHOD__, __LINE__, self::MODEL_NAME_LIST[self::MODEL_ALLIANCE] . " " . "赠送联盟分 商城单 联盟PV:【{$order_pv_1}】比例:【{$setting['string_code_order_scale_1']}】"], "app_debug.log"); } //debug_log([__METHOD__, __LINE__, self::MODEL_NAME_LIST[self::MODEL_ALLIANCE] . " " . "赠送联盟分 店铺:【{$store_id}】分值:【{$money}】"], "app_debug.log"); $log_type = $is_scan ? UserWallet::TYPE_SCAN : UserWallet::TYPE_ORDER; $log_desc = self::MODEL_NAME_LIST[self::MODEL_ALLIANCE] . " " . UserWallet::TYPE_NAME_LIST[$log_type] . "【{$order->order_no}】 赠送联盟分"; $source_table = $is_scan ? "\app\plugins\scanCodePay\models\Order" : "app\models\Order"; $currency = Currency::findOne(['code' => Currency::CURRENCY_COIN]); $saas_user_id = SaasUser::findSaasIdByUserId($order->user_id); UserWallet::addLog($currency, $store_id, $saas_user_id, $money, $log_desc, $log_type, $source_table, $order_id); } } /** * 门店让利额的用途,门店推荐人4%,合伙人分红6%,会员所属门店10%,用户推荐人20%,串码红包60%(20个点位各3%) 5%区县代理商,3%街道代理商 * @param $is_scan * @return false */ public static function transfer($order, $is_scan = 0) { //debug_log([__METHOD__, __LINE__, '串码让利 start'], "app_debug.log"); if (!$order->is_pay) { return false; } $store_id = $order->store_id; $store = Store::findOne($store_id); $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}'); $setting = $setting ? Json::decode($setting['value']) : []; $check_res = self::checkSettingByStoreId($store_id, $setting); if (!$check_res) { return false; } $t = \Yii::$app->db->beginTransaction(); try { $is_scan = 0; if ($order instanceof ScanOrder) { $is_scan = 1; } self::transferByModel($order, $setting, $is_scan); $UserStringCodeOrderlist = UserStringCodeOrder::findAll([ 'order_id' => $order->id, 'is_scan' => $is_scan, 'type' => [ UserStringCodeOrder::TYPE_STORE_USER_REFERRER, UserStringCodeOrder::TYPE_STORE_USER_AFFILIATED, UserStringCodeOrder::TYPE_STORE_REFERRER, UserStringCodeOrder::TYPE_BRAND_USER_REFERRER, UserStringCodeOrder::TYPE_BRAND_USER_AFFILIATED, UserStringCodeOrder::TYPE_BRAND_REFERRER, UserStringCodeOrder::TYPE_BRAND_PROVINCE_AGENT ] // 用数组指定多个类型 ]); if (count($UserStringCodeOrderlist) > 0) { $order->team_reward_status = 1; $order->save(); } self::sendDistrictStreetAgentDivvy($order); $t->commit(); } catch (\Exception $e) { $t->rollBack(); //debug_log([__METHOD__, __LINE__, "串码让利 异常" . $e->getMessage()], "app_debug.log"); } //debug_log([__METHOD__, __LINE__, '串码让利 end'], "app_debug.log"); } public static function storeTransferByShopModel($order, $string_code_setting, $model_val) { $store_id = $order->store_id; if ($order instanceof ScanOrder) { $order_pv = $order->pay_price; } else { $order_pv = OrderDetail::find() ->andWhere(['order_id' => $order['id'], 'is_delete' => 0]) ->select([ 'sum(pv_0)', ])->scalar(); } $transfer_money = bcmul($order_pv, $string_code_setting['string_code_pv_scale_0'] / 100, 4); //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】门店总待分账金额:{$transfer_money} 订单金额:{$order_pv} pv:{$string_code_setting['string_code_pv_scale_0']}"], "app_debug.log"); $setting = Option::get(OptionSetting::SHARE_STRING_CODE_SALE_SETTING, self::ALLIANCE_STORE_ID, OptionSetting::SHARE_GROUP_NAME, '{}'); $setting = $setting ? Json::decode($setting['value']) : []; //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】店铺推荐人:{$setting['string_code_store_referrer']} 合伙人分红:{$setting['string_code_store_partner']} 会员所属门店:{$setting['string_code_store_user_affiliated']} 用户推荐人:{$setting['string_code_store_user_referrer']}"], "app_debug.log"); if (isset($setting['string_code_store_referrer']) && $setting['string_code_store_referrer'] > 0) { $store_referral = SaasStoreReferral::findOne(['store_id' => $store_id]); $saas_id = $store_referral['referral_id']; $money = bcmul($transfer_money, $setting['string_code_store_referrer'] / 100, 4); $type = UserStringCodeOrder::TYPE_STORE_REFERRER; UserStringCodeOrder::transferAddUserWallet($order, $saas_id, $money, $type, $model_val); } //debug_log([__METHOD__, __LINE__, "---------------- 开始插入分红池 -------------------" . $setting['string_code_store_partner']], "app_debug.log"); if (isset($setting['string_code_store_partner']) && $setting['string_code_store_partner'] > 0) { $money = bcmul($transfer_money, $setting['string_code_store_partner'] / 100, 4); if (bccomp($money, 0, 4) > 0) { //debug_log([__METHOD__, __LINE__, "---------------- 开始插入分红池 -------------------"], "app_debug.log"); $desc = self::MODEL_NAME_LIST[$model_val] . " " . "订单号:【{$order->order_no}】合伙人分红增加"; PartnerPool::poolPush($order, $money, $desc, $order_pv, $string_code_setting['string_code_pv_scale_0'], $setting['string_code_store_partner'], $model_val); } else { //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】门店总待分账金额:{$transfer_money},合伙人分账金额:{$money} 有误"], "app_debug.log"); } } if (isset($setting['string_code_store_user_affiliated']) && $setting['string_code_store_user_affiliated'] > 0) { $first_store_id = SaasUser::findFirstStoreIdByUserId($order->user_id); $store_admin = Admin::findOne(['type' => 'store', 'type_id' => $first_store_id, 'is_delete' => 0]); $saas_id = $store_admin['saas_user_id']; $money = bcmul($transfer_money, $setting['string_code_store_user_affiliated'] / 100, 4); $type = UserStringCodeOrder::TYPE_STORE_USER_AFFILIATED; UserStringCodeOrder::transferAddUserWallet($order, $saas_id, $money, $type, $model_val); } if (isset($setting['string_code_store_user_referrer']) && $setting['string_code_store_user_referrer'] > 0) { $user = User::findOne($order->user_id); $saas_id = SaasUser::findSaasParentIdByUserId($user['id']); $money = bcmul($transfer_money, $setting['string_code_store_user_referrer'] / 100, 4); $type = UserStringCodeOrder::TYPE_STORE_USER_REFERRER; UserStringCodeOrder::transferAddUserWallet($order, $saas_id, $money, $type, $model_val); } } public static function transferByModel($order, $string_code_setting, $is_scan) { $store_id = $order->store_id; //$setting = Option::getShareSaleSetting(self::ALLIANCE_STORE_ID); $setting = Option::getShareSaleSetting($store_id); if ($order instanceof ScanOrder) { $order_pv = $order->pay_price+$order->take_price; if (isset($setting['string_code_store_partner']) && $setting['string_code_store_partner'] > 0) { //debug_log([__METHOD__, __LINE__, "门店合伙人分红比例 : " . ($string_code_setting['scan_qr_code_percent'])], "app_debug.log"); self::stringCodeStorPartner($order, $order_pv, $string_code_setting['scan_qr_code_percent'], $setting['string_code_store_partner'], $setting, $is_scan, $string_code_setting['string_code_model'], $store_id, 0); } self::unionUintFounder($order, $order_pv, $string_code_setting['scan_qr_code_percent'], $setting, $string_code_setting['string_code_model'],$store_id,$is_scan, 0); if (isset($setting['string_code_brand_partner']) && $setting['string_code_brand_partner'] > 0) { //debug_log([__METHOD__, __LINE__, "品牌合伙人分红比例 : " . ($string_code_setting['alliance_scan_qr_code_percent'])], "app_debug.log"); self::stringCodeStorPartner($order, $order_pv, $string_code_setting['alliance_scan_qr_code_percent'], $setting['string_code_brand_partner'], $setting, $is_scan, $string_code_setting['string_code_model'], $store_id, 1); } self::unionUintFounder($order, $order_pv, $string_code_setting['alliance_scan_qr_code_percent'], $setting, $string_code_setting['string_code_model'],$store_id,$is_scan, 1); } else { $order_pv = OrderDetail::find()->andWhere(['order_id' => $order['id'], 'is_delete' => 0])->select(['sum(pv_0)'])->scalar(); self::stringCodeStorPartner($order, $order_pv, $string_code_setting['string_code_pv_scale_0'], $setting['string_code_brand_partner'], $setting, $is_scan, $string_code_setting['string_code_model'], $store_id, 0); self::unionUintFounder($order, $order_pv, $string_code_setting['string_code_pv_scale_0'], $setting, $string_code_setting['string_code_model'],$store_id,$is_scan, 0); $order_pv = OrderDetail::find()->andWhere(['order_id' => $order['id'], 'is_delete' => 0])->select(['sum(pv_1)'])->scalar(); self::stringCodeStorPartner($order, $order_pv, $string_code_setting['string_code_pv_scale_1'], $setting['string_code_brand_partner'], $setting, $is_scan, $string_code_setting['string_code_model'], $store_id, 1); self::unionUintFounder($order, $order_pv, $string_code_setting['string_code_pv_scale_1'], $setting, $string_code_setting['string_code_model'],$store_id,$is_scan, 1); } //debug_log([__METHOD__, __LINE__, "串码让利 订单金额:{$order_pv} pv:{$string_code_setting['string_code_make_concessions_scan']}"], "app_debug.log"); //debug_log([__METHOD__, __LINE__, "串码让利 店铺推荐人:{$setting['string_code_store_referrer']} 合伙人分红:{$setting['string_code_make_concessions_scan']} 会员所属门店:{$setting['string_code_store_user_affiliated']} 用户推荐人:{$setting['string_code_store_user_referrer']}"], "app_debug.log"); } public static function stringCodeStorPartner($order, $order_pv, $scan_qr_code_percent, $rate, $setting, $is_scan, $string_code_model, $store_id, $model_val) { if (in_array($model_val, $string_code_model)) { ////debug_log([__METHOD__, __LINE__, "大模型比例 : " . ($scan_qr_code_percent / 100)], "app_debug.log"); $add_money = bcmul($order_pv, $scan_qr_code_percent / 100, 4); $money = bcmul($add_money, $rate / 100, 4); ////debug_log([__METHOD__, __LINE__, "大模型:order_pv : " . $order_pv . ',$add_money:' . $add_money . ',$money:' . $money], "app_debug.log"); if (bccomp($money, 0, 4) > 0) { $desc = self::MODEL_NAME_LIST[$model_val] . " " . "订单号:【{$order->order_no}】合伙人分红增加"; PartnerPool::poolPush($order, $money, $desc, $order_pv, $rate, $scan_qr_code_percent, $model_val, $add_money); } } } public static function unionUintFounder($order, $order_pv, $scan_qr_code_percent, $setting, $string_code_model,$store_id,$is_scan, $model_val) { if (in_array($model_val, $string_code_model)) { //debug_log([__METHOD__, __LINE__, "大模型比例 : " . ($scan_qr_code_percent / 100) . ',Store_id:' . $order->store_id, ',order_id:' . $order->id], "app_debug.log"); $add_money = bcmul($order_pv, $scan_qr_code_percent / 100, 4); $money = bcmul($add_money, $setting['string_code_alliance_merchant'] / 100, 4); //debug_log([__METHOD__, __LINE__, "大模型:order_pv : " . $order_pv . ',$add_money:' . $add_money . ',$money:' . $money], "app_debug.log"); $desc = self::MODEL_NAME_LIST[$model_val] . " " . "订单号:【{$order->order_no}】分红增加"; if (bccomp($money, 0, 4) > 0) { StoreUnionPool::poolPush($order, $money, $desc, $order_pv, $setting['string_code_alliance_merchant'], $scan_qr_code_percent, $model_val, $add_money); } $money = bcmul($add_money, $setting['string_code_brand_cofounder'] / 100, 4); //debug_log([__METHOD__, __LINE__, "大模型:order_pv : " . $order_pv . ',$add_money:' . $add_money . ',$money:' . $money], "app_debug.log"); if (bccomp($money, 0, 4) > 0) { UnitFounderPool::poolPush($order, $money, $desc, $order_pv, $setting['string_code_brand_cofounder'], $scan_qr_code_percent, $model_val, $add_money); } if (bccomp($add_money, 0, 4) > 0) { self::hotAwardSend($setting['string_code_hot_district_agent'], $setting['string_code_ad_hot'], $setting['string_code_store_district_agent_divvy'], $add_money, $model_val, $order); self::adAwardSend($order->store_id, $add_money, $setting['string_code_ad_brand'], $setting['string_code_expansion_manager'], $model_val, $order,$setting['string_code_store_push_id']); self::areaAwardSend($order->store_id, $order, $add_money, $model_val, 1);//品牌区县代理 self::areaAwardSend($order->store_id, $order, $add_money, $model_val, 2);//品牌市代理 self::areaAwardSend($order->store_id, $order, $add_money, $model_val, 3);//品牌省代理 self::stringCodeStoreReferrer($order, $setting, $store_id, $add_money, $model_val); self::stringCodeStoreUserAffiliated($order, $setting, $add_money, $model_val); self::stringCodeStoreUserReferrer($order, $setting, $add_money, $model_val); $store = Store::findOne($store_id); self::sendMakeConcessionsScan($order, $setting, $is_scan, $store, $model_val); } } } private static function areaAwardSend($store_id, $order, $order_pv, $model, $area_level) { if ($order_pv <= 0) return false; $setting = Option::getShareSaleSetting(OptionSetting::ALLIANCE_STORE_ID); $store = Store::find()->where(['id' => $store_id])->select(['salesman_id', 'district_id','city_id','province_id'])->asArray()->one(); $salesman_id = $store['salesman_id']; //debug_log([__METHOD__, __LINE__, "============拓展经理:($salesman_id),,广告推流店铺id:" . $store_id], "app_debug.log"); $salesman = Salesman::findOne(['id' => $salesman_id, 'is_delete' => 0, 'status' => 1]); $admin = Admin::findOne(['id' => $salesman->admin_id, 'is_delete' => 0]); $query = Admin::find()->select('saas_user_id')->where(['agent_id' => $salesman->admin_id,'is_enable'=>1,'is_delete'=>0]); switch ($area_level) { case 1: $area = $setting['string_code_brand_district_agent']; $type = UserStringCodeOrder::TYPE_BRAND_DISTRICT_AGENT; $d_query = clone $query; $agent_id = $d_query->andWhere(['district_id' => $store['district_id'], 'area_level' => 1])->scalar() ?: null; if ($agent_id) break; //debug_log([__METHOD__, __LINE__, "============没找到区县代理" ], "app_debug.log"); case 2: if ($area_level == 2) { $type = UserStringCodeOrder::TYPE_BRAND_CITY_AGENT; $area = $setting['string_code_brand_city_agent']; } $c_query = clone $query; $agent_id = $c_query->andWhere(['city_id' => $store['city_id'], 'area_level' => 2])->scalar() ?: null; if ($agent_id) break; //debug_log([__METHOD__, __LINE__, "============没找到市代理" ], "app_debug.log"); case 3: if ($area_level == 3) { $type = UserStringCodeOrder::TYPE_BRAND_PROVINCE_AGENT; $area = $setting['string_code_brand_province_agent']; } $p_query = clone $query; $agent_id = $p_query->andWhere(['province_id' => $store['province_id'], 'area_level' => 3])->scalar() ?: null; break; default: $area = 0; break; } if ($area && $salesman->admin_id) { $area_money = $order_pv * $area / 100; $agent_id = $agent_id ?:($admin->advert_push_user_id?:$setting['string_code_store_push_id']); //debug_log([__METHOD__, __LINE__, "============区县代理商:".$agent_id."金额 : " . ($area_money)], "app_debug.log"); if ($agent_id){ UserStringCodeOrder::transferAddUserWallet($order, $agent_id, $area_money, $type, $model); } } return true; } public static function stringCodeStoreReferrer($order, $setting, $store_id, $transfer_money, $model_val) { $referrer = 0; if ($order instanceof ScanOrder) { if (isset($setting['string_code_store_referrer']) && $setting['string_code_store_referrer'] > 0) { $referrer = $setting['string_code_store_referrer']; } } else { if (isset($setting['string_code_brand_referrer']) && $setting['string_code_brand_referrer'] > 0) { $referrer = $setting['string_code_brand_referrer']; } } if ($referrer > 0) { $store_referral = SaasStoreReferral::findOne(['store_id' => $store_id]); $saas_id = $store_referral['referral_id']; $money = bcmul($transfer_money, $referrer / 100, 4); $type = UserStringCodeOrder::TYPE_STORE_REFERRER; UserStringCodeOrder::transferAddUserWallet($order, $saas_id, $money, $type, $model_val); } } public static function stringCodeStoreUserAffiliated($order, $setting, $transfer_money, $model_val) { $affiliated = 0; if ($order instanceof ScanOrder) { if (isset($setting['string_code_store_user_affiliated']) && $setting['string_code_store_user_affiliated'] > 0) { $affiliated = $setting['string_code_store_user_affiliated']; } } else { if (isset($setting['string_code_brand_user_affiliated']) && $setting['string_code_brand_user_affiliated'] > 0) { $affiliated = $setting['string_code_brand_user_affiliated']; } } if ($affiliated > 0) { $first_store_id = SaasUser::findFirstStoreIdByUserId($order->user_id); $store_admin = Admin::findOne(['type' => 'store', 'type_id' => $first_store_id, 'is_delete' => 0]); $saas_id = $store_admin['saas_user_id']; $money = bcmul($transfer_money, $affiliated / 100, 4); $type = UserStringCodeOrder::TYPE_STORE_USER_AFFILIATED; UserStringCodeOrder::transferAddUserWallet($order, $saas_id, $money, $type, $model_val); } } public static function stringCodeStoreUserReferrer($order, $setting, $transfer_money, $model_val) { $referrer = 0; if ($order instanceof ScanOrder) { if (isset($setting['string_code_store_user_referrer']) && $setting['string_code_store_user_referrer'] > 0) { $referrer = $setting['string_code_store_user_referrer']; } } else { if (isset($setting['string_code_brand_user_referrer']) && $setting['string_code_brand_user_referrer'] > 0) { $referrer = $setting['string_code_brand_user_referrer']; } } if ($referrer > 0) { $user = User::findOne($order->user_id); if ($user->id > 0) { $saas_id = SaasUser::findSaasParentIdByUserId($order->user_id); $money = bcmul($transfer_money, $referrer / 100, 4); $type = UserStringCodeOrder::TYPE_STORE_USER_REFERRER; UserStringCodeOrder::transferAddUserWallet($order, $saas_id, $money, $type, $model_val); } } } public static function sendDistrictStreetAgentDivvy($order, $model_val = 1, $modelType = '街道代理商') { $setting = Option::get(OptionSetting::SHARE_STRING_CODE_SALE_SETTING, self::ALLIANCE_STORE_ID, OptionSetting::SHARE_GROUP_NAME, '{}'); $setting = $setting ? Json::decode($setting['value']) : []; //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】店铺推荐人:{$setting['string_code_store_referrer']} 合伙人分红:{$setting['string_code_store_partner']} 会员所属门店:{$setting['string_code_store_user_affiliated']} 用户推荐人:{$setting['string_code_store_user_referrer']}"], "app_debug.log"); $transfer_money = 0; if ($order instanceof ScanOrder) { $transfer_money = UserStringCodePlus::countOrderPvBonus($order); } if ($transfer_money <= 0.01) { //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType}总待分账金额:{$transfer_money} 小于0.01不分账"], "app_debug.log"); return; } /*if (isset($setting['string_code_store_district_agent_divvy']) && $setting['string_code_store_district_agent_divvy'] > 0) { $money = bcmul($transfer_money, $setting['string_code_store_district_agent_divvy'] / 100, 4); //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType}总待分账金额:{$transfer_money} 门店区县代理商待分账金额:{$money}"], "app_debug.log"); if ($money > 0) { self::getAgentSaasIdByOrder($order, UserStringCodeOrder::TYPE_STRING_CODE_STORE_DISTRICT_AGENT_DIVVY, $money, $model_val, $modelType); } }*/ if (isset($setting['string_code_store_street_agent_divvy']) && $setting['string_code_store_street_agent_divvy'] > 0) { $money = bcmul($transfer_money, $setting['string_code_store_street_agent_divvy'] / 100, 4); //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType}总待分账金额:{$transfer_money} 门店街道代理商待分账金额:{$money}"], "app_debug.log"); if ($money > 0) { self::getAgentSaasIdByOrder($order, UserStringCodeOrder::TYPE_STRING_CODE_STORE_STREET_AGENT_DIVVY, $money, $model_val, $modelType); } } } public static function getModelSwitchBySettingArray($string_code_model_arr) { // 如果是字符串,自动转成数组 if (!isset($string_code_model_arr) || !is_array($string_code_model_arr)) { $string_code_model_arr = is_string($string_code_model_arr) ? explode(',', $string_code_model_arr) : []; } $model_switch_shop = in_array(0, $string_code_model_arr) ? 1 : 0; $model_switch_alliance = in_array(1, $string_code_model_arr) ? 1 : 0; return [$model_switch_shop, $model_switch_alliance]; } /** * 获取根结点用户ID * @param $store_id * @param $string_code_model * @return int */ public static function getRootUserId($store_id, $string_code_model) { if ($string_code_model == self::MODEL_ALLIANCE) { $store_id = self::ALLIANCE_STORE_ID; } $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}'); $setting = $setting ? Json::decode($setting['value']) : []; return isset($setting['string_code_root_user_id']) && $setting['string_code_root_user_id'] ? (int)$setting['string_code_root_user_id'] : 0; } /** * 设置根结点用户ID * todo 根结点改为后台手选,废弃 * @param $store_id * @param $string_code_model * @return int */ public static function setRootUserId($store_id, $user_id) { $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}'); $setting = $setting ? Json::decode($setting['value']) : []; $check_res = self::checkSettingByStoreId($store_id, $setting); if (!$check_res) { //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】设置条件不满足"], "app_debug.log"); return false; } $first_order_user = Order::find()->where( [ 'is_delete' => 0, 'trade_status' => Order::ORDER_FLOW_CONFIRM, 'store_id' => $store_id ] )->andWhere(['or', ['is_pay' => 1], ['pay_type' => 2]])->orderBy('pay_time DESC')->select('user_id')->column(); if ($first_order_user) { $setting['string_code_root_user_id'] = $first_order_user; $json = json_encode($setting); Option::set(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $json, $store_id, OptionSetting::SHARE_GROUP_NAME); return true; } $first_scan_order_user = ScanOrder::find()->where( [ 'is_delete' => 0, 'trade_status' => Order::ORDER_FLOW_CONFIRM, 'store_id' => $store_id, 'is_pay' => 1 ] )->select('user_id')->orderBy('pay_time DESC')->column(); if ($first_scan_order_user) { $setting['string_code_root_user_id'] = $first_scan_order_user; $json = json_encode($setting); Option::set(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $json, $store_id, OptionSetting::SHARE_GROUP_NAME); return true; } return true; } /** * 发放串码红包 * @param $order * @return bool */ public static function sendRedPacket($order, $is_scan) { $order_id = $order->id; $store_id = $order->store_id; $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}'); $setting = $setting ? Json::decode($setting['value']) : []; $check_res = self::checkSettingByStoreId($store_id, $setting); if (!$check_res) { //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】设置条件不满足"], "app_debug.log"); return false; } $ids = UserStringCodeOrder::find() ->where(['order_id' => $order_id, 'status' => 0]) ->andWhere(['in', 'type', [UserStringCodeOrder::TYPE_BRAND_RED_PACKET, UserStringCodeOrder::TYPE_STORE_RED_PACKET, UserStringCodeOrder::TYPE_BRAND_TEAM_PARTNER, UserStringCodeOrder::TYPE_STORE_TEAM_PARTNER]]) ->select('id') ->column(); if (!$ids) { //debug_log([__METHOD__, __LINE__, "串码红包发放 订单id:【{$order_id}】店铺:【{$store_id}】待发放订单为空"], "app_debug.log"); return false; } foreach ($ids as $item_id) { $string_code_order = UserStringCodeOrder::findOne($item_id); $money = $string_code_order->money; $model_val = $string_code_order->model_val; if ($string_code_order->store_id == self::ALLIANCE_STORE_ID) { $to_user_id = $string_code_order->saas_id; } else { $to_user_id = $string_code_order->user_id; } //debug_log([__METHOD__, __LINE__, self::MODEL_NAME_LIST[$model_val] . " " . "串码红包发放 记录:【{$item_id}】,店铺:【{$store_id}】用户:【{$to_user_id}】,红包金额:【{$money}】"], "app_debug.log"); $log_type = $is_scan ? UserWallet::TYPE_SCAN : UserWallet::TYPE_ORDER; $log_desc = self::MODEL_NAME_LIST[$model_val] . " " . UserWallet::TYPE_NAME_LIST[$log_type] . "【{$order->order_no}】 发放串码红包"; $source_table = $is_scan ? "\app\plugins\scanCodePay\models\Order" : "app\models\Order"; $currency = Currency::findOne(['code' => Currency::CURRENCY_STRING_CODE]); UserWallet::addLog($currency, $string_code_order->store_id, $to_user_id, $money, $log_desc, $log_type, $source_table, $order_id,$string_code_order->store_id,$string_code_order->type); } UserStringCodeOrder::updateAll( ['status' => UserStringCodeOrder::STATUS_SUCCESS], [ 'and', ['order_id' => $order_id, 'status' => 0], ['in', 'type', [UserStringCodeOrder::TYPE_BRAND_RED_PACKET, UserStringCodeOrder::TYPE_STORE_RED_PACKET, UserStringCodeOrder::TYPE_BRAND_TEAM_PARTNER, UserStringCodeOrder::TYPE_STORE_TEAM_PARTNER]] ] ); return true; } /** * 指定用户上级所有节点团队人数 + 1 * @param $store_id * @param $user_id * @return int */ public static function setTeamCountInc($store_id, $user_id) { $parent_node_ids = self::getAllParentNodeIds($store_id, $user_id); if ($parent_node_ids) { return self::updateAll( ['team_num' => new Expression('team_num + 1')], ['in', 'user_id', $parent_node_ids] ); } else { return 0; } } /** * 获取用户最后一个节点 * 从上至下,从左至右 * @param $store_id 店铺ID * @param $user_id 下单用户ID * @param $parent_id 下单用户上级ID * @param $max_layer 限制最大层数 * @return array */ public static function getRealParentNode($store_id, $order_user_id, $parent_id, $max_layer) { // 针对父节点对应的区 $real_area_key = 0; // 针对根节点对应的排序 $real_layer_rank = 0; $parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $parent_id]); $children_list = self::findOne(['store_id' => $store_id, 'parent_node' => $parent_id]); // 未有子节点 if (!$children_list) { //debug_log([__METHOD__, __LINE__, "未有子节点"], "app_debug.log"); $real_parent_node = $parent_node; return [$real_parent_node, $real_area_key, $real_layer_rank]; } // 先判断 最大层级下 第一列能否能占位 $temp_parent_id = $parent_id; //debug_log([__METHOD__, __LINE__, "最大层数:{$max_layer}"], "app_debug.log"); for ($i = 0; $i < $max_layer; $i++) { //debug_log([__METHOD__, __LINE__, "第1区循环:{$i},用户ID:{$temp_parent_id}"], "app_debug.log"); $temp_node = self::findOne(['store_id' => $store_id, 'parent_node' => $temp_parent_id, 'area_key' => $real_area_key]); if (!$temp_node) { $real_parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $temp_parent_id]); return [$real_parent_node, $real_layer_rank, $real_area_key]; } else { $temp_parent_id = $temp_node['user_id']; } } $queue = []; $queue[] = $parent_node; while (!empty($queue)) { // 当前节点 $current_node = array_shift($queue); // 当前层数 $current_layer = $current_node['layer_node'] - $parent_node['layer_node']; //debug_log([__METHOD__, __LINE__, "当前节点ID:{$current_node['user_id']},当前层数:{$current_layer}"], "app_debug.log"); // 判断用户第1区有无落点 $parent_first_col_auth = self::findOne(['store_id' => $store_id, 'parent_node' => $current_node['user_id'], 'area_key' => 0]); if (!$parent_first_col_auth) { $real_area_key = 0; //debug_log([__METHOD__, __LINE__, "当前节点ID:{$current_node['user_id']},1区没人,落第1区"], "app_debug.log"); $real_parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $current_node['user_id']]); $current_layer_rank = self::find() ->where(['store_id' => $store_id, 'layer_node' => $real_parent_node['layer_node'] + 1]) ->max('layer_rank'); $real_layer_rank = $current_layer_rank + 1; return [$real_parent_node, $real_layer_rank, $real_area_key]; } // 判断用户能否开第2区 $parent_second_col_auth = self::checkSecondColumnAuthPlus($store_id, $order_user_id, $current_node['user_id'], $max_layer); if ($parent_second_col_auth) { // 判断第2区第一个有无占位 $real_area_key = 1; $temp_node = self::findOne(['store_id' => $store_id, 'parent_node' => $current_node['user_id'], 'area_key' => $real_area_key]); if (!$temp_node) { //debug_log([__METHOD__, __LINE__, "当前节点ID:{$current_node['user_id']},可开第2区,落第2区"], "app_debug.log"); $real_parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $current_node['user_id']]); $current_layer_rank = self::find() ->where(['store_id' => $store_id, 'layer_node' => $real_parent_node['layer_node'] + 1]) ->max('layer_rank'); $real_layer_rank = $current_layer_rank + 1; return [$real_parent_node, $real_layer_rank, $real_area_key]; } } // 判断用户能否开第3区 $parent_multi_col_auth = self::checkMultiColumnAuth($store_id, $current_node['user_id']); if ($parent_multi_col_auth) { // 判断第3区第一个有无占位 $real_area_key = 2; $temp_node = self::findOne(['store_id' => $store_id, 'parent_node' => $current_node['user_id'], 'area_key' => $real_area_key]); if (!$temp_node) { //debug_log([__METHOD__, __LINE__, "当前节点ID:{$current_node['user_id']},可开第3区,落第3区"], "app_debug.log"); $real_parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $current_node['user_id']]); $current_layer_rank = self::find() ->where(['store_id' => $store_id, 'layer_node' => $real_parent_node['layer_node'] + 1]) ->max('layer_rank'); $real_layer_rank = $current_layer_rank + 1; return [$real_parent_node, $real_layer_rank, $real_area_key]; } } // 查询当前节点的子节点(假设最多有3个子节点情况,根据实际parent_id关联查询) $children_nodes = self::find()->where(['store_id' => $store_id, 'parent_node' => $current_node['user_id']])->orderBy("area_key ASC")->all(); if ($children_nodes) { foreach ($children_nodes as $node) { $queue[] = $node; } } } } /** * 获取用户最后一个节点 * 深度优先,从左至右 左子树满20层,右子树第一个节点满20层,再层次落点 * @param $store_id 店铺ID * @param $user_id 下单用户ID * @param $parent_id 下单用户上级ID * @param $max_layer 限制最大层数 * @param $model_val 0=单店,1=联盟 * @return array */ public static function getRealParentNodePlus($store_id, $order_user_id, $parent_id, $max_layer, $model_val, $string_code_shop_value = 0) { // 针对父节点对应的区 $real_area_key = 0; // 针对根节点对应的排序 $real_layer_rank = 0; // $parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $parent_id]); // $children_list = self::findOne(['store_id' => $store_id, 'parent_node' => $parent_id]); $parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $parent_id]); if (!$parent_node) { ///推荐人不在点位表中 $tmepparent_node = $parent_node; //赋初始值 $whereuser = SaasUser::findOne($parent_id); //找推荐人看一下 $tempparent_id = $whereuser['parent_id']; $parent_id = $tempparent_id; while ($tempparent_id != 0 && !$tmepparent_node) { $tmepparent_node = self::findOne(['store_id' => $store_id, 'user_id' => $tempparent_id]); if (!$tmepparent_node) { $whereuser = SaasUser::findOne($tempparent_id); $tempparent_id = $whereuser['parent_id']; } else { $parent_node = $tmepparent_node; break; } //循环加入查找推荐人信息 $parent_id = $tempparent_id; } } // 小杨新增 if (!$parent_node) { ///推荐人不在点位表中 if ($store_id < 0) { // $parent_id ==》 saas_id $tmepparent_node = $parent_node; //赋初始值 $whereuser = SaasUser::findOne($parent_id); //找推荐人看一下 $tempparent_id = $whereuser['parent_id']; $parent_id = $tempparent_id; while ($tempparent_id != 0 && !$tmepparent_node) { $tmepparent_node = self::findOne(['store_id' => $store_id, 'user_id' => $tempparent_id]); if (!$tmepparent_node) { $whereuser = SaasUser::findOne($tempparent_id); $tempparent_id = $whereuser['parent_id']; } else { $parent_node = $tmepparent_node; break; } //循环加入查找推荐人信息 $parent_id = $tempparent_id; } } else { // $parent_id ==》 user_id $parentUser = User::findOne($parent_id); $parent_id = 0; //查不到节点 $parent_id 置为 0,重新查 //userid的binding查询SaaSID,通过saasId查询下一级推荐关系 if (!empty($parentUser) && !empty($parentUser['binding'])) { $saasUser = SaasUser::findOne(['mobile' => $parentUser['binding']]); if (!empty($saasUser) && !empty($saasUser['parent_id'])) { $parentSaasId = $saasUser['parent_id']; $parentSaasIdArr = []; //循环的saasId避免推荐人是自己导致死循环 while (!empty($parentSaasId)) { //debug_log([__METHOD__, __LINE__, "加入节点店铺:【{$store_id}】,推荐人SaaSID:{$parentSaasId},已查过的推荐人SaaSID:" . json_encode($parentSaasIdArr, JSON_UNESCAPED_UNICODE)], "app_debug.log"); if (in_array($parentSaasId, $parentSaasIdArr)) break; $parentSaasIdArr[] = $parentSaasId; $parentSaasUser = SaasUser::findOne($parentSaasId); if (!empty($parentSaasUser)) { $parentUser = User::findOne(['binding' => $parentSaasUser['mobile'], 'store_id' => $store_id]); if (!empty($parentUser)) { $childrenList = self::findOne(['store_id' => $store_id, 'parent_node' => $parentUser['id']]); if (!empty($childrenList)) { $parent_id = $parentUser['id']; //debug_log([__METHOD__, __LINE__, "加入节点店铺:【{$store_id}】,已查到节点用户推荐人SaaSID:【{$parentSaasId}】,UserID:【{$parentUser['id']}】"], "app_debug.log"); break; } else { $parentSaasId = $parentSaasUser['parent_id']; } } else { $parentSaasId = $parentSaasUser['parent_id']; } } } } } //debug_log([__METHOD__, __LINE__, "加入节点店铺:【{$store_id}】,父节点:{$parent_id}"], "app_debug.log"); //都查不到用string_code_root_user_id if (empty($parent_id)) { $string_code_root_user_id = self::getRootUserId($store_id, self::MODEL_SHOP); $parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $string_code_root_user_id]); if (!$parent_node) { //debug_log([__METHOD__, __LINE__, "加入节点店铺:【{$store_id}】,根节点用户:{$string_code_root_user_id}不存在"], "app_debug.log"); return [null, $real_area_key, $real_layer_rank]; } $parent_id = $parent_node['user_id']; //debug_log([__METHOD__, __LINE__, "加入节点店铺:【{$store_id}】,根节点用户:{$parent_id}"], "app_debug.log"); } } } //debug_log([__METHOD__, __LINE__, "加入节点店铺:【{$store_id}】,父节点:{$parent_id}"], "app_debug.log"); $children_list = self::findOne(['store_id' => $store_id, 'parent_node' => $parent_id]); // 未有子节点 if (!$children_list) { //debug_log([__METHOD__, __LINE__, "{$parent_id} 未有子节点"], "app_debug.log"); $real_parent_node = $parent_node; return [$real_parent_node, $real_area_key, $real_layer_rank]; } //debug_log([__METHOD__, __LINE__, "门店模型{$string_code_shop_value}"], "app_debug.log"); // 默认品牌模型 if ($string_code_shop_value == 0) { // 先判断 最大层级下 左区是否能占位 $temp_parent_id = $parent_id; //debug_log([__METHOD__, __LINE__, "推荐人:{$parent_id},1-区:{$max_layer} 查找"], "app_debug.log"); for ($i = 0; $i < $max_layer; $i++) { //debug_log([__METHOD__, __LINE__, "1-区 循环:{$i},用户ID:{$temp_parent_id}"], "app_debug.log"); $temp_node = self::findOne(['store_id' => $store_id, 'parent_node' => $temp_parent_id, 'area_key' => 0]); if (!$temp_node) { $real_parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $temp_parent_id]); return [$real_parent_node, $real_layer_rank, $real_area_key]; } else { $temp_parent_id = $temp_node['user_id']; } } // 再判断 最大层级下 右区是否能占位 // 判断推荐人能否开第2区 $parent_second_col_auth = self::checkSecondColumnAuth($store_id, $order_user_id, $parent_id); if ($parent_second_col_auth) { // 判断第2-区第一个有无占位 //debug_log([__METHOD__, __LINE__, "推荐人:{$parent_id},2-区可开"], "app_debug.log"); $temp_node = self::findOne(['store_id' => $store_id, 'parent_node' => $parent_id, 'area_key' => 1]); if (!$temp_node) { $real_parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $parent_id]); $current_layer_rank = self::find() ->where(['store_id' => $store_id, 'layer_node' => $real_parent_node['layer_node'] + 1]) ->max('layer_rank'); $real_layer_rank = $current_layer_rank + 1; return [$real_parent_node, $real_layer_rank, 1]; } else { // 先判断 最大层级下 右区是否能占位 $temp_parent_id = $temp_node['user_id']; //debug_log([__METHOD__, __LINE__, "推荐人:{$parent_id},2-区:{$max_layer} 查找"], "app_debug.log"); for ($i = 0; $i < $max_layer - 1; $i++) { //debug_log([__METHOD__, __LINE__, "2-区 循环:{$i},用户ID:{$temp_parent_id}"], "app_debug.log"); $temp_node = self::findOne(['store_id' => $store_id, 'parent_node' => $temp_parent_id, 'area_key' => 0]); if (!$temp_node) { $real_parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $temp_parent_id]); return [$real_parent_node, $real_layer_rank, 0]; } else { $temp_parent_id = $temp_node['user_id']; } } } } else { //debug_log([__METHOD__, __LINE__, "推荐人:{$parent_id},2-区不可开"], "app_debug.log"); } $queue = []; $queue[] = $parent_node; $search_layer = 0; // 搜索层数 while (!empty($queue)) { $n = count($queue); // 层序遍历 for ($i = 0; $i < $n; $i++) { // 变量 i 无实际意义,只是为了循环 n 次 // 当前节点 $current_node = array_shift($queue); //debug_log([__METHOD__, __LINE__, "当前节点ID:{$current_node['user_id']},搜索层数:{$search_layer}"], "app_debug.log"); // 判断用户第1-区有无落点 $parent_first_col_auth = self::findOne(['store_id' => $store_id, 'parent_node' => $current_node['user_id'], 'area_key' => 0]); if (!$parent_first_col_auth) { $real_area_key = 0; //debug_log([__METHOD__, __LINE__, "当前节点ID:{$current_node['user_id']},1-区没人,落第1-区"], "app_debug.log"); $real_parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $current_node['user_id']]); $current_layer_rank = self::find() ->where(['store_id' => $store_id, 'layer_node' => $real_parent_node['layer_node'] + 1]) ->max('layer_rank'); $real_layer_rank = $current_layer_rank + 1; return [$real_parent_node, $real_layer_rank, $real_area_key]; } // 大于最大限制层数 // 查询当前节点的子节点 $children_nodes = self::find()->where(['store_id' => $store_id, 'parent_node' => $current_node['user_id']])->orderBy("area_key ASC")->all(); if ($children_nodes) { foreach ($children_nodes as $node) { $queue[] = $node; } } $search_layer++; } } } // 门店模型 if ($string_code_shop_value == 1) { // 直线推荐关系,逐级查找父节点直到满足条件 $current_node = self::findOne(['store_id' => $store_id, 'user_id' => $parent_id]); // 从父节点开始,逐级向上查找父节点直到满足条件 while ($current_node) { //debug_log([__METHOD__, __LINE__, "当前节点ID:{$current_node['user_id']}"], "app_debug.log"); // 判断左区是否可以占位 $parent_first_col_auth = self::findOne(['store_id' => $store_id, 'parent_node' => $current_node['user_id'], 'area_key' => 0]); if (!$parent_first_col_auth) { $real_area_key = 0; // 1-区没人,落第1-区 //debug_log([__METHOD__, __LINE__, "当前节点ID:{$current_node['user_id']},1-区没人,落第1-区"], "app_debug.log"); // 查找父节点并返回 $real_parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $current_node['user_id']]); $current_layer_rank = self::find() ->where(['store_id' => $store_id, 'layer_node' => $real_parent_node['layer_node'] + 1]) ->max('layer_rank'); $real_layer_rank = $current_layer_rank + 1; return [$real_parent_node, $real_layer_rank, $real_area_key]; // 返回左区的位置 } // 如果左区占位,继续向上查找 $current_node = self::findOne(['store_id' => $store_id, 'user_id' => $current_node['parent_node']]); } } } /** * 获取用户最后一个节点 * 深度优先,从左至右 落满左区成完全树 * @param $store_id 店铺ID * @param $user_id 下单用户ID * @param $parent_id 下单用户上级ID * @param $max_layer 限制最大层数 * @return array */ public static function getRealParentNodeBack($store_id, $order_user_id, $parent_id, $max_layer) { // 针对父节点对应的区 $real_area_key = 0; // 针对根节点对应的排序 $real_layer_rank = 0; $parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $parent_id]); $children_list = self::findOne(['store_id' => $store_id, 'parent_node' => $parent_id]); // 未有子节点 if (!$children_list) { //debug_log([__METHOD__, __LINE__, "未有子节点"], "app_debug.log"); $real_parent_node = $parent_node; return [$real_parent_node, $real_area_key, $real_layer_rank]; } $queue = []; $queue[] = $parent_node; $search_layer = 0; // 搜索层数 while (!empty($queue)) { $n = count($queue); // 层序遍历 for ($i = 0; $i < $n; $i++) { // 变量 i 无实际意义,只是为了循环 n 次 // 当前节点 $current_node = array_shift($queue); //debug_log([__METHOD__, __LINE__, "当前节点ID:{$current_node['user_id']},搜索层数:{$search_layer}"], "app_debug.log"); if ($search_layer < $max_layer) { // 小于最大限制层级 // 深度优先 $max_layer - $search_layer 控制遍历层次深度 $res = self::findLastNode($store_id, $order_user_id, $current_node, $max_layer - $search_layer); if ($res) { return $res; } } // 大于最大限制层数 // 查询当前节点的子节点 $children_nodes = self::find()->where(['store_id' => $store_id, 'parent_node' => $current_node['user_id']])->orderBy("area_key ASC")->all(); if ($children_nodes) { foreach ($children_nodes as $node) { $queue[] = $node; } } $search_layer++; } } } /** * 算法查找最后落点 * @param $store_id 店铺id * @param UserStringCodePlus $node 节点 * @param $depth 查找深度 * @param $remain_node * @return array */ public static function findLastNode($store_id, $order_user_id, $node, $depth, $remain_node = []) { //debug_log([__METHOD__, __LINE__, "算法查找最后落点:{$node['user_id']},深度层数:{$depth}"], "app_debug.log"); if ($depth < 0 && !$remain_node) { // 还有剩余节点,继续找 $temp_node = array_shift($remain_node); $depth = $temp_node['layer_node']; return self::findLastNode($store_id, $order_user_id, $temp_node, $depth, $remain_node); } if ($depth < 0 && empty($remain_node)) { return null; } // 针对父节点对应的区 $real_area_key = 0; // 针对根节点对应的排序 $real_layer_rank = 0; // 左子树队列 不包括 根节点 $left_queue = []; // 先左子数查满层 $temp_parent_id = $node['user_id']; for ($i = 0; $i < $depth; $i++) { $temp_node = UserStringCodePlus::findOne(['store_id' => $store_id, 'parent_node' => $temp_parent_id, 'area_key' => $real_area_key]); if (!$temp_node) { $real_parent_node = UserStringCodePlus::findOne(['store_id' => $store_id, 'user_id' => $temp_parent_id]); //debug_log([__METHOD__, __LINE__, "A区深度查找:节点未占,落点:{$temp_parent_id},深度层数:{$depth},A区循环:{$i}"], "app_debug.log"); return [$real_parent_node, $real_layer_rank, $real_area_key]; } else { //debug_log([__METHOD__, __LINE__, "A区深度查找:节点被{$temp_node['user_id']}占点,深度层数:{$depth},A区循环:{$i}"], "app_debug.log"); $temp_parent_id = $temp_node['user_id']; $left_queue[] = $temp_node; $remain_node[] = $temp_node; } } //debug_log([__METHOD__, __LINE__, "算法查找最后落点:{$node['user_id']},A区深度:{$depth} 找不到落点"], "app_debug.log"); // 除了根结点,深度减 1 $depth = $depth - 1; //debug_log([__METHOD__, __LINE__, "算法查找最后落点:{$node['user_id']},深度层数:{$depth}"], "app_debug.log"); foreach ($left_queue as $index => $item_node) { // 判断用户能否开第2区 $parent_second_col_auth = self::checkSecondColumnAuth($store_id, $order_user_id, $item_node['user_id']); if ($parent_second_col_auth) { // 判断第2区第一个有无占位 //debug_log([__METHOD__, __LINE__, "算法查找最后落点:{$item_node['user_id']},B区可开"], "app_debug.log"); $real_area_key = 1; $temp_node = UserStringCodePlus::findOne(['store_id' => $store_id, 'parent_node' => $item_node['user_id'], 'area_key' => $real_area_key]); if (!$temp_node) { $real_parent_node = UserStringCodePlus::findOne(['store_id' => $store_id, 'user_id' => $item_node['user_id']]); $current_layer_rank = UserStringCodePlus::find() ->where(['store_id' => $store_id, 'layer_node' => $real_parent_node['layer_node'] + 1]) ->max('layer_rank'); $real_layer_rank = $current_layer_rank + 1; return [$real_parent_node, $real_layer_rank, $real_area_key]; } else { return self::findLastNode($store_id, $order_user_id, $temp_node, $depth - $index - 1, $remain_node); } } else { //debug_log([__METHOD__, __LINE__, "算法查找最后落点:{$item_node['user_id']},B区不可开"], "app_debug.log"); } } // A 区满,又不可开B区 return null; } /** * 判断用户是否能开第 2 区 * 条件 直推一个且已排位置 就可开通 2 区 * @param $store_id * @param $user_id * @param $max_layer * @return bool */ public static function checkSecondColumnAuth($store_id, $order_user_id, $user_id) { if ($store_id == self::ALLIANCE_STORE_ID) { $invite_user_ids = SaasUser::find() ->where(['parent_id' => $user_id]) ->select('id') ->column(); } else { $invite_user_ids = User::find() ->where(['store_id' => $store_id, 'parent_id' => $user_id]) ->column(); } $node = self::find() ->where(['store_id' => $store_id]) ->andWhere(['in', 'user_id', $invite_user_ids]) ->select('id') ->one(); if ($node) { return true; } else { return false; } } /** * 深度优先搜索 * @param $node * @return mixed */ public static function findLastNodeDFS($node, $depth, $current_depth = 0) { // 达到指定深度,退出 if ($current_depth + 1 >= $depth) { return null; } $last_node = $node; $children_nodes = self::find()->where(['store_id' => $last_node['store_id'], 'parent_node' => $last_node['user_id']])->orderBy("area_key ASC")->all(); // 判断右子树是否有 // 递归处理所有子树 foreach ($children_nodes as $children_node) { $temp = self::findLastNodeDFS($children_node, $depth, $current_depth + 1); if ($temp) { $last_node = $temp; } } return $last_node; } /** * 获取用户最后一个节点 * 从上至下,从左至右 * @param $store_id 店铺ID * @param $parent_id 上级ID * @return array */ public static function findLastNodeBFS($store_id, $parent_id) { $parent_node = self::findOne(['store_id' => $store_id, 'user_id' => $parent_id]); $queue = []; $queue[] = $parent_node; $search_layer = 0; // 搜索层数 while (!empty($queue)) { $n = count($queue); // 层序遍历 for ($i = 0; $i < $n; $i++) { // 变量 i 无实际意义,只是为了循环 n 次 // 当前节点 $current_node = array_shift($queue); // //debug_log([__METHOD__, __LINE__, "当前节点ID:{$current_node['user_id']},搜索层数:{$search_layer}"], "app_debug.log"); echo "搜索层数:{$search_layer}:{$current_node['user_id']} \n"; // 大于最大限制层数 // 查询当前节点的子节点 $children_nodes = self::find()->where(['store_id' => $store_id, 'parent_node' => $current_node['user_id']])->orderBy("area_key ASC")->all(); if ($children_nodes) { foreach ($children_nodes as $node) { $queue[] = $node; } } $search_layer++; } } } public static function getAllParentIds($user_id) { $relation = self::findOne(['user_id' => $user_id]); $recommon_relation = trim($relation['recommend_relation'], ','); if (!$recommon_relation) return []; return explode(',', $recommon_relation); } /** * 获取所有上级节点 user_ids * @param $store_id * @param $user_id * @return array|false|string[] */ public static function getAllParentNodeIds($store_id, $user_id) { $relation = self::findOne(['store_id' => $store_id, 'user_id' => $user_id]); $recommon_relation_node = trim($relation['recommend_relation_node'], ','); if (!$recommon_relation_node) return []; return explode(',', $recommon_relation_node); } public static function getAllParentNodeIdsAll($store_id, $user_id,$is_scan=0) { if($is_scan == 0){ $users = \Yii::$app->db->createCommand(" SELECT * FROM cyy_user WHERE id = :id ", [ ':id' => $user_id ])->queryOne(); $saas_user = \Yii::$app->db->createCommand(" SELECT * FROM cyy_saas_user WHERE mobile = :mobile ", [ ':mobile' => $users['binding'] ])->queryOne(); if($store_id == -1){ $saas_user = \Yii::$app->db->createCommand(" SELECT * FROM cyy_saas_user WHERE id = :id ", [ ':id' => $user_id ])->queryOne(); } $ranking_user = \Yii::$app->db->createCommand(" SELECT * FROM ysdl_ranking_user WHERE store_id = :storeId AND saas_user_id = :saasUserId ", [ ':storeId' => $store_id, ':saasUserId' => $saas_user['id'] ])->queryOne(); if ($ranking_user) { $ranking_user_list = str_replace(['[', ']'], '', $ranking_user['tree_saas_path']); if (!empty($ranking_user_list)) { $ranking_user_list_array = explode(',', $ranking_user_list); } else { $ranking_user_list_array = []; } $ranking_user_list_array [] = SaasUser::findSaasIdByUserId($user_id);; $new_ranking_user_list = []; if (!empty($ranking_user_list_array)) { foreach ($ranking_user_list_array as $key => &$val) { $rank_info = \Yii::$app->db->createCommand(" SELECT node_valid FROM ysdl_ranking_user WHERE store_id = :storeId AND saas_user_id = :saasUserId ", [ ':storeId' => $store_id, ':saasUserId' => $val ])->queryOne(); if ($rank_info['node_valid'] == 1) { $mobile = \Yii::$app->db->createCommand(" SELECT mobile FROM cyy_saas_user WHERE id = :userId ", [ ':userId' => $val ])->queryScalar(); $new_ranking_user_list[] = \Yii::$app->db->createCommand(" SELECT id FROM cyy_user WHERE binding = :binding AND store_id = :storeId LIMIT 1 ", [ ':binding' => $mobile, ':storeId' => $store_id ])->queryScalar(); } else { unset($ranking_user_list_array[$key]); } } } if ($store_id == -1) { return $ranking_user_list_array; } else { return $new_ranking_user_list; } } else { if ($store_id == -1) { return [SaasUser::findSaasIdByUserId($user_id)]; } else { return [$user_id]; } } } else { sleep(1); $relation = self::findOne(['store_id' => $store_id, 'user_id' => $user_id]); if ($relation) { $recommon_relation_node = trim($relation['recommend_relation_node'], ','); $recommon_relation_node =$recommon_relation_node.",".$user_id; if (!$recommon_relation_node) return [-1]; return explode(',', $recommon_relation_node); } else { return [$user_id]; } $recommon_relation_node = trim($relation['recommend_relation_node'], ','); $recommon_relation_node =$recommon_relation_node.",".$user_id; if (!$recommon_relation_node) return [$user_id]; return explode(',', $recommon_relation_node); } /*$relation = self::findOne(['store_id' => $store_id, 'user_id' => $user_id]); if ($relation) { $recommon_relation_node = trim($relation['recommend_relation_node'], ','); if (!$recommon_relation_node) return [-1]; return explode(',', $recommon_relation_node); } else { return []; }*/ } public static function getChildNodeIdsByUserId($user_id, $area_key = '', $level = 0, $scope = 'all') { $user_node = self::find()->select(['layer_node'])->where(['user_id' => $user_id])->asArray()->one(); $layer_node = (int)$user_node['layer_node']; $query = self::find()->select(['user_id'])->where(['like', 'recommend_relation_node', (',' . $user_id . ',')]); if ($area_key) $query->andWhere(['area_key' => $area_key]); //查询多N代全部子用户 if ($level > 0 && $scope == 'all') $query->andWhere(['>=', 'layer_node', $level + $layer_node]); //查询指定代子用户 if ($level > 0 && $scope == 'equal') $query->andWhere(['=', 'layer_node', $level + $layer_node]); return $query->asArray()->column(); } /** * 查询用户指定部门的所有用户 * @param $user_id * @param $node_key * @return array */ public static function getChildNodeIdsByNodeKey($user_id, $department_key) { // if ($department_key) { // // 其他 部门 // $first_node = self::find()->select(['user_id']) // ->where(['parent_id' => $user_id, 'node_key' => $department_key]) // ->asArray() // ->one(); // if (!$first_node) return []; // $res = self::find()->select(['user_id']) // ->where(['or', ['user_id' => $first_node['user_id']], ['like', 'recommend_relation_node', (',' . $first_node['user_id'] . ',')]]) // ->asArray()->column(); // } else { // // A 部门 // $res = self::find()->select(['user_id']) // ->where(['like', 'recommend_relation_node', (',' . $user_id . ',')]) // ->asArray()->column(); // } $res = UserNodeDepartment::find()->select(['child_id']) ->where(['user_id' => $user_id, 'department_key' => $department_key]) ->asArray()->column(); return $res; } public static function getAllParentList($user_id) { $relation = self::findOne(['user_id' => $user_id]); $recommon_relation = trim($relation['recommend_relation'], ','); $relation_arr = explode(',', $recommon_relation); if (empty($relation_arr)) { return []; } $list = Share::find()->alias('s')->where(array('in', 's.user_id', $relation_arr)) ->andWhere(['sl.is_delete' => 0]) ->leftJoin(['sl' => ShareLevel::tableName()], 'sl.level=s.level') ->select('s.user_id, sl.order_layer, sl.point_reward') ->asArray() ->all(); if (empty($list)) { return []; } $level_list = ArrayHelper::index($list, "user_id"); $res = []; foreach ($relation_arr as $v) { $temp = []; $temp['user_id'] = $v; $temp['order_layer'] = $level_list[$v]['order_layer'] ?? 0; $temp['point_reward'] = $level_list[$v]['point_reward'] ?? 0; $temp['is_bonus'] = isset($level_list[$v]); $res[] = $temp; } return $res; } public static function getAllParentNodeList($user_id) { $relation = self::findOne(['user_id' => $user_id]); $recommon_relation_node = trim($relation['recommend_relation_node'], ','); $relation_arr = explode(',', $recommon_relation_node); if (empty($relation_arr)) { return []; } $list = Share::find()->alias('s')->where(array('in', 's.user_id', $relation_arr)) ->andWhere(['sl.is_delete' => 0]) ->leftJoin(['sl' => ShareLevel::tableName()], 'sl.level=s.level') ->select('s.user_id, sl.order_layer, sl.point_reward') ->asArray() ->all(); if (empty($list)) { return []; } $level_list = ArrayHelper::index($list, "user_id"); $res = []; foreach ($relation_arr as $v) { $temp = []; $temp['user_id'] = $v; $temp['order_layer'] = $level_list[$v]['order_layer'] ?? 0; $temp['point_reward'] = $level_list[$v]['point_reward'] ?? 0; $temp['is_bonus'] = isset($level_list[$v]); $res[] = $temp; } return $res; } public static function getRecommendRelationByUserId($user_id) { $res = ""; $parentList = []; self::getParentList($user_id, $parentList); if ($parentList) { $res = "," . implode(',', array_reverse($parentList)) . ","; } return $res; } public static function getParentList($user_id, &$parentList) { $user = User::findOne(['id' => $user_id]); if ($user['parent_id']) { $parentList[] = $user['parent_id']; $parent = User::findOne(['id' => $user['parent_id']]); if ($parent) { return self::getParentList($parent['id'], $parentList); } } return $parentList; } public static function getLayerByUserId($user_id) { $res = 1; $parentList = []; self::getParentList($user_id, $parentList); if ($parentList) { $res += count($parentList); } return $res; } public static function createRootNode($store_id, $user_id) { $root_node = self::findOne(['store_id' => $store_id, 'user_id' => $user_id]); if (!$root_node) { $saas_user_id = SaasUser::findSaasIdByUserId($user_id); $root_node = new UserStringCodePlus(); $root_node->store_id = $store_id; $root_node->user_id = $user_id; $root_node->area_key = 0; $root_node->recommend_relation = ""; $root_node->recommend_relation_node = ""; $root_node->saas_id = $saas_user_id; if (!$root_node->save()) { //debug_log([__METHOD__, __LINE__, "用户:{$user_id},节点信息保存失败"], "app_debug.log"); } } return $root_node; } public static function createUserNode($store_id, $user_id) { $user_node = UserStringCodePlus::findOne(['store_id' => $store_id, 'user_id' => $user_id]); if (!$user_node) { $user = User::findOne(['id' => $user_id]); $saas_user_id = SaasUser::findSaasIdByUserId($user_id); $user_node = new UserStringCodePlus(); $user_node->store_id = $store_id; $user_node->user_id = $user_id; $user_node->parent_id = $user['parent_id']; $user_node->recommend_relation = self::getRecommendRelationByUserId($user_id); $user_node->layer = self::getLayerByUserId($user_id); $user_node->recommend_relation_node = ""; $user_node->layer_node = 0; $user_node->created_at = time(); $user_node->saas_id = $saas_user_id; if (!$user_node->save()) { //debug_log([__METHOD__, __LINE__, "用户:{$user_id},节点信息保存失败"], "app_debug.log"); } } return $user_node; } public static function getChildNodeCount($store_id, $user_id) { $node_count = self::find()->select('COUNT(id) as node_count') ->where(['store_id' => $store_id]) ->andWhere(['like', 'recommend_relation_node', (',' . $user_id . ',')])->scalar(); return (int)$node_count; } public static function getChildNodeCountNew($store_id, $user_id) { $storeStringCodeSet = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}'); $storeStringCodeSet = json_decode($storeStringCodeSet['value'], true); $string_code_max_layer = $storeStringCodeSet['string_code_max_layer']; $max_level = $string_code_max_layer; // 限制最大层级为 20 $node_count = 0; $queue = []; // 获取根节点 $root_node = self::findOne(['store_id' => $store_id, 'parent_node' => $user_id]); if (!$root_node) { return 0; // 如果没有找到根节点,则返回 0 } // 初始化队列,存储每个节点及其层级 $queue[] = ['node' => $root_node, 'level' => 0]; // 初始层级为 0 while (!empty($queue)) { $current_item = array_shift($queue); // 获取队列中的第一个节点 $current_node = $current_item['node']; $current_level = $current_item['level']; // 如果当前层级大于最大层级,则停止继续查找子节点 if ($current_level >= $max_level) { continue; } // 查找当前节点的子节点 $children_nodes = self::find()->where(['store_id' => $store_id, 'parent_node' => $current_node['user_id']])->all(); if ($children_nodes) { foreach ($children_nodes as $node) { // 将子节点及其层级加入队列 $queue[] = ['node' => $node, 'level' => $current_level + 1]; } } // 计数当前节点 $node_count++; } return $node_count; } public static function getTeamNodeOrderPrice($store_id, $user_id) { $child_ids = self::getChildNodeIdsByUserId($store_id, $user_id); $team_ids = array_merge($child_ids, [$user_id]); $res = UserWallet::find() ->where(['store_id' => $store_id, 'currency_code' => Currency::CURRENCY_COIN]) ->andWhere(['in', 'user_id', $team_ids]) ->select('SUM(`money_total`) as node_order_price') ->scalar(); return round($res, 4); } /** * 获取用户部门列表 * @param $user_id * @return array */ public static function getUserDepartmentList($store_id, $user_id) { $user = User::findOne(['id' => $user_id]); $user_share_holder_level = ShareHolder::findOne(['user_id' => $user_id]); if ($user['total_coin'] < 50) { // 未消费大礼包只有A部门 $department_key_highest = 0; } else { // 有消费则有A,B等多部门 if ($user_share_holder_level['level_id'] < 9) { // 股东等级小于V7只有A,B两条线 $department_key_highest = 1; } else { // 大于等于V7可开多线 $department_key_highest = self::getLastNodeKeyByUserId($user_id) + 1; } } $res = []; for ($department_key = 0; $department_key <= $department_key_highest; $department_key++) { $last_user_id = self::getLastUserByDepartmentKey($user_id, $department_key); $last_user = User::findOne(['id' => $last_user_id]); $department_name = $department_key + 1; $temp = []; $temp['id'] = $department_key; $temp['department_key'] = $department_key; $temp['user_id'] = $last_user_id; $temp['department_name'] = "{$department_name}-部门"; $temp['nickname'] = $last_user['nickname']; $temp['mobile'] = $last_user['binding']; $res[] = $temp; } return $res; } /** * 获取指定用户最高部门 node_key * @param $user_id * @return int|mixed */ public static function getLastNodeKeyByUserId($user_id) { $last_node_key = 0; $node_list = UserStringCodePlus::find() ->where(['parent_id' => $user_id]) ->orderBy('node_key DESC') ->asArray() ->one(); if ($node_list) { $last_node_key = $node_list['node_key']; } return $last_node_key; } /** * 获取指定用户的部门最后一个用户 * @param $user_id * @param $department_name * @return int */ public static function getLastUserByDepartmentKey($user_id, $department_key) { // $first_node = self::find()->select(['user_id']) // ->where(['parent_id' => $user_id, 'node_key' => $department_key]) // ->asArray() // ->one(); // if (!$first_node) return (int)$user_id; // // $last_user_node = UserNode::find() // ->where(['or', ['user_id' => $first_node['user_id']], ['like', 'recommend_relation_node', (',' . $first_node['user_id'] . ',')]]) // ->orderBy('layer_node DESC') // ->asArray() // ->one(); // // if ($last_user_node) { // return (int)$last_user_node['user_id']; // } else { // return (int)$user_id; // } $last = UserNodeDepartment::find() ->where(['user_id' => $user_id, 'department_key' => $department_key]) ->orderBy('id DESC') ->asArray() ->one(); return $last['user_id']; } public static function getLastParentNodeLeader($user_id) { $user_node = self::findOne(['user_id' => $user_id]); if ($user_node->parent_id == $user_node->parent_node) { return self::findOne(['user_id' => $user_node->parent_id]); } else { return self::getLastParentNodeLeader($user_node->parent_node); } } /** * 查询用户指定部门的所有用户 ids * @param $user_id * @param $node_key * @return array */ public static function getChildNodeIdsByAreaKey($store_id, $user_id, $area_key) { $child_ids = []; $queue = []; $root_node = self::findOne(['store_id' => $store_id, 'parent_node' => $user_id, 'area_key' => $area_key]); $queue[] = $root_node; while (!empty($queue)) { $current_node = array_shift($queue); $children_nodes = self::find()->where(['store_id' => $store_id, 'parent_node' => $current_node['user_id']])->all(); if ($children_nodes) { foreach ($children_nodes as $node) { $queue[] = $node; } } $child_ids[] = $current_node['user_id']; } return $child_ids; } public static function getChildNodeIdsByAreaKeyToMaxLayer($store_id, $user_id, $area_key) { $child_ids = []; $queue = []; $root_node = self::findOne(['store_id' => $store_id, 'parent_node' => $user_id, 'area_key' => $area_key]); // 初始化队列并设置层级 $queue[] = ['node' => $root_node, 'level' => 0]; // 添加节点和层级(初始为0) $storeStringCodeSet = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}'); $storeStringCodeSet = json_decode($storeStringCodeSet['value'], true); $string_code_max_layer = $storeStringCodeSet['string_code_max_layer']; $temparr = []; while (!empty($queue)) { // 从队列中取出当前节点和层级 $current_item = array_shift($queue); $current_node = $current_item['node']; $current_level = $current_item['level']; // 限制层级最大为 20 层 // if ($current_level >= 20) { if ($current_level >= $string_code_max_layer) { continue; // 超过 20 层,不继续查询子节点 } $tempupuser = $current_node['user_id']; // 查询当前节点的子节点 $children_nodes = self::find()->where(['store_id' => $store_id, 'parent_node' => $current_node['user_id']])->all(); // 将子节点添加到队列,并增加层级 if ($children_nodes) { foreach ($children_nodes as $node) { $queue[] = ['node' => $node, 'level' => $current_level + 1]; } $tempuser = $children_nodes; } $temparr[] = ['level' => $current_level, 'user_id' => $tempupuser, 'parent_node' => $tempuser]; // 记录当前节点的 user_id $child_ids[] = $current_node['user_id']; } return [ 'nodelist' => $temparr, 'child_ids' => $child_ids ]; } public static function addOrderPvIntegralBonus($order) { //debug_log([__METHOD__, __LINE__, $order->order_no . '串码订单店铺让利-------- start --------'], "model_pv_integral_bonus_debug.log"); //debug_log([__METHOD__, __LINE__, json_encode($order, JSON_UNESCAPED_UNICODE)], "model_pv_integral_bonus_debug.log"); $store_id = $order->store_id; $store = Store::findOne($store_id); try { //获取结算商户信息 $merchants = ScanCodePayOrderPercent::find()->where(['order_no' => $order->order_no, 'is_type' => 1])->asArray()->all(); if (!empty($merchants)) { foreach ($merchants as $merchant) { //店铺汇付配置支付则记录结算信息 if ($merchant['pay_price'] <= 0) { //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . "串码订单商户支付金额:" . $merchant['pay_price'] . " 0元"], "model_pv_integral_bonus_debug.log"); continue; } $subMoney = Store::subStoreMoney($store, $merchant['pay_price'], "扣{$merchant['desc']}奖励", $order->id, $order->user_id); if (!$subMoney) { //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . "扣{$merchant['desc']}奖励:" . $merchant['pay_price'] . " 失败"], "model_pv_integral_bonus_debug.log"); return false; } //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . "扣{$merchant['desc']}奖励:" . $merchant['pay_price'] . " 成功"], "model_pv_integral_bonus_debug.log"); } return true; } //debug_log([__METHOD__, __LINE__, $order->order_no . '串码订单店铺让利:未获取结算商户信息----失败---- end --------'], "model_pv_integral_bonus_debug.log"); return false; } catch (\Exception $e) { //debug_log([__METHOD__, __LINE__, $order->order_no . "串码订单店铺让利失败:" . $e->getMessage() . ':' . $e->getLine() . ':' . $e->getFile() . '---- end --------'], "model_pv_integral_bonus_debug.log"); return false; } } public static function addOrderPvIntegralBonus_back($order) { //debug_log([__METHOD__, __LINE__, $order->order_no . '串码订单店铺让利-------- start --------'], "model_pv_integral_bonus_debug.log"); //debug_log([__METHOD__, __LINE__, json_encode($order, JSON_UNESCAPED_UNICODE)], "model_pv_integral_bonus_debug.log"); $store_id = $order->store_id; $store = Store::findOne($store_id); if (!in_array($store->store_type, [Store::TYPE_STORE, Store::TYPE_BRAND])) { //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】类型即不是门店也不是品牌,不进行让利"], "model_pv_integral_bonus_debug.log"); return false; } //串码红包设置 $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}'); $setting = $setting ? Json::decode($setting['value']) : []; $check_res = self::checkSettingByStoreId($store_id, $setting); if (!$check_res) { //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】设置条件不满足"], "model_pv_integral_bonus_debug.log"); return false; } $t = \Yii::$app->db->beginTransaction(); try { list($model_switch_shop, $model_switch_alliance) = self::getModelSwitchBySettingArray($setting['string_code_model']); //大模型 $bigModelMoney = 0; $oldBigModelMoney = $order->big_model_pv_bonus; if ($model_switch_alliance) { if ($order instanceof ScanOrder) { $order_pv = $order->pay_price; $order->big_model_pv_integral = bcmul($order_pv, $setting['string_code_scan_scale_1'] / 100, 8); //debug_log([__METHOD__, __LINE__, $order->order_no . "大模型扫描订单PV:" . $order_pv . " 大模型pv积分:" . $order->big_model_pv_integral], "model_pv_integral_bonus_debug.log"); } else { $order_pv = OrderDetail::find() ->andWhere(['order_id' => $order['id'], 'is_delete' => 0]) ->select([ 'sum(pv_1)', ])->scalar(); $order->big_model_pv_integral = bcmul($order_pv, $setting['string_code_order_scale_1'] / 100, 8); //debug_log([__METHOD__, __LINE__, $order->order_no . "大模型商城订单PV:" . $order_pv . " 大模型pv积分:" . $order->big_model_pv_integral], "model_pv_integral_bonus_debug.log"); } $bigModelMoney = bcmul($order_pv, $setting['string_code_pv_scale_1'] / 100, 8); $order->big_model_pv_bonus = $bigModelMoney; //debug_log([__METHOD__, __LINE__, $order->order_no . "大模型商城订单PV:" . $order_pv . " 大模型pv奖励:" . $bigModelMoney], "model_pv_integral_bonus_debug.log"); } //小模型 $smallModelMoney = 0; $oldSmallModelMoney = $order->small_model_pv_bonus; if ($model_switch_shop) { if ($order instanceof ScanOrder) { $order_pv = $order->pay_price; $order->small_model_pv_integral = bcmul($order_pv, $setting['string_code_scan_scale_0'] / 100, 8); //debug_log([__METHOD__, __LINE__, $order->order_no . "小模型扫描订单PV:" . $order_pv . " 小模型pv积分:" . $order->small_model_pv_integral], "model_pv_integral_bonus_debug.log"); } else { $order_pv = OrderDetail::find() ->andWhere(['order_id' => $order['id'], 'is_delete' => 0]) ->select([ 'sum(pv_0)', ])->scalar(); $order->small_model_pv_integral = bcmul($order_pv, $setting['string_code_order_scale_0'] / 100, 8); //debug_log([__METHOD__, __LINE__, $order->order_no . "小模型商城订单PV:" . $order_pv . " 小模型pv积分:" . $order->small_model_pv_integral], "model_pv_integral_bonus_debug.log"); } $smallModelMoney = bcmul($order_pv, $setting['string_code_pv_scale_0'] / 100, 8); $order->small_model_pv_bonus = $smallModelMoney; //debug_log([__METHOD__, __LINE__, $order->order_no . "小模型商城订单PV:" . $order_pv . " 小模型pv奖励:" . $smallModelMoney], "model_pv_integral_bonus_debug.log"); } if ($order->save()) { // //汇付支付账号是否平台账号 // if (is_use_platform_mch_huifu_id($order->huifu_id)) { // //debug_log([__METHOD__, __LINE__, $order->order_no . '串码订单店铺让利---使用平台账号支付,汇付ID:' . $order->huifu_id], "model_pv_integral_bonus_debug.log"); // //小模型 // if ($oldSmallModelMoney == 0 && $smallModelMoney != 0) { // $subMoney = Store::subStoreMoney($store, $smallModelMoney, '扣小模型PV奖励', $order->id, $order->user_id); // if (!$subMoney) { // $t->rollBack(); // //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣小模型PV奖励:" . $bigModelMoney . " 失败"], "model_pv_integral_bonus_debug.log"); // return false; // } // //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣小模型PV奖励:" . $bigModelMoney . " 成功"], "model_pv_integral_bonus_debug.log"); // } // //大模型 // if ($oldBigModelMoney == 0 && $bigModelMoney != 0) { // $subMoney = Store::subStoreMoney($store, $bigModelMoney, '扣大模型PV奖励', $order->id, $order->user_id); // if (!$subMoney) { // $t->rollBack(); // //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣大模型PV奖励:" . $bigModelMoney . " 失败"], "model_pv_integral_bonus_debug.log"); // return false; // } // //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣大模型PV奖励:" . $bigModelMoney . " 成功"], "model_pv_integral_bonus_debug.log"); // } // } //汇付支付账号是否平台账号 //debug_log([__METHOD__, __LINE__, "$order->order_no 串码订单店铺让利---使用平台账号支付,汇付ID:$order->huifu_id 小模型:$smallModelMoney 大模型:$bigModelMoney"], "model_pv_integral_bonus_debug.log"); if ($order->pay_type > 2000 && $order->pay_type < 3000) { if (!empty($order->is_use_platform_mch)) { //debug_log([__METHOD__, __LINE__, $order->order_no . '串码订单店铺让利---使用平台账号支付,汇付ID:' . $order->huifu_id], "model_pv_integral_bonus_debug.log"); //小模型 if ($oldSmallModelMoney == 0 && $smallModelMoney > 0) { $subMoney = Store::subStoreMoney($store, $smallModelMoney, '扣小模型PV奖励', $order->id, $order->user_id); if (!$subMoney) { $t->rollBack(); //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣小模型PV奖励:" . $bigModelMoney . " 失败"], "model_pv_integral_bonus_debug.log"); return false; } //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣小模型PV奖励:" . $bigModelMoney . " 成功"], "model_pv_integral_bonus_debug.log"); } //大模型 if ($oldBigModelMoney == 0 && $bigModelMoney > 0) { $subMoney = Store::subStoreMoney($store, $bigModelMoney, '扣大模型PV奖励', $order->id, $order->user_id); if (!$subMoney) { $t->rollBack(); //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣大模型PV奖励:" . $bigModelMoney . " 失败"], "model_pv_integral_bonus_debug.log"); return false; } //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣大模型PV奖励:" . $bigModelMoney . " 成功"], "model_pv_integral_bonus_debug.log"); } } } else { //debug_log([__METHOD__, __LINE__, $order->order_no . '串码订单店铺让利---使用平台账号支付,支付类型:' . $order->pay_type], "model_pv_integral_bonus_debug.log"); //小模型 if ($smallModelMoney > 0) { $subMoney = Store::subStoreMoney($store, $smallModelMoney, '扣小模型PV奖励', $order->id, $order->user_id); if (!$subMoney) { $t->rollBack(); //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣小模型PV奖励:" . $smallModelMoney . " 失败"], "model_pv_integral_bonus_debug.log"); return false; } //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣小模型PV奖励:" . $smallModelMoney . " 成功"], "model_pv_integral_bonus_debug.log"); } //大模型 if ($bigModelMoney > 0) { $subMoney = Store::subStoreMoney($store, $bigModelMoney, '扣大模型PV奖励', $order->id, $order->user_id); if (!$subMoney) { $t->rollBack(); //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣大模型PV奖励:" . $bigModelMoney . " 失败"], "model_pv_integral_bonus_debug.log"); return false; } //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣大模型PV奖励:" . $bigModelMoney . " 成功"], "model_pv_integral_bonus_debug.log"); } } $t->commit(); //debug_log([__METHOD__, __LINE__, $order->order_no . '串码订单店铺让利----成功---- end --------'], "model_pv_integral_bonus_debug.log"); return true; } $t->rollBack(); //debug_log([__METHOD__, __LINE__, $order->order_no . '串码订单店铺让利:订单保存让利失败----失败---- end --------'], "model_pv_integral_bonus_debug.log"); return false; } catch (\Exception $e) { $t->rollBack(); //debug_log([__METHOD__, __LINE__, $order->order_no . '串码订单店铺让利失败:' . $e->getMessage()], "model_pv_integral_bonus_debug.log"); return false; } } public static function getAgentSaasIdByOrder($order, $agentType, $money, $model_val, $modelType) { $commission = 0.00; $agent = UserStringCodeOrder::TYPE_LIST[UserStringCodeOrder::TYPE_STRING_CODE_STORE_DISTRICT_AGENT_DIVVY]; //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType} {$agent}待分账金额:{$money} 门店:{$order->store_id} ------start-----"], "app_debug.log"); //获取店铺 $store = Store::findOne($order->store_id); if (empty($store)) { //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType} {$agent}待分账金额:{$money} 门店:{$order->store_id} 不存在"], "app_debug.log"); return $commission; } switch ($agentType) { case UserStringCodeOrder::TYPE_STRING_CODE_STORE_DISTRICT_AGENT_DIVVY: //区县代理商 $store['district_id'] $where['district_id'] = $store['district_id']; $where['area_level'] = 1; $order->district_agent_status = 1; break; case UserStringCodeOrder::TYPE_STRING_CODE_STORE_STREET_AGENT_DIVVY: //街道代理商 $store['street_id'] $where['street_id'] = $store['street_id']; $where['area_level'] = 4; $order->street_agent_status = 1; break; default: //所有区县代理商分红 $store['district_id'] $where['area_level'] = 1; $order->all_district_agent_status = 1; break; } $where['is_delete'] = 0; $where['is_enable'] = 1; $admin = Admin::find()->where($where)->asArray()->all(); $agentNum = count($admin); if ($agentNum > 0) { $order->save(); $commissionMoney = bcdiv($money, $agentNum, 4); if ($commissionMoney <= 0) { //debug_log([__METHOD__, __LINE__, "代理商平均分红 【{$commissionMoney}】小于0.01不分红"], "app_debug.log"); } foreach ($admin as $item) { if ($item['saas_user_id']) { $res = UserStringCodeOrder::transferAddUserWallet($order, $item['saas_user_id'], $commissionMoney, $agentType, $model_val); if ($res) { $commission += $commissionMoney; } //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType} {$agent}分账金额:{$commissionMoney} 门店:{$order->store_id} {{$agent}}ID:{$item['saas_user_id']}"], "app_debug.log"); } else { //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType} {$agent}分账金额:{$commissionMoney} 门店:{$order->store_id} {{$agent}}未绑定 SaasId不分红"], "app_debug.log"); } } } else { //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType} {$agent}不存在"], "app_debug.log"); } //分红金额小于待分红金额,则分给指定用户 if ($money > $commission) { $commissionMoney = $money - $commission; $setting = Option::get(OptionSetting::SHARE_STRING_CODE_SALE_SETTING, UserStringCodePlus::ALLIANCE_STORE_ID, OptionSetting::SHARE_GROUP_NAME, '{}'); $setting = $setting ? Json::decode($setting['value']) : []; if ($setting['string_code_store_push_id']) { UserStringCodeOrder::transferAddUserWallet($order, $setting['string_code_store_push_id'], $commissionMoney, $agentType, $model_val, true); //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType} {$agent}分账剩余金额:{$commissionMoney} 代理商剩余让利用户ID:{$setting['string_code_store_push_id']}"], "app_debug.log"); } else { //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType} {$agent}分账剩余金额:{$commissionMoney} 代理商剩余让利用户不存在不继续分红"], "app_debug.log"); return $commission; } } return $money; } //用于重新执行排位 手动执行 用于店铺id public static function giveCoinAction($order, $is_scan, $to_store_id) { $store_id = $order->store_id; $order_id = $order->id; $user_id = $order->user_id; $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}'); $setting = $setting ? Json::decode($setting['value']) : []; $check_res = self::checkSettingByStoreId($store_id, $setting); if (!$check_res) { //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】设置条件不满足"], "app_debug.log"); return false; } list($model_switch_shop, $model_switch_alliance) = self::getModelSwitchBySettingArray($setting['string_code_model']); if ($to_store_id != -1) { if ($model_switch_shop) { if ($is_scan) { $order_pv = $order->pay_price; $money = bcmul($order_pv, $setting['string_code_scan_scale_0'] / 100, 4); //debug_log([__METHOD__, __LINE__, self::MODEL_NAME_LIST[self::MODEL_SHOP] . " " . "赠送店铺分 当面付 联盟PV:【{$order_pv}】比例:【{$setting['string_code_scan_scale_0']}】"], "app_debug.log"); } else { $order_pv_0 = OrderDetail::find() ->andWhere(['order_id' => $order['id'], 'is_delete' => 0]) ->select([ 'sum(pv_0)', ])->scalar(); $money = bcmul($order_pv_0, $setting['string_code_order_scale_0'] / 100, 4); //debug_log([__METHOD__, __LINE__, self::MODEL_NAME_LIST[self::MODEL_SHOP] . " " . "赠送店铺分 商城单 联盟PV:【{$order_pv_0}】比例:【{$setting['string_code_order_scale_0']}】"], "app_debug.log"); } //debug_log([__METHOD__, __LINE__, self::MODEL_NAME_LIST[self::MODEL_SHOP] . " " . "赠送店铺分 店铺:【{$store_id}】分值:【{$money}】"], "app_debug.log"); $log_type = $is_scan ? TempUserWallet::TYPE_SCAN : TempUserWallet::TYPE_ORDER; $log_desc = self::MODEL_NAME_LIST[self::MODEL_SHOP] . " " . TempUserWallet::TYPE_NAME_LIST[$log_type] . "【{$order->order_no}】 赠送店铺分"; $source_table = $is_scan ? "\app\plugins\scanCodePay\models\Order" : "app\models\Order"; $currency = Currency::findOne(['code' => Currency::CURRENCY_COIN]); TempUserWallet::addLog($currency, $store_id, $user_id, $money, $log_desc, $log_type, $source_table, $order_id); } } if ($to_store_id == -1) { if ($model_switch_alliance) { $store_id = self::ALLIANCE_STORE_ID; if ($is_scan) { $order_pv = $order->pay_price; $money = bcmul($order_pv, $setting['string_code_scan_scale_1'] / 100, 4); //debug_log([__METHOD__, __LINE__, self::MODEL_NAME_LIST[self::MODEL_ALLIANCE] . " " . "赠送联盟分 当面付 联盟PV:【{$order_pv}】比例:【{$setting['string_code_scan_scale_1']}】"], "app_debug.log"); } else { $order_pv_1 = OrderDetail::find() ->andWhere(['order_id' => $order['id'], 'is_delete' => 0]) ->select([ 'sum(pv_1)', ])->scalar(); $money = bcmul($order_pv_1, $setting['string_code_order_scale_1'] / 100, 4); //debug_log([__METHOD__, __LINE__, self::MODEL_NAME_LIST[self::MODEL_ALLIANCE] . " " . "赠送联盟分 商城单 联盟PV:【{$order_pv_1}】比例:【{$setting['string_code_order_scale_1']}】"], "app_debug.log"); } //debug_log([__METHOD__, __LINE__, self::MODEL_NAME_LIST[self::MODEL_ALLIANCE] . " " . "赠送联盟分 店铺:【{$store_id}】分值:【{$money}】"], "app_debug.log"); $log_type = $is_scan ? TempUserWallet::TYPE_SCAN : TempUserWallet::TYPE_ORDER; $log_desc = self::MODEL_NAME_LIST[self::MODEL_ALLIANCE] . " " . TempUserWallet::TYPE_NAME_LIST[$log_type] . "【{$order->order_no}】 赠送联盟分"; $source_table = $is_scan ? "\app\plugins\scanCodePay\models\Order" : "app\models\Order"; $currency = Currency::findOne(['code' => Currency::CURRENCY_COIN]); $saas_user_id = SaasUser::findSaasIdByUserId($order->user_id); TempUserWallet::addLog($currency, $store_id, $saas_user_id, $money, $log_desc, $log_type, $source_table, $order_id); } } } //用于重新执行排位 加入排位 public static function joinNodeAction($order, $is_scan = 0, $to_store_id = -1) { $store_id = $order->store_id; $user_id = $order->user_id; $order_id = $order->id; $order_no = $order->order_no; $temporder = json_encode($order); //debug_log([__METHOD__, __LINE__, "订单信息:【{$temporder}】- $store_id - $user_id - $order_id - $order_no - $is_scan "], "app_debug.log"); $saas_user_id = SaasUser::findSaasIdByUserId($user_id); $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}'); $setting = $setting ? Json::decode($setting['value']) : []; $check_res = self::checkSettingByStoreId($store_id, $setting); if (!$check_res) { //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】设置条件不满足"], "app_debug.log"); return false; } //门店模式 $string_code_shop_value = 0; if ($store_id != -1) { $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}'); $setting = $setting ? Json::decode($setting['value']) : []; $string_code_shop_value = $setting['string_code_shop_value'] ? $setting['string_code_shop_value'] : 0; } //debug_log([__METHOD__, __LINE__, "加入节点 门店模式:{$string_code_shop_value},0品牌模式 1门店模式"], "app_debug.log"); list($model_switch_shop, $model_switch_alliance) = self::getModelSwitchBySettingArray($setting['string_code_model']); if ($to_store_id != -1) { if ($model_switch_shop) { self::joinNodeByShopModelAction($store_id, $user_id, $setting, self::MODEL_SHOP); } } if ($to_store_id == -1) { if ($model_switch_alliance) { $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, self::ALLIANCE_STORE_ID, OptionSetting::SHARE_GROUP_NAME, '{}'); $setting = $setting ? Json::decode($setting['value']) : []; self::joinNodeByAllianceModelAction(self::ALLIANCE_STORE_ID, $saas_user_id, $setting, self::MODEL_ALLIANCE); } } return true; } public static function joinNodeByShopModelAction($store_id, $user_id, $setting, $model_val, $string_code_shop_value = 0) { $user = User::findOne($user_id); $saas_user_id = SaasUser::findSaasIdByUserId($user_id); $model_name = self::MODEL_NAME_LIST[self::MODEL_SHOP]; $string_code_root_user_id = self::getRootUserId($store_id, self::MODEL_SHOP); $user_string_code = self::findOne(['store_id' => $store_id, 'user_id' => $user_id]); if ($user_string_code) { //debug_log([__METHOD__, __LINE__, "加入节点 串码模式:{$model_name},店铺:【{$store_id}】,用户:{$user_id}已加入串码节点"], "app_debug.log"); return false; } $root_string_code = self::findOne(['store_id' => $store_id, 'user_id' => $string_code_root_user_id]); if (!$root_string_code) { //debug_log([__METHOD__, __LINE__, "加入节点 串码模式:{$model_name},店铺:【{$store_id}】,用户:{$user_id},根节点用户:{$string_code_root_user_id}不存在"], "app_debug.log"); return false; } $consume_amount = self::getStoreConsumeAmountAction($store_id, $user_id); // //debug_log([__METHOD__, __LINE__, "加入节点 串码模式:{$model_name},消费金额:{$consume_amount}"], "app_debug.log"); if (bccomp($consume_amount, $setting['string_code_condition_value'], 4) == -1) { $msg = "加入节点 串码模式:{$model_name},店铺:【{$store_id}】,用户:{$user_id},消费:{$consume_amount} 未达到 {$setting['string_code_condition_value']} 元,加入串码节点失败"; //debug_log([__METHOD__, __LINE__, $msg], "app_debug.log"); return false; } $parent_id = !$user['parent_id'] ? $root_string_code['user_id'] : $user['parent_id']; // 深度优先,从左至右 list($real_parent_node, $layer_rank, $area_key) = self::getRealParentNodePlus($store_id, $user_id, $parent_id, $setting['string_code_max_layer'], $model_val, $string_code_shop_value); if (empty($real_parent_node['recommend_relation_node'])) { $recommend_relation_node = ',' . $real_parent_node->user_id . ','; } else { $recommend_relation_node = $real_parent_node['recommend_relation_node'] . $real_parent_node->user_id . ','; } $parent_string_code = self::findOne(['store_id' => $store_id, 'user_id' => $parent_id]); if (empty($parent_string_code['recommend_relation'])) { $recommend_relation = ',' . $parent_string_code->user_id . ','; } else { $recommend_relation = $real_parent_node['recommend_relation'] . $parent_string_code->user_id . ','; } // 保存节点数据 $user_string_code = new self(); $user_string_code->store_id = $store_id; $user_string_code->user_id = $user_id; $user_string_code->parent_id = $parent_id; $user_string_code->parent_node = $real_parent_node['user_id']; $user_string_code->recommend_relation_node = $recommend_relation_node; $user_string_code->layer_node = $real_parent_node['layer_node'] + 1; $user_string_code->recommend_relation = $recommend_relation; $user_string_code->layer = $parent_string_code['layer'] + 1; $user_string_code->area_key = $area_key; $user_string_code->layer_rank = $layer_rank; $user_string_code->saas_id = $saas_user_id; if (!$user_string_code->save()) { $errors = json_encode($user_string_code->getErrors()); $msg = "加入节点 店铺:【{$store_id}】,用户:{$user_id},保存串码节点失败 {$errors}"; //debug_log([__METHOD__, __LINE__, $msg], "app_debug.log"); return false; } // 所有上级节点 团队人数 + 1 self::setTeamCountInc($store_id, $user_id); return true; } public static function joinNodeByAllianceModelAction($store_id, $saas_user_id, $setting, $model_val, $string_code_shop_value = 0) { $user_id = $saas_user_id; $user = SaasUser::findOne($saas_user_id); $model_name = self::MODEL_NAME_LIST[self::MODEL_ALLIANCE]; $string_code_root_user_id = self::getRootUserId($store_id, self::MODEL_ALLIANCE); $user_string_code = self::findOne(['store_id' => $store_id, 'user_id' => $user_id]); if ($user_string_code) { //debug_log([__METHOD__, __LINE__, "加入节点 串码模式:{$model_name},用户:{$user_id}已加入串码节点"], "app_debug.log"); return false; } $root_string_code = self::findOne(['store_id' => $store_id, 'user_id' => $string_code_root_user_id]); if (!$root_string_code) { //debug_log([__METHOD__, __LINE__, "加入节点 串码模式:{$model_name},用户:{$user_id}根节点不存在"], "app_debug.log"); return false; } $consume_amount = self::getStoreConsumeAmountAction($store_id, $user_id); // //debug_log([__METHOD__, __LINE__, "加入节点 串码模式:{$model_name}, 消费金额:{$consume_amount}"], "app_debug.log"); if (bccomp($consume_amount, $setting['string_code_condition_value'], 4) == -1) { $msg = "加入节点 串码模式:{$model_name},店铺:【{$store_id}】,用户:{$user_id},消费:{$consume_amount}未达到{$setting['string_code_condition_value']}元,加入串码节点失败"; //debug_log([__METHOD__, __LINE__, $msg], "app_debug.log"); return false; } $parent_id = !$user['parent_id'] ? $root_string_code['user_id'] : $user['parent_id']; // 深度优先,从左至右 list($real_parent_node, $layer_rank, $area_key) = self::getRealParentNodePlus($store_id, $user_id, $parent_id, $setting['string_code_max_layer'], $model_val, $string_code_shop_value); if (empty($real_parent_node['recommend_relation_node'])) { $recommend_relation_node = ',' . $real_parent_node->user_id . ','; } else { $recommend_relation_node = $real_parent_node['recommend_relation_node'] . $real_parent_node->user_id . ','; } $parent_string_code = self::findOne(['store_id' => $store_id, 'user_id' => $parent_id]); if (empty($parent_string_code['recommend_relation'])) { $recommend_relation = ',' . $parent_string_code->user_id . ','; } else { $recommend_relation = $real_parent_node['recommend_relation'] . $parent_string_code->user_id . ','; } // 保存节点数据 $user_string_code = new self(); $user_string_code->store_id = $store_id; $user_string_code->user_id = $user_id; $user_string_code->parent_id = $parent_id; $user_string_code->parent_node = $real_parent_node['user_id']; $user_string_code->recommend_relation_node = $recommend_relation_node; $user_string_code->layer_node = $real_parent_node['layer_node'] + 1; $user_string_code->recommend_relation = $recommend_relation; $user_string_code->layer = $parent_string_code['layer'] + 1; $user_string_code->area_key = $area_key; $user_string_code->layer_rank = $layer_rank; $user_string_code->saas_id = $saas_user_id; if (!$user_string_code->save()) { $errors = json_encode($user_string_code->getErrors()); $msg = "加入节点 店铺:【{$store_id}】,用户:{$user_id},保存串码节点失败 {$errors}"; //debug_log([__METHOD__, __LINE__, $msg], "app_debug.log"); return false; } // 所有上级节点 团队人数 + 1 self::setTeamCountInc($store_id, $user_id); return true; } public static function getStoreConsumeAmountAction($store_id, $user_id) { // 联盟分 $user_wallet = TempUserWallet::getCurrencyWallet($store_id, $user_id, Currency::CURRENCY_COIN); return $user_wallet['money_total'] ?: 0; } public static function countOrderPvBonus($order) { $store_id = $order->store_id; $store = Store::findOne($store_id); if (!in_array($store->store_type, [Store::TYPE_STORE, Store::TYPE_BRAND])) { // 判断店铺类型 {{ text == 0 ? '默认' : text == 1 ? '品牌' : '门店' }} // {{ text == 1 ? '独立运营' : text == 2 ? '平台运营' : text == 3 ? '当面付' : text == 4 ? '点餐' : '' }} if ($store->business_model == 3) { $store->store_type = 2; } else { $store->store_type = 1; } $store->save(); //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】类型即不是门店也不是品牌,不进行让利"], "app_debug.log"); //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】business_model:【{$store->business_model}】自动变更店铺类型store_type:【{$store->store_type}】"], "app_debug.log"); // return false; } if ($order instanceof ScanOrder) { $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}'); if (empty($setting)) { //debug_log([__METHOD__, __LINE__, "店铺:【{$store_id}】串码红包未设置,不进行让利"], "huifu_payment_debug.log.log"); return false; } //串码红包设置 $setting = Json::decode($setting['value']); $bigModelMoney = !empty($setting['string_code_pv_scale_1']) ? bcmul($order->pay_price, $setting['string_code_pv_scale_1'] / 100, 8) : 0; $smallModelMoney = !empty($setting['string_code_pv_scale_0']) ? bcmul($order->pay_price, $setting['string_code_pv_scale_0'] / 100, 8) : 0; } else { $bigModelMoney = OrderDetail::find() ->andWhere(['order_id' => $order['id'], 'is_delete' => 0]) ->select([ 'sum(pv_1)', ])->scalar(); $smallModelMoney = OrderDetail::find() ->andWhere(['order_id' => $order['id'], 'is_delete' => 0]) ->select([ 'sum(pv_0)', ])->scalar(); } //大模型 $order->big_model_pv_bonus = $bigModelMoney ?? 0; //小模型 $order->small_model_pv_bonus = $smallModelMoney ?? 0; $order->save(); return $smallModelMoney + $bigModelMoney; } //商城让利合伙人 public static function sendMakeConcessionsByOrder($order, $setting, $is_scan, $store) { $temp_store = json_encode($setting['string_make_doncessions_userlist']); //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 【商城让利是否开启:{$setting['string_make_doncessions_switch']} 商城订单是否开启:{$setting['string_make_doncessions_order']} 扫码订单是否开启:{$setting['string_make_doncessions_scan']} 商城让利人员:{$temp_store}"], "app_debug.log"); list($model_switch_shop, $model_switch_alliance) = UserStringCodePlus::getModelSwitchBySettingArray($setting['string_code_model']); //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 【商城串码模型:{$setting['string_code_model']}"], "app_debug.log"); if (empty($setting['string_code_make_concessions'])) { //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 【商城让利人比例:{$setting['string_code_make_concessions']} 未设置"], "app_debug.log"); return; } if ($setting['string_code_make_concessions'] <= 0) { //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 【商城让利人比例:{$setting['string_code_make_concessions']} 设置不正确"], "app_debug.log"); return; } if ($model_switch_shop) { //执行小模型前验证 if (is_array($setting['string_make_doncessions_userlist']) && !empty($setting['string_make_doncessions_userlist'])) { // $dataSource 是有效的非空数组 self::sendMakeConcessionsByOrderStore($order, $setting, $is_scan, 0); } else { // $dataSource 不是有效的数组或是空数组 if (empty($setting['string_code_make_concessions_saas_id'])) { //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 小模型 【商城剩余让利人{$setting['string_code_make_concessions']} 未设置 以及 店铺商城让利合伙人 未设置"], "app_debug.log"); } else { //执行发放逻辑 self::sendMakeConcessionsByOrderStore($order, $setting, $is_scan, 0); } } } if ($model_switch_alliance) { //执行大模型前验证 if (is_array($setting['string_make_doncessions_userlist']) && !empty($setting['string_make_doncessions_userlist'])) { // $dataSource 是有效的非空数组 self::sendMakeConcessionsByOrderStore($order, $setting, $is_scan, 1); } else { // $dataSource 不是有效的数组或是空数组 if (empty($setting['string_code_make_concessions_saas_id'])) { //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 大模型 【商城剩余让利人{$setting['string_code_make_concessions']} 未设置 以及 店铺商城让利合伙人 未设置"], "app_debug.log"); } else { //执行发放逻辑 self::sendMakeConcessionsByOrderStore($order, $setting, $is_scan, 1); } } } //检测是否有发放 有直接更新订单状态 $UserStringCodeOrderlist = UserStringCodeOrder::findAll([ 'order_id' => $order->id, 'is_scan' => $is_scan, 'type' => [UserStringCodeOrder::TYPE_STRING_CODE_BRAND_MAKE_DONCESSIONS] ]); $temp_count = count($UserStringCodeOrderlist); //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 执行记录有:{$temp_count}"], "app_debug.log"); if (count($UserStringCodeOrderlist) > 0) { $temp_order = json_encode($order); //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 订单信息:{$temp_order}"], "app_debug.log"); $order->make_concessions_status = 1; if ($order->save()) { //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 状态修改失败"], "app_debug.log"); } // 计算合并结果的总金额 $ModelMoney = 0; foreach ($UserStringCodeOrderlist as $ordertempr) { if ($ordertempr['status'] == 1) { $ModelMoney += $ordertempr['money']; // 累加金额 } } try { if ($order->is_use_platform_mch == 1 && ($order->pay_type == 1 || in_array($order->pay_type, array_keys(Order::HUIFU_PAYMENT_PAY_TYPE)))) { //扣除店铺金额 $subMoney = Store::subStoreMoney($store, $ModelMoney, '扣商城让利合伙人分红', $order->id, $order->user_id); if (!$subMoney) { //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣商城让利合伙人分红:" . $ModelMoney . " 失败"], "app_debug.log"); } //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣商城让利合伙人分红:" . $ModelMoney . " 成功"], "app_debug.log"); } else { //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 已分账,不用扣商城让利合伙人分红 成功"], "app_debug.log"); } } catch (\Exception $e) { //debug_log([__METHOD__, __LINE__, "扣商城让利合伙人分红:{$e->getMessage()}"], "app_debug.log"); } } //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 执行完成"], "app_debug.log"); } //商城让利合伙人 public static function sendMakeConcessionsScan($order, $setting, $is_scan, $store, $model_val) { $temp_store = json_encode($setting['string_make_doncessions_userlist']); //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 【商城让利是否开启:{$setting['string_make_doncessions_switch']} 商城订单是否开启:{$setting['string_make_doncessions_order']} 扫码订单是否开启:{$setting['string_make_doncessions_scan']} 商城让利人员:{$temp_store}"], "app_debug.log"); //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 【商城串码模型:{$setting['string_code_model']}"], "app_debug.log"); if (empty($setting['string_code_make_concessions'])) { //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 【商城让利人比例:{$setting['string_code_make_concessions']} 未设置"], "app_debug.log"); return; } if ($setting['string_code_make_concessions'] <= 0) { //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 【商城让利人比例:{$setting['string_code_make_concessions']} 设置不正确"], "app_debug.log"); return; } //执行小模型前验证 if (is_array($setting['string_make_doncessions_userlist']) && !empty($setting['string_make_doncessions_userlist'])) { // $dataSource 是有效的非空数组 self::sendMakeConcessionsByOrderStore($order, $setting, $is_scan, $model_val); } else { // $dataSource 不是有效的数组或是空数组 if (empty($setting['string_code_make_concessions_saas_id'])) { //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 小模型 【商城剩余让利人{$setting['string_code_make_concessions']} 未设置 以及 店铺商城让利合伙人 未设置"], "app_debug.log"); } else { //执行发放逻辑 self::sendMakeConcessionsByOrderStore($order, $setting, $is_scan, $model_val); } } //检测是否有发放 有直接更新订单状态 $UserStringCodeOrderlist = UserStringCodeOrder::findAll([ 'order_id' => $order->id, 'is_scan' => $is_scan, 'type' => [UserStringCodeOrder::TYPE_STRING_CODE_BRAND_MAKE_DONCESSIONS] ]); $temp_count = count($UserStringCodeOrderlist); //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 执行记录有:{$temp_count}"], "app_debug.log"); if (count($UserStringCodeOrderlist) > 0) { $temp_order = json_encode($order); //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 订单信息:{$temp_order}"], "app_debug.log"); $order->make_concessions_status = 1; if ($order->save()) { //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 状态修改失败"], "app_debug.log"); } // 计算合并结果的总金额 $ModelMoney = 0; foreach ($UserStringCodeOrderlist as $ordertempr) { if ($ordertempr['status'] == 1) { $ModelMoney += $ordertempr['money']; // 累加金额 } } try { if ($order->is_use_platform_mch == 1 && ($order->pay_type == 1 || in_array($order->pay_type, array_keys(Order::HUIFU_PAYMENT_PAY_TYPE)))) { //扣除店铺金额 $subMoney = Store::subStoreMoney($store, $ModelMoney, '扣商城让利合伙人分红', $order->id, $order->user_id); if (!$subMoney) { //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣商城让利合伙人分红:" . $ModelMoney . " 失败"], "app_debug.log"); } //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣商城让利合伙人分红:" . $ModelMoney . " 成功"], "app_debug.log"); } else { //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 已分账,不用扣商城让利合伙人分红 成功"], "app_debug.log"); } } catch (\Exception $e) { //debug_log([__METHOD__, __LINE__, "扣商城让利合伙人分红:{$e->getMessage()}"], "app_debug.log"); } } //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 执行完成"], "app_debug.log"); } // 商城让利合伙人分红 public static function sendMakeConcessionsByOrderStore($order, $setting, $is_scan, $model_val) { if (empty($setting['string_make_doncessions_switch'])) { //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 商城让利合伙人模式未设置"], "app_debug.log"); return; } if ($setting['string_make_doncessions_switch'] == 0) { //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 商城让利合伙人模式未开启"], "app_debug.log"); return; } if ($is_scan == 0) { //商城订单 if (empty($setting['string_make_doncessions_order']) || $setting['string_make_doncessions_order'] == 0) { //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 商城订单商城让利合伙人状态未设置"], "app_debug.log"); } else { //debug_log([__METHOD__, __LINE__, "执行 商城让利人分红"], "app_debug.log"); /*$order_pv = OrderDetail::find() ->andWhere(['order_id' => $order['id'], 'is_delete' => 0]) ->select([ 'sum(pv_0)', ])->scalar(); self::sendMakeConcessionsByOrderGrant($order, $order_pv, $setting['string_code_make_concessions'], $setting['string_code_make_concessions_saas_id'], $setting['string_make_doncessions_userlist'], 0); $order_pv = OrderDetail::find() ->andWhere(['order_id' => $order['id'], 'is_delete' => 0]) ->select([ 'sum(pv_1)', ])->scalar();*/ self::sendMakeConcessionsByOrderGrant($order, $order->pay_price, $setting['string_code_make_concessions'], $setting['string_code_make_concessions_saas_id'], $setting['string_make_doncessions_userlist'], $model_val); //debug_log([__METHOD__, __LINE__, "执行 商城让利人分红:" . $setting['string_code_make_concessions'] . '======'], "app_debug.log"); } } else { //扫码订单 if (empty($setting['string_make_doncessions_scan']) || $setting['string_make_doncessions_scan'] == 0) { //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 商城订单商城让利合伙人状态未设置"], "app_debug.log"); } else { //debug_log([__METHOD__, __LINE__, "执行 扫码分红"], "app_debug.log"); self::sendMakeConcessionsByOrderGrant($order, $order->pay_price, $setting['string_code_make_concessions_scan'], $setting['string_code_make_concessions_saas_id'], $setting['string_make_doncessions_userlist'], $model_val); } } } // 商城让利合伙人分红 public static function sendMakeConcessionsByOrderGrant($order, $transfer_money, $string_code_make_concessions, $push_saas_id, $string_make_doncessions_userlist, $model_val) { $money = bcmul($transfer_money, $string_code_make_concessions / 100, 4); if ($string_make_doncessions_userlist) { $moneytran_temp = 0; if (is_array($string_make_doncessions_userlist)) { // 遍历数组 $string_make_doncessions_userlist = self::NewUserList($string_make_doncessions_userlist); foreach ($string_make_doncessions_userlist as $item) { $moneytran = 0; //debug_log([__METHOD__, __LINE__, "div1===" . bcmul(bcmul($money, $item['percent'], 8), $item['weight'], 8)], "app_debug.log"); if ($item['total_weight'] > 0 && bcmul(bcmul($money, $item['percent'], 8), $item['weight'], 8) > 0) { $moneytran = bcmul( bcdiv( bcmul($money, $item['percent'], 8), $item['total_weight'], 8 ), $item['weight'], 8 ); } //debug_log([__METHOD__, __LINE__, "div2====" . $moneytran] . '====' . $item['total_weight'] . '===' . $item['weight'] . '===' . $item['percent'], "app_debug.log"); $moneytran = sprintf("%.4f", $moneytran); //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 总的{$money} 当前商城没设置参与人员:{$item['saas_id']} 获得:{$moneytran}"], "app_debug.log"); UserStringCodeOrder::transferAddUserWalletAndStoreid($order, $item['saas_id'], $moneytran, UserStringCodeOrder::TYPE_STRING_CODE_BRAND_MAKE_DONCESSIONS, $model_val, $order->store_id, false); $moneytran_temp = bcadd($moneytran_temp, $moneytran, 4); } } $moneytran_sy = $money - $moneytran_temp; if ($moneytran_sy > 0) { //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 总的{$money} 平分后还有剩余:{$moneytran_sy} 直接给剩余让利人{$push_saas_id} "], "app_debug.log"); UserStringCodeOrder::transferAddUserWalletAndStoreid($order, $push_saas_id, $moneytran_sy, UserStringCodeOrder::TYPE_STRING_CODE_BRAND_MAKE_DONCESSIONS, $model_val, $order->store_id, true); } } else { //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人总的{$money} 当前商城没设置参与人员 全部给剩余让利人:{$push_saas_id}"], "app_debug.log"); UserStringCodeOrder::transferAddUserWalletAndStoreid($order, $push_saas_id, $money, UserStringCodeOrder::TYPE_STRING_CODE_BRAND_MAKE_DONCESSIONS, $model_val, $order->store_id, true); } } public static function NewUserList($data) { foreach ($data as &$value) { $level_info = \Yii::$app->db->createCommand('select * from cyy_store_partner_level where id=:id')->bindValue(':id', $value['level_id'])->queryOne(); $value['percent'] = $level_info['profit_rate'] / 100; //debug_log([__METHOD__, __LINE__, "div2====" . $level_info['name'] . '=user_id:' . $value['saas_id']], "app_debug.log"); } $total_weights = []; foreach ($data as $item) { $level_id = $item['level_id']; $weight = (int)$item['weight']; // 确保 weight 是整数 if (!isset($total_weights[$level_id])) { $total_weights[$level_id] = 0; } $total_weights[$level_id] += $weight; } // Step 2: 将 total_weight 添加到每个数组元素中 foreach ($data as &$item) { $level_id = $item['level_id']; $item['total_weight'] = $total_weights[$level_id]; } // 释放引用 unset($item); return $data; } private static function adAwardSend($store_id, $order_pv, $rate, $manager, $model, $order, $string_code_store_push_id) { $store = Store::find()->where(['id' => $store_id])->select(['salesman_id', 'district_id'])->asArray()->one(); $salesman_id = $store['salesman_id']; //debug_log([__METHOD__, __LINE__, "============拓展经理:($salesman_id),广告推流店铺id:" . $store_id], "app_debug.log"); if ($order_pv <= 0) return false; $salesman = Salesman::findOne(['id' => $salesman_id, 'is_delete' => 0, 'status' => 1]); $admin = Admin::findOne(['id' => $salesman->admin_id, 'is_delete' => 0]); $manager_money = $order_pv * $manager / 100; if ($manager && $salesman->saas_user_id) { //debug_log([__METHOD__, __LINE__, "============拓展经理金额 : " . ($manager_money)], "app_debug.log"); UserStringCodeOrder::transferAddUserWallet($order, $salesman->saas_user_id, $manager_money, UserStringCodeOrder::TYPE_EXPAND_MANAGER, $model); }else{ if ($string_code_store_push_id){ UserStringCodeOrder::transferAddUserWallet($order, $string_code_store_push_id, $manager_money, UserStringCodeOrder::TYPE_EXPAND_MANAGER, $model); } } if ($rate){ $money = $order_pv * $rate / 100; if ($admin->advert_push_user_id) { //debug_log([__METHOD__, __LINE__, "============广告推流金额 : " . ($money)], "app_debug.log"); UserStringCodeOrder::transferAddUserWallet($order, $admin->advert_push_user_id, $money, UserStringCodeOrder::TYPE_BD_AGENT, $model); }else{ if ($string_code_store_push_id){ UserStringCodeOrder::transferAddUserWallet($order, $string_code_store_push_id, $money, UserStringCodeOrder::TYPE_BD_AGENT, $model); } } } return true; } private static function hotAwardSend($saas_id, $rate, $founder, $order_pv, $model, $order) { $money = $order_pv * $rate / 100; //debug_log([__METHOD__, __LINE__, "============热动代理人金额 : " . ($money)], "app_debug.log"); if ($saas_id && $money > 0) { UserStringCodeOrder::transferAddUserWallet($order, $saas_id, $money, UserStringCodeOrder::TYPE_AD_HOT, $model); } $money = $order_pv * $founder / 100; //debug_log([__METHOD__, __LINE__, "============热动广告推流金额 : " . ($money)], "app_debug.log"); if ($saas_id && $money > 0) { UserStringCodeOrder::transferAddUserWallet($order, $saas_id, $money, UserStringCodeOrder::TYPE_STRING_CODE_STORE_DISTRICT_AGENT_DIVVY, $model); } } }