services->setting->addons->get($mall_id, HappinessEnum::ADDONS_NAME, 'basic'); if ($order_status == $config['settlement_method']) { $this->recordOrderLog($order, $config,$order_status); //分红池订单 } } catch (\Exception $e) { \Yii::error(__METHOD__ . ', err:' . $e->getMessage()); } } //发放奖励 public function send($mall_id, $config, $start_at, $end_at, $job_id) { try { $last=HappinessWeightPoolOrderLog::find()->where(['mall_id'=>$mall_id,'status'=>StatusEnum::ENABLED,'settlement_status' => StatusEnum::DISABLED])->orderBy('id desc')->one(); if(!$last) { return true; } //分红的金额 $pool_prize_amount = HappinessWeightPoolOrderLog::find()->where([ 'and', ['mall_id' => $mall_id], ['status' => StatusEnum::ENABLED], ['settlement_status' => StatusEnum::DISABLED], ['<=', 'id', $last->id] ])->sum('amount') ?? 0; if ($pool_prize_amount <= 0) return true; $level_list=!empty($config['boss_list'])? json_decode($config['boss_list'],true):[];//身份收益设置 $pool_level=[]; if(!empty($level_list)) { foreach ($level_list as $level => $level_info) { if($level_info['weight_scale']>0 && $level_info['weight_num']>0) { $pool_level[]=[ 'weight_scale'=>$level_info['weight_scale'], 'weight_num'=>$level_info['weight_num'], 'level'=>$level_info['level'] ]; } } } if (empty($pool_level)) return true; //获取分红人数 foreach ($pool_level as &$level_info) { $level_info['member']=HappinessBoss::find()->where(['level'=>$level_info['level'], 'mall_id'=>$mall_id])->orderBy('id asc')->asArray()->limit($level_info['weight_num'])->all(); $level_info['count']=count($level_info['member']); $level_info['pool']=bcmul(bcdiv($level_info['weight_scale'],100,4), $pool_prize_amount, 2); $level_info['amount']=bcdiv($level_info['pool'], $level_info['weight_num'], 2); } $rows = []; $period_num = 0; $period_amount = 0; foreach ($pool_level as $pool_level_info) { $amount = $pool_level_info['amount']; if($amount<=0 || $pool_level_info['count']<=0) { continue; } foreach ($pool_level_info['member'] as $member_info) { $rows[] = [ 'mall_id' => $mall_id, 'user_id' => $member_info['user_id'], 'num' => $pool_level_info['count'], //分红人数 'total_amount' => $pool_level_info['pool'], //分红池总金额 'amount' => $amount, //可获得分红 'start_at' => $start_at, 'end_at' => $end_at, 'remark'=>'合伙人加权分红', 'created_at' => time(), 'updated_at' => time(), 'billing_cycle' => $config['compute_period'], 'job_id' => $job_id, 'scale' => $pool_level_info['weight_scale'], ]; $period_num += 1; //实际分红人数 $period_amount += $amount; //分红总金额累加 } } if (empty($rows)) throw new \Exception('奖金池佣金记录为空'); $job = HappinessWeightPoolJob::findOne($job_id); $t = \Yii::$app->db->beginTransaction(); try { $insert_wallet = []; $columns = ['mall_id', 'user_id', 'num', 'total_amount', 'amount', 'start_at', 'end_at','remark','created_at', 'updated_at', 'billing_cycle', 'job_id', 'scale']; $res = \Yii::$app->db->createCommand()->batchInsert(HappinessWeightPoolLog::tableName(), $columns, $rows)->execute(); if (!$res) throw new \Exception('批量生成奖金池佣金记录失败'); HappinessWeightPoolOrderLog::updateAll( ['settlement_status' => StatusEnum::ENABLED, 'updated_at' => time()], ['and', ['mall_id' => $mall_id, 'settlement_status' => StatusEnum::DISABLED], ['<=', 'id', $last->id]] ); $k = 1; $page_log = 1000; while ($log_list = HappinessWeightPoolLog::find()->where(['mall_id' => $mall_id, 'start_at' => $start_at, 'end_at' => $end_at]) ->offset(($k - 1) * $page_log)->limit($page_log)->asArray()->all() ) { foreach ($log_list as $log) { $insert_wallet[] = [ 'mall_id' => $log['mall_id'], 'user_id' => $log['user_id'], 'is_frozen' => false, 'wallet_type' => 'commission', 'money' => $log['amount'], 'desc' => '加权分红', 'source_table' => HappinessWeightPoolLog::tableName(), 'source_table_id' => $log['id'], 'from_type' => HappinessEnum::ADDONS_NAME, 'capital_type' => HappinessRewardEnum::COMMISSION_TYPE_POOL ]; } $k++; } $job->num = $period_num; //分红人数 $job->total_amount = $period_amount; //实际分红总金额 $job->period_total_amount = $pool_prize_amount; //分红池金额 $job->save(); //加一条减少记录 if (HappinessWeightPoolOrderLog::setData([ 'mall_id' => $mall_id, 'user_id' => 0, 'date' => date('Ymdhis'), 'amount' => -$pool_prize_amount, 'order_id' =>0, 'order_no' => '', 'price' => 0, 'pay_price' => 0, 'before_amount' => $pool_prize_amount, 'after_amount' => 0, 'settlement_status' =>1, 'desc' => '奖金池释放' ]) === false) { throw new \Exception(HappinessWeightPoolOrderLog::getStaticError()); } $t->commit(); } catch (\Exception $ex) { $t->rollback(); throw $ex; } if ($insert_wallet) { UserWalletService::batchHandleByQueue($insert_wallet); } return true; } catch (\Exception $e) { \Yii::error(__METHOD__ . ', err:' . $e->getMessage()); return true; } } /** * @Description: 记录进入奖金池的订单 * @param array $order * @param array $config * @return bool */ private function recordOrderLog($order, $config,$order_status): bool { try { $user_id = $order['user_id']; $mall_id = $order['mall_id']; $is_open = $config['is_enable']; if (!$is_open || $order['pay_money']<=0) { return true; } //如果是订单支付且结算方式是支付完成 if ($order_status == 0 && $config['settlement_method'] == 1) { return false; } //判断是否已经写入这个订单 $hasOrder=HappinessWeightPoolOrderLog::find()->where(['order_no'=>$order['order_no'],'mall_id'=>$mall_id, 'user_id'=>$user_id]) ->one(); if($hasOrder) { return false; } $amount = $order['pay_money'] ; $before_amount = HappinessWeightPoolOrderLog::find()->where(['mall_id' => $mall_id, 'settlement_status' => 0])->sum('amount'); $before_amount= $before_amount??0; if ($amount > 0) { if (HappinessWeightPoolOrderLog::setData([ 'mall_id' => $mall_id, 'user_id' => $user_id, 'date' => date('Ymdhis'), 'amount' => $amount, 'order_id' => $order['id'], 'order_no' => $order['order_no'], 'price' => $order['goods_price'], 'pay_price' => $order['goods_price'], 'before_amount' => $before_amount, 'after_amount' => bcadd($before_amount, $amount, 2), 'desc' => '来自订单' . $order['order_no'] . '的分红金额' ]) === false) { throw new \Exception(HappinessWeightPoolOrderLog::getStaticError()); } } return true; } catch (\Exception $e) { \Yii::error(__METHOD__ . ',err:' . $e->getMessage()); return false; } } }