Vipwithdraw.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  1. <?php
  2. namespace app\admin\controller;
  3. use app\common\controller\Backend;
  4. use app\common\library\Redis;
  5. use app\main\helper\StringHelper;
  6. use app\main\service\OrderService;
  7. use think\Controller;
  8. use think\Log;
  9. use think\Request;
  10. /**
  11. * 订单结算
  12. */
  13. class Vipwithdraw extends Backend
  14. {
  15. protected $model = null;
  16. // protected $searchFields = 'admin.nickname';
  17. //Multi方法可批量修改的字段
  18. protected $noNeedRight=['historyexport'];
  19. public function _initialize()
  20. {
  21. parent::_initialize();
  22. $this->model = model('Withdraw')->setConnect();
  23. $this->view->assign("stateList", $this->model->getStateList());
  24. }
  25. /**
  26. * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个方法
  27. * 因此在当前控制器中可不用编写增删改查的代码,如果需要自己控制这部分逻辑
  28. * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
  29. */
  30. // /*
  31. // * 我的结算单
  32. // */
  33. public function index(){
  34. $vipadminIds = model("VipAdminBind")
  35. ->where("admin_id_master",$this->auth->id)
  36. ->where("flag = 1")
  37. ->column("admin_id_slave");
  38. if ($this->request->isAjax()) {
  39. //如果发送的来源是Selectpage,则转发到Selectpage
  40. if ($this->request->request('pkey_name')) {
  41. return $this->selectpage();
  42. }
  43. list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  44. $total = model("AdminMoney")
  45. ->where("admin_id","in",$vipadminIds)
  46. ->where($where)
  47. ->order($sort, $order)
  48. ->count();
  49. $list = model("AdminMoney")
  50. ->alias("a")
  51. ->join("admin ad","a.admin_id = ad.id")
  52. ->join("admin_config ac","a.admin_id = ac.admin_id","left")
  53. ->where("a.admin_id","in",$vipadminIds)
  54. ->field("a.*,ac.json,ad.username")
  55. ->order($sort, $order)
  56. ->limit($offset, $limit)
  57. ->select();
  58. foreach ($list as $k=>$v){
  59. $rechargeinfo = [];
  60. $rechargeinfo = model('orders_collect')->sumCollect($v['admin_id'],1,3);
  61. foreach ($rechargeinfo->toarray() as $rk=>$rv){
  62. $list[$k][$rk] = $rv;
  63. }
  64. $list[$k]['name'] = $v['json']?json_decode($v['json'])->authorizer_info->nick_name:'-';
  65. $today_collect = model('orders_collect')->sumCollect($v['admin_id'],1,3);
  66. $channelTotalSplitMoney = $today_collect['split_money'] ?? 0;
  67. $list[$k]['split_money'] = StringHelper::moneyFormat($channelTotalSplitMoney);
  68. $list[$k]['no_cash_money'] = StringHelper::moneyFormat(($rechargeinfo['recharge_money_benefit']*100-$v['cash_money']*100-$v['count_cash_money']*100 - $channelTotalSplitMoney*100)/100);
  69. $list[$k]['recharge_money_benefit'] = StringHelper::moneyFormat(($rechargeinfo['recharge_money_benefit']*100 - $channelTotalSplitMoney*100)/100);
  70. }
  71. //按未体现金额排序
  72. $keyarr = array_column($list,"no_cash_money");
  73. array_multisort($keyarr,SORT_DESC,$list);
  74. $result = array("total" => $total, "rows" => $list);
  75. return json($result);
  76. }
  77. $fields = "sum(no_cash_money) no_cash_money,sum(cash_money) cash_money,sum(count_money) count_money,sum(benefit_money) benefit_money,sum(count_cash_money) count_cash_money,sum(orders_count) orders_count, sum(split_money) as split_money";
  78. $admin_money = model('admin_money')
  79. ->field($fields)
  80. ->where('admin_id','in',$vipadminIds)
  81. ->find();
  82. $this->assign('admin_money',$admin_money);
  83. //渠道充值不含当天
  84. $today_collect = model('orders_collect')->sumCollect($vipadminIds,1,3);
  85. $totalSplitMoney = $today_collect['split_money'] ?? 0;
  86. $this->assign('split_money',$totalSplitMoney ?: 0);
  87. $this->assign('recharge_all',$today_collect['recharge_money']??0);
  88. $this->assign('no_cash_money',($today_collect['recharge_money_benefit']??0)-$admin_money['cash_money']-$admin_money['count_cash_money']-$totalSplitMoney);
  89. $this->assign('count_money',($today_collect['recharge_money_benefit']??0)-$totalSplitMoney);
  90. return $this->view->fetch("mywithdraw");
  91. }
  92. /**
  93. * VIP名下所有渠道商提现记录
  94. */
  95. public function historyMoney()
  96. {
  97. $vipadminIds = model("VipAdminBind")
  98. ->where("admin_id_master", $this->auth->id)
  99. ->where("flag = 1")
  100. ->column("admin_id_slave");
  101. if ($this->request->isAjax()) {
  102. list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  103. /*$total = $this->model
  104. ->where('withdraw.admin_id', 'in', $vipadminIds)
  105. ->where($where)
  106. ->order($sort, $order)
  107. ->count();*/
  108. $total = $this->model
  109. ->join('admin_config', 'withdraw.admin_id = admin_config.admin_id', 'left')
  110. ->join('admin', 'withdraw.admin_id = admin.id', 'left')
  111. ->where('withdraw.admin_id', 'in', $vipadminIds)
  112. ->where($where)
  113. ->order('withdraw.id desc')
  114. ->count();
  115. $list = $this->model
  116. ->join('admin_config', 'withdraw.admin_id = admin_config.admin_id', 'left')
  117. ->join('admin', 'withdraw.admin_id = admin.id', 'left')
  118. ->where('withdraw.admin_id', 'in', $vipadminIds)
  119. ->where($where)
  120. ->field('withdraw.*')
  121. ->field('admin.username,nickname')
  122. ->field(['REPLACE (JSON_EXTRACT(JSON_EXTRACT( admin_config.json, "$.authorizer_info"),"$.nick_name"), "\"", "")' => 'service_name'])
  123. ->order('withdraw.id desc')
  124. ->limit($offset, $limit)
  125. ->select();
  126. $result = array("total" => $total, "rows" => $list);
  127. return json($result);
  128. }
  129. return $this->view->fetch();
  130. }
  131. public function add($ids = NULL)
  132. {
  133. $t = time();
  134. $start_time = strtotime(date('Y-m-d 23:30:00'));
  135. $end_time = strtotime(date('Y-m-d 01:30:00'));
  136. if($t>=$start_time || $t<=$end_time){
  137. $this->error('每天00:00-01:30与23:30-24:00,不支持提现');
  138. }
  139. $admin_money = model('AdminMoney')->get($ids);
  140. $isIdCard = 0;
  141. $today_collect = model('orders_collect')->sumCollect($admin_money['admin_id'],1,3);
  142. //不含今日的分账金额
  143. $totalSplitMoney = $today_collect['split_money'] ?? 0;
  144. $no_cash_money = floatval(($today_collect['recharge_money_benefit']??0)-$admin_money['cash_money']-$admin_money['count_cash_money']-$totalSplitMoney);
  145. $no_cash_money = StringHelper::moneyFormat($no_cash_money);
  146. if ($this->request->isPost()) {
  147. $timedate = date('Ymd',time());
  148. $withdrawKey = 'WD:'.$admin_money['admin_id'].':'.$timedate;
  149. $redis = Redis::instance();
  150. if($redis->exists($withdrawKey)){
  151. $this->error('提现过于频繁,请十分钟以后再试');
  152. }
  153. if(empty($this->request->post('idcard_no'))){
  154. $row = $this->request->post('row/a');
  155. if ($row) {
  156. $money = $row['money'];
  157. $no_cash_money = (string) $no_cash_money;
  158. //未提现余额 严格校验
  159. if($no_cash_money != $money){
  160. $this->error('ERROR:提现金额与计算后的提现金额不一致');
  161. }
  162. if( $money<10){
  163. $this->error('最低提现金额10元');
  164. }
  165. /* if($admin_money['no_cash_money'] < $money){
  166. $this->error('超出最大可提现金额'.$admin_money['no_cash_money']);
  167. }*/
  168. $save['etime'] = date('Ymd',strtotime('-1 day'));
  169. $stime = model('withdraw')->setConnect()->where('admin_id',$admin_money['admin_id'])->field('etime')->order('id desc')->find();
  170. if(empty($stime['etime'])){
  171. $save['stime'] = null;
  172. }else{
  173. $save['stime'] = date('Ymd',strtotime($stime['etime'])+3600*24);
  174. }
  175. //$this->error($save['stime']);
  176. $save['admin_id'] = $admin_money['admin_id'];
  177. $save['money'] = $money;//含手续费
  178. $save['state'] = 1;
  179. if(model('withdraw')->save($save)){
  180. model('AdminMoney')->where('admin_id',$admin_money['admin_id'])->setInc('cash_money',$money);
  181. $redis->setex($withdrawKey,600,'1'); //redis存10分钟,避免重复提现
  182. $this->success();
  183. }
  184. $this->error('提交申请失败');
  185. }
  186. }else{ //输入身份证号
  187. $idCardNo = trim($this->request->post('idcard_no'));
  188. $flag = validateIDCard($idCardNo);
  189. if($flag){
  190. model('AdminExtend')->update(['idcard_no'=>$idCardNo],['admin_id'=>$admin_money['admin_id']]);
  191. $this->success();
  192. }else{
  193. $this->error('身份证号码不合法');
  194. }
  195. }
  196. $this->error('错误');
  197. }
  198. $this->assign('isIdcard',$isIdCard);
  199. $this->assign('group',$this->group);
  200. $this->assignconfig('group',$this->group);
  201. $this->view->assign('no_cash_money',$no_cash_money?$no_cash_money:0);
  202. $this->assignconfig('no_cash_money',$no_cash_money?$no_cash_money:0);
  203. return $this->view->fetch();
  204. }
  205. /**
  206. * 批量更新
  207. */
  208. public function multi($ids = "")
  209. {
  210. $ids = $ids ? $ids : $this->request->param("ids");
  211. if ($ids) {
  212. $idsarr = explode(",", $ids);
  213. $list = model("AdminMoney")
  214. ->alias("a")
  215. ->join("admin ad", "a.admin_id = ad.id")
  216. ->join("admin_config ac", "a.admin_id = ac.admin_id", "left")
  217. ->where("a.id", "in", $ids)
  218. ->field("a.*,ac.json,ad.username")
  219. ->select();
  220. $totalmoney = 0;
  221. foreach ($list as $k => $v) {
  222. $rechargeinfo = [];
  223. $rechargeinfo = model('orders_collect')->sumCollect($v['admin_id'], 1, 3);
  224. foreach ($rechargeinfo->toarray() as $rk => $rv) {
  225. $list[$k][$rk] = $rv;
  226. }
  227. // $list[$k]['name'] = json_decode($v['json'])->authorizer_info->nick_name;
  228. $list[$k]['name'] = $v['json']?json_decode($v['json'])->authorizer_info->nick_name:'-';
  229. $channelTotalSplitMoney = $list[$k]['split_money'] ?? 0;
  230. $list[$k]['money'] = ($list[$k]['recharge_money_benefit'] ?? 0) - ($list[$k]['cash_money'] ?? 0) - ($list[$k]['count_cash_money'] ?? 0) - $channelTotalSplitMoney;
  231. $list[$k]['money'] = StringHelper::moneyFormat($list[$k]['money']);
  232. $totalmoney += $list[$k]['money'];
  233. }
  234. $this->view->assign("list", $list);
  235. $this->view->assign("ids", $ids);
  236. $this->view->assign("totalmoney", $totalmoney);
  237. if ($this->request->isAjax()) {
  238. $t = time();
  239. $start_time = strtotime(date('Y-m-d 23:30:00'));
  240. $end_time = strtotime(date('Y-m-d 01:30:00'));
  241. if ($t >= $start_time || $t <= $end_time) {
  242. $this->error('每天00:00-01:30与23:30-24:00,不支持提现');
  243. }//体现时间
  244. $limitids = [];//频繁提现
  245. $lowids = [];//低于10元
  246. $sucids = [];//验证通过
  247. foreach ($idsarr as $id) {//验证提现
  248. $num = $this->checkwithdraw($id);
  249. if ($num == -1) {
  250. $limitids[] = $id;
  251. } elseif ($num == -2) {
  252. $lowids[] = $id;
  253. } elseif ($num) {
  254. $sucids[] = $id;
  255. }
  256. }
  257. $redis = Redis::instance();
  258. $timedate = date('Ymd', time());
  259. $idxList = [];
  260. foreach ($list as $item) {
  261. $idxList[$item->id] = $item;
  262. }
  263. if (empty($limitids) && empty($lowids) && $sucids && count($sucids) == count($idsarr)) {//验证通过,提现
  264. foreach ($idsarr as $id) {
  265. $admin_money = model('AdminMoney')->get($id);
  266. $today_collect = model('orders_collect')->sumCollect($admin_money['admin_id'], 1, 3);
  267. $channelTotalSplitMoney = $today_collect['split_money'] ?? 0;
  268. $money = ($today_collect['recharge_money_benefit'] ?? 0) - $admin_money['cash_money'] - $admin_money['count_cash_money'] - $channelTotalSplitMoney;
  269. $money = StringHelper::moneyFormat($money);
  270. $save = [
  271. 'admin_id' => $admin_money['admin_id'],
  272. 'money' => $money,
  273. 'state' => 1,
  274. 'etime' => date('Ymd', strtotime('-1 day')),
  275. 'createtime' => time(),
  276. 'updatetime' => time(),
  277. ];
  278. $stime = model('withdraw')->setConnect()->where('admin_id',
  279. $admin_money['admin_id'])->field('etime')->order('id desc')->find();
  280. if (empty($stime['etime'])) {
  281. $save['stime'] = null;
  282. } else {
  283. $save['stime'] = date('Ymd', strtotime($stime['etime']) + 3600 * 24);
  284. }
  285. $result = model('withdraw')->insert($save);
  286. unset($save);
  287. if ($result) {
  288. model('AdminMoney')->where('admin_id', $admin_money['admin_id'])->setInc('cash_money', $money);
  289. $withdrawKey = 'WD:' . $admin_money['admin_id'] . ':' . $timedate;
  290. $redis->setex($withdrawKey, 600, '1'); //redis存10分钟,避免重复提现
  291. } else {
  292. $faluireids[] = $id;
  293. }
  294. }
  295. if (empty($faluireids)) {
  296. $this->success();
  297. } else {
  298. $faluireidInfos = [];
  299. foreach ($faluireids as $faluireid) {
  300. $faluireidInfos[$faluireid] = $idxList[$faluireid];
  301. }
  302. // $res = ['code' => -1, 'data' => ['faluireids' => $faluireids]];
  303. $res = ['code' => -1, 'data' => $faluireidInfos];
  304. }
  305. } else {//有验证未通过
  306. $limitInfos = [];
  307. $lowInfos = [];
  308. foreach ($limitids as $limitid) {
  309. $limitInfos[] = $idxList[$limitid];
  310. }
  311. foreach ($lowids as $lowid) {
  312. $lowInfos[] = $idxList[$lowid];
  313. }
  314. $res = ['code' => -1, 'data' => ['limitinfos' => $limitInfos, 'lowids' => $lowInfos]];
  315. }
  316. return json($res);
  317. }
  318. return $this->view->fetch();
  319. } else {
  320. $this->error(__('Parameter %s can not be empty', 'ids'));
  321. }
  322. }
  323. public function checkwithdraw($id){
  324. if(!$id){
  325. return false;
  326. }
  327. $admin_money = model('AdminMoney')->get($id);
  328. $today_collect = model('orders_collect')->sumCollect($admin_money['admin_id'],1,3);
  329. $channelTotalSplitMoney = $today_collect['split_money'] ?? 0;
  330. $money = ($today_collect['recharge_money_benefit']??0)-$admin_money['cash_money']-$admin_money['count_cash_money'] - $channelTotalSplitMoney;
  331. $money = StringHelper::moneyFormat($money);
  332. $timedate = date('Ymd',time());
  333. $withdrawKey = 'WD:'.$admin_money['admin_id'].':'.$timedate;
  334. $redis = Redis::instance();
  335. if($redis->exists($withdrawKey)){
  336. return -1;
  337. }
  338. if( $money<10){
  339. return -2;
  340. }
  341. return 1;
  342. }
  343. /**
  344. * 提现记录导出
  345. */
  346. public function historyExport()
  347. {
  348. $vipadminIds = model("VipAdminBind")
  349. ->where("admin_id_master", $this->auth->id)
  350. ->where("flag = 1")
  351. ->column("admin_id_slave");
  352. list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  353. $total = $this->model
  354. ->join('admin_config', 'withdraw.admin_id = admin_config.admin_id', 'left')
  355. ->join('admin', 'withdraw.admin_id = admin.id', 'left')
  356. ->where('withdraw.admin_id', 'in', $vipadminIds)
  357. ->where($where)
  358. ->order('withdraw.id desc')
  359. ->count();
  360. $list = $this->model
  361. ->join('admin_config', 'withdraw.admin_id = admin_config.admin_id', 'left')
  362. ->join('admin', 'withdraw.admin_id = admin.id', 'left')
  363. ->where('withdraw.admin_id', 'in', $vipadminIds)
  364. ->where($where)
  365. ->field('withdraw.*')
  366. ->field('admin.username,nickname')
  367. ->field(['REPLACE (JSON_EXTRACT(JSON_EXTRACT( admin_config.json, "$.authorizer_info"),"$.nick_name"), "\"", "")' => 'service_name'])
  368. ->order('withdraw.id desc')
  369. ->limit($offset, $limit)
  370. ->select();
  371. $title=array('公众号名称','用户名称','昵称','提现时间','划账日期','提现金额','状态');
  372. $this->export($title,$list);
  373. }
  374. private function export($title,$list)
  375. {
  376. ini_set('memory_limit', '512M'); //内存限制
  377. $content = '';
  378. $content .= implode($title,',');
  379. $content .= PHP_EOL;
  380. foreach($list as $k =>$v){
  381. $content .= $v['service_name'].','.$v['username'].','.$v['nickname'].','.date('Y-m-d H:i:s',$v['createtime']).','.$v['finishtime_text'].','.$v['money'].','.$v['state_text'].PHP_EOL;
  382. }
  383. mb_convert_variables('GBK', 'UTF-8', $content);
  384. $fileName = "提现记录导出-".date('YmdHis', time()).".csv";
  385. header('Expires: 0');
  386. header('Content-Encoding: utf-8');
  387. header("Content-type:text/csv; charset=utf-8");
  388. Header("Accept-Length: " . strlen($content));
  389. header("Content-Disposition:attachment;filename=" . $fileName);
  390. header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
  391. header('Pragma:public');
  392. echo $content;exit;
  393. }
  394. }