RefundController.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use App\Http\Controllers\Controller;
  4. use App\Models\Account_detailed;
  5. use App\Models\LuckyMoney;
  6. use App\Lib\Biz\Money\AddOrCutMoney;
  7. use Illuminate\Http\Request as Req;
  8. use Illuminate\Support\Facades\App;
  9. use Ramsey\Uuid\Uuid;
  10. use Request;
  11. use DB;
  12. class RefundController extends Controller {
  13. public function index(Req $req) {
  14. $request['type'] = isset($req->type) ? trim($req->type) : '-1';
  15. $request['lm_order_id'] = $req->lm_order_id ? $req->lm_order_id : '';
  16. $request['account'] = $req->account ? $req->account : '';
  17. $request['start_time'] = isset($req->start_time) ? trim($req->start_time) : null;
  18. $request['end_time'] = isset($req->end_time) ? trim($req->end_time) : null;
  19. $dt = \App\Lib\DataTable\DataTable::init();
  20. $dt->setDataSource('/admin/Refund/getList');
  21. $dt->setLang('lucky_money');
  22. $dt->addColsFields('lm_order_id', array('templet' => '#lm_order_id', 'sort' => false, 'width' => 300));
  23. $dt->addColsFields('account', array('sort' => false));
  24. $dt->addColsFields('room_name', array('sort' => false));
  25. $dt->addColsFields('money', array('sort' => false));
  26. $dt->addColsFields('num', array('sort' => false, 'width' => 120));
  27. $dt->addColsFields('take_num', array('sort' => false, 'width' => 120));
  28. $dt->addColsFields('take_money', array('sort' => false));
  29. $dt->addColsFields('created_at', array('templet' => '#created_at', 'sort' => false, 'width' => 160));
  30. // $dt->addColsFields('lm_return_money', array('sort' => false));
  31. // $dt->addColsFields('type_name', array('sort' => false));
  32. // $dt->addColsFields('action_d', array('templet' => '#waterTool', 'sort' => false));
  33. $dt->enableCheckBox();
  34. return view('admin.refund/index', $dt->render($request));
  35. }
  36. function getList(Req $req) {
  37. $list = isset($req->limit) ? trim($req->limit) : 50;
  38. $request['type'] = isset($req->type) ? trim($req->type) : '-1';
  39. $start_time = Request::has('start_time') ? Request::get('start_time') : '';
  40. $end_time = Request::has('end_time') ? Request::get('end_time') : '';
  41. $lm_order_id = $req->lm_order_id ? $req->lm_order_id : '';
  42. $account = $req->account ? $req->account : '';
  43. $where = array();
  44. if ($request['type'] > '-1') {
  45. $where['type'] = $request['type'];
  46. }
  47. if (!empty($lm_order_id)) {
  48. $where[] = array('lm_order_id', $lm_order_id);
  49. }
  50. if (!empty($account)) {
  51. $where[] = array('account', 'like', '%' . $account . '%');
  52. }
  53. if (!empty($start_time)) {
  54. $where[] = array('created_at', '>=', $start_time);
  55. }
  56. if (!empty($end_time)) {
  57. $where[] = array('created_at', '<=', $end_time);
  58. }
  59. $langinfo = trans('lucky_money');
  60. $db = new \App\Models\LuckyMoney;
  61. $data = $db->getRefund($list, $where);
  62. foreach ($data['data'] as $k => $v) {
  63. $room_info = DB::table('chat_rooms')->where('id', $v['room_id'])->first();
  64. if ($room_info) {
  65. $data['data'][$k]['room_name'] = $room_info->room_name;
  66. }
  67. }
  68. return \App\Lib\DataTable\DataTable::init()->toJson($data['data'], $data['total']);
  69. }
  70. function delete(Req $req) {
  71. set_time_limit(0);
  72. $get_data = $req->data;
  73. // $star_time = $req->star_time ? $req->star_time . ' 00:00:00' : '';
  74. // $end_time = $req->end_time ? $req->end_time . ' 23:59:59' : '';
  75. if (!is_array($get_data)) {
  76. return responseToJson(-2001);
  77. }
  78. $err_times = 0;
  79. $s_times = 0;
  80. $skip=0;
  81. foreach ($get_data as $k => $v) {
  82. $money = $v['money'] - $v['take_money'];
  83. if ($money == 0){
  84. $skip++;
  85. continue;
  86. }
  87. $i = $this->handleRefund($v['account_identity'], $v['account'], $v['lm_order_id'], $money, session('adminInfo.admin_id'));
  88. if (!$i) $err_times++;
  89. else
  90. $s_times++;
  91. }
  92. return responseToJson( ['ok' => $s_times, 'nok' => $err_times,'skip'=>$skip]);
  93. }
  94. function delete2(Req $req) {
  95. $get_data = $req->data;
  96. $star_time = $req->star_time ? $req->star_time . ' 00:00:00' : '';
  97. $end_time = $req->end_time ? $req->end_time . ' 23:59:59' : '';
  98. // $room_id=$req->room_id?trim($req->room_id):'';
  99. /**时间条件***/
  100. $timearea = array();
  101. if (!empty($star_time)) {
  102. $star_time = date('Y-m-d H:i:s', strtotime($star_time));
  103. $timearea[] = array('created_at', '>=', $star_time);
  104. }
  105. if (!empty($end_time)) {
  106. $end_time = date('Y-m-d H:i:s', strtotime($end_time));
  107. $timearea[] = array('created_at', '<=', $end_time);
  108. }
  109. /**数据检验***/
  110. if (!is_array($get_data)) {
  111. return responseToJson(-2001);
  112. }
  113. $account_id_array = array();
  114. foreach ($get_data as $v) {
  115. if ($v['take_money'] < 0) {
  116. return responseToJson(-5030021122);
  117. }
  118. //获取用户id数组
  119. $account_id_array[] = $v['account_identity'];
  120. }
  121. $lm_order_id = array();
  122. foreach ($get_data as $v) {
  123. if ($v['take_money'] < 0) {
  124. return responseToJson(-5030021122);
  125. }
  126. //获取用户id数组
  127. $lm_order_id[] = $v['lm_order_id'];
  128. }
  129. //插入回水记录
  130. $data_min_array = array(); //详情数据数组
  131. $refund_money_array = array(); //详情数据数组
  132. //获取用户信息
  133. $account_detailed = new \App\Models\Account_detailed;
  134. //获取用户当前余额
  135. $account_cash_array = $account_detailed->getCashArray($account_id_array);
  136. $lucky_money = new \App\Models\LuckyMoney;
  137. $refund_money = $lucky_money->getRefundArr($lm_order_id);
  138. $refu_money = $lucky_money->getRefundA($lm_order_id);
  139. //组装数据
  140. foreach ($get_data as $k => $v) {
  141. $order_id = OrderID();
  142. $money = $v['money'] - $v['take_money'];
  143. $data_min_array[$k]['account_name'] = $v['account'];
  144. $data_min_array[$k]['account_identity'] = $v['account_identity'];
  145. $data_min_array[$k]['trade_id'] = $order_id;
  146. $data_min_array[$k]['money'] = $money;
  147. $data_min_array[$k]['sysetem_user'] = session('adminInfo.admin_name');
  148. $data_min_array[$k]['info_identity'] = UUID();
  149. $data_min_array[$k]['money_time'] = date('Y-m-d H:i:s');
  150. $data_min_array[$k]['money_type'] = 1;
  151. $data_min_array[$k]['money_cash'] = $account_cash_array[$v['account_identity']] + $money;
  152. $data_min_array[$k]['trade_type'] = 16;
  153. $data_min_array[$k]['trade_desc'] = sprintf(trans('trade.admin_refund_money'), session('adminInfo.admin_name'), $v['account'], $money, $order_id);
  154. $refund_money_array[$k]['lm_return_order_id'] = OrderID();
  155. $refund_money_array[$k]['lm_return_money'] = $money;
  156. }
  157. //插入详情记录
  158. $db_money_de = new \App\Models\Money_details;
  159. $res_detail = $db_money_de->returnData($data_min_array);
  160. if ($res_detail < 0) {
  161. DB::rollback();
  162. return responseToJson($res_detail);
  163. }
  164. //退还红包
  165. foreach ($get_data as $k => $v) {
  166. $money = $v['money'] - $v['take_money'];
  167. $order_id = OrderID();
  168. $re_money = $lucky_money->refundData($v['lm_order_id'], $money);
  169. if ($re_money < 0) {
  170. break;
  171. }
  172. }
  173. //更新用户余额
  174. foreach ($get_data as $k => $v) {
  175. $money = $v['money'] - $v['take_money'];
  176. $res_money = $account_detailed->addMoney($v['account_identity'], $money);
  177. if ($res_money < 0) {
  178. break;
  179. }
  180. }
  181. if ($res_money < 0) {
  182. DB::rollback();
  183. return responseToJson($res_money);
  184. }
  185. //组装
  186. $account_str = array();
  187. $length = count($get_data);
  188. $limit = 0;
  189. if ($length > 20) {
  190. $limit = ceil($length / 20);
  191. }
  192. $i = 0;
  193. foreach ($get_data as $k => $v) {
  194. if ($k < 20 * ($i + 1)) {
  195. if (!isset($account_str[$i])) {
  196. $account_str[$i] = '';
  197. }
  198. $account_str[$i] .= $v['account'] . ',';
  199. } else {
  200. $i++;
  201. }
  202. }
  203. $log = array();
  204. foreach ($account_str as $k => $v) {
  205. $log[] = array(
  206. session('adminInfo.admin_name'),
  207. $v
  208. );
  209. }
  210. foreach ($log as $v) {
  211. $res = OperationLog(session('adminInfo.admin_id'), 'refund_money', $v);
  212. if ($res < 0) {
  213. break;
  214. }
  215. }
  216. if ($res < 0) {
  217. DB::rollback();
  218. return responseToJson($res);
  219. }
  220. DB::commit();
  221. return responseToJson(1);
  222. }
  223. /**
  224. * 退红包函数
  225. * @param $account_id
  226. * @param $account_name
  227. * @param $lm_id
  228. * @param $money
  229. * @param $admin
  230. * @return bool
  231. */
  232. protected function handleRefund($account_id, $account_name, $lm_id, $money, $admin): bool {
  233. $ad = new Account_detailed();
  234. $adObj = $ad->where('account_identity', $account_id)->first();
  235. DB::beginTransaction();
  236. $rlm_id = UUID();
  237. $aoc = new AddOrCutMoney();
  238. $trade_id = OrderID();
  239. $date = date('Y-m-d H:i:s');
  240. $trad_desc = sprintf("管理员%s于{$date}退还了%s发起的红包余额%s元(红包ID:%s),退还单号为%s", $admin, $account_name, $money, $lm_id, $rlm_id);
  241. $reason = '红包退还';
  242. $ret = $aoc->addMoneyDetailRec($adObj, $account_name, $trade_id, $money, 1, 16, $admin, $trad_desc, $reason);
  243. if (is_int($ret)) {
  244. DB::rollBack();
  245. return false;
  246. }
  247. $ret = DB::table('lucky_money')->where('lm_order_id', $lm_id)->update([
  248. 'lm_return_order_id' => $rlm_id,
  249. 'lm_return_money' => $money,
  250. 'updated_at' => date('Y-m-d H:i:s'),
  251. ]);//更新红包退还数据
  252. if ($ret !== 1) {
  253. DB::rollBack();
  254. return false;
  255. }
  256. $detail = $trad_desc;
  257. $ret = $aoc->addMoneyRechargeRec($adObj, $account_name, $trade_id, $money, '红包退还', $admin, $reason, $detail, 0, 1);//添加充值详情
  258. if (is_int($ret)) {
  259. DB::rollBack();
  260. return false;
  261. }
  262. $ret = $aoc->incAccountDetailMoney($adObj, $money);//更新用户余额
  263. if ($ret !== 1) {
  264. DB::rollBack();
  265. return false;
  266. }
  267. $res = OperationLog($admin = session('adminInfo.admin_id'), 'refund_money', [$admin, $account_name, $money]);
  268. if ($res < 0) {
  269. DB::rollBack();
  270. return false;
  271. }
  272. $ret=DB::table('chat_redbag')->where('redid',$lm_id)->delete();
  273. if(!is_int($ret)){
  274. DB::rollBack();
  275. return false;
  276. }
  277. DB::commit();
  278. return true;
  279. }
  280. }