DepositService.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | LARAVEL8.0 框架 [ LARAVEL ][ RXThinkCMF ]
  4. // +----------------------------------------------------------------------
  5. // | 版权所有 2017~2021 LARAVEL研发中心
  6. // +----------------------------------------------------------------------
  7. // | 官方网站: http://www.laravel.cn
  8. // +----------------------------------------------------------------------
  9. // | Author: laravel开发员 <laravel.qq.com>
  10. // +----------------------------------------------------------------------
  11. namespace App\Services\Common;
  12. use App\Models\AccountLogModel;
  13. use App\Models\DepositModel;
  14. use App\Models\MemberModel;
  15. use App\Models\MessageModel;
  16. use App\Services\BaseService;
  17. use App\Services\ConfigService;
  18. use App\Services\PaymentService;
  19. use App\Services\RedisService;
  20. use App\Services\SmsService;
  21. use Illuminate\Support\Facades\DB;
  22. /**
  23. * 保证金订单管理-服务类
  24. * @author laravel开发员
  25. * @since 2020/11/11
  26. * @package App\Services\Api
  27. */
  28. class DepositService extends BaseService
  29. {
  30. // 静态对象
  31. protected static $instance = null;
  32. /**
  33. * 构造函数
  34. * @author laravel开发员
  35. * @since 2020/11/11
  36. */
  37. public function __construct()
  38. {
  39. $this->model = new DepositModel();
  40. }
  41. /**
  42. * 静态入口
  43. */
  44. public static function make()
  45. {
  46. if (!self::$instance) {
  47. self::$instance = new static();
  48. }
  49. return self::$instance;
  50. }
  51. /**
  52. * 列表数据
  53. * @param $params
  54. * @param int $pageSize
  55. * @return array
  56. */
  57. public function getDataList($params, $pageSize = 15)
  58. {
  59. $query = $this->getQuery($params);
  60. $refundStatus = isset($params['refund_status']) ? $params['refund_status'] : -1;
  61. $model = clone $query;
  62. $counts = [
  63. 'count'=> $model->count('a.id'),
  64. 'total'=> $model->sum($refundStatus>=0?'a.refund_money':'a.money'),
  65. ];
  66. if($refundStatus==0){
  67. $query->orderBy('a.refund_status', 'asc')
  68. ->orderBy('a.create_time', 'desc')
  69. ->orderBy('a.id', 'desc');
  70. }else if($refundStatus>0){
  71. $query->orderBy('a.create_time', 'desc')
  72. ->orderBy('a.id', 'desc');
  73. }else{
  74. $query->orderBy('a.create_time', 'desc')
  75. ->orderBy('a.id', 'desc');
  76. }
  77. $field = ["a.*"];
  78. $list = $query->select($field)
  79. ->paginate($pageSize > 0 ? $pageSize : 9999999);
  80. $list = $list ? $list->toArray() : [];
  81. if ($list) {
  82. foreach ($list['data'] as &$item){
  83. $item['create_time'] = $item['create_time']? datetime($item['create_time'],'Y-m-d H:i:s') : '';
  84. $item['time_text'] = $item['create_time']? datetime($item['create_time'],'Y年m月d日') : '';
  85. }
  86. $datas = [
  87. 'pageSize' => $pageSize,
  88. 'total' => isset($list['total']) ? $list['total'] : 0,
  89. 'list' => isset($list['data']) ? $list['data'] : [],
  90. 'counts' => $counts,
  91. ];
  92. // 消息已读
  93. MessageModel::where(['is_read'=>2,'type'=>$refundStatus>=0?4:3,'mark'=>1])->update(['is_read'=>1,'update_time'=>time()]);
  94. }
  95. return $datas;
  96. }
  97. /**
  98. * 查询条件
  99. * @param $params
  100. * @return mixed
  101. */
  102. public function getQuery($params)
  103. {
  104. $where = ['a.status' => 0, 'a.mark' => 1];
  105. $status = isset($params['status']) ? $params['status'] : 0;
  106. if ($status > 0) {
  107. $where['a.status'] = $status;
  108. } else {
  109. unset($where['a.status']);
  110. }
  111. $model = $this->model->with(['user'])->from('deposit_orders as a')
  112. ->leftJoin('member as b','b.id','=','a.user_id')
  113. ->where($where)
  114. ->where(function ($query) use ($params) {
  115. $refundNo= isset($params['refund_no']) ? trim($params['refund_no']) : '';
  116. $orderNo = isset($params['order_no']) ? trim($params['order_no']) : '';
  117. $refundStatus = isset($params['refund_status']) ? $params['refund_status'] : -1;
  118. if($refundNo){
  119. $query->where(function($query) use($refundNo){
  120. $query->where('a.refund_no', 'like', "%{$refundNo}%")
  121. ->orWhere('a.refund_transaction_id', 'like', "%{$refundNo}%");
  122. });
  123. }else if($orderNo){
  124. $query->where(function($query) use($orderNo){
  125. $query->where('a.order_no', 'like', "%{$orderNo}%")
  126. ->orWhere('a.transaction_id', 'like', "%{$orderNo}%");
  127. });
  128. }
  129. if($refundStatus==0){
  130. $query->where(['a.status'=>3])->where('a.refund_status','>',1);
  131. }else if($refundStatus>0){
  132. $query->where(['a.status'=>3])->where('a.refund_status', $refundStatus);
  133. }
  134. // 用户
  135. $account = isset($params['account']) ? trim($params['account']) : '';
  136. if ($account) {
  137. $query->where(function ($query) use ($account) {
  138. $query->where('b.mobile', 'like', "%{$account}%")
  139. ->orWhere('b.nickname', 'like', "%{$account}%");
  140. });
  141. }
  142. $userId = isset($params['user_id']) ? intval($params['user_id']) : 0;
  143. if ($userId>0) {
  144. $query->where('a.user_id', $userId);
  145. }
  146. });
  147. return $model;
  148. }
  149. /**
  150. * 详情信息
  151. * @param $id
  152. * @return mixed
  153. */
  154. public function getInfo($id)
  155. {
  156. $cacheKey = "caches:deposit:info_{$id}";
  157. $info = RedisService::get($cacheKey);
  158. if($info){
  159. return $info;
  160. }
  161. $info = $this->model->with(['user'])->where(['order_id' => $id])->first();
  162. $info = $info? $info->toArray() :[];
  163. if($info){
  164. RedisService::set($cacheKey, $info, rand(5,10));
  165. }
  166. return $info;
  167. }
  168. /**
  169. * 审核
  170. * @param $adminId
  171. * @param $params
  172. * @return array|false
  173. */
  174. public function confirm($adminId, $params)
  175. {
  176. $id = isset($params['id'])? intval($params['id']) : 0;
  177. $status = isset($params['refund_status'])? intval($params['refund_status']) : 0;
  178. $confirmRemark = isset($params['refund_confirm_remark'])? trim($params['refund_confirm_remark']) : '';
  179. $info = $this->model->with(['user'])->where(['id'=> $id,'mark'=>1])->first();
  180. $userInfo = isset($info['user'])? $info['user'] : [];
  181. $orderStatus = isset($info['refund_status'])? $info['refund_status'] : 0;
  182. $orderUserId = isset($info['user_id'])? $info['user_id'] : 0;
  183. $refundMoney = isset($info['refund_money'])? $info['refund_money'] : 0;
  184. if(empty($info) || empty($userInfo) || $orderUserId<=0 || $refundMoney<=0){
  185. $this->error = '退保申请信息不存在或参数错误';
  186. return false;
  187. }
  188. if($orderStatus != 1){
  189. $this->error = '退保订单状态不可操作';
  190. return false;
  191. }
  192. if(!in_array($status,[2,3])){
  193. $this->error = '退保审核状态错误';
  194. return false;
  195. }
  196. if($status == 3 && empty($confirmRemark)){
  197. $this->error = '请填写审核驳回备注';
  198. return false;
  199. }
  200. DB::beginTransaction();
  201. $updateOrder = ['refund_status'=>$status,'confirm_admin_id'=>$adminId,'update_time'=>time(),'refund_confirm_remark'=>$confirmRemark];
  202. // 如果驳回
  203. if($status == 3){
  204. $updateData = ['deposit'=> $refundMoney,'update_time'=>time()];
  205. if(!MemberModel::where(['id'=> $orderUserId])->update($updateData)){
  206. DB::rollBack();
  207. $this->error = '退保审核处理失败';
  208. return false;
  209. }
  210. }else if($status == 2){
  211. // 线上直接退款逻辑
  212. $payType = isset($info['pay_type'])? $info['pay_type'] : 0;
  213. $order = [
  214. 'money' => $refundMoney,
  215. 'pay_type' => $payType,
  216. 'order_no' => isset($info['order_no'])? $info['order_no'] : '',
  217. 'out_trade_no' => isset($info['refund_no'])? $info['refund_no'] : '',
  218. 'transaction_id' => isset($info['transaction_id'])? $info['transaction_id'] : '',
  219. 'remark'=> '退保'
  220. ];
  221. if(!PaymentService::make()->refund($order)){
  222. DB::rollBack();
  223. $this->error = '退保退款处理失败';
  224. return false;
  225. }
  226. // 支付宝调用成功直接完成
  227. if($payType == 20){
  228. $updateOrder['refund_status'] = 4;
  229. $updateOrder['remark'] = '已退保';
  230. }
  231. }
  232. if(!$this->model->where(['id'=> $id])->update($updateOrder)){
  233. DB::rollBack();
  234. $this->error = '退款审核处理失败';
  235. return false;
  236. }
  237. DB::commit();
  238. $this->error = '退款审核成功';
  239. return ['id'=>$id,'money'=>$refundMoney,'refund_status'=>$status];
  240. }
  241. /**
  242. * 打款
  243. * @param $adminId
  244. * @param $params
  245. * @return array|false
  246. */
  247. public function payment($adminId, $params)
  248. {
  249. $id = isset($params['id'])? intval($params['id']) : 0;
  250. $info = $this->model->with(['user'])->where(['id'=> $id,'mark'=>1])->first();
  251. $userInfo = isset($info['user'])? $info['user'] : [];
  252. $orderStatus = isset($info['refund_status'])? $info['refund_status'] : 0;
  253. $orderUserId = isset($info['user_id'])? $info['user_id'] : 0;
  254. $refundMoney = isset($info['refund_money'])? $info['refund_money'] : 0;
  255. if(empty($info) || empty($userInfo) || $orderUserId<=0 || $refundMoney<=0){
  256. $this->error = '退保申请信息不存在或参数错误';
  257. return false;
  258. }
  259. if($orderStatus == 4){
  260. $this->error = '退保订单已打款';
  261. return false;
  262. }
  263. if($orderStatus != 2){
  264. $this->error = '退保订单状态不可操作';
  265. return false;
  266. }
  267. // 线上直接退款逻辑
  268. $payType = isset($info['pay_type'])? $info['pay_type'] : 0;
  269. $order = [
  270. 'money' => $refundMoney,
  271. 'pay_type' => $payType,
  272. 'order_no' => isset($info['order_no'])? $info['order_no'] : '',
  273. 'out_trade_no' => isset($info['refund_no'])? $info['refund_no'] : '',
  274. 'transaction_id' => isset($info['transaction_id'])? $info['transaction_id'] : '',
  275. 'remark'=> '退保'
  276. ];
  277. DB::beginTransaction();
  278. if(!PaymentService::make()->refund($order)){
  279. DB::rollBack();
  280. $this->error = '退保退款处理请求失败';
  281. return false;
  282. }
  283. if($payType == 20 && !$this->model->where(['id'=> $id])->update(['refund_status'=>4,'remark'=>'已退保','update_time'=>time()])){
  284. DB::rollBack();
  285. $this->error = '退保退款处理失败';
  286. return false;
  287. }
  288. DB::commit();
  289. $this->error = '退保打款请求成功';
  290. return ['id'=>$id,'money'=>$refundMoney,'status'=>$orderStatus];
  291. }
  292. /**
  293. * 统计
  294. * @param int $type
  295. * @return array|mixed
  296. */
  297. public function getTotal($type=0)
  298. {
  299. $cacheKey = "caches:deposit:total_{$type}";
  300. $data = RedisService::get($cacheKey);
  301. if($data){
  302. return $data;
  303. }
  304. $data = $this->model->where(['mark'=>1])
  305. ->where(function($query) use($type){
  306. if($type== 1){
  307. $query->where(['status'=>3])->whereIn('refund_status',[2,4]);
  308. }else {
  309. $query->where(['status'=>3]);
  310. }
  311. })->sum('money');
  312. if($data){
  313. RedisService::set($cacheKey, $data, rand(300, 600));
  314. }
  315. return $data;
  316. }
  317. }