financeRule($data,false); if(!$status) return [$status,$msg]; 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){ 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') ->orderBy('b.id','desc'); 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']); $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 = FinanceDetail::where('del_time',0) ->select('id','finance_id','amount','crt_time','confirm_time','status','order_number') ->orderBy('id','desc'); if(! empty($data['order_number'])) $model->where('order_number', 'LIKE', '%'.$data['order_number'].'%'); if(! empty($data['amount'])) $model->where('amount', $data['amount']); if(isset($data['status'])) $model->where('status',$data['status']); if(! empty($data['confirm_time'][0]) && ! empty($data['confirm_time'][1])) $model->whereBetween('confirm_time',[$data['confirm_time'][0],$data['confirm_time'][1]]); 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; date_default_timezone_set('PRC'); foreach ($data['data'] as $key => $value){ $data['data'][$key]['status_name'] = FinanceDetail::$status[$value['status']] ?? ''; $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']) : ''; } 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, '']; } protected 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, '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); //五秒后过期 // 发送支付 TODO list($status, $msg, $orderNumber) = $this->paymentRequest($data); if($status == 201) return [false, $msg]; return [true, $orderNumber]; } //发送支付请求返回 TODO public function paymentRequest($data){ return [200,'成功','测试订单号222222']; } }