ChannelWithdraw.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. <?php
  2. /**
  3. * 渠道提现管理相关控制器
  4. */
  5. namespace app\admin\controller;
  6. use app\common\library\MakeReportGo;
  7. use app\common\model\Channel;
  8. use app\common\model\Admin as AdminModel;
  9. use app\common\model\Setting;
  10. use app\common\library\MakeReport;
  11. use app\common\library\FileUpload;
  12. use think\Db;
  13. class ChannelWithdraw extends Admin
  14. {
  15. protected $redis; //redis的句柄对象
  16. /**
  17. * 不进行父类的登录验证,所以增加构造方法重写了父类的初始化方法
  18. */
  19. protected function _initialize()
  20. {
  21. parent::_initialize();
  22. $this->redis = \think\Cache::store('default')->handler();
  23. }
  24. /**
  25. * 渠道提现列表
  26. */
  27. public function index()
  28. {
  29. $status = input('status',0,'intval');
  30. $begin_time = input('start','','trim');
  31. $end_time = input('end','','trim');
  32. $channelModel = new Channel;
  33. $where = [];
  34. //渠道名
  35. if(input('request.channel_id') <> '')
  36. {
  37. $where['a.channel_id'] = input('request.channel_id',0,'intval');
  38. }
  39. //一级审核状态
  40. if(input('request.status') <> ''){
  41. $where['a.status'] = $status;
  42. }
  43. //申请开始时间和结束时间不为空时
  44. if ($begin_time != '' && $end_time != '') {
  45. $where['a.create_time'] = [
  46. ['>=', strtotime($begin_time)],
  47. ['<=', strtotime($end_time . ' 23:59:59')],
  48. ];
  49. } //开始时间不为空时
  50. elseif ($begin_time != '') {
  51. $where['a.create_time'] = ['>=', strtotime($begin_time)];
  52. } //结束时间不为空时
  53. elseif ($end_time != '') {
  54. $where['a.create_time'] = ['<=', strtotime($end_time . ' 23:59:59')];
  55. }
  56. $channelList = $channelModel->getAllByCondition('id,name',['level'=>1,'flag'=>3],'name asc');
  57. if(input('download')==2){
  58. $list = model('ChannelWithdraw')->alias('a')
  59. ->join('nw_channel c','a.channel_id=c.id','left')
  60. ->field('a.*,c.name as channel_name,a.id as id,a.create_time as create_time')
  61. ->where($where)
  62. ->where("a.status=1")
  63. ->order('a.create_time desc')
  64. ->select();
  65. $title = "提现管理(财务)-".date('YmdHis');
  66. if(!$list){
  67. $this->error('暂无数据');
  68. }
  69. $total_withdraw_amt = floatval(model('ChannelWithdraw')->alias('a')
  70. ->join('nw_channel c','a.channel_id=c.id','left')
  71. ->where($where)
  72. ->where("a.status=1")->sum('withdraw_amt')); // 总提现金额
  73. $list_more = array();
  74. $list_more['total_withdraw_amt'] = $total_withdraw_amt;
  75. $this->downloadexls($list,$title,'channelWithdraw',$list_more);
  76. exit();
  77. }
  78. else if(input('download')==3){
  79. $where = array();
  80. $where['a.month'] = date('Y-m',mktime(0,0,0,date('m'),01)-1);
  81. $channelGameDataList = model('ChannelExtraDivideData')->alias('a')
  82. ->join('nw_channel c','a.channel_id=c.id','left')
  83. ->join('nw_extra_game g','a.extra_game_id=g.id','left')
  84. ->field('a.*,c.name as channel_name,g.extra_game_name as game_name,a.id as id,a.create_time as create_time')
  85. ->where($where)
  86. ->order('a.channel_type asc,a.channel_id asc,a.extra_game_id asc')
  87. ->select();
  88. reset($channelGameDataList);
  89. $list = array();
  90. while(list($key,$val)=@each($channelGameDataList)){
  91. $channelGameData = array();
  92. $channelGameData['game_name'] = $val['game_name'];
  93. $channelGameData['channel_name'] = $val['channel_name'];
  94. $channelGameData['start_date'] = $val['start_date'];
  95. $channelGameData['end_date'] = $val['end_date'];
  96. $channelGameData['pay_amt'] = $val['pay_amt'];
  97. $channelGameData['rate'] = $val['rate'];
  98. $channelGameData['divide_amt'] = $val['divide_amt'];
  99. $channelGameData['real_name'] = $val['real_name'];
  100. $channelGameData['zfb_account'] = $val['zfb_account'];
  101. $channelGameData['bank_number'] = $val['bank_number'];
  102. $channelGameData['bank_name'] = $val['bank_name'];
  103. $channelGameData['bank_open_name'] = $val['bank_open_name'];
  104. $list[$val['channel_id']][$val['extra_game_id']] = $channelGameData;
  105. }
  106. $title = "上月补点数据(财务)-".date('YmdHis');
  107. if(!$list){
  108. $this->error('暂无数据');
  109. }
  110. $channelDataList = model('ChannelExtraDivideData')->alias('a')
  111. ->join('nw_channel c','a.channel_id=c.id','left')
  112. ->field('channel_id,count(1) as channel_game_cnt,sum(pay_amt) as channel_pay_amt,sum(divide_amt) as channel_divide_amt')
  113. ->where($where)
  114. ->group('a.channel_id')
  115. ->order('a.channel_type asc,a.channel_id asc')
  116. ->select();
  117. reset($channelDataList);
  118. $list_more = array();
  119. while(list($key,$val)=@each($channelDataList)){
  120. $channelData = array();
  121. $channelData['channel_id'] = $val['channel_id'];
  122. $channelData['channel_game_cnt'] = $val['channel_game_cnt'];
  123. $channelData['channel_pay_amt'] = $val['channel_pay_amt'];
  124. $channelData['channel_divide_amt'] = $val['channel_divide_amt'];
  125. $list_more[$val['channel_id']] = $channelData;
  126. }
  127. $this->downloadexls($list,$title,'channelExtraPoint',$list_more);
  128. exit();
  129. }
  130. if (request()->isAjax() && input('download')==1) {
  131. $sql = model('ChannelWithdraw')->alias('a')
  132. ->join('nw_channel c','a.channel_id=c.id','left')
  133. ->field('a.*,c.name as channel_name,a.id as id,a.create_time as create_time')
  134. ->where($where)
  135. ->order('a.create_time desc')
  136. ->fetchSql(true)->select();
  137. if((new MakeReportGo())->addTask('admin.withdrawIndex',$sql,session_id())){
  138. $this->success('报表生成的任务已经提交, 报表生成完成后,会及时通知您,请耐心稍等');
  139. }
  140. else{
  141. $this->error('报表生成任务不可重复提交,如遇到无法导出情况,建议修改查询条件解除当前状态,提交重新生成报表任务!');
  142. }
  143. }
  144. $param = input('request.'); //分页带条件
  145. $list = model('ChannelWithdraw')->alias('a')
  146. ->join('nw_channel c','a.channel_id=c.id','left')
  147. ->field('a.*,c.name as channel_name,a.id as id,a.create_time as create_time')
  148. ->where($where)
  149. ->order('a.create_time desc')
  150. ->paginate(10,false,array('query' => $param));
  151. // 获取分页显示的HTML
  152. $page = $list->render();
  153. $this->assign('channel_list',$channelList);
  154. $this->assign('list', $list);
  155. $this->assign('page', $page);
  156. $this->assign('start', $begin_time);
  157. $this->assign('end', $end_time);
  158. return $this->fetch();
  159. }
  160. //审核
  161. public function audit()
  162. {
  163. if (request()->isAjax()) {
  164. $id = input('id',0,'intval');
  165. $beizhu = input('beizhu','','trim');
  166. $status = input('status','0','intval');
  167. if(empty($id)){
  168. $this->error('ID不能为空');
  169. }
  170. if($status<>1 && $status<>2){
  171. $this->error('非法审核状态');
  172. }
  173. $withdrawInfo = model('ChannelWithdraw')->where(['id' => $id])->find();
  174. if(empty($withdrawInfo)){
  175. $this->error('提现申请不存在');
  176. }
  177. else if($withdrawInfo['status'] <> 0){
  178. $this->error('提现申请已审核过,不能再进行审核');
  179. }
  180. if($status == $withdrawInfo['status']){
  181. $this->error('您未更改订单状态,请选择要更改的状态');
  182. }
  183. //检查账号
  184. if(!$withdrawInfo['channel_id']){
  185. $this->error('提现申请异常:无归属渠道');
  186. }
  187. $channelInfo = model('Channel')->where(['id'=>$withdrawInfo['channel_id']])->find();
  188. if (empty($channelInfo)){
  189. $this->error('提现申请异常:提现申请归属渠道不存在');
  190. }
  191. else if($channelInfo['level'] <> 1){
  192. $this->error('提现申请异常:提现申请归属渠道层级有误');
  193. }
  194. $auditData = array();
  195. $auditData['id'] = $id;
  196. $auditData['status'] = $status;
  197. $auditData['audit_time'] = NOW_TIMESTAMP;
  198. $auditData['audit_remark'] = $beizhu;
  199. $auditData['audit_admin_name'] = session('USERNAME');
  200. Db::startTrans();
  201. try {
  202. if($status==2 ){ //审核不通过
  203. //添加账户金额变动信息
  204. $detData = array();
  205. $detData['channel_id'] = $channelInfo['id'];
  206. $detData['channel_name'] = $channelInfo['name'];
  207. $detData['change_amount'] = $withdrawInfo['withdraw_amt'];
  208. $detData['account_type'] = 2; //结算账户
  209. $detData['type'] = 10; //提现审核不通过返回
  210. $detData['out_orderid'] = $withdrawInfo['orderid'];
  211. $detData['create_time'] = NOW_TIMESTAMP;
  212. $insertDetId = model('ChannelAccountDet')->insertGetId($detData);
  213. if ( !$insertDetId) {
  214. throw new Exception("添加账户变动明细失败");
  215. }
  216. $updData = array();
  217. $updData['js_amount'] = Db::raw("js_amount+".$withdrawInfo['withdraw_amt']);
  218. $updData['update_time'] = time();
  219. $updResult = model('Channel')->where(['id'=>$channelInfo['id']])->update($updData);
  220. if (!$updResult) {
  221. throw new Exception("账户金额变动失败");
  222. }
  223. $result = model('ChannelWithdraw')->where(['id'=>$id,'status'=>array('in',[0])])->update($auditData);
  224. if ($result === false) {
  225. throw new Exception("更改提现申请状态失败");
  226. }
  227. $this->insertLog($this->current_node, "渠道提现审核,提现单号ID:".$withdrawInfo['id'].",审核状态:审核不通过",172);
  228. }
  229. else if($status==1){ //审核通过
  230. $result = model('ChannelWithdraw')->where(['id'=>$id,'status'=>array('in',[0])])->update($auditData);
  231. if ($result === false) {
  232. throw new Exception("更改提现订单状态失败");
  233. }
  234. $this->insertLog($this->current_node, "渠道提现审核,提现单号ID:".$withdrawInfo['id'].",审核状态:审核通过",172);
  235. }
  236. Db::commit();
  237. } catch (\Exception $e) {
  238. Db::rollback();
  239. $this->error("添加失败: " . $e->getMessage());
  240. }
  241. $this->success('审核成功');
  242. }
  243. else{
  244. $this->error('非法请求');
  245. }
  246. }
  247. /**
  248. * 提现处理
  249. */
  250. public function doWithdraw()
  251. {
  252. if ($this->request->isPost()) {
  253. $channel_id = input('channel_id',0,'intval'); //公会ID
  254. $amount = input('amount',0,'floatval'); //提现金额
  255. $remark = '外部投放公会手动提现'; //备注
  256. $orderid = 'W'.makeOrderid();
  257. if(!$amount){
  258. $this->jsonResult('', 0, '请填写提现金额!');
  259. }
  260. else if(abs(intval($amount*100)/100-$amount) > 0.01){
  261. $this->jsonResult('', 0, '请正确填写提现金额!');
  262. }
  263. $channelInfo = model("Channel")->field("id,name,parent_id,level,cps_settle_period,mcps_settle_period,status,js_amount")->where(['id'=>$channel_id,'level'=>1])->find();
  264. if(empty($channelInfo)){
  265. $this->jsonResult('', 0, '公会账号异常,请选择正确的公会账号');
  266. }
  267. else if($channelInfo['js_amount']<$amount){
  268. $this->jsonResult('', 0, '您的结算余额不足');
  269. }
  270. //只能结算外放的公会
  271. $parentChannelInfo = model("Channel")->field("id,name,level,cps_settle_period,mcps_settle_period,status,channel_tg_type")->where(['id'=>$channelInfo['parent_id'],'level'=>0])->find();
  272. if(empty($parentChannelInfo)){
  273. $this->jsonResult('', 0, '公会所属商务账号异常');
  274. }
  275. else if($parentChannelInfo['channel_tg_type']<>1){
  276. $this->jsonResult('', 0, '非外放商务下公会不能使用该功能');
  277. }
  278. /*
  279. $relChannelInfo = model("ChannelInfo")->where(['channel_id'=>$channel_id])->find();
  280. if(!$relChannelInfo){
  281. $this->jsonResult('', 0, '请先补充完提现相关信息后再进行提现');
  282. }
  283. $channelInfoApply = model("ChannelInfo")->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();
  284. if(empty($channelInfoApply)){
  285. $this->jsonResult('', 0, '您的身份尚未认证通过,不能进行提现');
  286. }
  287. */
  288. //指定时间内,禁止重复下单
  289. if(!requestDuplicateCheck('channel_withdraw_duplicate_'.$channel_id,10)){
  290. $this->jsonResult('', 0, '提现请求过多,请于10s以后,再次进行提现操作');
  291. }
  292. $withdrawData = array();
  293. $withdrawData['orderid'] = $orderid;
  294. $withdrawData['channel_id'] = $channel_id;
  295. $withdrawData['channel_name'] = $channelInfo['name'];
  296. $withdrawData['withdraw_amt'] = $amount;
  297. $withdrawData['remark'] = $remark;
  298. $withdrawData['status'] = 0;
  299. $withdrawData['create_time'] = time();
  300. $withdrawData['real_name'] = '张智博';
  301. $withdrawData['person_id'] = '';
  302. $withdrawData['zfb_account'] = '';
  303. $withdrawData['bank_ban_mobile']= '';
  304. $withdrawData['bank_number'] = '6236684220002075555';
  305. $withdrawData['bank_province_city'] = '陕西,西安';
  306. $withdrawData['bank_name'] = '中国建设银行';
  307. $withdrawData['bank_open_name'] = '中国建设银行股份有限公司西安龙首北路支行';
  308. $withdrawData['bank_open_number'] = '';
  309. // 启动事务
  310. Db::startTrans();
  311. try{
  312. $result = ''; //返回值
  313. $insertWithdrawId = model("ChannelWithdraw")->insert($withdrawData);
  314. if(!$insertWithdrawId){
  315. throw new Exception("创建提现订单失败! ");
  316. }
  317. $detData = array();
  318. $detData['channel_id'] = $channel_id;
  319. $detData['channel_name'] = $channelInfo['name'];
  320. $detData['change_amount'] = -$amount;
  321. $detData['account_type'] = 2; //结算账户
  322. $detData['type'] = 9; //提现
  323. $detData['out_orderid'] = $orderid;
  324. $detData['create_time'] = NOW_TIMESTAMP;
  325. $insertDetId = model('ChannelAccountDet')->insertGetId($detData);
  326. if ( !$insertDetId) {
  327. throw new Exception("添加账户变动明细失败");
  328. }
  329. $updData = array();
  330. $updData['js_amount'] = Db::raw("js_amount-".$amount);
  331. $updData['update_time'] = time();
  332. $updResult = model('Channel')->where(['id'=>$channel_id,'js_amount'=>array('egt',$amount)])->update($updData);
  333. if (!$updResult) {
  334. throw new Exception("账户金额变动失败");
  335. }
  336. $this->redis->del('channel_withdraw_duplicate_'.$channel_id);
  337. // 提交事务
  338. Db::commit();
  339. } catch (\Exception $e) {
  340. // 回滚事务
  341. Db::rollback();
  342. $this->jsonResult('', 0, '提现订单生成失败'.$e->getMessage());
  343. }
  344. $result['orderid'] = $orderid;
  345. $this->jsonResult($result, 20000, '提现订单生成成功');
  346. exit;
  347. }
  348. else{
  349. $this->jsonResult('', 0, '非法请求');
  350. exit;
  351. }
  352. }
  353. }