TeamRewards.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622
  1. <?php
  2. namespace app\common\logic;
  3. use app\common\model\EtcWithdrawRecordModel;
  4. use app\common\model\LedgerWalletModel;
  5. use app\common\model\OfflineRechargeRecordModel;
  6. use app\common\model\ParametersModel;
  7. use app\common\model\TimedTaskLogModel;
  8. use app\common\model\UserPathModel;
  9. use fast\Action;
  10. use fast\Asset;
  11. use fast\MembershipLevel;
  12. use think\Db;
  13. use think\Log;
  14. use think\Model;
  15. use think\console\Output;
  16. use fast\Http;
  17. /**
  18. * 团队奖励发放逻辑
  19. * 定时任务,定时发放,每天一次,一般在凌晨12一过开始
  20. */
  21. class TeamRewards
  22. {
  23. /**
  24. * 奖励名称及类型ID
  25. * @var array
  26. */
  27. private array $rewards_type = [
  28. 'power' => [
  29. 'type_id' => 1,
  30. 'type_name' => "团队算力奖励"
  31. ],
  32. 'usdt' => [
  33. 'type_id' => 2,
  34. 'type_name' => "加权分红"
  35. ],
  36. 'market' => [
  37. 'type_id' => 3,
  38. 'type_name' => "团队在、系统领导人加权分红"
  39. ],
  40. 'team' => [
  41. 'type_id' => 4,
  42. 'type_name' => "社区长业绩分红"
  43. ],
  44. 'allocate' => [
  45. 'type_id' => 5,
  46. 'type_name' => "算力拨币"
  47. ],
  48. ];
  49. /**
  50. * 发放团队算力奖励
  51. * 1.先判断最后一次发放时间,把该时间至当前时间的所有日期内的数据都发放了
  52. * 2.从算力明细表,取当日算力租赁数据,写入团队统计表,统计每人当日团队新增算力
  53. * 3.遍历当日统计表,计算每人理论应得算力奖励
  54. * 4.发放奖励,理论奖励-团队已发放=自身奖励金额
  55. */
  56. public function powerRewards()
  57. {
  58. $date = $this->getExeDate($this->rewards_type['power']['type_id']);
  59. if(empty($date)){
  60. return "本次没有可用时间";
  61. }
  62. //创建定时任务执行日志
  63. $TimedTaskLog = new TimedTaskLogModel();
  64. $log_id = $TimedTaskLog->insertGetId([
  65. 'type_id' => $this->rewards_type['power']['type_id'],
  66. 'type_name' => $this->rewards_type['power']['type_name'],
  67. 'date_time' => $date,
  68. 'create_time' => date('Y-m-d H:i:s'),
  69. ]);
  70. $between_time = [strtotime($date), strtotime($date) + 86400];
  71. //读取当日新增数据,按用户分组统计
  72. $recharge_record = DB::table('offline_recharge_record')
  73. ->field('user_id, SUM(amount) as amount')
  74. ->whereBetween('create_time', $between_time)
  75. ->where('order_type', 1)
  76. ->where('status', 1)
  77. ->group('user_id')
  78. ->select();
  79. if(empty($recharge_record)){
  80. (new Output())->writeln("本次没有可用新增数据:" . $date);
  81. return $log_id;
  82. }
  83. //1.统计团队新增业绩
  84. foreach ($recharge_record as $info) {
  85. $path = (new UserPathModel())
  86. ->where('user_id', $info['user_id'])
  87. ->column('parent_id');
  88. $path[] = $info['user_id'];
  89. $this->createData($path, $info['amount'], $date);
  90. }
  91. //2.计算每人理论收益
  92. $team_level_config = DB::table('team_level')
  93. ->field('level_id, compute_require, compute_incentive')
  94. ->select();
  95. $rewards_record = DB::table('team_rewards')
  96. ->field('id, user_id, today_power, date_time')
  97. ->where('date_time', $date)
  98. ->where('status', 0)
  99. ->select();
  100. foreach ($rewards_record as $info) {
  101. $this->calculateRewards($info, $team_level_config);
  102. }
  103. //3.发放收益
  104. $rewards_send = DB::table('team_rewards')
  105. ->field('id, user_id, commission, team_commission, date_time')
  106. ->where('date_time', $date)
  107. ->where('status', 0)
  108. ->select();
  109. foreach ($rewards_send as $info) {
  110. $amount = $info['commission'] - $info['team_commission'];
  111. if($amount > 0){
  112. (new LedgerWalletModel)->changeWalletAccount($info['user_id'], Asset::POWER, $amount / 8, Action::PowerProfit);
  113. }
  114. DB::table('team_rewards')
  115. ->where('id', $info['id'])
  116. ->update([
  117. 'send_commission' => $amount,
  118. 'status' => 1,
  119. 'update_time' => date('Y-m-d H:i:s')
  120. ]);
  121. }
  122. return $log_id;
  123. }
  124. /**
  125. * 获取可用日期
  126. * @var array
  127. */
  128. protected function getExeDate($type_id = 1)
  129. {
  130. $today = date('Y-m-d',strtotime("-1day"));//当前时间减一天为最后一次可用时间
  131. $dateInfo = DB::table('timed_task_log')
  132. ->where('type_id' ,$type_id)
  133. ->where('status', 1)
  134. ->order('date_time', 'desc')
  135. ->find();
  136. if(empty($dateInfo)){//首次
  137. return $today;
  138. }
  139. $new_date = date('Y-m-d',strtotime("+1day",strtotime($dateInfo['date_time'])));//最后一次发放日期+1天为本次执行时间
  140. if($new_date > $today){//超过今天
  141. return "";
  142. }
  143. return $new_date;
  144. }
  145. /**
  146. * 插入或更新收益统计信息
  147. * @var array
  148. */
  149. protected function createData($uids, $amount, $date)
  150. {
  151. foreach ($uids as $user_id) {
  152. $check = DB::table('team_rewards')
  153. ->field('id')
  154. ->where('user_id', $user_id)
  155. ->where('date_time', $date)
  156. ->find();
  157. if ($check) {//存在,则更新
  158. DB::table('team_rewards')
  159. ->where('id', $check['id'])
  160. ->update([
  161. 'today_power' => Db::raw('today_power+' . $amount),
  162. 'update_time' => date('Y-m-d H:i:s')
  163. ]);
  164. } else {//新增
  165. DB::table('team_rewards')
  166. ->insert([
  167. 'user_id' => $user_id,
  168. 'date_time' => $date,
  169. 'today_power' => Db::raw('today_power+' . $amount),
  170. 'create_time' => date('Y-m-d H:i:s')
  171. ]);
  172. }
  173. }
  174. }
  175. /**
  176. * 计算理论收益
  177. * @var array
  178. */
  179. protected function calculateRewards($info, $team_level_config)
  180. {
  181. $user = DB::table('user')
  182. ->where('id', $info['user_id'])
  183. ->find();
  184. $level_info = [];
  185. foreach ($team_level_config as $level) {
  186. if ($user['team_power'] >= $level['compute_require']) {
  187. $level_info['id'] = $level['level_id'];
  188. $level_info['rate'] = $level['compute_incentive'];
  189. }
  190. }
  191. if(isset($level_info['id']) && $level_info['id'] > 0){
  192. //团队等级大于0,才发放收益
  193. $amount = $info['today_power'] * $level_info['rate'];
  194. DB::table('team_rewards')
  195. ->where('id', $info['id'])
  196. ->update([
  197. 'team_power' => $user['team_power'],
  198. 'level_id' => $level_info['id'],
  199. 'rate' => $level_info['rate'],
  200. 'commission' => $amount,
  201. 'update_time' => date('Y-m-d H:i:s')
  202. ]);
  203. //累计上级的团队收益
  204. DB::table('team_rewards')
  205. ->where('user_id', $user['parent_id'])
  206. ->where('date_time', $info['date_time'])
  207. ->update([
  208. 'team_commission' => DB::raw("team_commission + " . $amount),
  209. 'update_time' => date('Y-m-d H:i:s')
  210. ]);
  211. // //更新所有上级的 team_commission
  212. // $path = (new UserPathModel())
  213. // ->where('user_id', $info['user_id'])
  214. // ->column('parent_id');
  215. //
  216. // DB::table('team_rewards')
  217. // ->where('user_id', 'in', $path)
  218. // ->where('date_time', $info['date_time'])
  219. // ->update([
  220. // 'team_commission' => DB::raw("team_commission+" . $amount),
  221. // 'update_time' => date('Y-m-d H:i:s')
  222. // ]);
  223. }
  224. }
  225. /**
  226. * 发放团队加权分红
  227. * 1.提取各个等级的会员列表
  228. * 2.再计算当日新增业绩
  229. * 3.根据每个等级现存的人数,按比例平分佣金
  230. */
  231. public function usdtRewards()
  232. {
  233. $date = $this->getExeDate($this->rewards_type['usdt']['type_id']);
  234. if(empty($date)){
  235. return "本次没有可用时间";
  236. }
  237. //创建定时任务执行日志
  238. $TimedTaskLog = new TimedTaskLogModel();
  239. $log_id = $TimedTaskLog->insertGetId([
  240. 'type_id' => $this->rewards_type['usdt']['type_id'],
  241. 'type_name' => $this->rewards_type['usdt']['type_name'],
  242. 'date_time' => $date,
  243. 'create_time' => date('Y-m-d H:i:s'),
  244. ]);
  245. $between_time = [strtotime($date), strtotime($date) + 86400];
  246. //读取当日新增数据,按用户分组统计
  247. $recharge_amount = DB::table('offline_recharge_record')
  248. ->whereBetween('create_time', $between_time)
  249. ->where('order_type', 1)
  250. ->where('status', 1)
  251. ->sum('amount');
  252. if($recharge_amount < 1){
  253. (new Output())->writeln("本次没有可用新增数据:" . $date);
  254. return $log_id;
  255. }
  256. //1.查找有等级的会员
  257. $level_user_list = DB::table('user')
  258. ->field('id,team_level_id')
  259. ->where('team_level_id', '>', 0)
  260. ->select();
  261. $levels_info = [];
  262. //整理数据格式,以team_level_id为键名,存放该等级下的会员id数组
  263. foreach ($level_user_list as $info) {
  264. $levels_info[$info['team_level_id']][] = $info['id'];
  265. }
  266. //读取团队等级配置
  267. $team_level_config = DB::table('team_level')
  268. ->field('level_id, weight_dividend')
  269. ->select();
  270. foreach ($team_level_config as $level) {
  271. if(isset($levels_info[$level['level_id']])){//存在当前等级的会员
  272. //计算当前等级平分佣金金额:当日新增业绩 * 分红比例 / 当前等级人数
  273. $amount = $recharge_amount * $level['weight_dividend'] / count($levels_info[$level['level_id']]);
  274. if($amount > 0){
  275. foreach ($levels_info[$level['level_id']] as $user_id){
  276. //发放佣金
  277. (new LedgerWalletModel)->changeWalletAccount($user_id, Asset::USDT, $amount, Action::UsdtWeightDividend);
  278. }
  279. }else{
  280. Log::info("分红等级" . $level['level_id'] . "在" . $date . "分红金额为0;当日新增业绩:" . $amount . ",分红比例:" . $level['weight_dividend']. ",分红人数" . dump($levels_info[$level['level_id']]));
  281. }
  282. }
  283. }
  284. return $log_id;
  285. }
  286. /**
  287. * 发放社区长、系统领导人加权分红
  288. * 1.提取社区长等级的会员列表
  289. * 2.再计算当日新增业绩
  290. * 3.根据每个等级现存的人数,按比例平分佣金
  291. * 5.提取系统领导人等级的会员列表
  292. * 6.再计算当日新增业绩
  293. * 7.根据每个等级现存的人数,按比例平分佣金
  294. */
  295. public function marketRewards()
  296. {
  297. $date = $this->getExeDate($this->rewards_type['market']['type_id']);
  298. if(empty($date)){
  299. return "本次没有可用时间";
  300. }
  301. //创建定时任务执行日志
  302. $TimedTaskLog = new TimedTaskLogModel();
  303. $log_id = $TimedTaskLog->insertGetId([
  304. 'type_id' => $this->rewards_type['market']['type_id'],
  305. 'type_name' => $this->rewards_type['market']['type_name'],
  306. 'date_time' => $date,
  307. 'create_time' => date('Y-m-d H:i:s'),
  308. ]);
  309. $between_time = [strtotime($date), strtotime($date) + 86400];
  310. //读取当日新增数据
  311. $recharge_power = DB::table('offline_recharge_record')
  312. ->whereBetween('create_time', $between_time)
  313. ->where('status', 1)
  314. ->sum('power');
  315. if($recharge_power < 1){
  316. (new Output())->writeln("本次没有可用新增数据:" . $date);
  317. return $log_id;
  318. }
  319. //团队长分红
  320. //查找有团队长等级的会员
  321. $community_user_list = DB::table('user')
  322. ->field('id,market_level_id')
  323. ->where('market_level_id', MembershipLevel::CommunityLeader)
  324. ->select();
  325. $community_rewards = (new ParametersModel())->getValue('communityRewards'); //社区长分红参数 数据格式为:0.02:0.5:0.5
  326. $usdt_rate = (new ParametersModel())->getValue('usdtToPowerRate');
  327. $community_rewards_arr = explode(':', $community_rewards);
  328. $reward = $recharge_power * $community_rewards_arr[0] / count($community_user_list);//新增业绩 * 分红比例 / 人数
  329. if($reward > 0) {
  330. $reward_power = $reward * $community_rewards_arr[1];
  331. $reward_usdt = $reward * $community_rewards_arr[2] / $usdt_rate;//算力折算成U
  332. foreach ($community_user_list as $info) {
  333. //发放分红
  334. (new LedgerWalletModel)->changeWalletAccount($info['id'], Asset::POWER, $reward_power, Action::PowerBonusAward);
  335. (new LedgerWalletModel)->changeWalletAccount($info['id'], Asset::USDT, $reward_usdt, Action::UsdtWeightDividend);
  336. }
  337. }else {
  338. Log::info("社区长分红在" . $date . "分红金额为0;当日新增业绩:" . $recharge_power . ",分红比例:" . $community_rewards_arr[0] . ",分红人数" . count($community_user_list));
  339. }
  340. //领导人分红
  341. //查找有团队长等级的会员
  342. $sys_leader_user_list = DB::table('user')
  343. ->field('id,market_level_id')
  344. ->where('market_level_id', MembershipLevel::SystemLeader)
  345. ->select();
  346. $sys_leade_rewards = (new ParametersModel())->getValue('sysLeaderRewards'); //系统领导人分红参数 数据格式为:0.02:0.5:0.5
  347. $sys_leade_rewards_arr = explode(':', $sys_leade_rewards);
  348. $reward = $recharge_power * $sys_leade_rewards_arr[0] / count($sys_leader_user_list);//新增业绩 * 分红比例 / 人数
  349. if($reward > 0) {
  350. $reward_power = $reward * $sys_leade_rewards_arr[1];
  351. $reward_usdt = $reward * $sys_leade_rewards_arr[2] * 8;//算力折算成U
  352. foreach ($sys_leader_user_list as $info) {
  353. //发放分红
  354. (new LedgerWalletModel)->changeWalletAccount($info['id'], Asset::POWER, $reward_power, Action::PowerBonusAward);
  355. (new LedgerWalletModel)->changeWalletAccount($info['id'], Asset::USDT, $reward_usdt, Action::UsdtWeightDividend);
  356. }
  357. }else {
  358. Log::info("系统领导人分红在" . $date . "分红金额为0;当日新增业绩:" . $recharge_power . ",分红比例:" . $community_rewards_arr[0] . ",分红人数" . count($community_user_list));
  359. }
  360. return $log_id;
  361. }
  362. /**
  363. * 团队业绩分红
  364. * 1.提取社区长等级的会员列表
  365. * 2.再计算当日新增业绩 * 0.08
  366. * 3.取20%发放算力,剩余发放U
  367. */
  368. public function teamRewards()
  369. {
  370. $date = $this->getExeDate($this->rewards_type['team']['type_id']);
  371. if(empty($date)){
  372. return "本次没有可用时间";
  373. }
  374. //创建定时任务执行日志
  375. $TimedTaskLog = new TimedTaskLogModel();
  376. $log_id = $TimedTaskLog->insertGetId([
  377. 'type_id' => $this->rewards_type['team']['type_id'],
  378. 'type_name' => $this->rewards_type['team']['type_name'],
  379. 'date_time' => $date,
  380. 'create_time' => date('Y-m-d H:i:s'),
  381. ]);
  382. $between_time = [strtotime($date), strtotime($date) + 86400];
  383. //查找有团队长等级的会员
  384. $community_user_list = DB::table('user')
  385. ->field('id,market_level_id')
  386. ->where('market_level_id', MembershipLevel::CommunityLeader)
  387. ->select();
  388. if(empty($community_user_list)){
  389. (new Output())->writeln("本次没有可用会员数据:" . $date);
  390. return $log_id;
  391. }
  392. $market_level_arr = [];//所有社区长,以user_id 为键名的数组
  393. $market_user_id_arr = [];//所有社区长,user_id 数组
  394. foreach ($community_user_list as $info) {
  395. $market_level_arr[$info['id']] = [
  396. 'user_id' => $info['id'],//自身ID
  397. 'today_usdt' => 0,//当日团队新增业绩USDT
  398. 'user_power' => 0,//自身收益
  399. 'user_usdt' => 0,//自身收益
  400. 'team_power' => 0,//下级团队收益
  401. 'team_usdt' => 0,//下级团队收益
  402. 'same_power' => 0,//同级奖收益
  403. 'same_usdt' => 0,//同级奖收益
  404. ];
  405. $market_user_id_arr[] = $info['id'];
  406. }
  407. $community_rewards = (new ParametersModel())->getValue('communityTeamRewards'); //社区长分红参数 数据格式为:0.08:0.2:0.8
  408. $community_rewards_arr = explode(':', $community_rewards);
  409. dump('团队分红参数配置');
  410. dump($community_rewards_arr);
  411. $performance_list = (new \app\admin\model\TeamRewards())
  412. ->where('user_id', 'in', $market_user_id_arr)
  413. ->where('date_time', $date)
  414. ->select();
  415. foreach ($performance_list as $item){
  416. if($item['today_power'] > 0){
  417. $amount = $community_rewards_arr[0] * $item['today_power'];//取新增业绩的8%
  418. if($amount < 1){
  419. dump("会员:" . $item['user_id'] . ",本次没有可用新增数据:" . $date);
  420. continue;
  421. }
  422. $market_level_arr[$item['user_id']]['today_usdt'] = $item['today_power'];//u折成算力
  423. $market_level_arr[$item['user_id']]['user_power'] = $amount * $community_rewards_arr[1] / 8;//u折成算力
  424. $market_level_arr[$item['user_id']]['user_usdt'] = $amount * $community_rewards_arr[2];
  425. $parent_ids = (new UserPathModel())
  426. ->where('user_id', $item['user_id'])
  427. ->order('distance')
  428. ->select();
  429. $i = 0;
  430. dump($item['user_id'] . '的上级');
  431. foreach ($parent_ids as $uid){
  432. if(isset($market_level_arr[$uid['parent_id']])){//向上级的团队收益中累计本次收益,方便后面对应的上级减掉
  433. dump($uid['parent_id']);
  434. if($i == 0){//只累计给首个上级
  435. dump($uid['parent_id'] . '累计上级');
  436. $market_level_arr[$uid['parent_id']]['team_power'] += $market_level_arr[$item['user_id']]['user_power'];
  437. $market_level_arr[$uid['parent_id']]['team_usdt'] += $market_level_arr[$item['user_id']]['user_usdt'];
  438. $i++;
  439. }
  440. dump($uid['parent_id'] . '累计平级');
  441. //每个同级上级都有平级奖
  442. $market_level_arr[$uid['parent_id']]['same_power'] += $market_level_arr[$item['user_id']]['user_power'] * 0.05;//5%的平级奖
  443. $market_level_arr[$uid['parent_id']]['same_usdt'] += $market_level_arr[$item['user_id']]['user_usdt'] * 0.05;//5%的平级奖
  444. }
  445. }
  446. dump($market_level_arr[$item['user_id']]);
  447. //dump(['用户ID:' . $info['id'],'新增业绩:' . $recharge_power, '算力收益:' . $reward_power, 'U收益:' . $reward_usdt]);
  448. }
  449. }
  450. dump('进展过半');
  451. Log::info($date . ' - 社区长分红');
  452. foreach ($market_level_arr as $info) {
  453. Log::info(json_encode($info));
  454. $power = $info['user_power'] - $info['team_power'];
  455. $usdt = $info['user_usdt'] - $info['team_usdt'];
  456. //社区长团队分红
  457. if($power > 0){
  458. (new LedgerWalletModel)->changeWalletAccount($info['user_id'], Asset::POWER, $power, Action::PowerCommunityBonusAward);
  459. }
  460. if($usdt > 0){
  461. (new LedgerWalletModel)->changeWalletAccount($info['user_id'], Asset::USDT, $usdt, Action::UsdtCmmunityBonus);
  462. }
  463. //平级奖励
  464. if($info['same_power'] > 0){
  465. (new LedgerWalletModel)->changeWalletAccount($info['user_id'], Asset::POWER, $info['same_power'], Action::PowerSameBonus);
  466. }
  467. if($info['same_usdt'] > 0){
  468. (new LedgerWalletModel)->changeWalletAccount($info['user_id'], Asset::USDT, $info['same_usdt'], Action::UsdtSameBonus);
  469. }
  470. }
  471. // foreach ($community_user_list as $info) {
  472. // //取该社区长下新增服务器算力
  473. // $next_ids = (new UserPathModel())->where('parent_id', $info['id'])->column('user_id');
  474. // $recharge_power = OfflineRechargeRecordModel::where('user_id', 'in', $next_ids)
  475. // //->where('order_type', 2)
  476. // ->where('status', 1)
  477. // ->whereBetween('create_time', $between_time)
  478. // ->sum('power');
  479. // $recharge_power = $community_rewards_arr[0] * $recharge_power;//取新增业绩的8%
  480. // if($recharge_power < 1){
  481. // (new Output())->writeln("会员:" . $info['id'] . ",本次没有可用新增数据:" . $date);
  482. // continue;
  483. // }
  484. // $reward_power = $recharge_power * $community_rewards_arr[1];
  485. // $reward_usdt = $recharge_power * $community_rewards_arr[2] * 8;//算力折算成U
  486. // dump(['用户ID:' . $info['id'],'新增业绩:' . $recharge_power, '算力收益:' . $reward_power, 'U收益:' . $reward_usdt]);
  487. //
  488. // //发放分红
  489. // (new LedgerWalletModel)->changeWalletAccount($info['id'], Asset::POWER, $reward_power, Action::PowerCommunityBonusAward);
  490. //
  491. // (new LedgerWalletModel)->changeWalletAccount($info['id'], Asset::USDT, $reward_usdt, Action::UsdtCmmunityBonus);
  492. // }
  493. return $log_id;
  494. }
  495. /**
  496. * 拨币
  497. * 向会员发放ETC
  498. * 每8000算力每天收益93,即每算力每天收益 93/8000=0.011625人民币
  499. * 实际发放的时候,发放ETH,根据当日价格,折算相应ETH,比如1ETH=12300RMB,则每算力为:0.011625/12300=0.000000945122ETH
  500. */
  501. public function AllocateEtc()
  502. {
  503. $date = $this->getExeDate($this->rewards_type['allocate']['type_id']);
  504. if(empty($date)){
  505. return "本次没有可用时间";
  506. }
  507. //创建定时任务执行日志
  508. $TimedTaskLog = new TimedTaskLogModel();
  509. $log_id = $TimedTaskLog->insertGetId([
  510. 'type_id' => $this->rewards_type['allocate']['type_id'],
  511. 'type_name' => $this->rewards_type['allocate']['type_name'],
  512. 'date_time' => $date,
  513. 'create_time' => date('Y-m-d H:i:s'),
  514. ]);
  515. $between_time = [strtotime($date), strtotime($date) + 86400];
  516. //查找会员资产列表
  517. $info_list = DB::table('ledger_wallet')
  518. ->alias('w')
  519. ->join('user u','u.id = w.user_id')
  520. ->field('user_id,power,server_power')
  521. ->where('power', '>', 0)
  522. ->where('effective_time', '<', strtotime($date) - 1209600) //报单十五天后才有收益
  523. ->select();
  524. if(empty($info_list)){
  525. (new Output())->writeln("本次没有可用会员数据:" . $date);
  526. return $log_id;
  527. }
  528. $etc_usdt_price = (new EtcWithdrawRecordModel)->getEtcPrice();
  529. $power_usdt_price = 0.0038;//每算力每日获得Usdt的数量 没8000算力13U除过来的
  530. $power_etc_price = round($power_usdt_price / $etc_usdt_price, 6);//每算力每日获得ETC的数量
  531. foreach ($info_list as $info) {
  532. $amount = ($info['power'] + $info['server_power']) * $power_etc_price;
  533. dump(['用户ID:' . $info['user_id'],'拨币量为:' . $amount]);
  534. //发放
  535. (new LedgerWalletModel)->changeWalletAccount($info['user_id'], Asset::TOKEN, $amount, Action::TokenAllocateEtc);
  536. }
  537. return $log_id;
  538. }
  539. }