| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- <?php
- // +----------------------------------------------------------------------
- // | likeshop开源商城系统
- // +----------------------------------------------------------------------
- // | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
- // | gitee下载:https://gitee.com/likeshop_gitee
- // | github下载:https://github.com/likeshop-github
- // | 访问官网:https://www.likeshop.cn
- // | 访问社区:https://home.likeshop.cn
- // | 访问手册:http://doc.likeshop.cn
- // | 微信公众号:likeshop技术社区
- // | likeshop系列产品在gitee、github等公开渠道开源版本可免费商用,未经许可不能去除前后端官方版权标识
- // | likeshop系列产品收费版本务必购买商业授权,购买去版权授权后,方可去除前后端官方版权标识
- // | 禁止对系统程序代码以任何目的,任何形式的再发布
- // | likeshop团队版权所有并拥有最终解释权
- // +----------------------------------------------------------------------
- // | author: likeshop.cn.team
- // +----------------------------------------------------------------------
- namespace app\common\command;
- use app\common\enum\OrderEnum;
- use app\common\logic\AccountLogLogic;
- use app\common\model\AccountLog;
- use app\common\model\DividendCashLog;
- use app\common\model\DividendOrder;
- use app\common\model\DividendOrderLog;
- use app\common\model\order\Order;
- use app\common\model\user\User;
- use app\common\server\ConfigServer;
- use think\console\Command;
- use think\console\Input;
- use think\console\Output;
- use think\facade\Log;
- class AwardIntegral extends Command
- {
- protected function configure()
- {
- $this->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 ;
- }
- }
|