1, // 'user_id' => 1, // 'user_name' => 1, // 'crt_time' => 123456, // 'data' => [ // [ // 'key' => '金额', // 'old_data' => '100', // 'new_data' => '200', // ] // // ] // ] // ]; $array = []; if (strpos($data['order_number'], '|') !== false) { $array = explode('|',$data['order_number']); $order = $array[0].'|'.$array[1]; $list = OperationLog::where('order_number', 'LIKE', '%' . $order .'%')->select('*')->get()->toArray(); }else{ $list = OperationLog::where('order_number', $data['order_number'])->select('*')->get()->toArray(); } $employee_key_list = Employee::pluck('emp_name', 'id')->toArray(); $log_ids = []; $log_list = []; foreach ($list as $v) { $log_ids[] = $v['id']; $log_list[] = [ 'type' => $v['type'], 'id' => $v['id'], 'user_id' => $v['user_id'], 'user_name' => $employee_key_list[$v['user_id']], 'crt_time' => date('Y-m-d H:i:s', $v['crt_time']), 'order_number' => $v['order_number'], ]; } $detail_list = OperationLogDetail::wherein('log_id', $log_ids)->select('*')->get()->toArray(); $detail_data_list = []; foreach ($detail_list as $v) { if(is_numeric($v['old_data'])&&strlen($v['old_data']) === 10) $v['old_data'] = date('Y-m-d H:i:s',$v['old_data']); if(is_numeric($v['new_data'])&&strlen($v['new_data']) === 10) $v['new_data'] = date('Y-m-d H:i:s',$v['new_data']); $detail_data_list[$v['log_id']][] = [ 'key' => $v['title'], 'old_data' => $v['old_data'], 'new_data' => $v['new_data'], ]; } foreach ($log_list as &$v) { $tmp = $detail_data_list[$v['id']] ?? []; $v['data'] = $tmp; } //按钮类功能的操作日志 $log_list2 = OrderOperation::where('del_time',0) ->where('order_number',$data['order_number']) ->select('order_number','msg','user_id','crt_time') ->get()->toArray(); foreach ($log_list2 as $key => $value){ $log_list2[$key]['type'] = 4; //操作类 $log_list2[$key]['crt_time'] = $value['crt_time'] ? date('Y-m-d H:i:s', $value['crt_time']) : ""; $log_list2[$key]['user_name'] = $employee_key_list[$value['user_id']] ?? ""; if(! empty($array[2])) $log_list2[$key]['order_number'] = $array[2]; } $list_final = array_merge($log_list, $log_list2); //跟进日志 $log_list3 = []; if(! empty($array[0]) && ! empty($array[1])){ if($array[0] == Customer::$order_number){ $log_list3 = FollowUpRecord::where('del_time',0) ->where('type', FollowUpRecord::type_one) ->where('data_id',$array[1]) ->select('id','data_title as order_number','basic_type_id','visit_time','content','crt_id as user_id','result','crt_time') ->get()->toArray(); } }else{ $log_list3 = FollowUpRecord::where('del_time',0) ->where('data_title',$data['order_number']) ->select('id','data_title as order_number','basic_type_id','visit_time','content','crt_id as user_id','result','crt_time') ->get()->toArray(); } $basic_type_map = BasicType::whereIn('id',array_unique(array_column($log_list3,'basic_type_id')))->pluck('title','id')->toArray(); $log_list3_detail = FollowUpRecordFile::where('del_time',0) ->whereIn('follow_up_record_id',array_column($log_list3,'id')) ->select('follow_up_record_id','file','name') ->get()->toArray(); $log_list3_detail_map = []; $fileUploadService = new FileUploadService(); foreach ($log_list3_detail as $value){ $value['file'] = $fileUploadService->getFileShow($value['file']); $log_list3_detail_map[$value['follow_up_record_id']][] = $value; } foreach ($log_list3 as $key => $value){ $log_list3[$key]['type'] = 5;//状态类 $log_list3[$key]['basic_type_title'] = $basic_type_map[$value['basic_type_id']] ?? ""; $log_list3[$key]['crt_time'] = $value['crt_time'] ? date('Y-m-d H:i:s', $value['crt_time']) : ""; $log_list3[$key]['visit_time'] = $value['visit_time'] ? date('Y-m-d', $value['visit_time']) : ""; $log_list3[$key]['user_name'] = $employee_key_list[$value['user_id']] ?? ""; $tmp = $log_list3_detail_map[$value['id']] ?? []; $log_list3[$key]['data'] = $tmp; } $list_final = array_merge($list_final, $log_list3); if(isset($data['sales_order'])){ $id = SalesOrder::where('order_number', $data['order_number'])->value('id'); $detail = SalesOrderInfo::where('del_time',0) ->where('sales_order_id', $id) ->whereIn('type',[SalesOrderInfo::type_seven,SalesOrderInfo::type_eight]) ->get()->toArray(); $emp = Employee::whereIn('id', array_unique(array_column($detail,'data_id')))->pluck('emp_name','id')->toArray(); $file = []; foreach ($detail as $value){ if($value['type'] == SalesOrderInfo::type_seven && $value['file']){ $file_tmp = $fileUploadService->getFileShow($value['file']); $file[$value['crt_time']]['file'][] = $file_tmp; } if($value['type'] == SalesOrderInfo::type_eight){ $file[$value['crt_time']]['user_name'] = $emp[$value['data_id']] ?? ""; $file[$value['crt_time']]['mark'] = $value['file']; } } $log_list4 = []; foreach ($file as $key => $value){ $log_list4[] = [ 'type' => 6, 'title' => '公司完结', 'user_name' => $value['user_name'], 'mark' => $value['mark'] ?? "", 'crt_time' => $key ? date('Y-m-d H:i:s', $key) : "", 'data' => $value['file'] ?? [], ]; } if(! empty($log_list4)) $list_final = array_merge($list_final, $log_list4); } //时间排序 usort($list_final, function($a, $b) { return strtotime($b['crt_time']) - strtotime($a['crt_time']); }); return [true, $list_final]; } public function setOperationList($data, $user, $type = 1, $menu_id = 18) { file_put_contents('log.txt', date('Y-m-d H:i:s') . json_encode($data) . PHP_EOL, 8); //获取oa参数 $key = 'menu_id'; // 要匹配的键 // $value = $menu_id; // 要匹配的值 $value = $data['menu_id']; $result = array_filter(config('oa'), function ($array) use ($key, $value) { return $array[$key] == $value; }); $result = array_values($result); if (!isset($result[0]['children'])) return [true, '']; $result = $result[0]; try { DB::beginTransaction(); if ($type == 1) { $log = new OperationLog(); $log->user_id = $user['id']; $log->menu_id = $menu_id; $log->crt_time = time(); $log->order_number = $data['order_number']; $log->type = $type; $log->save(); DB::commit(); 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; // } // $newUser = new Employee(); // $newUser = $newUser->fill($user); // $request->userData = $newUser; // $all = $request->all(); // if (!isset($all['order_number'])) $request->merge($param); //创建request副本对象 没有参数让检索出来的数据为空数组 $result_one['id'] = $data['id'] ?? -1; $result_one['order_number'] = $data['order_number'] ?? "-1"; $currentRequest = request(); $request = $currentRequest->duplicate( $result_one, null, [], $currentRequest->cookies->all(), $currentRequest->files->all(), [] ); file_put_contents('log.txt', date('Y-m-d H:i:s') . "入参:".json_encode($request->all()) . PHP_EOL, 8); $detail = $this->oaGetData($menu_id, $request); $log = new OperationLog(); $log->user_id = $user['id']; $log->menu_id = $menu_id; $log->order_number = $data['order_number']; $log->crt_time = time(); $log->type = $type; $log->save(); $id = $log->id; $bind_data_detail = []; //以下是对比逻辑 foreach ($data as $k => $v) { if (isset($detail[$k]) && isset($key_data[$k]) ) { $pattern = '/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/'; $pattern1 = '/^\d{4}-\d{2}-\d{2}$/'; if (preg_match($pattern, $detail[$k])) { continue; $detail[$k] = strtotime($detail[$k]); }elseif (preg_match($pattern1, $detail[$k])) { continue; $detail[$k] = strtotime($detail[$k]); } if (preg_match($pattern, $v)) { continue; $v = strtotime($v); } if($v != $detail[$k]){ $bind_data_detail[] = [ 'log_id' => $id, 'parent_id' => 0, 'new_data' => $v, 'old_data' => $detail[$k], 'title' => $key_data[$k], ]; } } } OperationLogDetail::insert($bind_data_detail); DB::commit(); return [true, '']; } catch (\Exception $e) { DB::rollBack(); file_put_contents('log.txt', date('Y-m-d H:i:s') . $e->getCode() . $e->getLine() . $e->getMessage() . PHP_EOL, 8); 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], ] ] ]; } }