| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811 |
- <?php
- namespace addons\Boss\common\logic;
- use addons\Boss\common\enums\BossEnum;
- use addons\Boss\common\enums\LevelEnum;
- use addons\Boss\common\models\AddonsBoss;
- use addons\Boss\common\models\AddonsBossCommissionItemSetting;
- use addons\Boss\common\models\AddonsBossCommissionLog;
- use addons\Boss\common\models\AddonsBossLevel;
- use addons\Boss\common\models\AddonsBossLevelSetting;
- use addons\Boss\common\models\AddonsBossRewardLog;
- use addons\Boss\common\models\BossGoodsStatistics;
- use addons\DoubleCopy\common\models\DoubleCopyUser;
- use addons\Mch\common\enums\MchEnum;
- use addons\Mch\common\logic\BossLogic;
- use addons\Mch\common\models\MchCensus;
- use addons\Mch\common\models\MchModel;
- use addons\Mch\common\models\MchSettings;
- use addons\Store\common\models\StoreGoodsModel;
- use common\enums\AddonsEnum;
- use common\enums\StatusEnum;
- use common\enums\UserWalletEnum;
- use common\helpers\FileHelper;
- use common\helpers\FormatHelper;
- use common\models\mall\MallAddons;
- use common\models\order\Order;
- use common\models\statistics\UserStatisticsTotal;
- use common\models\user\User;
- use yii\helpers\Json;
- use common\models\order\OrderDetail;
- use common\models\user\UserWallet;
- use common\traits\ErrorTrait;
- use Exception;
- use services\common\UserWalletService;
- use yii;
- /**
- * Class RewardLog
- * @Author: lun
- * @DateTime: 2021/10/25 9:39
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @package addons\Boss\common\logic
- */
- class RewardLogLogic
- {
- use ErrorTrait;
- /**
- * @Author: hua
- * @DateTime: 2021/10/18 9:57
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @param $order
- * @return bool
- */
- public function execute($order)
- {
- try {
- // 初始化数据
- $order_list = $order['detail'];
- $mallId = $order['mall_id'];
- $calculate = []; // 佣金计算
- $amounts = 0; // 结算的总金额
- $date = date('Ymd', time());
- $time = time();
- // 判断用户插件是否安装
- if (MallAddons::isInstall($mallId, BossEnum::ADDONS_NAME) == 0) return true;
- $isDecMchTaskCounter = true;
- $isMch = false;
- if (!empty($order['mch_id'])) {
- $isMch = MallAddons::isInstall($mallId, AddonsEnum::ADDONS_NAME_MCH);
- }
- // 获取基础配置
- $config = Yii::$app->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';
- }
- }
|