financeRule($data,false); if(!$status) return [$status,$msg]; FinanceDetail::where('id',$data['id'])->update([ 'remark' => $data['remark'] ?? '' ]); return [true,'保存成功!']; } public function financeAdd($data,$user){ list($status,$msg) = $this->financeRule($data); if(!$status) return [$status,$msg]; return [true,'保存成功!']; } public function financeRule($data,$is_add = true){ if(! $is_add){ if(empty($data['id'])) return [false,'ID不能为空!']; } return [true,'']; } public function financeDel($data){ if($this->isEmpty($data,'id')) return [false,'ID必须!']; Finance::where('id',$data['id'])->update([ 'del_time'=>time() ]); FinanceDetail::where('id',$data['finance_id'])->update([ 'del_time'=>time() ]); return [true,'删除成功']; } public function financeList($data){ $model = Finance::from('finance as a') ->leftJoin('finance_detail as b','b.finance_id','a.id') ->where('a.del_time',0) ->where('b.del_time',0) ->select('a.finance_account_name','a.account','a.ifsc','a.crt_time','b.id','b.amount','b.status','b.confirm_time','b.remark','b.utr') ->orderBy('a.id','asc'); if(! empty($data['finance_account_name'])) $model->where('a.finance_account_name', 'LIKE', '%'.$data['finance_account_name'].'%'); if(! empty($data['account'])) $model->where('a.account', 'LIKE', '%'.$data['account'].'%'); if(! empty($data['ifsc'])) $model->where('a.ifsc', 'LIKE', '%'.$data['ifsc'].'%'); if(! empty($data['amount'])) $model->where('b.amount', $data['amount']); if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) $model->whereBetween('a.crt_time',[$data['crt_time'][0],$data['crt_time'][1]]); if(! empty($data['confirm_time'][0]) && ! empty($data['confirm_time'][1])) $model->whereBetween('b.confirm_time',[$data['confirm_time'][0],$data['confirm_time'][1]]); if(isset($data['status'])) $model->where('b.status',$data['status']); if(! empty($data['utr'])) $model->where('b.utr',$data['utr']); $list = $this->limit($model,'',$data); $list = $this->fillFinanceList($list); return [200,$list]; } public function fillFinanceList($data){ if(empty($data['data'])) return $data; date_default_timezone_set('PRC'); foreach ($data['data'] as $key => $value){ $data['data'][$key]['confirm_time'] = $value['confirm_time'] ? date("Y-m-d",$value['confirm_time']) : ''; $data['data'][$key]['crt_time'] = $value['crt_time'] ? date("Y-m-d",$value['crt_time']) : ''; $data['data'][$key]['status_name'] = FinanceDetail::$status[$value['status']] ?? ''; } return $data; } // public function financeList($data){ // $model = Finance::where('del_time',0) // ->select('id','finance_account_name','account','ifsc','amount','crt_id','crt_time','confirm_time') // ->orderBy('id','desc'); // // if(! empty($data['finance_account_name'])) $model->where('finance_account_name', 'LIKE', '%'.$data['finance_account_name'].'%'); // if(! empty($data['account'])) $model->where('account', 'LIKE', '%'.$data['account'].'%'); // if(! empty($data['ifsc'])) $model->where('ifsc', 'LIKE', '%'.$data['ifsc'].'%'); // if(! empty($data['amount'])) $model->where('amount', $data['amount']); // if(! empty($data['crt_id'])) $model->where('crt_id', $data['crt_id']); // if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) $model->whereBetween('crt_time',[$data['crt_time'][0],$data['crt_time'][1]]); // if(! empty($data['confirm_time'][0]) && ! empty($data['confirm_time'][1])) $model->whereBetween('confirm_time',[$data['confirm_time'][0],$data['confirm_time'][1]]); // // $list = $this->limit($model,'',$data); // $list = $this->fillFinanceList($list); // // return [200,$list]; // } // // public function fillFinanceList($data){ // if(empty($data['data'])) return $data; // // $financeDetailMap = FinanceDetail::where('del_time',0) // ->whereIn('finance_id',array_column($data['data'],'id')) // ->select('finance_id','status') // ->groupBy('finance_id') // ->pluck('status','finance_id')->toArray(); // $map = Employee::whereIn('id',array_unique(array_column($data['data'],'crt_id'))) // ->pluck('emp_name','id') // ->toArray(); // // date_default_timezone_set('PRC'); // foreach ($data['data'] as $key => $value){ // $data['data'][$key]['crt_name'] = $map[$value['crt_id']] ?? ''; // $data['data'][$key]['crt_time'] = $value['crt_time'] ? date("Y-m-d",$value['crt_time']) : ''; // $data['data'][$key]['status'] = FinanceDetail::$status[$financeDetailMap[$value['id']]] ?? ''; // } // // return $data; // } public function financeDetailList($data){ $model = Finance::where('del_time',0) ->select('id','finance_account_name','account','ifsc','amount','crt_time') ->orderBy('id','asc'); if(! empty($data['amount'])) $model->where('amount', $data['amount']); if(isset($data['status'])) { if($data['status'] == 0 || $data['status'] == 2){ if($data['status'] == 0){ $k1 = 0;$k2 = 2; }else{ $k1 = 2; $k2 = 0; } $return = FinanceDetail::whereHas('finance_detail', function ($query) use ($k1) { $query->where('status', $k1); })->whereDoesntHave('finance_detail', function ($query) use ($k2) { $query->where('status', '!=', $k2); })->select('finance_id')->distinct()->get()->toArray(); }elseif ($data['status'] == 1){ $k1 = 0;$k2 = 2; $return = FinanceDetail::whereIn('status', [$k1, $k2]) ->select('finance_id') ->groupBy('finance_id') ->havingRaw('COUNT(DISTINCT status) = 2') ->get() ->toArray(); } $model->whereIn('id',array_column($return,'finance_id')); } if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) $model->whereBetween('crt_time',[$data['crt_time'][0],$data['crt_time'][1]]); $list = $this->limit($model,'',$data); $list = $this->fillFinanceDetailList($list); return [200,$list]; } public function fillFinanceDetailList($data){ if(empty($data['data'])) return $data; $detail = FinanceDetail::where('del_time',0) ->whereIn('finance_id',array_column($data['data'],'id')) ->select('finance_id','status','payment_status','amount') ->get()->toArray(); $status_map = $money_map = []; if(! empty($detail)) { foreach ($detail as $value){ if(isset($status_map[$value['finance_id']])){ if(! in_array($value['status'], $status_map[$value['finance_id']])) $status_map[$value['finance_id']][] = $value['status']; }else{ $status_map[$value['finance_id']][] = $value['status']; } if(isset($money_map[$value['finance_id']])){ $money_map[$value['finance_id']][$value['payment_status']] += $value['amount']; }else{ $money_map[$value['finance_id']][$value['payment_status']] = $value['amount']; } } } date_default_timezone_set('PRC'); foreach ($data['data'] as $key => $value){ //状态 $status = $status_map[$value['id']] ?? []; $status_count = count($status); $status_val = isset($status[0]) ? $status[0] : 0; if($status_count > 1){ $data['data'][$key]['status_name'] = FinanceDetail::$status[1]; }else{ $data['data'][$key]['status_name'] = FinanceDetail::$status[$status_val]; } //金额 $m = $money_map[$value['id']] ?? []; $success_money = $m[FinanceDetail::Payment_four] ?? 0; $pending_money = $m[FinanceDetail::Payment_three] ?? 0; $not_success_money = ($m[FinanceDetail::Payment_one] ?? 0) + ($m[FinanceDetail::Payment_two] ?? 0); $data['data'][$key]['success_money'] = $success_money; $data['data'][$key]['pending_money'] = $pending_money; $data['data'][$key]['not_success_money'] = $not_success_money; $data['data'][$key]['crt_time'] = $value['crt_time'] ? date("Y-m-d",$value['crt_time']) : ''; } return $data; } public function financeImport($data,$user){ $import = new Import(); //设置导入人id $import->setCrt($user['id']); //导入 \Maatwebsite\Excel\Facades\Excel::import($import,$data['file']); if($import->getMsg()) return [false, $import->getMsg()]; return [true, '']; } public function getData($id){ if(empty($id)) return []; $model = FinanceDetail::from('finance_detail as a') ->leftJoin('finance as b','b.id','a.finance_id') ->where('a.del_time',0) ->where('a.id',$id) ->select('a.id','a.amount','a.status','b.finance_account_name','b.account','b.ifsc') ->first(); if(! $model) return []; return $model->toArray(); } public function financeConfirm($data){ if($this->isEmpty($data,'id')) return [false,'请选择数据!']; //获取数据 $detail = $this->getData($data['id']); if(empty($detail)) return [false,'确认数据不存在!']; //是否已确认 if($detail['status'] == 2) return [false,'已确认,请勿重复操作!']; //验证验证码 if($this->isEmpty($data,'code')) return [false,'验证码不能为空!']; list($status,$msg) = (new CodeService())->ConfirmCodeRule($data); if(! $status) return [false,$msg]; //限制请求 发送支付申请 list($status,$return) = $this->limitingRequest(0, $detail); if(! $status) return [false, $return]; //订单号 $order_number = $return; FinanceDetail::where('id',$data['id'])->update([ 'order_number' => $order_number, 'status' => 2, 'payment_status' => 1, 'confirm_time' => time() ]); return [true,'']; } //加原子锁 public function limitingRequest($a = 0, $data){ $key = "limitingRequest" . $data['id']; $value = Redis::get($key); if ($a == 5) return [false,'意外错误!'];//避免潜在的无限递归问题 if ($value == 1) { sleep(1); $a++; if ($a > 3) return [false, '重复操作同一数据!']; return $this->limitingRequest($a, $data); } Redis::setnx($key, 1); Redis::expire($key, 5); //五秒后过期 // 发送支付 $send = [ "customName" => $data['finance_account_name'], "bankAccount" => $data['account'], "ifsc" => $data['ifsc'], "amount" => $data['amount'], ]; $send['sign'] = EncryptService::sign($send); list($status, $msg) = $this->paymentRequest($send); if(! $status) return [false, $msg]; return [true, $msg]; } //发送支付请求返回 public function paymentRequest($send){ $url = "https://api2.indiacashpayment.in/chargeMoney9321"; $result = $this->curlURL($url,$send); if($result['status'] == 201){ return [false, $result['msg']]; } return [true, $result['data']['order_no']]; } public function curlURL($url,$data){ $data = json_encode($data); $header[] = "Content-Type:application/json"; $ch=curl_init($url); curl_setopt($ch,CURLOPT_POST,1); curl_setopt($ch,CURLOPT_POSTFIELDS,$data); curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); curl_setopt($ch,CURLOPT_HTTPHEADER,$header); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); $response=curl_exec($ch); file_put_contents('charge.txt',$response.PHP_EOL,8); $response=json_decode($response,true); if(curl_errno($ch) ){ sc(curl_error($ch)); } return $response; } }