1, 'user_id' => 1, 'user_name' => 1, 'crt_time' => 123456, 'data' => [ [ 'key' => '金额', 'old_data' => '100', 'new_data' => '200', ] ] ] ]; return [true,$data]; } // public function public function setOperationList($data,$user,$type=1,$menu_id=18){ //获取oa参数 $key = 'menu_id'; // 要匹配的键 $value = $menu_id; // 要匹配的值 $result = array_filter( config('oa'), function($array) use ($key, $value) { return $array[$key] == $value; }); if(!isset($result['children'])) return [true,'']; $key_data = []; foreach ($result['children'] as $v){ $key_data[$v['key']] = $v['title']; } $menu_id = $data['menu_id']; $param = isset($data['order_number']) ? ['order_number'=>$data['order_number']]:['id'=>$data['id']]; $request = request(); foreach ($param as $k=>$v){ $request->$k = $v; } $all = $request->all(); if(!isset($all['order_number'])) $request->merge($param); $detail = $this->oaGetData($menu_id,$request); try { DB::beginTransaction(); $log = new OperationLog(); $log->user_id = $user['id']; $log->menu_id = $menu_id; $log->type = $type; $log->save(); $id = $log->id; $bind_data_detail = []; //以下是对比逻辑 foreach ($data as $k=>$v){ if(isset($detail[$k])&&isset($key_data[$k])&&$detail[$k] != $v){ $bind_data_detail[] = [ 'log_id' => $id, 'parent_id' => 0, 'old_data' => $v, 'new_data' => $detail[$k], 'title' => $key_data[$k], ]; } } OperationLogDetail::insert($bind_data_detail); DB::commit(); return [true,'']; }catch (\Exception $e){ DB::rollBack(); return [false,$e->getLine().$e->getMessage()]; } } public function oaGetData($menu_id,$request) { $api = SysMenu::where('id',$menu_id)->value('api'); $path = $this->getMenu(); $control = '\\'.$path[$api]["controller"]; $act = $path[$api]["act"]; $new = new $control(); $detail = $new->$act($request); // if(!isset($detail['data']['data'][0])) $detail['data']['data'][0] = $detail['data']; return $detail['data']['data'][0]; } public function getMenu(){ $app = App(); $routes = $app->routes->getRoutes(); $path = []; foreach ($routes as $k => $value) { if(!isset($value->action['controller'])) continue; $act = explode('@',$value->action['controller']); if(!isset($act[1])) continue; $path[$value->uri]['act'] = $act[1]; $path[$value->uri]['controller'] = $act[0]; } return $path; } public function insertOperationLog($insert){ try { DB::beginTransaction(); $menu_id = $insert['menu_id']; $user_id = $insert['user_id']; $ip = $insert['ip']; $parent_id = $insert['parent_id']; $type = $insert['type']??2; $logModel = new OperationLog(); $logModel->user_id = $user_id; $logModel->ip = $ip; $logModel->menu_id = $menu_id; $logModel->type = $type; $logModel->parent_id = $parent_id; $logModel->save(); $LogParent_id = $logModel->id; if($type == 2){ $sub_datas = []; $relationship_datas = []; $table_Data = $insert['table_data']; $sub_table_data = $insert['sub_table_data'] ?? []; $relationship_table_data = $insert['relationship_table_data'] ?? []; $table_Data = $this->findTableDatas($table_Data); if(!empty($sub_table_data)) { foreach ($sub_table_data as $v){ $sub_data = $this->findTableData($v); $sub_datas = array_merge($sub_datas,$sub_data); } } if(!empty($relationship_table_data)) { foreach ($sub_table_data as $v){ $relationship_data = $this->findTableData($relationship_table_data); $relationship_datas = array_merge($relationship_datas,$relationship_data); } } $insert_detail_data = array_merge($table_Data,$sub_datas,$relationship_datas); $table_Data = $this->dealOperationLogDetail($insert_detail_data,$LogParent_id); OperationLogDetail::insert($table_Data); } DB::commit(); return [true,'']; }catch (\Exception $e){ DB::rollBack(); return [false,$e->getLine().':'.$e->getMessage()]; } } public function dealOperationLogDetail($data,$log_id){ foreach ($data as $k=>$v){ $data[$k]['log_id'] = $log_id; } return $data; } public function findTableData($data){ $table = $data['table']; $param = $data['param']; $parent_id = $data['parent_id']; $parent_key = $data['parent_key']??'id'; $model = DB::table($table)->where($parent_key,$parent_id); $select_list = []; $new_data_list = []; foreach ($param as $v){ $select_list[] = $v['key']; $new_data_list[$v['key']] = [ 'new_data' => $v['value'], 'parent_id' => $parent_id, ]; } $detail = $model->select($select_list)->first()->toArray(); foreach ($new_data_list as $k=>$v){ $new_data_list[$k]['old_data'] = $detail[$k]; } sort($new_data_list); return $new_data_list; } public function findTableDatas($data){ $table = $data['table']; $parent_id = $data['parent_id']; $parent_key = $data['parent_key']??'id'; $key = $data['key']; $value = $data['value']; $model = DB::table($table)->where($parent_key,$parent_id); $old_data = implode(',',$model->where($parent_key,$parent_id)->pluck($key)->toArray()); return [['old_data'=>$old_data,'new_data'=>implode(',',$value),'parent_id'=>$parent_id]]; } public function setParam() { //3种格式类型,1:单张表数据更新,只需要数组种有key,value;2.子表更新,也是单条数据更新只需要数组种有key,value;3.子表更新,但是是删除数据更新,则传old data 和 new data $insert = [ 'menu_id'=>1, 'user_id'=>'1', 'ip'=>'1', 'parent_id'=>'1', 'table_data'=>[ 'table'=>'table', 'parent_id'=>'1', 'param'=>[ [ 'key' => 'd', 'value' => 'd', ] ] ], 'sub_table_data'=>[ [ 'table'=>'table', 'parent_id'=>'1', 'parent_key'=>'1', 'param'=>[ [ 'key' => 'd', 'value' => 'd', ] ], ] ], 'relationship_table_data'=>[ [ 'table'=>'table', 'parent_id'=>'table', 'parent_key'=>'table', 'key'=>'title', 'value'=>[1,2,3,4,5], ] ] ]; } }