Package.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. <?php
  2. namespace app\models\store;
  3. use app\models\system\SystemUserLevel;
  4. use app\models\user\User;
  5. use app\models\user\UserBill;
  6. use crmeb\basic\BaseModel;
  7. use crmeb\services\UtilService;
  8. use crmeb\traits\ModelTrait;
  9. use think\Exception;
  10. use think\facade\Log;
  11. use think\Model;
  12. class Package extends BaseModel
  13. {
  14. use ModelTrait;
  15. /**
  16. * 预约
  17. * @param $uid
  18. * @param $package_manager
  19. * @param $price
  20. * @param $day
  21. * @param $proportion
  22. * @return Package|bool|Model
  23. * @throws \think\db\exception\DataNotFoundException
  24. * @throws \think\db\exception\DbException
  25. * @throws \think\db\exception\ModelNotFoundException
  26. */
  27. public static function reserve($uid,$whole_id,$time_id,$to_uid,$price,$first_price,$last_id)
  28. {
  29. $user = User::find($uid);
  30. $data['uid'] = $uid;
  31. $data['whole_id'] = $whole_id;
  32. $data['time_id'] = $time_id;
  33. $data['first_price'] = $first_price;
  34. $data['last_id'] = $last_id;
  35. $data['price'] = $price;
  36. if($last_id>0 && self::where('last_id',$last_id)->where('uid',$uid)->find())
  37. {
  38. return self::setErrorInfo('你已报名,无需重复报名');
  39. }
  40. $integral = bcmul($price,bcdiv(sys_config('reserve_integral'),100,2),2);
  41. if($integral>$user['integral']) return self::setErrorInfo('金豆不足,请先买金豆专区');
  42. if($last_id>0 && self::where('id',$last_id)->value('status')!=3) return self::setErrorInfo('已有用户预约,换个商品预约');
  43. $data['add_time'] = time();
  44. $data['order_id'] = self::getNewOrderId();
  45. if($to_uid==0)
  46. {
  47. $to_uid = User::where('is_sys', 1)->order('sys_pay asc,uid asc')->value('uid');
  48. }
  49. $data['to_uid'] = $to_uid;
  50. self::beginTrans();
  51. try{
  52. $data['use_integral'] = $integral;
  53. $res = self::create($data);
  54. User::where('uid',$uid)->dec('integral',$integral)->update();
  55. UserBill::expend("预约扣金豆",$uid,'integral','pay_money',$integral,$res['id'],bcsub($user['integral'],$integral,2),'预约扣除'.$integral."金豆");
  56. User::edit(['is_whole'=>1],$uid);
  57. self::commitTrans();
  58. return $res->toArray();
  59. }catch (Exception $e)
  60. {
  61. Log::error('预约出错:' . $e->getLine().'--'.$e->getMessage());
  62. return self::setErrorInfo($e->getMessage(),true);
  63. }
  64. }
  65. /**
  66. * 生成订单唯一id
  67. * @param $uid 用户uid
  68. * @return string
  69. */
  70. public static function getNewOrderId()
  71. {
  72. list($msec, $sec) = explode(' ', microtime());
  73. $msectime = number_format((floatval($msec) + floatval($sec)) * 1000, 0, '', '');
  74. $orderId = 'pk' . $msectime . mt_rand(10000, 99999);
  75. while (self::be(['order_id' => $orderId])) $orderId = 'pk' . $msectime . mt_rand(10000, 99999);
  76. return $orderId;
  77. }
  78. /**
  79. * 我的订单
  80. * @return bool|string
  81. */
  82. public static function getlist()
  83. {
  84. $rs = sys_data('package_manager');
  85. $am= explode("~",sys_config('start_time'));
  86. $pm= explode("~",sys_config('end_time'));
  87. foreach ($rs as &$v) {
  88. $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();
  89. $v['cts'] = bcadd($v['virtual'],$v['cts']);
  90. }
  91. return $rs;
  92. }
  93. /**
  94. * 收货确认
  95. * @param $id
  96. */
  97. public static function take($id)
  98. {
  99. $info = self::find($id);
  100. $data['status'] = 3;
  101. $data['paid'] = 1;
  102. self::beginTrans();
  103. try {
  104. User::where('uid',$info['uid'])->inc('now_money',$info['pass'])->update();
  105. $user = User::where('uid',$info['uid'])->find();
  106. UserBill::income('通证收益',$info['uid'],'now_money','sign',$info['pass'],$info['id'],$user['now_money'],'包收益通证'.$info['pass']);
  107. $res = self::edit($data,$id);
  108. $res1 = self::backBrokerage($info);
  109. if($info['last_id']>0) self::edit(['status'=>6],$info['last_id']);
  110. self::commitTrans();
  111. }
  112. catch (Exception $e)
  113. {
  114. Log::error('收货错误:' .$e->getFile().'行'.$e->getLine()."原因:".$e->getMessage());
  115. self::setErrorInfo('收货确认错误',true);
  116. }
  117. return true;
  118. }
  119. /**
  120. * 定时执行
  121. * @throws \think\db\exception\DataNotFoundException
  122. * @throws \think\db\exception\DbException
  123. * @throws \think\db\exception\ModelNotFoundException
  124. */
  125. public static function make_package()
  126. {
  127. self::startTrans();
  128. try {
  129. $package_manager = sys_data('package_manager');
  130. $package = [];
  131. foreach ($package_manager as $v) {
  132. if(date("H:i") == $v['open'])
  133. $package[] = $v;
  134. }
  135. $uids = User::where('is_sys', 1)->column('uid');
  136. foreach ($package as $v)
  137. {
  138. $arr = self::where('status', 0)->where('package_manager',$v['id'])->where('add_time','<',strtotime(date("Y-m-d ").$v['end'].":00"))->select();
  139. if ($arr) {
  140. $ids = [];
  141. $sum = $v['one'];
  142. if (sizeof($arr->toArray()) > $sum) {
  143. $ids = self::getrand($arr->toArray(), $sum);
  144. } else {
  145. foreach ($arr as $v1) {
  146. $ids[] = $v1['id'];
  147. }
  148. }
  149. foreach ($ids as $v2) {
  150. $info = self::where('status', 4)->where('uid','not in',$uids)->where('add_time','<',strtotime("-30 minute"))->where('package_manager', $v['id'])->find();
  151. $last_id = 0;
  152. if ($info) {
  153. $to_uid = $info['uid'];
  154. $last_id = $info['id'];
  155. self::edit(['status' => 5], $info['id']);
  156. } else {
  157. $to_uid = User::where('is_sys', 1)->order('sys_pay asc,uid asc')->value('uid');
  158. User::where('uid', $to_uid)->inc('sys_pay', 1)->update();
  159. }
  160. self::edit(['to_uid' => $to_uid, 'status' => 1,'last_id'=>$last_id,'lottery_time'=>time()], $v2);
  161. }
  162. }
  163. }
  164. self::checkTrans(true);
  165. }catch (Exception $e)
  166. {
  167. self::setErrorInfo('生成出错'.$e->getMessage(),true);
  168. }
  169. }
  170. /**
  171. * 定时执行老
  172. */
  173. public static function make_package2()
  174. {
  175. self::startTrans();
  176. try {
  177. $H = date("H");
  178. $package_manager = sys_data('package_manager');
  179. $package = [];
  180. foreach ($package_manager as $v) {
  181. $package[$v['id']] = $v;
  182. }
  183. $model = new self;
  184. $model = $model->where('add_time','<',strtotime("-30 minute"));
  185. $where = null;
  186. if ($H < 13) {
  187. $model = $model->where('am', 1);
  188. $where['am'] = 1;
  189. } else {
  190. $model = $model->where('am', 0);
  191. $where['am'] = 0;
  192. }
  193. $rs = $model->where('status', 0)->group('package_manager')->field('package_manager,count(package_manager) as ct')->select();
  194. foreach ($rs as $v) {
  195. $arr = self::where('status', 0)->where($where)->where('add_time','<',strtotime("-30 minute"))->where('package_manager', $v['package_manager'])->select();
  196. if ($arr) {
  197. $ids = [];
  198. $sum = $package[$v['package_manager']]['one'];
  199. if (sizeof($arr->toArray()) > $sum) {
  200. $ids = self::getrand($arr->toArray(), $sum);
  201. } else {
  202. foreach ($arr as $v1) {
  203. $ids[] = $v1['id'];
  204. }
  205. }
  206. foreach ($ids as $v2) {
  207. $info = self::where('status', 4)->where($where)->where('add_time','<',strtotime("-30 minute"))->where('package_manager', $v['package_manager'])->find();
  208. $last_id = 0;
  209. if ($info) {
  210. $to_uid = $info['uid'];
  211. $last_id = $info['id'];
  212. self::edit(['status' => 5], $info['id']);
  213. } else {
  214. $to_uid = User::where('is_sys', 1)->order('sys_pay asc,uid asc')->value('uid');
  215. User::where('uid', $to_uid)->inc('sys_pay', 1)->update();
  216. }
  217. self::edit(['to_uid' => $to_uid, 'status' => 1,'last_id'=>$last_id,'lottery_time'=>time()], $v2);
  218. }
  219. }
  220. }
  221. self::checkTrans(true);
  222. }catch (Exception $e)
  223. {
  224. self::setErrorInfo('生成出错'.$e->getMessage(),true);
  225. }
  226. }
  227. /**
  228. * 返现
  229. * @param $info
  230. * @throws \think\db\exception\DataNotFoundException
  231. * @throws \think\db\exception\DbException
  232. * @throws \think\db\exception\ModelNotFoundException
  233. */
  234. public static function backBrokerage($info)
  235. {
  236. $userinfo = User::find($info['uid']);
  237. $spreaduser = User::where('uid',$userinfo['spread_uid'])->find();
  238. $twouser = User::where('uid',$spreaduser['spread_uid'])->find();
  239. $bksum = bcdiv(bcmul($info['price'],bcmul($info['proportion'],$info['day'],2),2),100,2);
  240. if($spreaduser['level']>0) {
  241. $recommend = bcmul(bcdiv(sys_config('recommend'),100,2), $bksum, 2);
  242. $mark = "订单号" . $info['order_id'] . '产生推荐奖,奖励推广佣金' . $recommend;
  243. $res1 = UserBill::income('推荐奖', $spreaduser['uid'], 'now_money', 'brokerage', $recommend, $info['id'], bcadd($recommend, $spreaduser['brokerage_price'], 2), $mark);
  244. $res2 = User::where('uid', $spreaduser['uid'])->inc('brokerage_price', $recommend)->update();
  245. }
  246. //二代推荐
  247. if($twouser && $twouser['level']>1)
  248. {
  249. $recommend = bcmul(bcdiv(sys_config('two_recommend'),100,2), $bksum, 2);
  250. $mark = "订单号" . $info['order_id'] . '产生推荐奖,奖励推广佣金' . $recommend;
  251. $res1 = UserBill::income('二代推荐奖', $twouser['uid'], 'now_money', 'brokerage', $recommend, $info['id'], bcadd($recommend, $twouser['brokerage_price'], 2), $mark);
  252. $res2 = User::where('uid', $twouser['uid'])->inc('brokerage_price', $recommend)->update();
  253. }
  254. $userlist = User::select()->toArray();
  255. $pids = UtilService::getparentid($userlist, $info['uid']);
  256. $levels = SystemUserLevel::where('is_del',0)->where('is_show',1)->field('id,name,peer_award,team_award')->select();
  257. $levela = [];$current_level = $spreaduser['level'];
  258. foreach ($levels as $v)
  259. {
  260. $levela[$v['id']]['peer_award'] = $v['peer_award'];
  261. $levela[$v['id']]['team_award'] = $v['team_award'];
  262. $levela[$v['id']]['sbl'] = false;
  263. $levela[$v['id']]['use'] = false;
  264. }
  265. if($pids) {
  266. foreach ($pids as $v) {
  267. if ($v['level'] >= $current_level && $levela[$v['level']]['team_award'] > 0) {
  268. //处理第一次
  269. if ($levela[$v['level']]['use']==false) {
  270. $level_award = $levela[$v['level']]['team_award'];
  271. $levela[$v['level']]['use'] = true;
  272. } else {
  273. if ($levela[$v['level']]['sbl']==false) {
  274. $level_award = $levela[$v['level']]['peer_award'];
  275. $levela[$v['level']]['sbl'] = true;
  276. }
  277. }
  278. if ($v['level'] > $current_level) {
  279. $current_level = $v['level'];
  280. } else {
  281. if ($v['level'] == $current_level && $levela[$v['level']]['sbl'] == true) {
  282. $current_level++;
  283. }
  284. }
  285. $proportion = bcmul($bksum, bcdiv($level_award, 100, 2), 2);
  286. if($proportion==0) continue;
  287. if ($levela[$v['level']]['sbl'] == true) {
  288. $mark = "订单号" . $info['order_id'] . '产生平级奖,奖励推广佣金' . $proportion;
  289. $res1 = UserBill::income('平级奖', $v['uid'], 'now_money', 'brokerage', $proportion, $info['id'], bcadd($proportion, $v['brokerage_price'], 2), $mark);
  290. $res2 = User::where('uid', $v['uid'])->inc('brokerage_price', $proportion)->update();
  291. } else {
  292. $mark = "订单号" . $info['order_id'] . '产生团队奖,奖励推广佣金' . $proportion;
  293. $res1 = UserBill::income('团队奖', $v['uid'], 'now_money', 'brokerage', $proportion, $info['id'], bcadd($proportion, $v['brokerage_price'], 2), $mark);
  294. $res2 = User::where('uid', $v['uid'])->inc('brokerage_price', $proportion)->update();
  295. }
  296. }
  297. }
  298. }
  299. return true;
  300. }
  301. /**
  302. * 订单无效
  303. * @param $id
  304. */
  305. public static function invalid($id,$re='')
  306. {
  307. $data['status'] = -2;
  308. $data['re'] = $re;
  309. $last_id = self::where('id',$id)->value('last_id');
  310. if($last_id>0) self::edit(['status'=>4],$last_id);
  311. return self::edit($data,$id);
  312. }
  313. /**
  314. * 支付超时
  315. */
  316. public static function time_out()
  317. {
  318. $list = self::where('status',1)->where('lottery_time','<',strtotime("-".sys_config('time_out')." minute"))->select();
  319. foreach ($list as $v)
  320. {
  321. if($v['last_id']>0) self::edit(['status'=>4],$v['last_id']);
  322. self::edit(['status'=>-3],$v['id']);
  323. $user =User::where('uid',$v['uid'])->find();
  324. User::where('uid',$v['uid'])->inc('notpay',1)->update();
  325. if($user['notpay']<9)
  326. {
  327. if(bcadd($user['notpay'],1) % 3==0)
  328. {
  329. $mark = "累计提时" .bcadd($user['notpay'],1) . '扣通行证100';
  330. $res1 = UserBill::expend('支付超时', $v['uid'], 'now_money', 'pay_money', 100, 0, bcsub($v['now_money'],100, 2), $mark);
  331. $res2 = User::where('uid', $v['uid'])->dec('now_money', 100)->update();
  332. }
  333. }
  334. else
  335. {
  336. if($user['status'] ==1)
  337. User::where('uid',$v['uid'])->update(['status'=>0]);
  338. }
  339. }
  340. return ;
  341. }
  342. /**
  343. * 获取中奖用户编号
  344. * 先根据投入积分求出未中奖用户,然后在获取中奖用户
  345. * @param $user
  346. * @return array
  347. */
  348. public static function getrand($user, $prize_person_num = 1)
  349. {
  350. $user_arr = []; //随机数组
  351. $n = 0;
  352. $count = 0;$sum = 0;
  353. foreach ($user as $v)
  354. {
  355. $sum += bcadd(100,0,0);
  356. }
  357. foreach ($user as $v) {
  358. $user_arr [$n] = [
  359. 'id' => $v['id'],
  360. "start" => $count,
  361. "end" => $count + ($sum-bcadd(100,0,0)),
  362. ];
  363. $n++;
  364. $count +=($sum-bcadd(100,0,0))+1;
  365. }
  366. $prize_arr = [];
  367. $n = $prize_person_num; //中奖人数
  368. while (sizeof($prize_arr) < $n) {
  369. $random = mt_rand(0, $count); //随机数
  370. foreach ($user_arr as $item) {
  371. if ($random >= $item['start'] && $random <= $item['end'] && !in_array($item['id'],$prize_arr)) {
  372. $prize_arr[] = $item['id'];
  373. break;
  374. }
  375. }
  376. }
  377. return $prize_arr;
  378. }
  379. /**
  380. * 获取列表
  381. * @param $where
  382. */
  383. public static function lst($where)
  384. {
  385. $model = new self;
  386. if(isset($where['data']) && $where['data']!='') $model = $model->getModelTime($where,$model);
  387. if(isset($where['uid']) && $where['uid']>0) $model = $model->where('uid',$where['uid']);
  388. if(isset($where['to_uid']) && $where['to_uid']>0) $model = $model->where('to_uid',$where['to_uid']);
  389. if(isset($where['status']) && $where['status']>-4) $model = $model->where('status',$where['status']);
  390. if(isset($where['time_id']) && $where['time_id']>-4) $model = $model->where('time_id',$where['time_id']);
  391. $count = $model->value('count(id)')?:0;
  392. $data = $model->order('id desc')->page($where['page'],$where['limit'])->select();
  393. foreach ($data as &$v)
  394. {
  395. $v['whole'] = StoreWholesale::find($v['whole_id'])->toArray();
  396. $v['user'] = User::where('uid',$v['uid'])->field('real_name,avatar,phone')->find()->toArray();
  397. if($v['to_uid']>0) {
  398. $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();
  399. }
  400. }
  401. return compact('count','data');
  402. }
  403. /**
  404. * 每天分账
  405. * @throws \think\db\exception\DataNotFoundException
  406. * @throws \think\db\exception\DbException
  407. * @throws \think\db\exception\ModelNotFoundException
  408. */
  409. public static function day()
  410. {
  411. self::beginTrans();
  412. try {
  413. $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();
  414. if ($list) {
  415. foreach ($list->toarray() as $v) {
  416. if (floatval($v['sum_revenue']) - floatval($v['revenue']) - floatval($v['use_revenue']) > 0) {
  417. $data['use_revenue'] = bcadd($v['use_revenue'], $v['revenue'], 2);
  418. $number = $v['revenue'];
  419. } else {
  420. $data['use_revenue'] = $v['sum_revenue'];
  421. $number = bcsub($v['sum_revenue'], $v['use_revenue'], 2);
  422. $data['status'] = 4;
  423. }
  424. self::edit($data, $v['id']);
  425. $brokerage_price = User::where('uid', $v['uid'])->value('brokerage_price');
  426. User::where('uid',$v['uid'])->inc('brokerage_price',bcmul($number,0.8,2))->inc("integral",bcmul($number,0.2,2))->update();
  427. $mark = sprintf("订单号:%s,订单金额%d,当天收益%f,积分%f", $v['order_id'], $v['price'], bcmul($number,0.8,2),bcmul($number,0.2,2));
  428. UserBill::income('每天收益', $v['uid'], 'now_money', 'brokerage', bcmul($number,0.8,2), $v['id'], bcadd($brokerage_price, bcmul($number,0.8,2)), $mark);
  429. UserBill::income('每天收益积分', $v['uid'], 'integral', 'add', bcmul($number,0.2,2), $v['id'], bcadd($brokerage_price, bcmul($number,0.2,2)), $mark);
  430. unset($data);
  431. }
  432. }
  433. self::commitTrans();
  434. }
  435. catch (Exception $e)
  436. {
  437. return self::setErrorInfo('生成出错',true);
  438. }
  439. return true;
  440. }
  441. /**
  442. * 获取会员升级订单
  443. */
  444. public static function orderlist($where)
  445. {
  446. $model = new self;
  447. if(isset($where['data']) && $where['data'] !='') $model = $model->getModelTime($where,$model,"add_time");
  448. if(isset($where['paid']) && $where['paid'] >-1) $model = $model->where('paid',$where['paid']);
  449. if(isset($where['status']) && $where['status'] >-4) $model = $model->where('status',$where['status']);
  450. if(isset($where['key']) && $where['key'] !='') $model = $model->where('order_id','like',"%".$where['key']."%");
  451. $model = $model->order('id desc');
  452. return self::page($model, function ($v) {
  453. $v['user'] = User::where('uid',$v['uid'])->field('nickname,real_name,avatar,phone')->find()->toArray();
  454. if($v['to_uid']>0) {
  455. $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();
  456. }
  457. else
  458. {
  459. $v['touser'] = null;
  460. }
  461. }, $where);
  462. }
  463. }