setName('award_integral') ->setDescription('结算消费赠送积分'); } protected function execute(Input $input, Output $output) { try { $time = time(); $config = ConfigServer::get('transaction', 'order_after_sale_days', 7); $finish_limit = $config * 24 * 60 * 60; $orders = Order::field(true)->where([ ['del', '=', 0], ['award_integral_status', '>', 0], ['is_award_integral', '=', 0], ['pay_status', '=', 1] ])->order('id asc')->select()->toArray(); foreach ($orders as $order) { if ($order['award_integral'] <= 0) { continue; } if ($order['award_integral_status'] == OrderEnum::ORDER_DELIVERY && $order['order_status'] < OrderEnum::ORDER_STATUS_GOODS) { continue; } if ($order['award_integral_status'] == OrderEnum::ORDER_FINISH && $order['order_status'] < OrderEnum::ORDER_STATUS_COMPLETE) { continue; } if ($order['award_integral_status'] == OrderEnum::ORDER_AFTER_SALE_OVER && ($order['order_status'] < OrderEnum::ORDER_STATUS_COMPLETE || ($finish_limit + $order['confirm_take_time']) > $time)) { continue; } User::where('id',$order['user_id'])->inc('user_integral', $order['award_integral'])->update(); Order::update(['is_award_integral'=>1,'update_time'=>$time],['id'=>$order['id']]); AccountLogLogic::AccountRecord($order['user_id'], $order['award_integral'], 1, AccountLog::consume_award_integral, '', $order['id'], $order['order_sn']); $this->update_dividend_info($order); } return true; } catch (\Exception $e) { Log::write('结算消费赠送积分异常:'.$e->getMessage()); return false; } } //更新分红信息 protected function update_dividend_info($orders){ // outFileLog($orders,'award_integral','orders'); if(empty($orders)) return false; $dividend_cash = ConfigServer::get('platform_setting', 'dividend_cash', 0); $dividend_set_money = ConfigServer::get('platform_setting', 'dividend_set_money', 100); $dividend_rate = ConfigServer::get('platform_setting', 'dividend_rate', 0.04); $rebate_rate = ConfigServer::get('platform_setting', 'rebate_rate', 0.2); $change_money = $orders['order_amount']*$dividend_rate; $total_cash = $dividend_cash+$change_money; //更新分红池金额 ConfigServer::set('platform_setting', 'dividend_cash', $total_cash); //添加分红池记录 $this->addDividendCashLog($change_money,$orders['id'],1,$total_cash,'订单【'.$orders['order_sn'].'】增加分红池金额'); //检查方法分红奖励 $this->sendDividendCash(); //增加排队列表 $linret = $this->lineUp($orders,$dividend_set_money,$rebate_rate); return true; } //增加分红池资金变化记录 public function addDividendCashLog($change_money,$order_id,$change_type,$dividend_cash,$remark,$shop_id=0){ $saveData['change_type'] = $change_type; $saveData['order_id'] = $order_id; $saveData['change_money'] = $change_money; $saveData['total_money'] = $dividend_cash; $saveData['remark'] = $remark; $saveData['shop_id'] = $shop_id; $ret = DividendCashLog::create($saveData); return $ret; } //开始进入排队 protected function lineUp($order,$dividend_set_money=100,$rebate_rate=0.2){ $rated_money = ConfigServer::get('platform_setting', 'rated_money', 3000);//大额额定金额 $rated_money_rate = ConfigServer::get('platform_setting', 'rated_money_rate', 0.04);//大额分红额定比例 $order_money = $order['order_amount']; if($order_money >= $rated_money){ $dividend_set_money = round($order_money*$rated_money_rate,2); //分红额定金额 } $count = ceil($order_money/$dividend_set_money); // outFileLog($count,'award_integral','$count'); if($count>1){ $dividend_money = 0; //当前计入分红额度 for($i = 0 ;$i<$count ;$i++){ $j = $i+1; $flag_money = $dividend_set_money*$j; if($flag_money<$order_money){ $dividend_money = $dividend_set_money; }else{ $dividend_money = $order_money-$dividend_set_money*$i; } if($j<10){ $sn = $order['order_sn'].'0'.$j; }else{ $sn = $order['order_sn'].$j; } $this->createDividendOrder($order,$dividend_money,$rebate_rate,$dividend_set_money,$sn); } }else{ $sn=$order['order_sn'].'01'; $this->createDividendOrder($order,$order_money,$rebate_rate,$dividend_set_money,$sn); } } //创建排队信息 /* * $money 计算进入分红的金额 * $dividend_set_money 分红额定金额 满了结束排队 * */ public function createDividendOrder($order,$money,$rebate_rate,$dividend_set_money=100,$sn){ //给排队第一个人加佣金 $dowhere['status'] = 0; $doOrder = DividendOrder::where($dowhere)->order('id asc')->select()->toArray(); if($doOrder){ //插入排队表信息 $this->createData($order,0,$dividend_set_money,$sn); $change_money = round($money*$rebate_rate,2); foreach($doOrder as &$dov){ if($change_money<=0) break; $diff_money = $dov['rated_money'] - $dov['money']; if($diff_money>=$change_money){ //变动金额达不到排队订单完结状态 $this->updateUserDividendOrder($dov,$change_money,$order,$dividend_set_money,0); $change_money = 0; }else{ //当前排队订单完结 $change_money = $change_money-$diff_money; $this->updateUserDividendOrder($dov,$diff_money,$order,$dividend_set_money,1); } } }else { $data_money = round($money * $rebate_rate, 2); $this->createData($order,$data_money,$dividend_set_money,$sn); } return true ; } //插入排队信息以及记录 protected function createData($order,$money,$dividend_set_money,$sn=''){ //插入排队表信息 $saveDividendOrderData['sn'] = $sn; $saveDividendOrderData['user_id'] = $order['user_id']; $saveDividendOrderData['order_id'] = $order['id']; $saveDividendOrderData['rated_money'] = $dividend_set_money; $saveDividendOrderData['money'] = $money; $saveDividendOrderData['status'] = 0; $addret = DividendOrder::create($saveDividendOrderData); $do_id = $addret['id']; $saveLogData['do_id'] = $do_id; $saveLogData['order_id'] = $order['id']; $saveLogData['money'] = $money; DividendOrderLog::create($saveLogData); return true ; } //更新排队订单信息 public function updateUserDividendOrder($order,$change_money,$from_order,$dividend_set_money,$flag){ $order_id = $from_order['id']; $id = $order['id']; $total_money = $order['money'] + $change_money; if($flag){ //达到分红金额,排队结束,并扣减积分,钱转入可提现余额 $updateDividendOrderData['status'] = 1; $dividend_cash = ConfigServer::get('platform_setting', 'dividend_cash', 0); if($dividend_cash>=$dividend_set_money){ $updateDividendOrderData['is_exchange'] = 1; $this->changeIntegral($order,$order['user_id'],$order['rated_money']); } } $updateDividendOrderData['money'] = $total_money; $updateDividendOrderData['update_time'] = time(); DividendOrder::where(['id'=>$id])->update($updateDividendOrderData); $saveLogData['do_id'] = $id; $saveLogData['order_id'] = $order_id; $saveLogData['money'] = $change_money; DividendOrderLog::create($saveLogData); return true; } public function sendDividendCash(){ $dividend_cash = ConfigServer::get('platform_setting', 'dividend_cash', 0); $dowhere['status'] = 1; $dowhere['is_exchange'] = 0; $doOrder = DividendOrder::where($dowhere)->order('id asc')->select()->toArray(); foreach ($doOrder as &$dov){ if($dividend_cash >= $dov['rated_money']){ $this->changeIntegral($dov,$dov['user_id'],$dov['rated_money']); } } } /* * * $change_integral 变动积分 额定金额 * */ public function changeIntegral($order,$user_id,$change_integral){ //减少分红池金额 $dividend_cash = ConfigServer::get('platform_setting', 'dividend_cash', 0); $new_dividend_cash = $dividend_cash - $change_integral; if($new_dividend_cash < 0 ) return true; // outFileLog($new_dividend_cash,'award_integral','$total_cash2'); ConfigServer::set('platform_setting', 'dividend_cash', $new_dividend_cash); //扣减积分 $user_info = User::find($user_id); $user_info->user_integral = $user_info->user_integral - $change_integral; $user_info->earnings = $user_info->earnings + $change_integral; $user_info->save(); //扣减积分记录 AccountLogLogic::AccountRecord($order['user_id'], $change_integral, 2, AccountLog::integral_dividend, '分红池分红奖金提现消耗积分', $order['id'], ''); //增加佣金 AccountLogLogic::AccountRecord($user_id,$change_integral,1,AccountLog::dividend_inc_earnings, '分红池分红增加佣金', $order['id']); //添加分红池记录 $this->addDividendCashLog($change_integral,$order['id'],2,$new_dividend_cash,'分红订单【'.$order['sn'].'】分红后减少分红池金额'); //更新排队订单的支付状态 $updateDividendOrderData['is_exchange'] = 1; $updateDividendOrderData['update_time'] = time(); DividendOrder::where(['id'=>$order['id']])->update($updateDividendOrderData); return true ; } }