| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- <?php
- namespace addons\Happiness\common\service;
- use addons\Happiness\common\enums\HappinessEnum;
- use addons\Happiness\common\enums\HappinessRewardEnum;
- use addons\Happiness\common\models\HappinessBoss;
- use addons\Happiness\common\models\HappinessWeightPoolJob;
- use addons\Happiness\common\models\HappinessWeightPoolLog;
- use addons\Happiness\common\models\HappinessWeightPoolOrderLog;
- use common\enums\StatusEnum;
- use services\common\UserWalletService;
- /**
- * 加权分红服务
- */
- class WeightService
- {
- public function record($order, $order_status)
- {
- try {
- $mall_id = $order['mall_id'];
- $config = \Yii::$app->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;
- }
- }
-
- }
|