RedbagController.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: blade
  5. * Date: 2018/1/12
  6. * Time: 18:42
  7. */
  8. namespace App\Http\Controllers\Admin;
  9. use App\Http\Controllers\Controller;
  10. use Illuminate\Http\Request as Req;
  11. use Illuminate\Support\Facades\App;
  12. use Request;
  13. class RedbagController extends Controller{
  14. //页面
  15. function Index(Req $req){
  16. $request['red_type']=isset($req->red_type)?trim($req->red_type):null;
  17. $request['system_user']=isset($req->system_user)?trim($req->system_user):null;
  18. $request['input_order']=isset($req->account_name)?trim($req->account_name):null;
  19. $request['startime']=isset($req->startime)?trim($req->startime):null;
  20. $request['endtime']=isset($req->endtime)?trim($req->endtime):null;
  21. $dt = \App\Lib\DataTable\DataTable::init();
  22. $dt->setDataSource('/admin/Redbag/getList');
  23. $dt->setLang('redBag');
  24. $dt->addColsFields('red_type', array('templet' => '#red_type', 'sort' => false,'width'=>120));
  25. $dt->addColsFields('system_user', array('sort' => false,'width'=>140));
  26. $dt->addColsFields('create_time', array('sort' => false,'width'=>190));
  27. $dt->addColsFields('input_order', array('sort' => false,'width'=>240));
  28. $dt->addColsFields('input_reason', array('sort' => false));
  29. // $dt->addColsFields('input_rule', array('sort' => false,'templet' => '#input_rule'));//暂时无用,注释
  30. $dt->addColsFields('sum_money', array('sort' => false,'width'=>100));
  31. $dt->addColsFields('success_money', array('sort' => false,'width'=>100));
  32. $dt->addColsFields('sum_user', array('sort' => false));
  33. $dt->addColsFields('suescc_user', array('sort' => false));//成功人数
  34. $dt->addColsFields('fail_user', array('sort' => false));//失败人数
  35. return view('admin.redBag/index', $dt->render($request));
  36. }
  37. //数据源
  38. function getList(Req $req){
  39. $red_type=isset($req->red_type)?trim($req->red_type):null;
  40. $system_user=isset($req->system_user)?trim($req->system_user):null;
  41. $input_order=isset($req->account_name)?trim($req->account_name):null;
  42. $startime=isset($req->startime)?trim($req->startime):null;
  43. $endtime=isset($req->endtime)?trim($req->endtime):null;
  44. $list=isset($req->limit)?trim($req->limit):50;
  45. $where=array();
  46. if(!empty($red_type)){
  47. $where[]=array('red_type',$red_type);
  48. }
  49. $db=new \App\Models\MoneyRed;
  50. $data=$db->getList($list,$where);
  51. $regType=trans('redBag.redType');
  52. foreach ($data['data'] as $k=>$v){
  53. $data['data'][$k]['red_type']=$regType[$v['red_type']];
  54. }
  55. return \App\Lib\DataTable\DataTable::init()->toJson($data['data'],$data['total']);
  56. }
  57. function addRedBag(Req $req){
  58. if(!$req->isMethod('post')){
  59. $redType_db=new \App\Models\RedBag;
  60. $type=$redType_db->getRedBagType();
  61. return view('admin.redBag/addRedBag',['type'=>$type]);
  62. }else{
  63. //理由
  64. $password=$req->password;
  65. $reason=$req->reason_info?trim($req->reason_info):'';
  66. $redBag_type=$req->type?intval($req->type):'';
  67. $input_rule=$req->input_rule?trim($req->input_rule):'';
  68. $path=$req->path?trim($req->path):'';
  69. if(empty($reason)){
  70. return responseToJson(-5023500012);//理由不能为空
  71. }
  72. if(empty($redBag_type)){
  73. return responseToJson(-5023500112);//类型不能为空
  74. }
  75. if(empty($password)){
  76. return responseToJson(-5040022122);//密码不能为空
  77. }
  78. if(empty($path)){
  79. return responseToJson(-5040022222);//文件路径不能为空
  80. }
  81. //验证密码
  82. $admin_info = \App\Models\System_user::where('id', session('adminInfo.admin_id'))->first();
  83. if (!$admin_info) {
  84. return responseToJson(-7010100202);
  85. }
  86. $admin_info = $admin_info->toArray();
  87. if (!VerPassword($password, $admin_info['encryption_2'], $admin_info['password_2'])) {
  88. return responseToJson(-7010001622);
  89. }
  90. //初始化错误记录数组
  91. $error_account_array=array();
  92. $total_count=0;//总条数
  93. //计算失败金额
  94. $fail_money=0;
  95. //读取文件内容
  96. $data=$this->readFile($path);
  97. if($data<0) {
  98. return responseToJson($data);
  99. }
  100. //检查重复数据
  101. $data=$this->checkDate($data);
  102. $total_count=count($data);
  103. foreach ($data as $k=>$v){
  104. if(empty($v['money'])){
  105. $error_account_array[]=$v['account_name'].','.$v['money'].','.$v['reason'];
  106. $fail_money+=$v['money'];
  107. unset($data[$k]);
  108. }
  109. }
  110. //重排序列
  111. $data=array_values($data);
  112. //获取含用户id的数据
  113. $data_account=$this->getAccountDate($data);
  114. //获取初始用户名数组
  115. // $org_name_array=array_column($data,'account_name');
  116. //获取有效用户名数组
  117. $real_name_array=array_column($data_account,'account_name');
  118. //记录无限用户及金额
  119. foreach ($data as $v){
  120. if(!in_array(trim($v['account_name']),$real_name_array)){
  121. $error_account_array[]=$v['account_name'].','.$v['money'].','.$v['reason'];
  122. $fail_money+=$v['money'];
  123. }
  124. }
  125. if(empty($data_account)){
  126. $report_data=array(
  127. 'total'=>$total_count,//总条数
  128. 'fail'=>count($error_account_array),//失败条数
  129. 'error'=>$error_account_array,
  130. 'success'=>0,
  131. );
  132. return responseToJson($report_data);//文件上用户均不存在
  133. }
  134. $out_order_id=OrderID();
  135. //更新用户余额
  136. $res=$this->updateCash($data_account);
  137. if($res<0){
  138. return responseToJson($res);
  139. }
  140. //添加资金记录
  141. $inset_return=$this->MoneyLog($data_account,$out_order_id,$reason,$redBag_type);
  142. if(is_array($inset_return['error'])&&count($inset_return['error'])>0){
  143. foreach ($inset_return['error'] as $v){
  144. $error_account_array[]=$v;
  145. }
  146. }
  147. $fail_money+=$inset_return['fail_money'];
  148. $log = array(
  149. session('adminInfo.admin_name'),
  150. $reason,
  151. $redBag_type,
  152. $input_rule,
  153. );
  154. OperationLog(session('adminInfo.admin_id'), 'Redbag', $log);
  155. $res_data=array(
  156. 'total'=>$total_count,//总条数
  157. 'fail'=>count($error_account_array),//失败条数
  158. 'error'=>$error_account_array,
  159. );
  160. $res_data['success']=$res_data['total']-$res_data['fail'];
  161. //计算总金额
  162. $sum_money=0;
  163. foreach ($data as $k=>$v){
  164. $sum_money+=$v['money'];
  165. }
  166. //红包记录数据
  167. $data_log=array(
  168. 'red_type'=>$redBag_type,
  169. 'suescc_user'=>$res_data['success'],
  170. 'fail_user'=>$res_data['fail'],
  171. 'input_reason'=>$reason,
  172. 'input_rule'=>$input_rule,
  173. 'sum_user'=>$total_count,
  174. 'sum_money'=>$sum_money,
  175. 'success_money'=>round($sum_money-$fail_money,2),
  176. );
  177. $data_log['input_order']=$out_order_id;
  178. $out_order=$this->baoLog($data_log);
  179. if($out_order<0){
  180. return responseToJson($out_order);
  181. }
  182. return responseToJson($res_data);
  183. }
  184. }
  185. //文件上传
  186. function upload(Req $req){
  187. // print_r($_FILES);
  188. //判断请求中是否包含name=file的上传文件
  189. if(!$req->hasFile('file')){
  190. return responseToJson(-5050010022);
  191. // exit('上传文件为空!');
  192. }
  193. $file = $req->file('file');
  194. //判断文件上传过程中是否出错
  195. if(!$file->isValid()){
  196. return responseToJson(-5050010122);
  197. // exit('文件上传出错!');
  198. }
  199. // $path = $file->path();//文件路径
  200. $store_result = $file->store('cvs');
  201. $path=storage_path('app/'.$store_result);
  202. // $path=str_replace('\\','/',$path);
  203. $data=array(
  204. 'path'=>$path,
  205. 'name'=>$file->getClientOriginalName()
  206. );
  207. return responseToJson($data);
  208. }
  209. //读取cvs文件
  210. function readFile($path){
  211. $data=array();
  212. $file = fopen($path,"r");
  213. while(! feof($file))
  214. {
  215. $str=fgetcsv($file);
  216. // print_r($str);
  217. $str[2]=!empty($str[2])?iconv('GBK', 'UTF-8',$str[2]):' ';
  218. // $data[]=fgetcsv($file);
  219. $data[]=$str;
  220. }
  221. fclose($file);
  222. // print_r($data);
  223. array_shift ($data);//弹出第一姓名,金额,理由数据
  224. $data=array_filter($data);
  225. // print_r($data);die;
  226. if(count($data)==0){
  227. return -5050010222;
  228. }
  229. $return_array=array();
  230. foreach ($data as $k=>$v){
  231. if(isset($v[0])){
  232. $return_array[$k]['account_name']=trim($v[0]);
  233. $return_array[$k]['money']=trim($v[1]);
  234. $return_array[$k]['reason']=$v[2];
  235. }
  236. // if(isset($v[2])){
  237. // $return_array[$k]['reason']=mb_convert_encoding($v[2],'utf-8',mb_detect_encoding($v[2]));
  238. // }else{
  239. // $return_array[$k]['reason']='';
  240. // }
  241. }
  242. unset($data);
  243. return $return_array;
  244. }
  245. //数据检测排除重复用户和金额的钱
  246. private function checkDate($data){
  247. $len=count($data);
  248. for($i = 0; $i < $len; $i ++) {
  249. for($j = $i + 1; $j < $len; $j ++) {
  250. if ($data[$i]['account_name'] == $data[$j]['account_name']&&$data[$i]['money'] == $data[$j]['money']) {
  251. // $repeat_arr [] = $data [$i];
  252. unset($data[$i]);
  253. break;
  254. }
  255. }
  256. }
  257. return $data;
  258. }
  259. //添加红包记录
  260. private function baoLog($data){
  261. $red_db=new \App\Models\MoneyRed;
  262. return $red_db->insertData($data);
  263. }
  264. //更新用户余额
  265. private function updateCash($data){
  266. if(!is_array($data)){
  267. return -5050010322;
  268. }
  269. $account_db=new \App\Models\Account_detailed;
  270. foreach ($data as $k=>$v){
  271. if($v['money']>0){
  272. $res=$account_db->addMoney($v['account_identity'],$v['money']);
  273. if($res<0){
  274. break;
  275. }
  276. }else if($v['money']<0){
  277. $res=$account_db->costMoney($v['account_identity'],$v['money']);
  278. if($res<0){
  279. break;
  280. }
  281. }
  282. }
  283. return $res;
  284. }
  285. //用户数据组装成含有用户余额及用户id的数组
  286. private function getAccountDate($data){
  287. $account_db=new \App\Models\Account_list;
  288. //获取用户名的以为数组
  289. $account_name_array=array_column($data,'account_name');
  290. //获取用户余额,及id
  291. $account_data=$account_db->getAccountCash($account_name_array);
  292. foreach ($account_data as $k=>$v){
  293. foreach ($data as $ka=>$va){
  294. if($v['account_name']==$va['account_name']){
  295. $account_data[$k]['money']=$va['money'];
  296. // if(isset($va['reason'])){
  297. $account_data[$k]['reason']=$va['reason'];
  298. // }
  299. }
  300. }
  301. }
  302. return $account_data;
  303. }
  304. //添加用户资金记录
  305. private function MoneyLog($data,$out_order_id,$reson,$red_type){
  306. $money_db=new \App\Models\Money_details;
  307. $insert_data=array();
  308. $money_time=date('Y-m-d H:i:s');
  309. $order_f=date('Ym');
  310. $system=session('adminInfo.admin_name');
  311. $order_f_red=trans('redBag.redoder');
  312. $error_account_array=array();
  313. $fail_money=0;
  314. foreach ($data as $k=>$v){
  315. $end_order=$v['money']*100;
  316. $money_cash=$v['cash']+$v['money'];
  317. $insert_data['trade_id']=$order_f.'_'.$v['account_name'].'_'.$end_order.$order_f_red[$red_type];
  318. $insert_data['info_identity']=UUID();
  319. $insert_data['money_time']=$money_time;
  320. $insert_data['account_name']=$v['account_name'];
  321. $insert_data['account_identity']=$v['account_identity'];
  322. $insert_data['money']=abs($v['money']);
  323. if($v['money']>0){
  324. $insert_data['money_type']=1;
  325. }else{
  326. $insert_data['money_type']=2;
  327. }
  328. $insert_data['money_cash']=$money_cash;
  329. $insert_data['trade_type']=12;
  330. $insert_data['reason']=trans('redBag.redType')[$red_type].':'.$reson.$v['reason'];
  331. $insert_data['trade_desc']=$system.'发放红包给:'.$v["account_name"].'金额'.$v['money'];
  332. $insert_data['sysetem_user']=session('adminInfo.admin_name');
  333. $insert_data['out_order_id']=$out_order_id;
  334. //插入数据
  335. $res=$money_db->insertData($insert_data);
  336. if($res<0){
  337. $error_account_array[]=$v["account_name"].','.$v['money'].','.$v['reason'];
  338. $fail_money+=$v['money'];
  339. }
  340. }
  341. // return $money_db->insertAllData($insert_data);
  342. return array('error'=>$error_account_array,'fail_money'=>$fail_money);
  343. }
  344. //添加红包记录
  345. function addLog(Req $req){
  346. $reason=$req->reason?trim($req->reason):'';
  347. $redBag_type=$req->red_type?intval($req->red_type):'';
  348. $input_order=$req->input_order?trim($req->input_order):'';
  349. $input_rule=$req->input_rule?trim($req->input_rule):'';
  350. if(empty($reason)){
  351. return responseToJson(-5023500012);//理由不能为空
  352. }
  353. if(empty($redBag_type)){
  354. return responseToJson(-5023500112);//类型不能为空
  355. }
  356. $data=array(
  357. 'red_type'=>$redBag_type,
  358. 'input_order'=>$input_order,
  359. 'input_reason'=>$reason,
  360. 'input_rule'=>$input_rule,
  361. );
  362. }
  363. //导出红包文件返利
  364. function giveDemo(){
  365. $head = '用户名, 金额, 理由';
  366. $str = iconv('utf-8', 'gbk', $head) . chr(10) . chr(9);
  367. $data=array(
  368. 'test1',
  369. 100,
  370. '红包'
  371. );
  372. $str .= iconv('utf-8', 'gbk', trim(implode(',', $data))) . chr(10) . chr(9);
  373. header('Content-Type: application/vnd.ms-excel');
  374. header('Content-Disposition: attachment;filename="demo.csv"');
  375. header('Cache-Control: max-age=0');
  376. echo $str;
  377. }
  378. }