services->setting->addons->get($mallId, 'Boss', 'basic'); // 判断是否开启插件分润 if ($config['is_enable'] == StatusEnum::DISABLED) return true; // 判断结算方式,0=支付完成,1=订单完成 $settlement_method = $config['settlement_method'] == 0 ? 1 : 4; if ($order['order_status'] != $settlement_method) { $isDecMchTaskCounter = false; return true; } // 获取股东等级列表 $level_arr = AddonsBossLevelSetting::getBossLevelSetting([['mall_id' => $mallId]], [], true); if (empty($level_arr)) return true; $level_arr = array_column($level_arr, null, 'level'); if ($isMch) { BossLogic::resetCommonSetting($level_arr); $mchConfig = Yii::$app->services->setting->addons->get($mallId, MchEnum::ADDONS_NAME, 'mode'); // 获取是否开启模式 $enableMode = $mchConfig['is_enable_mode'] ?? 1; // 默认开启 // 多商户股东配置 $mchBossSetting = json_decode($mchConfig[AddonsEnum::ADDONS_NAME_BOSS] ?? '', true) ?: []; BossLogic::setCommonSetting($level_arr, $mchBossSetting); $settle_type = \Yii::$app->services->setting->addons->get($mallId, MchEnum::ADDONS_NAME, 'basic.settle_type'); $mch_setting_model = MchSettings::findOne(['mch_id'=>$order['mch_id'],'status'=>StatusEnum::ENABLED]); if(!empty($mch_setting_model) && !empty($mch_setting_model['individual_fee_setting'])) { $settle_type = $mch_setting_model['store_settle_type']; } if($settle_type==4) { $store_boss_status = \Yii::$app->services->setting->addons->get($mallId, MchEnum::ADDONS_NAME, 'basic.store_boss_status'); if (!empty($store_boss_status)) { $store_model = MchModel::getOne([['mch_id' => $order['mch_id']]], true); if (!empty($store_model)) { $enableMode = !empty($store_model['status']); $content = json_decode($store_model['content'], true); $storeMchBossSetting = json_decode($content[AddonsEnum::ADDONS_NAME_BOSS] ?? '', true) ?: []; if (!empty($storeMchBossSetting)) { $mchBossSetting = $storeMchBossSetting; BossLogic::setCommonSetting($level_arr, $mchBossSetting); } } } } $isBossEnableCommission = $mchBossSetting['commission']['is_enable'] ?? 1; $isBossEnableDigital = $mchBossSetting['digital']['is_enable'] ?? 1; } // 检查是否有股东用户,没有直接退出 $has_boss = AddonsBoss::find()->select('id')->where(['mall_id' => $mallId, 'status' => StatusEnum::ENABLED])->asArray()->one(); if (empty($has_boss)) return true; $boss_levels = AddonsBossLevel::lists([ 'where' => [['mall_id' => $mallId, 'status' => StatusEnum::ENABLED]], 'select'=> 'level', 'index' => 'level' ]); // 开启“高等级拿低等级分红”的等级数组 $insatiable_level_arr = []; // 获取高等级拿低等额外分红的数组 $insatiable_extra_level_arr = []; foreach ($level_arr as $level => $v) { $level_arr[$level]['extra_type'] = json_decode($v['extra_type'], true); if (!$v['insatiable']) continue; if(!isset($boss_levels[$level])) continue; $insatiable_level_arr[$level] = $v; } foreach ($level_arr as $level => $v) { if (!$v['insatiable_extra']) continue; if(!isset($boss_levels[$level])) continue; $insatiable_extra_level_arr[$level] = $v; } $level_count = AddonsBoss::find() ->select("count(id) num,level") ->where(['mall_id' => $mallId, 'status' => StatusEnum::ENABLED]) ->groupBy("level") ->indexBy("level") ->asArray() ->all(); $extra_level_count = AddonsBoss::getBossCountByExtraUpgrade($mallId); $is_decr_score = $config['is_decr_score'] ?? 0; if ($is_decr_score) { // 根据选择决定哪种类型需要扣除积分 $participate_decr_score_type = json_decode($config['participate_decr_score_type'] ?? '', true) ?: []; $is_decr_score_perpetual = !isset($participate_decr_score_type['perpetual']) || $participate_decr_score_type['perpetual']; // 这里为了兼容旧数据,只要开启默认扣除永久积分 $is_decr_score_extra = !empty($participate_decr_score_type['extra']); } $settlement_data = []; // 循环订单详情,对不同商品进行对应的佣金结算 foreach ($order_list as $index => $detail) { // 获取结算的金额 // if ($config['compute_type'] == 0) $order_money = $detail['goods_price'];// 支付金额 // if ($config['compute_type'] == 1) $order_money = $detail['goods_price'] - $detail['cost_price'] + $detail['adjust_money'];// 商品利润 // if ($config['compute_type'] == 2) $order_money = $detail['price'];// 商品售价 if ($config['compute_type'] == 0) $order_money = $detail['goods_price']; // 支付金额 if ($config['compute_type'] == 1) $order_money = $detail['goods_price'] - bcmul($detail['cost_price'], $detail['num'], 2) + $detail['adjust_money']; // 商品利润 if ($config['compute_type'] == 2) $order_money = bcmul($detail['price'], $detail['num'], 2); // 商品售价 // 兼容多商户,多商户则读多商户配置 if ($isMch) { $goods_setting = BossLogic::getBossAloneSetting($mallId, $detail['goods_id'], $order['mch_id']); } else { //判断是否为门店商品订单 if($detail['store_id'] > 0){ // 获取门店商品的股东分红独立配置 $goods_setting = StoreGoodsModel::getGoodsModel($detail['goods_id'],'Boss','commission'); }else{ // 获取平台商品的股东分红独立配置 $goods_setting = AddonsBossCommissionItemSetting::getOne([['mall_id' => $mallId], ['item_id' => $detail['goods_id']], ['commission_type' => 'commission']], true, ['detail']); } } if ($goods_setting['is_extra_scale_ratio']) { //开启了额外计算比例,重新计算 $order_money = bcmul($order_money, $goods_setting['extra_scale_ratio'] / 100, 2); // 商品售价 } $amounts = $amounts + $order_money; // 商品没参与股东分红则直接退出 if (!empty($goods_setting) && $goods_setting['is_enable'] == 0) continue; // 判断是否开启独立设置 if (!empty($goods_setting['is_alone']) && $goods_setting['is_alone'] == 1) { // 商品独立分佣配置 $level_calculate = $goods_setting['detail']; // 下面的额外分红读的是$level_arr,独立配置的额外分红开关不生效,重新赋值 foreach ($level_arr as &$item) { isset($goods_setting['is_extra']) && $item['is_extra'] = $goods_setting['is_extra']; } unset($item); } else { if ($isMch && (!$enableMode || !$isBossEnableCommission)) { continue; } // 等级分佣配置 $level_calculate = $level_arr; } // “高等级瓜分低等级”永久分红的等级数组 $outer_layer = []; $extra_outer_layer = []; // 对应的等级的永久/额外佣金计算 foreach ($level_calculate as $level) { $level_num = $extra_level_num = 0; $current_level = $level['level'];// 当前等级 if (!empty($level_count[$current_level]) && !empty($level_count[$current_level]['num'])) { $level_num = $level_count[$current_level]['num']; // 统计的人数 // 统计额外分红被选中的人数 $extra_type_arr = $level_arr[$current_level]['extra_type'] ?? []; foreach ($extra_type_arr as $selected) { if (!empty($extra_level_count[$current_level . '_' . $selected])) $extra_level_num += $extra_level_count[$current_level . '_' . $selected]; } } // 获取将瓜分该等级“永久分红”的高级别等级数组 $forever_level_arr = []; foreach ($insatiable_level_arr as $item) { if ($item['level'] <= $level['level']) continue; // 比当前等级高 $forever_level_arr[$item['level']] = $level_count[$item['level']]['num']; } // 获取将瓜分该等级“额外分红”的高级别等级数组 $extra_level_arr = []; foreach ($insatiable_extra_level_arr as $item) { if ($item['level'] <= $level['level']) continue; // 比当前等级高 // 统计额外分红被选中的人数 $extra_type_arr = $level_arr[$item['level']]['extra_type'] ?? []; $temp_extra_level_num = 0; foreach ($extra_type_arr as $selected) { if (!empty($extra_level_count[$item['level'] . '_' . $selected])) $temp_extra_level_num += $extra_level_count[$item['level'] . '_' . $selected]; } if ($temp_extra_level_num > 0) $extra_level_arr[$item['level']] = $temp_extra_level_num; } $forever_commonisson = $extra_commonisson = 0; if ($level_num <= 0) { if (array_sum($forever_level_arr) > 0) { $forever_commonisson = $level['prize'] ? bcdiv($order_money * $level['prize'] / array_sum($forever_level_arr), 100, 2) : 0; } // 额外分红判断是否开启单独分 if (empty($level_arr[$level['level']]['extra_alone'])) { if (array_sum($extra_level_arr) > 0) { $extra_commonisson = $level['extra_prize'] ? bcdiv($order_money * $level['extra_prize'] / (array_sum($extra_level_arr)), 100, 2) : 0; // 额外分红佣金,单位:元 } } else { // 开启了单独分则不需要进行平均计算 $extra_commonisson = $level['extra_prize'] ? bcdiv($order_money * $level['extra_prize'], 100, 2) : 0; // 额外分红佣金,单位:元 } } else { $forever_commonisson = $level['prize'] ? bcdiv($order_money * $level['prize'] / ($level_num + array_sum($forever_level_arr)), 100, 2) : 0; // 永久分红佣金,单位:元 // 判断是否开启单独分 if (empty($level_arr[$level['level']]['extra_alone'])) { if ($extra_level_num) $extra_commonisson = $level['extra_prize'] ? bcdiv($order_money * $level['extra_prize'] / ($extra_level_num + array_sum($extra_level_arr)), 100, 2) : 0; // 额外分红佣金,单位:元 } else { // 开启了单独分则不需要进行平均计算 $extra_commonisson = $level['extra_prize'] ? bcdiv($order_money * $level['extra_prize'], 100, 2) : 0; // 额外分红佣金,单位:元 } } if (count($forever_level_arr) > 0) { foreach ($forever_level_arr as $a => $b) { $outer_layer[$a] = bcadd($outer_layer[$a] ?? 0, $forever_commonisson, 2); } } // 叠加当前高等级的额外分红 if (count($extra_level_arr) > 0) { foreach ($extra_level_arr as $a => $b) { $extra_outer_layer[$a] = bcadd($extra_outer_layer[$a] ?? 0, $extra_commonisson, 2); } } // 单个商品的结算明细 $settlement_data[$level['level']][] = [ 'detail_id' => $detail['id'], 'goods_id' => $detail['goods_id'], 'goods_name' => $detail['goods_name'], 'amounts' => $order_money, 'prize' => $level['prize'], 'commonisson' => $forever_commonisson, 'extra_level_num' => $extra_level_num ?? 0, 'extra_level_arr' => array_sum($extra_level_arr) ?? 0, 'extra_prize' => $level['extra_prize'], 'extra_commonisson' => $extra_commonisson, 'extra_alone' => $level_arr[$level['level']]['extra_alone'] ?? 0, ]; // 分红佣金计算 $calculate[$level['level']] = [ 'commission' => empty($calculate[$level['level']]['commission']) ? $forever_commonisson : $calculate[$level['level']]['commission'] + $forever_commonisson, 'extra_commission' => empty($calculate[$level['level']]['extra_commission']) ? $extra_commonisson : $calculate[$level['level']]['extra_commission'] + $extra_commonisson, 'average_count' => $level_num, 'extra_average_count' => $extra_level_num + array_sum($extra_level_arr), 'forever_average_count' => $level_num + array_sum($forever_level_arr), 'settlement_data' => $settlement_data[$level['level']], ]; } // 对“单个商品的结算明细”和“分红佣金数组”中的佣金分红字段进行修改 foreach ($outer_layer as $m => $n) { $calculate[$m]['commission'] = bcadd($calculate[$m]['commission'], $n, 2); foreach ($calculate[$m]['settlement_data'] as &$k) { $k['commonisson'] = bcadd($k['commonisson'], $n, 2); } unset($k); } // 对“单个商品的结算明细”和“分红佣金数组”中的佣金额外分红字段进行修改 foreach ($extra_outer_layer as $m => $n) { $calculate[$m]['extra_commission'] = bcadd($calculate[$m]['extra_commission'], $n, 2); if (empty($calculate[$m])) continue; // 兼容没有结算明细的等级 foreach ($calculate[$m]['settlement_data'] as &$k) { $k['extra_commonisson'] = bcadd($k['extra_commonisson'], $n, 2); } unset($k); } } $digital_amounts = 0; // 处理数字币相关分佣 foreach ($order_list as $index => $detail) { if ($config['compute_type'] == 0) $order_money = $detail['goods_price']; // 支付金额 if ($config['compute_type'] == 1) $order_money = $detail['goods_price'] - bcmul($detail['cost_price'], $detail['num'], 2) + $detail['adjust_money']; // 商品利润 if ($config['compute_type'] == 2) $order_money = bcmul($detail['price'], $detail['num'], 2); // 商品售价 // 兼容多商户,多商户则读多商户配置 if ($isMch) { $goods_setting = BossLogic::getBossAloneSetting($mallId, $detail['goods_id'], $order['mch_id'], 'digital'); } else { // 获取商品的股东分红独立配置 $goods_setting = AddonsBossCommissionItemSetting::getOne([['mall_id' => $mallId], ['item_id' => $detail['goods_id']], ['commission_type' => 'digital']], true, ['detail']); } if ($goods_setting['is_extra_scale_ratio']) { //开启了额外计算比例,重新计算 $order_money = bcmul($order_money, $goods_setting['extra_scale_ratio'] / 100, 2); // 商品售价 } $digital_amounts = $digital_amounts + $order_money; // 商品没参与股东分红则直接退出 if (!empty($goods_setting) && $goods_setting['is_enable'] == 0) continue; $is_alone = false; // 判断是否开启独立设置 if (!empty($goods_setting['is_alone']) && $goods_setting['is_alone'] == 1) { // 商品独立分佣配置 $level_calculate = $goods_setting['detail']; $is_alone = true; } else { if ($isMch && (!$enableMode || !$isBossEnableDigital)) { continue; } // 等级分佣配置 $level_calculate = $level_arr; } $extra_digital_outer_layer = []; // 对应的等级的永久/额外佣金计算 foreach ($level_calculate as $level) { if($is_alone){ $level['digital_prize'] = $level['prize']; $level['extra_digital_prize'] = !empty($goods_setting['is_extra']) ? $level['extra_prize'] : 0; } $level_num = 0; if (!empty($level_count[$level['level']]) && !empty($level_count[$level['level']]['num'])) { $level_num = $level_count[$level['level']]['num']; // 统计的人数 } // 获取将瓜分该等级“额外分红”的高级别等级数组 $extra_level_arr = []; foreach ($insatiable_extra_level_arr as $item) { if ($item['level'] <= $level['level']) continue; // 比当前等级高 // 统计额外分红被选中的人数 $extra_type_arr = $level_arr[$item['level']]['extra_type'] ?? []; $temp_extra_level_num = 0; foreach ($extra_type_arr as $selected) { if (!empty($extra_level_count[$item['level'] . '_' . $selected])) $temp_extra_level_num += $extra_level_count[$item['level'] . '_' . $selected]; } if ($temp_extra_level_num > 0) $extra_level_arr[$item['level']] = $temp_extra_level_num; } if ($level_num <= 0) { $digital_commission = $ex_digital_commission = 0; if (array_sum($extra_level_arr) > 0) { // 判断是否开启单独分 if (empty($level_arr[$level['level']]['extra_alone'])) { $ex_digital_commission = $level['extra_digital_prize'] ? bcdiv($order_money * $level['extra_digital_prize'] / array_sum($extra_level_arr), 100, 2) : 0; //额外分红数字币 } else { $ex_digital_commission = $level['extra_digital_prize'] ? bcdiv($order_money * $level['extra_digital_prize'], 100, 2) : 0; //额外分红数字币 } } } else { $digital_commission = $level['digital_prize'] ? bcdiv($order_money * $level['digital_prize'] / $level_num , 100, 2) : 0;//数字币永久分红 // 判断是否开启单独分 if (empty($level_arr[$level['level']]['extra_alone'])) { $ex_digital_commission = $level['extra_digital_prize'] ? bcdiv($order_money * $level['extra_digital_prize'] / ($level_num + array_sum($extra_level_arr)), 100, 2) : 0;//额外分红数字币 } else { $ex_digital_commission = $level['extra_digital_prize'] ? bcdiv($order_money * $level['extra_digital_prize'], 100, 2) : 0; //额外分红数字币 } } // 叠加当前高等级的额外分红 if (array_sum($extra_level_arr) > 0) { foreach ($extra_level_arr as $a => $b) { $extra_digital_outer_layer[$a] = bcadd($extra_digital_outer_layer[$a] ?? 0, $ex_digital_commission, 2); } } // 单个商品的结算明细 $settlement_data[$level['level']][] = [ 'detail_id' => $detail['id'], 'goods_id' => $detail['goods_id'], 'goods_name' => $detail['goods_name'], 'amounts' => $order_money, 'prize' => $level['digital_prize'], 'commonisson' => $digital_commission, 'extra_prize' => $level['extra_digital_prize'], 'extra_commonisson' =>$ex_digital_commission, 'extra_alone' => $level_arr[$level['level']]['extra_alone'] ?? 0, 'type' => 'digital', ]; // 分红佣金计算 $calculate[$level['level']] = [ 'digital' => empty($calculate[$level['level']]['digital']) ? $digital_commission : $calculate[$level['level']]['digital'] + $digital_commission, 'extra_digital' => empty($calculate[$level['level']]['extra_digital']) ? $ex_digital_commission : $calculate[$level['level']]['extra_digital'] + $ex_digital_commission, 'commission' => empty($calculate[$level['level']]['commission']) ? 0 : $calculate[$level['level']]['commission'], 'extra_commission' => empty($calculate[$level['level']]['extra_commission']) ? 0 : $calculate[$level['level']]['extra_commission'], 'settlement_data' => $settlement_data[$level['level']], 'average_count' => empty($calculate[$level['level']]['average_count']) ? 0 : empty($calculate[$level['level']]['average_count']), 'forever_average_count' => $calculate[$level['level']]['forever_average_count'] ?? 0, 'extra_average_count' => $calculate[$level['level']]['extra_average_count'] ?? 0, 'digital_average_count' => $level_num, 'digital_forever_average_count' => $level_num ]; } // 对“单个商品的结算明细”和“分红佣金数组”中的佣金额外分红字段进行修改 foreach ($extra_digital_outer_layer as $m => $n) { $calculate[$m]['extra_digital'] = bcadd($calculate[$m]['extra_digital'], $n, 2); foreach ($calculate[$m]['settlement_data'] as &$k) { $k['extra_commonisson'] = bcadd($k['extra_commonisson'], $n, 2); } unset($k); } } // 结算的配置 $settlement_config = [ 'compute_type' => $config['compute_type'], // 佣金计算方式 'settlement_method' => $config['settlement_method'], // 结算方式 ]; if ($isMch) { $settlement_config['order_source'] = \common\enums\AddonsEnum::ADDONS_NAME_MCH; $settlement_config['mch_id'] = $order['mch_id']; } $i = 1; $page_size = 1000; $insert_wallet = []; $commissionArr = []; $totalCommission = 0; while ($boss_list = AddonsBoss::find()->where(['mall_id' => $mallId, 'status' => StatusEnum::ENABLED])->offset(($i - 1) * $page_size)->limit($page_size)->all()) { // 分红计算 foreach ($boss_list as $boss) { // 判断是否开启股东分红限制 $bonus_restrict_system = BossBonusLogic::getAccordBonus($boss, $level_arr[$boss->level]); if (!$bonus_restrict_system) continue; if (empty($calculate[$boss->level])) continue; $user_commission = $calculate[$boss->level]['commission']; if ($is_decr_score && !empty($is_decr_score_perpetual)) { $user_wallet = UserWallet::getOne([['user_id' => $boss->user_id], ['mall_id' => $boss->mall_id]], true, [], false, 'score'); $user_commission = $user_wallet['score'] >= $user_commission ? $user_commission : $user_wallet['score']; $user_wallet['score'] -= $user_commission; } if ($user_commission > 0) { // 永久分红 $rows[] = [ 'mall_id' => $boss->mall_id, 'order_id' => $order['id'], 'order_no' => $order['order_no'], 'user_id' => $boss->user_id, 'type' => 1, 'level' => $boss->level, // 股东等级 'average_count' => $calculate[$boss->level]['forever_average_count'], // 统计人数 'amounts' => $amounts, 'commission' => $user_commission, 'settlement_config' => Json::encode($settlement_config), 'settlement_data' => Json::encode($calculate[$boss->level]['settlement_data']), 'date' => $date, 'created_at' => $time, 'updated_at' => $time, 'total_num' => $level_count[$boss->level]['num'], ]; if ($is_decr_score && !empty($is_decr_score_perpetual)) { $desc = '股东分红佣金扣除积分'; $insert_wallet[] = [ 'mall_id' => $boss->mall_id, 'user_id' => $boss->user_id, 'is_frozen' => false, 'wallet_type' => 'score', 'money' => bcmul($user_commission, -1, 2), 'desc' => $desc, 'source_table' => '{{%order_detail}}', 'source_table_id' => $order_list[0]['id'], 'from_type' => BossEnum::ADDONS_NAME, 'capital_type' => UserWalletEnum::FOREVER, 'order_no' => $order['order_no'], 'contributor_name' => $order_list[0]['goods_name'], 'contributor_id' => $order['user_id'], 'contributor_money' => $order_list[0]['goods_price'], ]; } } // 统计佣金 foreach ($calculate[$boss->level]['settlement_data'] as $settlementItem) { if (isset($settlementItem['type']) && $settlementItem['type'] == 'digital') { continue; } $totalCommission = bcadd($totalCommission, $settlementItem['commonisson'], 2); $commissionArr[$settlementItem['detail_id']][BossEnum::ADDONS_NAME]['commission'] = bcadd($commissionArr[$settlementItem['detail_id']][BossEnum::ADDONS_NAME]['commission'] ?? 0, $settlementItem['commonisson'], 2); } $user_digital = $calculate[$boss->level]['digital']; if($user_digital > 0){ // 数字币永久分红 $rows[] = ['mall_id' => $boss->mall_id,'order_id' => $order['id'],'order_no' => $order['order_no'], 'user_id' => $boss->user_id,'type' => LevelEnum::DIGITAL_PRIZE,'level' => $boss->level, // 股东等级 'average_count' => $calculate[$boss->level]['digital_forever_average_count'], // 统计人数 'amounts' => $digital_amounts,'commission' => $user_digital,'settlement_config' => Json::encode($settlement_config), 'settlement_data' => Json::encode($calculate[$boss->level]['settlement_data']), 'date' => $date,'created_at' => $time,'updated_at' => $time, 'total_num' => $level_count[$boss->level]['num'], ]; } $extra_digital = $calculate[$boss->level]['extra_digital']; if ($extra_digital > 0) { // 额外分红数字币 $rows[] = ['mall_id' => $boss->mall_id,'order_id' => $order['id'],'order_no' => $order['order_no'],'user_id' => $boss->user_id, 'type' => LevelEnum::EXTRA_DIGITAL_PRIZE, 'level' => $boss->level, 'average_count' => $calculate[$boss->level]['digital_average_count'], 'amounts' => $digital_amounts,'commission' => $extra_digital, 'settlement_config' => Json::encode($settlement_config), 'settlement_data' => Json::encode($calculate[$boss->level]['settlement_data']), 'date' => $date, 'created_at' => $time, 'updated_at' => $time, 'total_num' => $level_count[$boss->level]['num'], ]; } $extra_commission = $calculate[$boss->level]['extra_commission']; if ($extra_commission <= 0) continue; // 额外分红小于=0直接退出 // 判断该等级是否开启额外分红 if ($level_arr[$boss->level]['is_extra'] == 0) continue; // 判断用户是否符合额外分红条件 if (isset($level_arr[$boss->level]) && !in_array($boss->upgrade_status, $level_arr[$boss->level]['extra_type'])) continue; $extra_settlement_config = $settlement_config; // 股东独立开启限额 $is_extra_bonus_alone_limit = $boss->is_extra_bonus_alone_limit; // 判断是否设置额外分红上限并且用户是否达到额外分红上限 $extra_is_limit = $is_extra_bonus_alone_limit ?: $level_arr[$boss->level]['extra_is_limit']; if ($is_extra_bonus_alone_limit) { $extra_limit_price = $boss->extra_bonus_limit; } else { $extra_limit_price = $level_arr[$boss->level]['extra_limit_price']; } //判断是否计算已满上限用户 if ($level_arr[$boss->level]['is_static_extra'] == 2 && $boss->extra_commission >= $extra_limit_price) continue; if ($extra_is_limit == 1) { // if ($is_extra_bonus_alone_limit) { // $extra_limit_price = $boss->extra_bonus_limit; // } else { // $extra_limit_price = $level_arr[$boss->level]['extra_limit_price']; // } // 已超额则直接退出 if ($boss->temp_extra_commission >= $extra_limit_price) continue; // 判断是否开启了股东额外分红限制 if (!empty($level_arr[$boss->level]['extra_restrict'])) { $check = $this->checkRestrict($boss, $level_arr[$boss->level]['extra_restrict_keys'], $level_arr[$boss->level]['extra_restrict_values'], $order); if ($check === false) continue; // 不符合条件直接跳过不给额外分红 } // 没超额,但是加上奖励金额则超额,额外分红 = 限制金额 - 已有额外金额; if ($boss->temp_extra_commission + $calculate[$boss->level]['extra_commission'] >= $extra_limit_price) { $extra_commission = $extra_limit_price - $boss->temp_extra_commission; $extra_settlement_config['extra_msg'] = '额外分红金额已达到上限,应得额外分红:¥' . $calculate[$boss->level]['extra_commission'] . ',实得额外分红:¥' . $extra_commission; } } if ($is_decr_score && !empty($is_decr_score_extra)) { if (empty($user_wallet)) { $user_wallet = UserWallet::getOne([['user_id' => $boss->user_id], ['mall_id' => $boss->mall_id], ['status' => StatusEnum::ENABLED]], true, [], false, 'score'); } $extra_commission = min($user_wallet['score'], $extra_commission); } if ($extra_commission > 0) { // 额外分红 $rows[] = [ 'mall_id' => $boss->mall_id, 'order_id' => $order['id'], 'order_no' => $order['order_no'], 'user_id' => $boss->user_id, 'type' => 2, 'level' => $boss->level, // 股东等级 'average_count' => $calculate[$boss->level]['extra_average_count'], // 统计人数 'amounts' => $amounts, 'commission' => $extra_commission, 'settlement_config' => Json::encode($extra_settlement_config), 'settlement_data' => Json::encode($calculate[$boss->level]['settlement_data']), 'date' => $date, 'created_at' => $time, 'updated_at' => $time, 'total_num' => $level_count[$boss->level]['num'], ]; if ($is_decr_score && !empty($is_decr_score_extra)) { $desc = '股东分红佣金扣除积分'; $insert_wallet[] = [ 'mall_id' => $boss->mall_id, 'user_id' => $boss->user_id, 'is_frozen' => false, 'wallet_type' => 'score', 'money' => bcmul($extra_commission, -1, 2), 'desc' => $desc, 'source_table' => '{{%order_detail}}', 'source_table_id' => $order_list[0]['id'], 'from_type' => BossEnum::ADDONS_NAME, 'capital_type' => UserWalletEnum::BO_EXTRA, 'order_no' => $order['order_no'], 'contributor_name' => $order_list[0]['goods_name'], 'contributor_id' => $order['user_id'], 'contributor_money' => $order_list[0]['goods_price'], ]; } } // 增加额外分红的临时额度 $boss->temp_extra_commission += $extra_commission; $boss->save(); // 统计佣金 foreach ($calculate[$boss->level]['settlement_data'] as $settlementItem) { if (isset($settlementItem['type']) && $settlementItem['type'] == 'digital') { continue; } $totalCommission = bcadd($totalCommission, $settlementItem['extra_commonisson'], 2); $commissionArr[$settlementItem['detail_id']][BossEnum::ADDONS_NAME]['commission'] = bcadd($commissionArr[$settlementItem['detail_id']][BossEnum::ADDONS_NAME]['commission'] ?? 0, $settlementItem['extra_commonisson'], 2); } } $i++; } // 保存数据 if (!empty($rows)) { $trans = Yii::$app->db->beginTransaction(); try { // 生成数据 $field = ['mall_id', 'order_id', 'order_no', 'user_id', 'type', 'level', 'average_count', 'amounts', 'commission', 'settlement_config', 'settlement_data', 'date', 'created_at', 'updated_at', 'total_num']; Yii::$app->db->createCommand()->batchInsert(AddonsBossRewardLog::tableName(), $field, $rows)->execute(); $trans->commit(); } catch (Exception $e) { $trans->rollBack(); $this->setError($e->getMessage()); return false; } } if ($insert_wallet) { $res = UserWalletService::batchHandleByQueue($insert_wallet); if (empty($res)) throw new \Exception(UserWalletService::getStaticError()); } if ($isMch) { $data = [ 'mall_id' => $order['mall_id'], 'mch_id' => $order['mch_id'], 'date_time' => date('Y-m-d', time()), 'order_nums' => 0, 'settlement_commission' => $totalCommission, ]; MchCensus::setData($data); } return true; } catch (Exception $e) { $exception = FormatHelper::exception($e, '订单触发股东分红计算错误'); echo $exception; $this->setError($exception); return false; } finally { if (!empty($isDecMchTaskCounter) && !empty($isMch)) { \addons\Mch\common\logic\BossLogic::decMchTaskCounter($mallId, $order['id'], $commissionArr ?? []); } } } /** * 检查用户是否符合额外分红限制条件 * @Author: lun * @DateTime: 2022/9/13 0013 11:02 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $user_id * @param $keys * @param $values * @return bool */ public function checkRestrict($user, $keys, $values, $order) { $keys = json_decode($keys, true); $values = json_decode($values, true); if (empty($keys)) return false; $is_bool = true; foreach ($values as $item) { if (in_array($item['key'], $keys) && $item['key'] <= 1) { $fun = "restrictCond" . ($item['key'] + 1); $is_bool = $this->$fun($user, $item['value']); if ($is_bool === false) { // 将不发送额外分红的用户数据存入日志,便于查询 FileHelper::writeLog($this->getLogPath($fun), "订单id={$order['id']},user_id={$user['user_id']} 本次订单无法获得额外分红"); break; } } } return $is_bool; } /** * desc@股东额外分红限制条件1 * 股东额外分红每累计收益满__元,必须购买__笔,指定商品__才可继续享受股东额外分红 * @Author: lun * @DateTime: 2022/9/13 0013 10:59 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $user_id * @param $setting * @return bool */ public function restrictCond1($user, $setting) { if ($user['extra_commission'] >= $setting['income']) { $intval = intval($user['extra_commission'] / $setting['income']); // 查询用户符合条件的购物数量 $buy_num = BossGoodsStatistics::find()->where(['user_id' => $user['user_id'], 'goods_id' => explode(',', $setting['goods_ids']), 'status' => StatusEnum::ENABLED])->sum('buy_num') ?? 0; if ($buy_num >= $intval && $buy_num >= $setting['buy_num']) return true; return false; } else { return true; } } /** * desc@股东额外分红限制条件2 * 用户累计收益每满__元,(链动和股东分红产生的收益总和),必须购买__笔,指定商品__才可继续享受股东额外分红 * @Author: lun * @DateTime: 2022/9/13 0013 11:34 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $user * @param $setting * @return bool */ public function restrictCond2($user, $setting) { $copy_commission = 0; // 二二复制累计收益初始化 if (MallAddons::isInstall($user['mall_id'], 'DoubleCopy')) { // 获取二二复制总收益 $copy_commission = DoubleCopyUser::find()->select('commission')->where(['user_id' => $user['user_id'], 'status' => StatusEnum::ENABLED])->scalar() ?? 0; } // 总收益 = 股东收益 + 二二复制收益 $total_commission = $user['total_commission'] + $copy_commission; if ($total_commission >= $setting['income']) { $intval = intval($total_commission / $setting['income']); // 查询用户符合条件的购物数量 $buy_num = BossGoodsStatistics::find()->where(['user_id' => $user['user_id'], 'goods_id' => explode(',', $setting['goods_ids']), 'status' => StatusEnum::ENABLED])->sum('buy_num') ?? 0; if ($buy_num >= $intval && $buy_num >= $setting['buy_num']) return true; return false; } else { return true; } } /** * 插入日志记录 * @Author: lun * @DateTime: 2022/9/13 0013 16:09 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $type * @return string */ protected function getLogPath($type) { return Yii::getAlias('@runtime') . "/logs/boss/" . $type . '/' . date('Y_m_d') . '.txt'; } }