You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
255 lines
9.2 KiB
255 lines
9.2 KiB
<?php |
|
|
|
namespace App\Http\Controllers\System\Permissions; |
|
|
|
use App\Class\LogWriter; |
|
use App\Exports\ArrayExport; |
|
use App\Http\Controllers\Controller; |
|
use App\Models\ExportFiles; |
|
use App\Models\MultisysEquipment; |
|
use App\Models\OverSpeedRed; |
|
use App\Models\OverSpeedRedEquipment; |
|
use App\Models\Permission; |
|
use App\Models\Role; |
|
use App\Models\User; |
|
use App\Models\IntervalEquipment; |
|
use Illuminate\Http\Request; |
|
use Illuminate\Support\Facades\DB; |
|
use Illuminate\Support\Facades\Hash; |
|
use Illuminate\Support\Facades\Log; |
|
use PhpParser\Node\Expr\AssignOp\Mul; |
|
use Illuminate\Support\Str; |
|
use Maatwebsite\Excel\Facades\Excel; |
|
|
|
class UserController extends Controller |
|
{ |
|
function __construct() |
|
{ |
|
$this->middleware('permission:user-list|user-create|user-edit|user-delete', ['only' => ['UserManager', 'show', 'index']]); |
|
$this->middleware('permission:user-create', ['only' => ['storeUser']]); |
|
$this->middleware('permission:user-edit', ['only' => ['updateUser']]); |
|
$this->middleware('permission:user-delete', ['only' => ['deleteUser']]); |
|
} |
|
#region 使用者管理 |
|
public function UserManager() |
|
{ |
|
$permissions = Permission::all(); |
|
$roles = Role::where('id', '!=', 1)->get(); |
|
$equipments = [ |
|
// "violationparking" => ViolationParkingEquipment::all(), |
|
"multisys" => MultisysEquipment::all(), |
|
"overspeedred" => OverSpeedRedEquipment::all(), |
|
"interval"=> IntervalEquipment::all(), |
|
]; |
|
$equipments_title = [ |
|
"multisys" => "路口多功能系統", |
|
"overspeedred" => "闖紅燈超速", |
|
"interval" => "區間測速", |
|
]; |
|
$allow = explode(",", auth()->user()->device); |
|
// dd($roles->toArray()); |
|
return view('system.setting.UserManager') |
|
->with('permissions', $permissions) |
|
->with('roles', $roles) |
|
->with('equipments_title', $equipments_title) |
|
->with('equipments', $equipments) |
|
->with('allow', $allow); |
|
} |
|
|
|
public function index(Request $request) |
|
{ |
|
#region DataTable 搜尋屬性 |
|
$draw = $request->get('draw'); |
|
$start = $request->get("start"); |
|
$rowperpage = $request->get("length"); // Rows display per page |
|
|
|
$columnIndex_arr = $request->get('order'); |
|
$columnName_arr = $request->get('columns'); |
|
$order_arr = $request->get('order'); |
|
$search_arr = $request->get('search'); |
|
|
|
$columnIndex = $columnIndex_arr[0]['column']; // Column index |
|
$columnName = $columnName_arr[$columnIndex]['data']; // Column name |
|
$columnSortOrder = $order_arr[0]['dir']; // asc or desc |
|
$searchValue = $search_arr['value']; // Search value |
|
#endregion |
|
|
|
// Role with permissions |
|
$records = User::query(); |
|
$records = $records->with('roles'); |
|
$records = $records->whereNotIn('id', [1]); |
|
$totalRecords = $records->count(); |
|
|
|
if (isset($columnName)) |
|
$records->orderBy($columnName, $columnSortOrder); |
|
if (isset($searchValue)) { |
|
$records->where(function ($query) use ($searchValue) { |
|
// $query->where('outlet_id', 'like', '%' . $searchValue . '%') |
|
// ->orwhere('name', 'like', '%' . $searchValue . '%') |
|
// ->orwhere('serialnumber', 'like', '%' . $searchValue . '%') |
|
// ->orwhere('creator_id', 'like', '%' . $searchValue . '%'); |
|
}); |
|
} |
|
|
|
$totalRecordswithFilter = $records->count(); |
|
|
|
$data_arr = $records->get(); |
|
|
|
$response = array( |
|
"draw" => intval($draw), |
|
"iTotalRecords" => $totalRecords, |
|
"iTotalDisplayRecords" => $totalRecordswithFilter, |
|
"aaData" => $data_arr |
|
); |
|
return response()->json($response); |
|
} |
|
|
|
// 新增使用者 |
|
public function store(Request $request) |
|
{ |
|
if(isset($request->device)){ |
|
$device = []; |
|
foreach ($request->device as $key => $value) { |
|
// $device[] = explode("-", $value)[1]; |
|
$device[] = $value; |
|
} |
|
$request->merge(['device' => implode(",", $device)]); |
|
}else{ |
|
$request->merge(['device' => ""]); |
|
} |
|
|
|
DB::beginTransaction(); |
|
|
|
try { |
|
$data = $request->all(); |
|
$data['password'] = Hash::make("Aa@123456789"); |
|
$user = User::create($data); |
|
$user->syncRoles($request->role); |
|
$logData = [ |
|
'action' => 'create', |
|
'action_detail' => '新增使用者', |
|
'ip' => request()->ip(), |
|
'remark' => "新增使用者:$user->name", |
|
]; |
|
LogWriter::writeLog($logData, 'api'); |
|
DB::commit(); |
|
return response()->json(['success' => '新增成功']); |
|
} catch (\Exception $e) { |
|
DB::rollback(); |
|
Log::error("新增使用者錯誤訊息: " . $e->getMessage()); |
|
return response()->json(['error' => '新增失敗']); |
|
} |
|
} |
|
|
|
public function show(Request $request, $id) |
|
{ |
|
$user = User::with('roles')->find($id); |
|
$role = Role::where('id', '!=', 1)->get(); |
|
return response()->json(['user' => $user, 'role' => $role]); |
|
} |
|
|
|
public function update(Request $request, $id) |
|
{ |
|
if ($id == 1) { |
|
return response()->json(['error' => '此使用者不可編輯']); |
|
} |
|
if (isset($request->password_reset)){ |
|
$user = User::find($id); |
|
$user->update(['password'=> Hash::make("Aa@123456789")]); |
|
$logData = [ |
|
'action' => 'edit', |
|
'action_detail' => '使用者密碼重設', |
|
'ip' => request()->ip(), |
|
'remark' => "重設使用者密碼: $user->name", |
|
]; |
|
LogWriter::writeLog($logData, 'api'); |
|
return response()->json(['success' => '重設成功']); |
|
} |
|
if(isset($request->device)){ |
|
$device = []; |
|
foreach ($request->device as $key => $value) { |
|
// $device[] = explode("-", $value)[1]; |
|
$device[] = $value; |
|
} |
|
$request->merge(['device' => implode(",", $device)]); |
|
}else{ |
|
$request->merge(['device' => ""]); |
|
} |
|
|
|
DB::beginTransaction(); |
|
|
|
try { |
|
$user = User::find($id); |
|
$user->update($request->all()); |
|
$user->syncRoles($request->role); |
|
$logData = [ |
|
'action' => 'edit', |
|
'action_detail' => '編輯使用者', |
|
'ip' => request()->ip(), |
|
'remark' => "編輯使用者:$user->name", |
|
]; |
|
LogWriter::writeLog($logData, 'api'); |
|
DB::commit(); |
|
return response()->json(['success' => '編輯成功']); |
|
} catch (\Exception $e) { |
|
DB::rollback(); |
|
Log::error("編輯使用者錯誤訊息: " . $e->getMessage()); |
|
return response()->json(['error' => '編輯失敗']); |
|
} |
|
} |
|
|
|
// 刪除使用者 |
|
public function destory(Request $request, $id) |
|
{ |
|
if ($id == 1) { |
|
return response()->json(['error' => '此使用者不可刪除']); |
|
} |
|
|
|
DB::beginTransaction(); |
|
try { |
|
$user = User::find($id); |
|
$user->update(['deleted_at' => now()]); |
|
$logData = [ |
|
'action' => 'delete', |
|
'action_detail' => '刪除使用者', |
|
'ip' => request()->ip(), |
|
'remark' => "刪除使用者:$user->name", |
|
]; |
|
LogWriter::writeLog($logData, 'api'); |
|
DB::commit(); |
|
return response()->json(['success' => '刪除成功']); |
|
} catch (\Exception $e) { |
|
DB::rollback(); |
|
return response()->json(['error' => '刪除失敗']); |
|
} |
|
} |
|
|
|
public function exportUserData() |
|
{ |
|
$data_arr = User::whereNotIn('id',[1])->OrderBy('id', 'asc')->get()->toArray(); |
|
$columns = ['id', 'station', 'unit', 'class', 'name', 'account', 'role_name', 'deleted_at']; |
|
$columnTitle = [ |
|
['編號', '分局', '使用單位', '職稱', '姓名', '帳號', '使用者權限', '備註'] |
|
]; |
|
$data = array_map(function ($row) use ($columns) { |
|
return array_merge(array_flip($columns), array_intersect_key($row, array_flip($columns))); |
|
}, $data_arr); |
|
// 修改data中編號id 從1開始 |
|
foreach ($data as $key => $value) { |
|
$data[$key]['id'] = $key + 1; |
|
} |
|
$fileName = 'userData-' . Str::random(10) . '.xlsx'; |
|
ExportFiles::create([ |
|
'name' => $fileName, |
|
'path' => 'public/exports_user', |
|
'type' => 'xlsx', |
|
'status' => '1', |
|
'remark' => '使用者匯出', |
|
'user_id' => 1, |
|
]); |
|
Excel::store(new ArrayExport($data, $columnTitle), 'public/exports_user/' . $fileName, 'local', \Maatwebsite\Excel\Excel::XLSX); |
|
// 直接跳轉下載 |
|
return response()->json(['success' => '匯出成功', 'file' => 'storage/exports_user/'.$fileName]); |
|
} |
|
#endregion |
|
}
|
|
|