WelfareLoginc.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. <?php
  2. namespace app\api\logic;
  3. use app\api\controller\Product;
  4. use app\common\model\ProductArea;
  5. use app\common\controller\Api;
  6. use app\common\model\UserWelfare;
  7. use app\common\model\ProductPopular;
  8. use app\common\model\ProductOrder;
  9. use fast\Action;
  10. use fast\Asset;
  11. use fast\MembershipLevel;
  12. use think\Db;
  13. use think\Log;
  14. use think\Exception;
  15. use think\console\Output;
  16. use fast\Http;
  17. /**
  18. * 空投福利
  19. */
  20. class WelfareLoginc
  21. {
  22. /** 添加新人福利
  23. * @param int $orderId 订单id
  24. * @param array $orderInfo 订单详情
  25. * @param int $typeId 订单类型
  26. * @param int $userId 用户id
  27. * @param int $fromUser 来源id
  28. * @param float $fees 手续费
  29. * @param float $fees 抢购价
  30. */
  31. public static function setUserWelfareLos($uid, int $productId, $num, $lan)
  32. {
  33. $tim = time();
  34. $result = ProductPopular::alias('a')->where('a.start_time', '<=', $tim)->where('a.end_time', '>=', $tim)
  35. ->join('product_list b', "a.product_id = b.id", "left")
  36. ->field('a.*,b.is_area,'.$lan.'_name as name')
  37. ->where('a.product_id', $productId)->find();
  38. if($num > $result->stock) throw new Exception(__('库存不足'));
  39. if(empty($result->is_area)){
  40. ProductOrder::setPopularNoAreaOrder($num, $result->id, $result->price, $result->product_id, $uid);
  41. }else{
  42. $areaArr = ProductArea::where('product_id', $productId)->where('status', ProductArea::NORMAL)->orderRaw('RAND()')->limit($num)->column('id');
  43. ProductOrder::setPopularAreaOrder($areaArr, $result->id, $result->price, $result->product_id, $uid);
  44. }
  45. return ['start_time'=>$tim, 'name'=>$result->name];
  46. }
  47. /**
  48. * 计算理论收益
  49. * @var array
  50. */
  51. protected function calculateRewards($info, $team_level_config)
  52. {
  53. $user = DB::table('user')
  54. ->where('id', $info['user_id'])
  55. ->find();
  56. $level_info = [];
  57. foreach ($team_level_config as $level) {
  58. if ($user['team_power'] >= $level['compute_require']) {
  59. $level_info['id'] = $level['level_id'];
  60. $level_info['rate'] = $level['compute_incentive'];
  61. }
  62. }
  63. if(isset($level_info['id']) && $level_info['id'] > 0){
  64. //团队等级大于0,才发放收益
  65. $amount = $info['today_power'] * $level_info['rate'];
  66. DB::table('team_rewards')
  67. ->where('id', $info['id'])
  68. ->update([
  69. 'team_power' => $user['team_power'],
  70. 'level_id' => $level_info['id'],
  71. 'rate' => $level_info['rate'],
  72. 'commission' => $amount,
  73. 'update_time' => date('Y-m-d H:i:s')
  74. ]);
  75. //累计上级的团队收益
  76. DB::table('team_rewards')
  77. ->where('user_id', $user['parent_id'])
  78. ->where('date_time', $info['date_time'])
  79. ->update([
  80. 'team_commission' => DB::raw("team_commission + " . $amount),
  81. 'update_time' => date('Y-m-d H:i:s')
  82. ]);
  83. }
  84. }
  85. /**
  86. * 发放团队加权分红
  87. * 1.提取各个等级的会员列表
  88. * 2.再计算当日新增业绩
  89. * 3.根据每个等级现存的人数,按比例平分佣金
  90. */
  91. public function usdtRewards()
  92. {
  93. $date = $this->getExeDate($this->rewards_type['usdt']['type_id']);
  94. if(empty($date)){
  95. return "本次没有可用时间";
  96. }
  97. //创建定时任务执行日志
  98. $TimedTaskLog = new TimedTaskLogModel();
  99. $log_id = $TimedTaskLog->insertGetId([
  100. 'type_id' => $this->rewards_type['usdt']['type_id'],
  101. 'type_name' => $this->rewards_type['usdt']['type_name'],
  102. 'date_time' => $date,
  103. 'create_time' => date('Y-m-d H:i:s'),
  104. ]);
  105. $between_time = [strtotime($date), strtotime($date) + 86400];
  106. //读取当日新增数据,按用户分组统计
  107. $recharge_amount = DB::table('offline_recharge_record')
  108. ->whereBetween('create_time', $between_time)
  109. ->where('order_type', 1)
  110. ->where('status', 1)
  111. ->sum('amount');
  112. if($recharge_amount < 1){
  113. (new Output())->writeln("本次没有可用新增数据:" . $date);
  114. return $log_id;
  115. }
  116. //1.查找有等级的会员
  117. $level_user_list = DB::table('user')
  118. ->field('id,team_level_id')
  119. ->where('team_level_id', '>', 0)
  120. ->select();
  121. $levels_info = [];
  122. //整理数据格式,以team_level_id为键名,存放该等级下的会员id数组
  123. foreach ($level_user_list as $info) {
  124. $levels_info[$info['team_level_id']][] = $info['id'];
  125. }
  126. //读取团队等级配置
  127. $team_level_config = DB::table('team_level')
  128. ->field('level_id, weight_dividend')
  129. ->select();
  130. foreach ($team_level_config as $level) {
  131. if(isset($levels_info[$level['level_id']])){//存在当前等级的会员
  132. //计算当前等级平分佣金金额:当日新增业绩 * 分红比例 / 当前等级人数
  133. $amount = $recharge_amount * $level['weight_dividend'] / count($levels_info[$level['level_id']]);
  134. if($amount > 0){
  135. foreach ($levels_info[$level['level_id']] as $user_id){
  136. //发放佣金
  137. (new LedgerWalletModel)->changeWalletAccount($user_id, Asset::USDT, $amount, Action::UsdtWeightDividend);
  138. }
  139. }else{
  140. Log::info("分红等级" . $level['level_id'] . "在" . $date . "分红金额为0;当日新增业绩:" . $amount . ",分红比例:" . $level['weight_dividend']. ",分红人数" . dump($levels_info[$level['level_id']]));
  141. }
  142. }
  143. }
  144. return $log_id;
  145. }
  146. /**
  147. * 发放社区长、系统领导人加权分红
  148. * 1.提取社区长等级的会员列表
  149. * 2.再计算当日新增业绩
  150. * 3.根据每个等级现存的人数,按比例平分佣金
  151. * 5.提取系统领导人等级的会员列表
  152. * 6.再计算当日新增业绩
  153. * 7.根据每个等级现存的人数,按比例平分佣金
  154. */
  155. public function marketRewards()
  156. {
  157. $date = $this->getExeDate($this->rewards_type['market']['type_id']);
  158. if(empty($date)){
  159. return "本次没有可用时间";
  160. }
  161. //创建定时任务执行日志
  162. $TimedTaskLog = new TimedTaskLogModel();
  163. $log_id = $TimedTaskLog->insertGetId([
  164. 'type_id' => $this->rewards_type['market']['type_id'],
  165. 'type_name' => $this->rewards_type['market']['type_name'],
  166. 'date_time' => $date,
  167. 'create_time' => date('Y-m-d H:i:s'),
  168. ]);
  169. $between_time = [strtotime($date), strtotime($date) + 86400];
  170. //读取当日新增数据
  171. $recharge_power = DB::table('offline_recharge_record')
  172. ->whereBetween('create_time', $between_time)
  173. ->where('status', 1)
  174. ->sum('power');
  175. if($recharge_power < 1){
  176. (new Output())->writeln("本次没有可用新增数据:" . $date);
  177. return $log_id;
  178. }
  179. //团队长分红
  180. //查找有团队长等级的会员
  181. $community_user_list = DB::table('user')
  182. ->field('id,market_level_id')
  183. ->where('market_level_id', MembershipLevel::CommunityLeader)
  184. ->select();
  185. $community_rewards = (new ParametersModel())->getValue('communityRewards'); //社区长分红参数 数据格式为:0.02:0.5:0.5
  186. $usdt_rate = (new ParametersModel())->getValue('usdtToPowerRate');
  187. $community_rewards_arr = explode(':', $community_rewards);
  188. $reward = $recharge_power * $community_rewards_arr[0] / count($community_user_list);//新增业绩 * 分红比例 / 人数
  189. if($reward > 0) {
  190. $reward_power = $reward * $community_rewards_arr[1];
  191. $reward_usdt = $reward * $community_rewards_arr[2] / $usdt_rate;//算力折算成U
  192. foreach ($community_user_list as $info) {
  193. //发放分红
  194. (new LedgerWalletModel)->changeWalletAccount($info['id'], Asset::POWER, $reward_power, Action::PowerBonusAward);
  195. (new LedgerWalletModel)->changeWalletAccount($info['id'], Asset::USDT, $reward_usdt, Action::UsdtWeightDividend);
  196. }
  197. }else {
  198. Log::info("社区长分红在" . $date . "分红金额为0;当日新增业绩:" . $recharge_power . ",分红比例:" . $community_rewards_arr[0] . ",分红人数" . count($community_user_list));
  199. }
  200. //领导人分红
  201. //查找有团队长等级的会员
  202. $sys_leader_user_list = DB::table('user')
  203. ->field('id,market_level_id')
  204. ->where('market_level_id', MembershipLevel::SystemLeader)
  205. ->select();
  206. $sys_leade_rewards = (new ParametersModel())->getValue('sysLeaderRewards'); //系统领导人分红参数 数据格式为:0.02:0.5:0.5
  207. $sys_leade_rewards_arr = explode(':', $sys_leade_rewards);
  208. $reward = $recharge_power * $sys_leade_rewards_arr[0] / count($sys_leader_user_list);//新增业绩 * 分红比例 / 人数
  209. if($reward > 0) {
  210. $reward_power = $reward * $sys_leade_rewards_arr[1];
  211. $reward_usdt = $reward * $sys_leade_rewards_arr[2] * 8;//算力折算成U
  212. foreach ($sys_leader_user_list as $info) {
  213. //发放分红
  214. (new LedgerWalletModel)->changeWalletAccount($info['id'], Asset::POWER, $reward_power, Action::PowerBonusAward);
  215. (new LedgerWalletModel)->changeWalletAccount($info['id'], Asset::USDT, $reward_usdt, Action::UsdtWeightDividend);
  216. }
  217. }else {
  218. Log::info("系统领导人分红在" . $date . "分红金额为0;当日新增业绩:" . $recharge_power . ",分红比例:" . $community_rewards_arr[0] . ",分红人数" . count($community_user_list));
  219. }
  220. return $log_id;
  221. }
  222. /**
  223. * 获取当日收益 Daily earnings
  224. */
  225. private static function getDayEarnings(string $date)
  226. {
  227. $between_time = [strtotime($date), strtotime($date) + 86400];
  228. //读取当日新增数据
  229. return ProductOrder::where('type_id', ProductOrder::Popular)->where('status', ProductOrder::Paid)->whereBetween('create_time', $between_time)->sum('price');
  230. }
  231. /**
  232. * 获取可用日期
  233. * @var array
  234. */
  235. protected function getExeDate($type_id = 1)
  236. {
  237. $today = date('Y-m-d',strtotime("-1day"));//当前时间减一天为最后一次可用时间
  238. $dateInfo = DB::table('timed_task_log')
  239. ->where('type_id' ,$type_id)
  240. ->where('status', 1)
  241. ->order('date_time', 'desc')
  242. ->find();
  243. if(empty($dateInfo)){//首次
  244. return $today;
  245. }
  246. $new_date = date('Y-m-d',strtotime("+1day",strtotime($dateInfo['date_time'])));//最后一次发放日期+1天为本次执行时间
  247. if($new_date > $today){//超过今天
  248. return "";
  249. }
  250. return $new_date;
  251. }
  252. /**
  253. * 插入或更新收益统计信息
  254. * @var array
  255. */
  256. protected function createData($uids, $amount, $date)
  257. {
  258. foreach ($uids as $user_id) {
  259. $check = DB::table('team_rewards')
  260. ->field('id')
  261. ->where('user_id', $user_id)
  262. ->where('date_time', $date)
  263. ->find();
  264. if ($check) {//存在,则更新
  265. DB::table('team_rewards')
  266. ->where('id', $check['id'])
  267. ->update([
  268. 'today_power' => Db::raw('today_power+' . $amount),
  269. 'update_time' => date('Y-m-d H:i:s')
  270. ]);
  271. } else {//新增
  272. DB::table('team_rewards')
  273. ->insert([
  274. 'user_id' => $user_id,
  275. 'date_time' => $date,
  276. 'today_power' => Db::raw('today_power+' . $amount),
  277. 'create_time' => date('Y-m-d H:i:s')
  278. ]);
  279. }
  280. }
  281. }
  282. }