diff --git a/.env.example b/.env.example index c8e8030..edd6ba2 100644 --- a/.env.example +++ b/.env.example @@ -57,3 +57,5 @@ VITE_PUSHER_HOST="${PUSHER_HOST}" VITE_PUSHER_PORT="${PUSHER_PORT}" VITE_PUSHER_SCHEME="${PUSHER_SCHEME}" VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" + +BAIDU_JS_SECRET= diff --git a/app/Admin/Controllers/Hr/SignController.php b/app/Admin/Controllers/Hr/SignController.php index 4907ac9..f9ad33c 100644 --- a/app/Admin/Controllers/Hr/SignController.php +++ b/app/Admin/Controllers/Hr/SignController.php @@ -53,6 +53,7 @@ class SignController extends AdminController amisMake()->TableColumn()->name('remarks')->label(__('employee_sign.remarks')), $this->rowActions([ $this->rowShowButton()->visible(Admin::user()->can('admin.hr.signs.view')), + $this->rowDeleteButton()->visible(Admin::user()->can('admin.hr.signs.delete')), ]), ]); @@ -80,13 +81,13 @@ class SignController extends AdminController amisMake()->BaseApi()->method('get')->url(admin_url('api/employee-sign-logs'))->data(['date' => '${date}', 'employee_id' => '${employee_id}']) ) ->body( - amisMake()->Table()->columns([ + amisMake()->Table()->columnsTogglable(false)->columns([ amisMake()->TableColumn()->name('sign_time')->label(__('employee_sign_log.sign_time'))->set('type', 'mapping')->map(SignTime::options()), amisMake()->TableColumn()->name('time')->label(__('employee_sign_log.time')), amisMake()->TableColumn()->name('sign_type')->label(__('employee_sign_log.sign_type'))->set('type', 'mapping')->map(SignType::options()), amisMake()->TableColumn()->name('remarks')->label(__('employee_sign_log.remarks')), amisMake()->TableColumn()->name('position.address')->label(__('employee_sign_log.position')), - amisMake()->TableColumn()->name('is_repair')->label(__('employee_sign_log.is_repair'))->set('type', 'status'), + amisMake()->TableColumn()->name('is_repair')->label(__('employee_sign_log.is_repair'))->set('type', 'mapping')->map(['否', '是']), ]) ); diff --git a/app/Admin/Controllers/Store/StoreController.php b/app/Admin/Controllers/Store/StoreController.php index 8ee4b87..ae7b45a 100644 --- a/app/Admin/Controllers/Store/StoreController.php +++ b/app/Admin/Controllers/Store/StoreController.php @@ -103,7 +103,7 @@ class StoreController extends AdminController ->valueField('key') ->required(), amisMake()->InputCityControl()->name('region')->label(__('store.region'))->allowDistrict(false)->extractValue(false)->required(), - amisMake()->LocationControl()->name('location')->label(__('store.location'))->ak('xDTLJ15QG6zt3f6VQcaNBfN8q3MsWBsE')->autoSelectCurrentLoc(), + amisMake()->LocationControl()->name('location')->label(__('store.location'))->ak(config('baidu.js_secret'))->autoSelectCurrentLoc(), ]); } diff --git a/app/Admin/Services/EmployeeService.php b/app/Admin/Services/EmployeeService.php index 06260f7..8db4852 100644 --- a/app/Admin/Services/EmployeeService.php +++ b/app/Admin/Services/EmployeeService.php @@ -42,8 +42,10 @@ class EmployeeService extends BaseService $model = $this->modelName::create($data); - if (isset($data['jobs']) && is_string($data['jobs'])) { - $this->resloveJob($model, explode(',', $data['jobs'])); + // 职位修改 + if (isset($data['jobs'])) { + $jobs = is_array($data['jobs']) ? $data['jobs'] : explode(',', $data['jobs']); + $model->jobs()->sync($jobs); } return true; @@ -66,8 +68,10 @@ class EmployeeService extends BaseService return $this->setError($adminUserService->getError()); } - if (isset($data['jobs']) && is_string($data['jobs'])) { - $this->resloveJob($model, explode(',', $data['jobs'])); + // 职位修改 + if (isset($data['jobs'])) { + $jobs = is_array($data['jobs']) ? $data['jobs'] : explode(',', $data['jobs']); + $model->jobs()->sync($jobs); } return $model->update($data); @@ -98,41 +102,27 @@ class EmployeeService extends BaseService return true; } - /** - * 处理职位关联 - * - * @param Employee $model - * @param array $jobs(字典表 key 组成的数组) - */ - public function resloveJob($model, $jobs) - { - $model->jobs()->sync($jobs); - } - public function preDelete(array $ids): void { - if (in_array(1, $ids)) { - admin_abort('超级管理员不能删除'); - } // 无打卡记录 if (EmployeeSignLog::whereIn('employee_id', $ids)->exists()) { admin_abort('请先删除员工打卡记录'); } // 无请假申请 if (HolidayApply::whereIn('employee_id', $ids)->exists()) { - admin_abort('请先删除员工打卡记录'); + admin_abort('请先删除员工请假申请'); } // 无出差申请 if (OfficalBusiness::whereIn('employee_id', $ids)->exists()) { - admin_abort('请先删除员工打卡记录'); + admin_abort('请先删除员工出差申请'); } // 加班申请 if (OvertimeApply::whereIn('employee_id', $ids)->exists()) { - admin_abort('请先删除员工打卡记录'); + admin_abort('请先删除员工加班申请'); } // 店员关联 - if (DB::table('store_employees')->whereIn('employee_id', $ids)->exists()) { + if (Employee::whereIn('id', $ids)->where('store_id', '>', 0)->exists()) { admin_abort('员工已关联门店, 请先从门店中删除'); } @@ -149,7 +139,7 @@ class EmployeeService extends BaseService { $createRules = [ 'name' => ['required'], - 'phone' => ['required'], + 'phone' => ['required', 'phone'], 'username' => ['required'], 'password' => ['required'], ]; diff --git a/app/Admin/Services/EmployeeSignService.php b/app/Admin/Services/EmployeeSignService.php index 3088aab..b2e9922 100644 --- a/app/Admin/Services/EmployeeSignService.php +++ b/app/Admin/Services/EmployeeSignService.php @@ -3,13 +3,8 @@ namespace App\Admin\Services; use App\Admin\Filters\EmployeeSignFilter; -use App\Enums\SignStatus; -use App\Enums\SignTime; -use App\Enums\SignType; -use App\Models\Employee; -use App\Models\EmployeeRest; -use App\Models\EmployeeSign; -use App\Models\EmployeeSignLog; +use App\Enums\{SignStatus, SignTime, SignType}; +use App\Models\{Employee, EmployeeRest, EmployeeSign, EmployeeSignLog, EmployeeSignRepair}; use Carbon\Carbon; class EmployeeSignService extends BaseService @@ -20,6 +15,14 @@ class EmployeeSignService extends BaseService protected string $modelFilterName = EmployeeSignFilter::class; + public function preDelete(array $ids): void + { + // 删除打卡日志 + EmployeeSignLog::whereIn('employee_id', $ids)->delete(); + // 删除补卡申请 + EmployeeSignRepair::whereIn('employee_id', $ids)->delete(); + } + /** * 整理昨天的打卡流水, 生成对应的打卡记录 */ diff --git a/app/Admin/routes.php b/app/Admin/routes.php index 68e313b..067c329 100644 --- a/app/Admin/routes.php +++ b/app/Admin/routes.php @@ -88,7 +88,7 @@ Route::group([ // 休息管理 $router->resource('rests', RestController::class)->only(['index', 'create', 'store', 'destroy']); // 打卡情况 - $router->resource('signs', SignController::class)->only(['index', 'show']); + $router->resource('signs', SignController::class)->only(['index', 'show', 'destroy']); // 补卡申请 $router->resource('repairs', SignRepairController::class); // 请假申请 diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 8e2feae..8a4e6b2 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -5,6 +5,7 @@ namespace App\Providers; use Illuminate\Database\Eloquent\Relations\Relation; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\ServiceProvider; +use Illuminate\Support\Facades\Validator; class AppServiceProvider extends ServiceProvider { @@ -24,6 +25,10 @@ class AppServiceProvider extends ServiceProvider JsonResource::withoutWrapping(); $this->definePolymorphicTypes(); + + Validator::extend('phone', function ($attribute, $value, $parameters, $validator) { + return preg_match('/^1[\d]{10}$/', $value); + }); } /** diff --git a/config/baidu.php b/config/baidu.php new file mode 100644 index 0000000..a05a07a --- /dev/null +++ b/config/baidu.php @@ -0,0 +1,5 @@ + env('BAIDU_JS_SECRET', 'xDTLJ15QG6zt3f6VQcaNBfN8q3MsWBsE'), +]; diff --git a/database/seeders/AdminPermissionSeeder.php b/database/seeders/AdminPermissionSeeder.php index 1f8251f..b55555c 100644 --- a/database/seeders/AdminPermissionSeeder.php +++ b/database/seeders/AdminPermissionSeeder.php @@ -135,7 +135,7 @@ class AdminPermissionSeeder extends Seeder 'name' => '考勤打卡', 'icon' => 'material-symbols:calendar-clock-outline', 'uri' => '/hr/signs', - 'resource' => ['list', 'view'], + 'resource' => ['list', 'view'. 'delete'], 'order' => 4, ], 'repairs' => [ diff --git a/database/seeders/AdminSeeder.php b/database/seeders/AdminSeeder.php index eeb9a3d..de75f3e 100644 --- a/database/seeders/AdminSeeder.php +++ b/database/seeders/AdminSeeder.php @@ -22,15 +22,15 @@ class AdminSeeder extends Seeder 'password' => bcrypt('admin'), 'name' => 'Administrator', ]); - DB::table('employees')->truncate(); - DB::table('employees')->insert([ - 'name' => 'admin', - 'phone' => '12345678900', - 'admin_user_id' => 1, - 'join_at' => $now, - 'created_at' => $now, - 'updated_at' => $now, - ]); + // DB::table('employees')->truncate(); + // DB::table('employees')->insert([ + // 'name' => 'admin', + // 'phone' => '12345678900', + // 'admin_user_id' => 1, + // 'join_at' => $now, + // 'created_at' => $now, + // 'updated_at' => $now, + // ]); // 创建初始角色 DB::table('admin_roles')->truncate(); diff --git a/database/seeders/WorkflowSeeder.php b/database/seeders/WorkflowSeeder.php index 527259e..c5c3eec 100644 --- a/database/seeders/WorkflowSeeder.php +++ b/database/seeders/WorkflowSeeder.php @@ -13,9 +13,10 @@ class WorkflowSeeder extends Seeder public function run(): void { $now = now(); - $config = json_encode([ - ['sort' => 1, 'type' => 'user', 'user' => 1, 'title' => '员工', 'value' => 1, 'subTitle' => 'Admin'], - ]); + // $config = json_encode([ + // ['sort' => 1, 'type' => 'user', 'user' => 1, 'title' => '员工', 'value' => 1, 'subTitle' => 'Admin'], + // ]); + $config = null; Workflow::truncate(); Workflow::insert([ ['key' => 'employee_sign_repair', 'name' => '补卡申请', 'config' => $config, 'created_at' => now(), 'updated_at' => now()],