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

<?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
}