| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545 |
- <?php
- namespace app\models\store;
- use app\models\system\SystemUserLevel;
- use app\models\user\User;
- use app\models\user\UserBill;
- use crmeb\basic\BaseModel;
- use crmeb\services\UtilService;
- use crmeb\traits\ModelTrait;
- use think\Exception;
- use think\facade\Log;
- use think\Model;
- class Package extends BaseModel
- {
- use ModelTrait;
- /**
- * 预约
- * @param $uid
- * @param $package_manager
- * @param $price
- * @param $day
- * @param $proportion
- * @return Package|bool|Model
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\DbException
- * @throws \think\db\exception\ModelNotFoundException
- */
- public static function reserve($uid,$package_manager,$price,$day,$proportion,$pass)
- {
- $data['uid'] = $uid;
- $data['package_manager'] = $package_manager;
- //if(!self::is_valid()) return self::setErrorInfo('非活动时间,不能预约');
- $start = strtotime(date("Y-m-d"));
- if(self::where('package_manager',$package_manager)->where('uid',$uid)->where('add_time','>=',$start)->find())
- {
- return self::setErrorInfo('你已报名,无需重复报名');
- }
- $data['add_time'] = time();
- $data['order_id'] = self::getNewOrderId();
- $data['proportion'] = $proportion;
- $data['price'] = $price;
- $data['day'] = $day;
- $data['am'] = date("H")>12?0:1;
- $data['pass'] = $pass;
- return self::create($data);
- }
- /**
- * 是否活动时间
- */
- public static function is_valid()
- {
- $am= explode("~",sys_config('start_time'));
- $pm = explode("~",sys_config('end_time'));
- if((date("H:i")>$am[0] && date("H:i")<$am[1]))
- {
- return 1;
- }
- elseif((date("H:i")>$pm[0] && date("H:i")<$pm[1]))
- {
- return 2;
- }
- return 0;
- }
- /**
- * 兑换
- * @param $uid
- * @param $package_manager
- * @param $price
- * @param $day
- * @param $proportion
- * @param $consume_pass
- * @param int $type
- * @param int $am
- */
- public static function create_order($uid,$tu_uid=0,$id,$price)
- {
- $user = User::find($uid);
- $H = date("H");
- if ($type==1 && $H < 12 ) {
- return self::setErrorInfo("推荐兑换只能在下午市进行");
- }
- if($type>0 && $consume_pass==0 || $user['now_money']<$consume_pass)
- {
- return self::setErrorInfo('通行证少于'.$consume_pass.",请先买通行证!");
- }
- if( $user['brokerage_price']<$price)
- {
- return self::setErrorInfo('收益少于'.$price);
- }
- $i = date("i");
- if ($i < 30) {
- $start = strtotime(date("Y-m-d H:00:00"));
- $end = strtotime(date("Y-m-d H:29:59"));
- } else {
- $start = strtotime(date("Y-m-d H:30:00"));
- $end = strtotime(date("Y-m-d H:59:59"));
- }
- if(self::where('package_manager',$package_manager)->where('uid',$uid)->where('add_time','>=',$start)->where('add_time','<=',$end)->find())
- {
- return self::setErrorInfo('你已报名,无需重复报名');
- }
- $data['uid'] =$uid;
- $data['package_manager'] = $package_manager;
- $data['add_time'] = time();
- $data['order_id'] = self::getNewOrderId();
- $data['proportion'] = $proportion;
- $data['price'] = $price;
- $data['day'] = $day;
- $data['consume_pass'] =$consume_pass;
- $data['am'] = date("H")>12?0:1;
- $data['pass'] = $pass;
- $data['type'] = $type;
- $data['status'] = 4;
- $res = self::create($data);
- User::where('uid',$uid)->dec('now_money',$consume_pass)->dec('brokerage_price',$price)->update();
- UserBill::expend("兑换包扣通证",$uid,'now_money','pay_money',$consume_pass,$res['id'],bcsub($user['now_money'],$consume_pass,2),'兑换包扣除'.$consume_pass."通行证");
- UserBill::expend("兑换包扣收益",$uid,'now_money','pay_money',$price,$res['id'],bcsub($user['brokerage_price'],$price,2),'兑换包扣除'.$price."收益");
- return $res;
- }
- /**
- * 生成订单唯一id
- * @param $uid 用户uid
- * @return string
- */
- public static function getNewOrderId()
- {
- list($msec, $sec) = explode(' ', microtime());
- $msectime = number_format((floatval($msec) + floatval($sec)) * 1000, 0, '', '');
- $orderId = 'pk' . $msectime . mt_rand(10000, 99999);
- while (self::be(['order_id' => $orderId])) $orderId = 'pk' . $msectime . mt_rand(10000, 99999);
- return $orderId;
- }
- /**
- * 我的订单
- * @return bool|string
- */
- public static function getlist()
- {
- $rs = sys_data('package_manager');
- $am= explode("~",sys_config('start_time'));
- $pm= explode("~",sys_config('end_time'));
- foreach ($rs as &$v) {
- $v['cts'] =self::where('package_manager',$v['id'])->where('add_time','>=',strtotime(date("Y-m-d ")))->where('add_time','<',strtotime(date("Y-m-d ").$v['end']))->count();
- $v['cts'] = bcadd($v['virtual'],$v['cts']);
- }
- return $rs;
- }
- /**
- * 收货确认
- * @param $id
- */
- public static function take($id)
- {
- $info = self::find($id);
- $data['start_day'] = time();
- $data['end_day'] = strtotime("+".$info['day']." days");
- $data['status'] = 3;
- $data['sum_revenue'] = bcdiv(bcmul(bcmul($info['proportion'],$info['day'],4),$info['price'],4),100,2);
- $data['paid'] = 1;
- self::beginTrans();
- try {
- User::where('uid',$info['uid'])->inc('now_money',$info['pass'])->update();
- $user = User::where('uid',$info['uid'])->find();
- UserBill::income('通证收益',$info['uid'],'now_money','sign',$info['pass'],$info['id'],$user['now_money'],'包收益通证'.$info['pass']);
- $res = self::edit($data,$id);
- $res1 = self::backBrokerage($info);
- if($info['last_id']>0) self::edit(['status'=>6],$info['last_id']);
- self::commitTrans();
- }
- catch (Exception $e)
- {
- Log::error('收货错误:' .$e->getFile().'行'.$e->getLine()."原因:".$e->getMessage());
- self::setErrorInfo('收货确认错误',true);
- }
- return true;
- }
- /**
- * 定时执行
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\DbException
- * @throws \think\db\exception\ModelNotFoundException
- */
- public static function make_package()
- {
- self::startTrans();
- try {
- $package_manager = sys_data('package_manager');
- $package = [];
- foreach ($package_manager as $v) {
- if(date("H:i") == $v['open'])
- $package[] = $v;
- }
- $uids = User::where('is_sys', 1)->column('uid');
- foreach ($package as $v)
- {
- $arr = self::where('status', 0)->where('package_manager',$v['id'])->where('add_time','<',strtotime(date("Y-m-d ").$v['end'].":00"))->select();
- if ($arr) {
- $ids = [];
- $sum = $v['one'];
- if (sizeof($arr->toArray()) > $sum) {
- $ids = self::getrand($arr->toArray(), $sum);
- } else {
- foreach ($arr as $v1) {
- $ids[] = $v1['id'];
- }
- }
- foreach ($ids as $v2) {
- $info = self::where('status', 4)->where('uid','not in',$uids)->where('add_time','<',strtotime("-30 minute"))->where('package_manager', $v['id'])->find();
- $last_id = 0;
- if ($info) {
- $to_uid = $info['uid'];
- $last_id = $info['id'];
- self::edit(['status' => 5], $info['id']);
- } else {
- $to_uid = User::where('is_sys', 1)->order('sys_pay asc,uid asc')->value('uid');
- User::where('uid', $to_uid)->inc('sys_pay', 1)->update();
- }
- self::edit(['to_uid' => $to_uid, 'status' => 1,'last_id'=>$last_id,'lottery_time'=>time()], $v2);
- }
- }
- }
- self::checkTrans(true);
- }catch (Exception $e)
- {
- self::setErrorInfo('生成出错'.$e->getMessage(),true);
- }
- }
- /**
- * 定时执行老
- */
- public static function make_package2()
- {
- self::startTrans();
- try {
- $H = date("H");
- $package_manager = sys_data('package_manager');
- $package = [];
- foreach ($package_manager as $v) {
- $package[$v['id']] = $v;
- }
- $model = new self;
- $model = $model->where('add_time','<',strtotime("-30 minute"));
- $where = null;
- if ($H < 13) {
- $model = $model->where('am', 1);
- $where['am'] = 1;
- } else {
- $model = $model->where('am', 0);
- $where['am'] = 0;
- }
- $rs = $model->where('status', 0)->group('package_manager')->field('package_manager,count(package_manager) as ct')->select();
- foreach ($rs as $v) {
- $arr = self::where('status', 0)->where($where)->where('add_time','<',strtotime("-30 minute"))->where('package_manager', $v['package_manager'])->select();
- if ($arr) {
- $ids = [];
- $sum = $package[$v['package_manager']]['one'];
- if (sizeof($arr->toArray()) > $sum) {
- $ids = self::getrand($arr->toArray(), $sum);
- } else {
- foreach ($arr as $v1) {
- $ids[] = $v1['id'];
- }
- }
- foreach ($ids as $v2) {
- $info = self::where('status', 4)->where($where)->where('add_time','<',strtotime("-30 minute"))->where('package_manager', $v['package_manager'])->find();
- $last_id = 0;
- if ($info) {
- $to_uid = $info['uid'];
- $last_id = $info['id'];
- self::edit(['status' => 5], $info['id']);
- } else {
- $to_uid = User::where('is_sys', 1)->order('sys_pay asc,uid asc')->value('uid');
- User::where('uid', $to_uid)->inc('sys_pay', 1)->update();
- }
- self::edit(['to_uid' => $to_uid, 'status' => 1,'last_id'=>$last_id,'lottery_time'=>time()], $v2);
- }
- }
- }
- self::checkTrans(true);
- }catch (Exception $e)
- {
- self::setErrorInfo('生成出错'.$e->getMessage(),true);
- }
- }
- /**
- * 返现
- * @param $info
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\DbException
- * @throws \think\db\exception\ModelNotFoundException
- */
- public static function backBrokerage($info)
- {
- $userinfo = User::find($info['uid']);
- $spreaduser = User::where('uid',$userinfo['spread_uid'])->find();
- $twouser = User::where('uid',$spreaduser['spread_uid'])->find();
- $bksum = bcdiv(bcmul($info['price'],bcmul($info['proportion'],$info['day'],2),2),100,2);
- if($spreaduser['level']>0) {
- $recommend = bcmul(bcdiv(sys_config('recommend'),100,2), $bksum, 2);
- $mark = "订单号" . $info['order_id'] . '产生推荐奖,奖励推广佣金' . $recommend;
- $res1 = UserBill::income('推荐奖', $spreaduser['uid'], 'now_money', 'brokerage', $recommend, $info['id'], bcadd($recommend, $spreaduser['brokerage_price'], 2), $mark);
- $res2 = User::where('uid', $spreaduser['uid'])->inc('brokerage_price', $recommend)->update();
- }
- //二代推荐
- if($twouser && $twouser['level']>1)
- {
- $recommend = bcmul(bcdiv(sys_config('two_recommend'),100,2), $bksum, 2);
- $mark = "订单号" . $info['order_id'] . '产生推荐奖,奖励推广佣金' . $recommend;
- $res1 = UserBill::income('二代推荐奖', $twouser['uid'], 'now_money', 'brokerage', $recommend, $info['id'], bcadd($recommend, $twouser['brokerage_price'], 2), $mark);
- $res2 = User::where('uid', $twouser['uid'])->inc('brokerage_price', $recommend)->update();
- }
- $userlist = User::select()->toArray();
- $pids = UtilService::getparentid($userlist, $info['uid']);
- $levels = SystemUserLevel::where('is_del',0)->where('is_show',1)->field('id,name,peer_award,team_award')->select();
- $levela = [];$current_level = $spreaduser['level'];
- foreach ($levels as $v)
- {
- $levela[$v['id']]['peer_award'] = $v['peer_award'];
- $levela[$v['id']]['team_award'] = $v['team_award'];
- $levela[$v['id']]['sbl'] = false;
- $levela[$v['id']]['use'] = false;
- }
- if($pids) {
- foreach ($pids as $v) {
- if ($v['level'] >= $current_level && $levela[$v['level']]['team_award'] > 0) {
- //处理第一次
- if ($levela[$v['level']]['use']==false) {
- $level_award = $levela[$v['level']]['team_award'];
- $levela[$v['level']]['use'] = true;
- } else {
- if ($levela[$v['level']]['sbl']==false) {
- $level_award = $levela[$v['level']]['peer_award'];
- $levela[$v['level']]['sbl'] = true;
- }
- }
- if ($v['level'] > $current_level) {
- $current_level = $v['level'];
- } else {
- if ($v['level'] == $current_level && $levela[$v['level']]['sbl'] == true) {
- $current_level++;
- }
- }
- $proportion = bcmul($bksum, bcdiv($level_award, 100, 2), 2);
- if($proportion==0) continue;
- if ($levela[$v['level']]['sbl'] == true) {
- $mark = "订单号" . $info['order_id'] . '产生平级奖,奖励推广佣金' . $proportion;
- $res1 = UserBill::income('平级奖', $v['uid'], 'now_money', 'brokerage', $proportion, $info['id'], bcadd($proportion, $v['brokerage_price'], 2), $mark);
- $res2 = User::where('uid', $v['uid'])->inc('brokerage_price', $proportion)->update();
- } else {
- $mark = "订单号" . $info['order_id'] . '产生团队奖,奖励推广佣金' . $proportion;
- $res1 = UserBill::income('团队奖', $v['uid'], 'now_money', 'brokerage', $proportion, $info['id'], bcadd($proportion, $v['brokerage_price'], 2), $mark);
- $res2 = User::where('uid', $v['uid'])->inc('brokerage_price', $proportion)->update();
- }
- }
- }
- }
- return true;
- }
- /**
- * 订单无效
- * @param $id
- */
- public static function invalid($id,$re='')
- {
- $data['status'] = -2;
- $data['re'] = $re;
- $last_id = self::where('id',$id)->value('last_id');
- if($last_id>0) self::edit(['status'=>4],$last_id);
- return self::edit($data,$id);
- }
- /**
- * 支付超时
- */
- public static function time_out()
- {
- $list = self::where('status',1)->where('lottery_time','<',strtotime("-".sys_config('time_out')." minute"))->select();
- foreach ($list as $v)
- {
- if($v['last_id']>0) self::edit(['status'=>4],$v['last_id']);
- self::edit(['status'=>-3],$v['id']);
- $user =User::where('uid',$v['uid'])->find();
- User::where('uid',$v['uid'])->inc('notpay',1)->update();
- if($user['notpay']<9)
- {
- if(bcadd($user['notpay'],1) % 3==0)
- {
- $mark = "累计提时" .bcadd($user['notpay'],1) . '扣通行证100';
- $res1 = UserBill::expend('支付超时', $v['uid'], 'now_money', 'pay_money', 100, 0, bcsub($v['now_money'],100, 2), $mark);
- $res2 = User::where('uid', $v['uid'])->dec('now_money', 100)->update();
- }
- }
- else
- {
- if($user['status'] ==1)
- User::where('uid',$v['uid'])->update(['status'=>0]);
- }
- }
- return ;
- }
- /**
- * 获取中奖用户编号
- * 先根据投入积分求出未中奖用户,然后在获取中奖用户
- * @param $user
- * @return array
- */
- public static function getrand($user, $prize_person_num = 1)
- {
- $user_arr = []; //随机数组
- $n = 0;
- $count = 0;$sum = 0;
- foreach ($user as $v)
- {
- $sum += bcadd(100,0,0);
- }
- foreach ($user as $v) {
- $user_arr [$n] = [
- 'id' => $v['id'],
- "start" => $count,
- "end" => $count + ($sum-bcadd(100,0,0)),
- ];
- $n++;
- $count +=($sum-bcadd(100,0,0))+1;
- }
- $prize_arr = [];
- $n = $prize_person_num; //中奖人数
- while (sizeof($prize_arr) < $n) {
- $random = mt_rand(0, $count); //随机数
- foreach ($user_arr as $item) {
- if ($random >= $item['start'] && $random <= $item['end'] && !in_array($item['id'],$prize_arr)) {
- $prize_arr[] = $item['id'];
- break;
- }
- }
- }
- return $prize_arr;
- }
- /**
- * 获取列表
- * @param $where
- */
- public static function lst($where)
- {
- $model = new self;
- if(isset($where['data']) && $where['data']!='') $model = $model->getModelTime($where,$model);
- if(isset($where['uid']) && $where['uid']>0) $model = $model->where('uid',$where['uid']);
- if(isset($where['to_uid']) && $where['to_uid']>0) $model = $model->where('to_uid',$where['to_uid']);
- if(isset($where['status']) && $where['status']>-4) $model = $model->where('status',$where['status']);
- if(isset($where['type']) && $where['type']>-1) $model = $model->where('type',$where['type']);
- $count = $model->value('count(id)')?:0;
- $data = $model->order('id desc')->page($where['page'],$where['limit'])->select();
- foreach ($data as &$v)
- {
- $v['user'] = User::where('uid',$v['uid'])->field('real_name,avatar,phone')->find()->toArray();
- if($v['to_uid']>0) {
- $v['touser'] = User::where('uid', $v['to_uid'])->field('real_name,avatar,phone,wx_qr,wx_no,alipay_no,alipay_name,account_Bank,bank_card,bank_name,bank_branch')->find()->toArray();
- }
- }
- return compact('count','data');
- }
- /**
- * 每天分账
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\DbException
- * @throws \think\db\exception\ModelNotFoundException
- */
- public static function day()
- {
- self::beginTrans();
- try {
- $list = self::where('status', 3)->where('end_day', '>', date("Y-m-d 00:00:00"))->where('sum_revenue', 'exp', '>use_revenue')->field('id,uid,order_id,sum_revenue/day as revenue,sum_revenue,use_revenue,price,pass')->select();
- if ($list) {
- foreach ($list->toarray() as $v) {
- if (floatval($v['sum_revenue']) - floatval($v['revenue']) - floatval($v['use_revenue']) > 0) {
- $data['use_revenue'] = bcadd($v['use_revenue'], $v['revenue'], 2);
- $number = $v['revenue'];
- } else {
- $data['use_revenue'] = $v['sum_revenue'];
- $number = bcsub($v['sum_revenue'], $v['use_revenue'], 2);
- $data['status'] = 4;
- }
- self::edit($data, $v['id']);
- $brokerage_price = User::where('uid', $v['uid'])->value('brokerage_price');
- User::where('uid',$v['uid'])->inc('brokerage_price',bcmul($number,0.8,2))->inc("integral",bcmul($number,0.2,2))->update();
- $mark = sprintf("订单号:%s,订单金额%d,当天收益%f,积分%f", $v['order_id'], $v['price'], bcmul($number,0.8,2),bcmul($number,0.2,2));
- UserBill::income('每天收益', $v['uid'], 'now_money', 'brokerage', bcmul($number,0.8,2), $v['id'], bcadd($brokerage_price, bcmul($number,0.8,2)), $mark);
- UserBill::income('每天收益积分', $v['uid'], 'integral', 'add', bcmul($number,0.2,2), $v['id'], bcadd($brokerage_price, bcmul($number,0.2,2)), $mark);
- unset($data);
- }
- }
- self::commitTrans();
- }
- catch (Exception $e)
- {
- return self::setErrorInfo('生成出错',true);
- }
- return true;
- }
- /**
- * 获取会员升级订单
- */
- public static function orderlist($where)
- {
- $model = new self;
- if(isset($where['data']) && $where['data'] !='') $model = $model->getModelTime($where,$model,"add_time");
- if(isset($where['paid']) && $where['paid'] >-1) $model = $model->where('paid',$where['paid']);
- if(isset($where['status']) && $where['status'] >-4) $model = $model->where('status',$where['status']);
- if(isset($where['key']) && $where['key'] !='') $model = $model->where('order_id','like',"%".$where['key']."%");
- $model = $model->order('id desc');
- return self::page($model, function ($v) {
- $v['user'] = User::where('uid',$v['uid'])->field('nickname,real_name,avatar,phone')->find()->toArray();
- if($v['to_uid']>0) {
- $v['touser'] = User::where('uid', $v['to_uid'])->field('real_name,real_name,avatar,phone,wx_qr,wx_no,alipay_no,alipay_name,account_Bank,bank_card,bank_name,bank_branch')->find()->toArray();
- }
- else
- {
- $v['touser'] = null;
- }
- }, $where);
- }
- }
|