ChannelExtraPointMonth.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. <?php
  2. /**
  3. * 公会每月补点数据统计定时器脚本
  4. *
  5. */
  6. namespace app\crontab;
  7. set_time_limit(0);
  8. use think\console\Command;
  9. use think\console\Input;
  10. use think\console\Output;
  11. use think\console\Input\Argument;
  12. use think\Db;
  13. use think\Env;
  14. class ChannelExtraPointMonth extends Command {
  15. protected $_output;
  16. protected function configure() {
  17. $this->addArgument('execMonth', Argument::OPTIONAL); //指定统计的日期时,格式Y-m
  18. $this->setName('ChannelExtraPointMonth')->setDescription('公会每月补点数据统计脚本');
  19. }
  20. protected function execute(Input $input, Output $output) {
  21. ini_set('memory_limit', '1024M');
  22. set_time_limit(3600);
  23. $month = $input->getArgument('execMonth'); //指定的执行月份
  24. $this->_output = $output;
  25. //指定统计的月份时
  26. if(!empty($month)){
  27. $start_time = mktime(0,0,0,date('m',strtotime($month)),01);
  28. $end_time = mktime(0,0,0,date('m',strtotime($month))+1,01)-1;
  29. }
  30. //未指定统计的月份时
  31. else{
  32. $start_time = mktime(0,0,0,date('m')-1,01); //上一个自然月的第一天
  33. $end_time = mktime(0,0,0,date('m'),01)-1; //上一个自然月的最后一天
  34. }
  35. $output->writeln(date('Y-m-d H:i:s')." ChannelExtraPointMonth start\r\n");
  36. $currentMonth = date('Y-m',$end_time);
  37. $delResult = Db::table('nw_game_channel_extra_divide_data')->where(['month'=>$currentMonth])->delete();
  38. //有流水的公会账号
  39. $guild_channel_list = Db::table('cy_pay')->alias('p')
  40. ->join('nw_channel c1', 'p.channel_id = c1.id')
  41. ->join('nw_channel c2', 'c1.parent_id = c2.id')
  42. ->join('nw_channel c3', 'c2.parent_id = c3.id')
  43. ->field('DISTINCT (case when c2.`level`=1 then c2.id else c3.id end) as guild_channel_id')
  44. ->where(['p.create_time'=>[['>=', $start_time],['<=', $end_time]]])
  45. ->where(['p.status'=>1])
  46. ->select();
  47. $output->writeln("guild_channel_list sql: ".Db::table('cy_pay')->getLastSql()."\r\n");
  48. if(!empty($guild_channel_list)){
  49. $arr = [];
  50. $key2 = 0;
  51. $TopChannelIds = array();
  52. foreach($guild_channel_list as $key=>$value){
  53. $where = [];
  54. $where['p.status'] = 1;
  55. $channel_id = $value['guild_channel_id'];
  56. $channelIds = get_child_channel_arr($channel_id);
  57. array_push($channelIds,$channel_id);
  58. $where['p.channel_id'] = ['in',$channelIds];
  59. $where['p.create_time'] = [['>=', $start_time],['<=', $end_time]];
  60. $parentChannelInfo = Db::table('nw_channel')->alias('c')
  61. ->join('nw_channel par', 'c.parent_id = par.id','left')
  62. ->field("par.id as par_channel_id,par.name as par_channel_name,par.level,par.channel_tg_type")
  63. ->where(['c.id'=>$channel_id])
  64. ->find();
  65. if($parentChannelInfo['channel_tg_type'] == 1 || $parentChannelInfo['channel_tg_type'] == 2){ //外部渠道保存商务ID
  66. if(!in_array($parentChannelInfo['par_channel_id'],$TopChannelIds)){
  67. $TopChannelIds[] = $parentChannelInfo['par_channel_id'];
  68. }
  69. }
  70. else{ //普通渠道
  71. $GameChannelData = Db::table('cy_pay')->alias('p')
  72. ->join('nw_extra_subgame sub', 'p.gameid = sub.game_id','inner')
  73. ->join('nw_extra_game g', 'sub.extra_game_id = g.id','inner')
  74. ->join('nw_game_extra_divide c', 'g.id = c.extra_game_id','left')
  75. ->join('nw_game_channel_extra_divide d','g.id = d.extra_game_id and d.channel_id='.$channel_id,'left')
  76. ->field("g.id AS extra_game_id,g.extra_game_name as game_name,c.id as game_divide_id,c.divide as game_divide,count(*) as pay_cnt,SUM(p.amount) AS pay_amt,d.id as channel_divide_id,d.divide as channel_divide")
  77. ->where($where)
  78. ->group('g.id')
  79. ->select();
  80. $pay_amt = $divide_amt = $pay_cnt = $rate = 0;
  81. foreach ( $GameChannelData as &$det ) {
  82. if(intval($det['channel_divide_id'])){
  83. $divide_type = 2;
  84. $divide_id = $det['channel_divide_id'];
  85. $divide = $det['channel_divide'];
  86. }
  87. else if(intval($det['game_divide_id'])){
  88. $divide_type = 1;
  89. $divide_id = $det['game_divide_id'];
  90. $divide = $det['game_divide'];
  91. }
  92. else{
  93. $divide_type = 0;
  94. $divide_id = 0;
  95. $divide = '';
  96. $rate = 0;
  97. }
  98. $pay_cnt = floatval($det['pay_cnt']);
  99. $pay_amt = floatval($det['pay_amt']);
  100. $extra_game_id = $det['extra_game_id'];
  101. $hasExtraRatio = false;
  102. if($pay_cnt && $pay_amt && $divide_id && $divide){
  103. $arr_divide = json_decode($divide);
  104. foreach($arr_divide as $civ){
  105. if(count($civ)==3){
  106. //实际流水大于该阶段左侧流水值并且小于右侧流水值
  107. // echo $civ[0]."---from---".$civ[1]."----to----<br>";
  108. if($pay_amt>=$civ[0] && $pay_amt<$civ[1]){
  109. $hasExtraRatio = true;
  110. $divide_amt = floatval(intval($pay_amt*$civ[2])/100);
  111. $rate = $civ[2];
  112. break;
  113. }
  114. }
  115. else{
  116. $template = '渠道游戏补点配置有误,游戏名:'.$det['game_name'].',当前配置为:'.$divide.' 。时间:'.date('Y-m-d H:i:s');
  117. $ddurl = Env::get('operat_url');
  118. curlDD($template, $ddurl,true);
  119. }
  120. }
  121. // echo $channel_id."---channel_id----".$hasExtraRatio."---hasExtraRatio----".$rate."---rate----".$divide_amt."-----divide_amt----<br>";
  122. if($hasExtraRatio){
  123. $arr[$key2][0] = $channel_id;
  124. $arr[$key2][1] = date('Y-m',$end_time);
  125. $arr[$key2][2] = $extra_game_id;
  126. $arr[$key2][3] = date('Y-m-d',$start_time);
  127. $arr[$key2][4] = date('Y-m-d',$end_time);
  128. $arr[$key2][5] = $pay_cnt;
  129. $arr[$key2][6] = $pay_amt;
  130. $arr[$key2][7] = $divide_type;
  131. $arr[$key2][8] = $divide_id;
  132. $arr[$key2][9] = $divide;
  133. $arr[$key2][10] = $rate;
  134. $arr[$key2][11] = $divide_amt;
  135. $channelInfo = Db::table('nw_channel')->field("id,name,level,parent_id")->where(['id'=>$channel_id])->find();
  136. $channelInfoApply = Db::table('nw_channel_info')->field("id,channel_id,real_name,apply_status,type,person_id,zfb_account,bank_ban_mobile,bank_number,bank_province_city,bank_name,bank_open_name,bank_open_number")->where(['channel_id'=>$channel_id,'apply_status'=>1])->find();
  137. if(empty($channelInfoApply)){
  138. $arr[$key2][12] = '';
  139. $arr[$key2][13] = '';
  140. $arr[$key2][14] = '';
  141. $arr[$key2][15] = '';
  142. $arr[$key2][16] = '';
  143. $arr[$key2][17] = '';
  144. $arr[$key2][18] = '';
  145. $arr[$key2][19] = '';
  146. $arr[$key2][20] = '';
  147. $template = '公会每月补点数据:该公会尚未身份认证,公会ID:'.$channel_id.',公会名称:'.$channelInfo['name'].' 。时间:'.date('Y-m-d H:i:s');
  148. $ddurl = Env::get('operat_url');
  149. curlDD($template, $ddurl,true);
  150. }
  151. else{
  152. $arr[$key2][12] = $channelInfoApply['real_name'];
  153. $arr[$key2][13] = $channelInfoApply['person_id'];
  154. $arr[$key2][14] = $channelInfoApply['zfb_account'];
  155. $arr[$key2][15] = $channelInfoApply['bank_ban_mobile'];
  156. $arr[$key2][16] = $channelInfoApply['bank_number'];
  157. $arr[$key2][17] = $channelInfoApply['bank_province_city'];
  158. $arr[$key2][18] = $channelInfoApply['bank_name'];
  159. $arr[$key2][19] = $channelInfoApply['bank_open_name'];
  160. $arr[$key2][20] = $channelInfoApply['bank_open_number'];
  161. }
  162. $arr[$key2][21] = time();
  163. $arr[$key2][22] = time();
  164. $arr[$key2][23] = 1;
  165. $key2++;
  166. }
  167. }
  168. }
  169. }
  170. if($arr){
  171. $arr_key = array('channel_id','month','extra_game_id','start_date','end_date','pay_cnt','pay_amt','divide_type','divide_id','divide','rate','divide_amt','real_name','person_id','zfb_account','bank_ban_mobile','bank_number','bank_province_city','bank_name','bank_open_name','bank_open_number','create_time','update_time','channel_type');
  172. $arr_update = array('start_date','end_date','pay_cnt','pay_amt','divide_type','divide_id','divide','rate','divide_amt','real_name','person_id','zfb_account','bank_ban_mobile','bank_number','bank_province_city','bank_name','bank_open_name','bank_open_number','update_time','channel_type');
  173. $execInfo = $this->multArray2InsertExec('nw_game_channel_extra_divide_data',$arr_key,$arr,$arr_update);
  174. if ($execInfo['code'] == 0) {
  175. $output->writeln("insert error:".json_encode($execInfo)." time:".date('Y-m-d H:i:s')."\r\n");
  176. }
  177. }
  178. }
  179. }
  180. if(!empty($TopChannelIds)){
  181. $arr = [];
  182. $key2 = 0;
  183. foreach($TopChannelIds as $key=>$value){
  184. $where = [];
  185. $where['p.status'] = 1;
  186. $channel_id = $value;
  187. $channelIds = get_child_channel_arr($channel_id);
  188. array_push($channelIds,$channel_id);
  189. $where['p.channel_id'] = ['in',$channelIds];
  190. $where['p.create_time'] = [['>=', $start_time],['<=', $end_time]];
  191. $GameChannelData = Db::table('cy_pay')->alias('p')
  192. ->join('nw_extra_subgame sub', 'p.gameid = sub.game_id','inner')
  193. ->join('nw_extra_game g', 'sub.extra_game_id = g.id','inner')
  194. ->join('nw_game_extra_divide c', 'g.id = c.extra_game_id','left')
  195. ->join('nw_game_channel_extra_divide d','g.id = d.extra_game_id and d.channel_id='.$channel_id,'left')
  196. ->field("g.id AS extra_game_id,g.extra_game_name as game_name,c.id as game_divide_id,c.divide as game_divide,count(*) as pay_cnt,SUM(p.amount) AS pay_amt,d.id as channel_divide_id,d.divide as channel_divide")
  197. ->where($where)
  198. ->group('g.id')
  199. ->select();
  200. $pay_amt = $divide_amt = $pay_cnt = $rate = 0;
  201. foreach ( $GameChannelData as &$det ) {
  202. if(intval($det['channel_divide_id'])){
  203. $divide_type = 2;
  204. $divide_id = $det['channel_divide_id'];
  205. $divide = $det['channel_divide'];
  206. }
  207. else if(intval($det['game_divide_id'])){
  208. $divide_type = 1;
  209. $divide_id = $det['game_divide_id'];
  210. $divide = $det['game_divide'];
  211. }
  212. else{
  213. $divide_type = 0;
  214. $divide_id = 0;
  215. $divide = '';
  216. $rate = 0;
  217. }
  218. $pay_cnt = floatval($det['pay_cnt']);
  219. $pay_amt = floatval($det['pay_amt']);
  220. $extra_game_id = $det['extra_game_id'];
  221. $hasExtraRatio = false;
  222. if($pay_cnt && $pay_amt && $divide_id && $divide){
  223. $arr_divide = json_decode($divide);
  224. foreach($arr_divide as $civ){
  225. if(count($civ)==3){
  226. //实际流水大于该阶段左侧流水值并且小于右侧流水值
  227. if($pay_amt>=$civ[0] && $pay_amt<$civ[1]){
  228. $hasExtraRatio = true;
  229. $divide_amt = floatval(intval($pay_amt*$civ[2])/100);
  230. $rate = $civ[2];
  231. break;
  232. }
  233. }
  234. else{
  235. $template = '游戏补点配置有误,游戏名:'.$det['game_name'].',当前配置为:'.$divide.' 。时间:'.date('Y-m-d H:i:s');
  236. $ddurl = Env::get('operat_url');
  237. curlDD($template, $ddurl,true);
  238. }
  239. }
  240. // echo $channel_id."---channel_id----".$hasExtraRatio."---hasExtraRatio----".$rate."---rate----".$divide_amt."-----divide_amt----<br>";
  241. if($hasExtraRatio){
  242. $arr[$key2][0] = $channel_id;
  243. $arr[$key2][1] = date('Y-m',$end_time);
  244. $arr[$key2][2] = $extra_game_id;
  245. $arr[$key2][3] = date('Y-m-d',$start_time);
  246. $arr[$key2][4] = date('Y-m-d',$end_time);
  247. $arr[$key2][5] = $pay_cnt;
  248. $arr[$key2][6] = $pay_amt;
  249. $arr[$key2][7] = $divide_type;
  250. $arr[$key2][8] = $divide_id;
  251. $arr[$key2][9] = $divide;
  252. $arr[$key2][10] = $rate;
  253. $arr[$key2][11] = $divide_amt;
  254. $channelInfo = Db::table('nw_channel')->field("id,name,level,parent_id")->where(['id'=>$channel_id])->find();
  255. $channelInfoApply =Db::table('nw_channel_info')->field("id,channel_id,real_name,apply_status,type,person_id,zfb_account,bank_ban_mobile,bank_number,bank_province_city,bank_name,bank_open_name,bank_open_number")->where(['channel_id'=>$channel_id,'apply_status'=>1])->find();
  256. if(empty($channelInfoApply)){
  257. $arr[$key2][12] = '';
  258. $arr[$key2][13] = '';
  259. $arr[$key2][14] = '';
  260. $arr[$key2][15] = '';
  261. $arr[$key2][16] = '';
  262. $arr[$key2][17] = '';
  263. $arr[$key2][18] = '';
  264. $arr[$key2][19] = '';
  265. $arr[$key2][20] = '';
  266. $template = '外部商务每月补点数据:该商务尚未身份认证,商务ID:'.$channel_id.',商务名称:'.$channelInfo['name'].' 。时间:'.date('Y-m-d H:i:s');
  267. $ddurl = Env::get('operat_url');
  268. curlDD($template, $ddurl,true);
  269. }
  270. else{
  271. $arr[$key2][12] = $channelInfoApply['real_name'];
  272. $arr[$key2][13] = $channelInfoApply['person_id'];
  273. $arr[$key2][14] = $channelInfoApply['zfb_account'];
  274. $arr[$key2][15] = $channelInfoApply['bank_ban_mobile'];
  275. $arr[$key2][16] = $channelInfoApply['bank_number'];
  276. $arr[$key2][17] = $channelInfoApply['bank_province_city'];
  277. $arr[$key2][18] = $channelInfoApply['bank_name'];
  278. $arr[$key2][19] = $channelInfoApply['bank_open_name'];
  279. $arr[$key2][20] = $channelInfoApply['bank_open_number'];
  280. }
  281. $arr[$key2][21] = time();
  282. $arr[$key2][22] = time();
  283. $arr[$key2][23] = 2;
  284. $key2++;
  285. }
  286. }
  287. }
  288. if($arr){
  289. $arr_key = array('channel_id','month','extra_game_id','start_date','end_date','pay_cnt','pay_amt','divide_type','divide_id','divide','rate','divide_amt','real_name','person_id','zfb_account','bank_ban_mobile','bank_number','bank_province_city','bank_name','bank_open_name','bank_open_number','create_time','update_time','channel_type');
  290. $arr_update = array('start_date','end_date','pay_cnt','pay_amt','divide_type','divide_id','divide','rate','divide_amt','real_name','person_id','zfb_account','bank_ban_mobile','bank_number','bank_province_city','bank_name','bank_open_name','bank_open_number','update_time','channel_type');
  291. $execInfo = $this->multArray2InsertExec('nw_game_channel_extra_divide_data',$arr_key,$arr,$arr_update);
  292. if ($execInfo['code'] == 0) {
  293. $output->writeln("insert error:".json_encode($execInfo)." time:".date('Y-m-d H:i:s')."\r\n");
  294. }
  295. }
  296. }
  297. }
  298. $output->writeln(date('Y-m-d H:i:s')." ChannelExtraPointMonth end\r\n");
  299. exit;
  300. }
  301. /**
  302. * 多条数据同时转化成插入SQL语句,并执行SQL语句,支持批量更新和新增
  303. *
  304. * @param string $table 表名
  305. * @param array $arr_key 是表字段名的key:$arr_key=array('field1','field2','field3')
  306. * @param array $arr 是字段值 数组示例 arrat(('a','b','c'), ('bbc','bbb','caaa'),('add','bppp','cggg'))
  307. * @param array $arr_list 是需要更新的表字段名的key $arr_list=array('field1','field2','field3')
  308. * @param string $split
  309. *
  310. * @return array
  311. */
  312. private function multArray2InsertExec($table,$arr_key,$arr,$arr_list,$split='`')
  313. {
  314. $arrValues=array();
  315. $arrListValues = array();
  316. if ( empty($table) || !is_array($arr_key) || !is_array($arr) || !is_array($arr_list)) {
  317. return ['code'=> 0, 'msg' => 'multArray2Insert param ERROR '];
  318. }
  319. $sql = "INSERT INTO %s( %s ) values %s on duplicate key update %s";
  320. foreach ($arr as $k => $v) {
  321. $arrValues[$k] = "'".implode("','", array_values($v))."'";
  322. }
  323. foreach ($arr_list as $k => $v) {
  324. $arrListValues[$k] = $v . "=values(".$v.')';
  325. }
  326. $sql = sprintf($sql,$table,"{$split}" .implode("{$split} ,{$split}",$arr_key) . "{$split}", "(". implode("),(",array_values($arrValues)) . ")",implode(',',$arrListValues));
  327. $this->_output->writeln(" insert sql: {$sql} \r\n");
  328. if($sql){
  329. try {
  330. $result = Db::execute($sql);
  331. } catch (\think\exception\PDOException $e) {
  332. return ['code'=> 0, 'msg' => 'InsertSql ERROR '.$e->getMessage()];
  333. }
  334. return ['code'=> 1, 'msg' => 'SUCCESS'];
  335. }else{
  336. return ['code'=> 0, 'msg' => 'InsertSql Null'];
  337. }
  338. }
  339. }