main
panliang 2024-04-07 16:04:03 +08:00
commit a1de082c21
81 changed files with 581 additions and 274 deletions

View File

@ -35,7 +35,7 @@ abstract class AdminController extends Controller
} }
if (! $result) { if (! $result) {
admin_abort($this->service->getError() ?: __('admin.save') . __('admin.failed')); admin_abort($this->service->getError() ?: __('admin.save').__('admin.failed'));
} }
DB::commit(); DB::commit();
@ -44,7 +44,7 @@ abstract class AdminController extends Controller
throw $this->prepareException($th); throw $this->prepareException($th);
} }
return $this->response()->successMessage(__('admin.save') . __('admin.successfully')); return $this->response()->successMessage(__('admin.save').__('admin.successfully'));
} }
/** /**
@ -64,7 +64,7 @@ abstract class AdminController extends Controller
$result = $this->service->update($this->getPrimaryValue($request), $input); $result = $this->service->update($this->getPrimaryValue($request), $input);
if (! $result) { if (! $result) {
admin_abort($this->service->getError() ?: __('admin.save') . __('admin.failed')); admin_abort($this->service->getError() ?: __('admin.save').__('admin.failed'));
} }
DB::commit(); DB::commit();
@ -73,7 +73,7 @@ abstract class AdminController extends Controller
throw $this->prepareException($th); throw $this->prepareException($th);
} }
return $this->response()->successMessage(__('admin.save') . __('admin.successfully')); return $this->response()->successMessage(__('admin.save').__('admin.successfully'));
} }
/** /**
@ -92,7 +92,7 @@ abstract class AdminController extends Controller
throw $this->prepareException($th); throw $this->prepareException($th);
} }
return $this->response()->successMessage(__('admin.delete') . __('admin.successfully')); return $this->response()->successMessage(__('admin.delete').__('admin.successfully'));
} }
public function getQuickEditItemPath(array $fields = ['*']) public function getQuickEditItemPath(array $fields = ['*'])

View File

@ -44,9 +44,9 @@ class AuthController extends AdminAuthController
} else { } else {
if ($user && Hash::check($request->password, $user->password)) { if ($user && Hash::check($request->password, $user->password)) {
$module = Admin::currentModule(true); $module = Admin::currentModule(true);
$prefix = $module ? $module . '.' : ''; $prefix = $module ? $module.'.' : '';
$token = $user->createToken($prefix . 'admin')->plainTextToken; $token = $user->createToken($prefix.'admin')->plainTextToken;
return $this->response()->success(compact('token'), __('admin.login_successful')); return $this->response()->success(compact('token'), __('admin.login_successful'));
} }

View File

@ -11,6 +11,7 @@ use Illuminate\Support\Facades\Validator;
use Slowlyo\OwlAdmin\Admin; use Slowlyo\OwlAdmin\Admin;
use Slowlyo\OwlAdmin\Renderers\AjaxAction; use Slowlyo\OwlAdmin\Renderers\AjaxAction;
use Slowlyo\OwlAdmin\Renderers\DrawerAction; use Slowlyo\OwlAdmin\Renderers\DrawerAction;
use Slowlyo\OwlAdmin\Renderers\Form;
use Slowlyo\OwlAdmin\Renderers\Page; use Slowlyo\OwlAdmin\Renderers\Page;
/** /**
@ -43,7 +44,7 @@ class ComplaintController extends AdminController
]), ]),
])) ]))
->columns([ ->columns([
amis()->TableColumn()->name('id')->label(__('complaint.complaint.id')), amis()->TableColumn()->name('created_at')->label(__('complaint.complaint.created_at')),
amis()->TableColumn() amis()->TableColumn()
->name('_employee') ->name('_employee')
->label(__('complaint.complaint.employee')) ->label(__('complaint.complaint.employee'))
@ -65,7 +66,6 @@ class ComplaintController extends AdminController
->label(__('complaint.complaint.complaint_status')) ->label(__('complaint.complaint.complaint_status'))
->type('mapping') ->type('mapping')
->map(ComplaintStatus::labelMap()), ->map(ComplaintStatus::labelMap()),
amis()->TableColumn()->name('created_at')->label(__('complaint.complaint.created_at')),
$this->rowActions([ $this->rowActions([
$this->rowProcessStartButton() $this->rowProcessStartButton()
->visible(Admin::user()->can('complaint.complaints.start')) ->visible(Admin::user()->can('complaint.complaints.start'))
@ -73,12 +73,28 @@ class ComplaintController extends AdminController
$this->rowProcessCompleteButton() $this->rowProcessCompleteButton()
->visible(Admin::user()->can('complaint.complaints.complete')) ->visible(Admin::user()->can('complaint.complaints.complete'))
->visibleOn('${complaint_status === '.ComplaintStatus::Processing->value.'}'), ->visibleOn('${complaint_status === '.ComplaintStatus::Processing->value.'}'),
$this->rowShowButton()
->visible(Admin::user()->can('admin.complaint.complaints.view')),
]), ]),
]); ]);
return $this->baseList($crud); return $this->baseList($crud);
} }
public function detail(): Form
{
return $this->baseDetail()->title('')->body([
amis()->Property()->items([
['label' => __('complaint.complaint.employee'), 'content' => '${anonymous ? "匿名" : employee.name}'],
['label' => __('complaint.complaint.created_at'), 'content' => '${created_at}'],
['label' => __('complaint.complaint.complaint_status'), 'content' => amis()->Mapping()->name('complaint_status')->map(ComplaintStatus::labelMap())],
['label' => __('complaint.complaint.content'), 'content' => '${content}', 'span' => 3],
['label' => __('complaint.complaint.result'), 'content' => '${result}', 'span' => 3],
['label' => __('complaint.complaint.photos'), 'content' => amis()->Images()->enlargeAble()->source('${photos}')->enlargeWithGallary(), 'span' => 3],
]),
]);
}
/** /**
* 处理开始 * 处理开始
*/ */

View File

@ -59,12 +59,12 @@ class CommissionIncomeController extends AdminController
protected function getCommissionIncomeStatistics(Request $request): array protected function getCommissionIncomeStatistics(Request $request): array
{ {
$aggregate = Ledger::select([ $aggregate = Ledger::select([
DB::raw('SUM(expenditure) as expenditure'), DB::raw('SUM(expenditure) as expenditure'),
DB::raw('SUM(expected_commission) as expected_commission'), DB::raw('SUM(expected_commission) as expected_commission'),
DB::raw('SUM(actual_commission) as actual_commission'), DB::raw('SUM(actual_commission) as actual_commission'),
DB::raw('SUM(expected_income) as expected_income'), DB::raw('SUM(expected_income) as expected_income'),
DB::raw('SUM(actual_income) as actual_income'), DB::raw('SUM(actual_income) as actual_income'),
]) ])
->filter($request->input(), LedgerFilter::class) ->filter($request->input(), LedgerFilter::class)
->first(); ->first();

View File

@ -36,7 +36,7 @@ class LedgerController extends AdminController
['label' => '类型', 'content' => $item->type?->name ?? '-'], ['label' => '类型', 'content' => $item->type?->name ?? '-'],
['label' => '销售', 'content' => $item->sales], ['label' => '销售', 'content' => $item->sales],
['label' => $item->ledger_item_type_id === 'ledger_item_type_other' ? '支出' : '兑奖', 'content' => $item->expenditure], ['label' => $item->ledger_item_type_id === 'ledger_item_type_other' ? '支出' : '兑奖', 'content' => $item->expenditure],
])->collapse()->all() ])->collapse()->all(),
]) ])
); );
} }

View File

@ -66,10 +66,10 @@ class SalesStatisticController extends AdminController
/** @var \Illuminate\Database\Eloquent\Collection */ /** @var \Illuminate\Database\Eloquent\Collection */
$statistics = LedgerItem::select([ $statistics = LedgerItem::select([
'ledger_item_type_id', 'ledger_item_type_id',
DB::raw('SUM(sales) as sales'), DB::raw('SUM(sales) as sales'),
DB::raw('SUM(expenditure) as expenditure'), DB::raw('SUM(expenditure) as expenditure'),
]) ])
->filter($request->input(), LedgerItemFilter::class) ->filter($request->input(), LedgerItemFilter::class)
->whereIn('ledger_item_type_id', $lotteryTypes->pluck('value')) ->whereIn('ledger_item_type_id', $lotteryTypes->pluck('value'))
->groupBy('ledger_item_type_id') ->groupBy('ledger_item_type_id')
@ -78,6 +78,7 @@ class SalesStatisticController extends AdminController
return $lotteryTypes->map(function ($lotteryType) use ($statistics) { return $lotteryTypes->map(function ($lotteryType) use ($statistics) {
$statistic = $statistics->get($lotteryType->value); $statistic = $statistics->get($lotteryType->value);
return [ return [
'name' => $lotteryType->name, 'name' => $lotteryType->name,
'sales' => trim_zeros($statistic->sales ?? '0.00'), 'sales' => trim_zeros($statistic->sales ?? '0.00'),

View File

@ -55,10 +55,10 @@ class StoreStatisticController extends AdminController
/** @var \Illuminate\Database\Eloquent\Collection */ /** @var \Illuminate\Database\Eloquent\Collection */
$statistics = Ledger::select([ $statistics = Ledger::select([
'store_id', 'store_id',
DB::raw('SUM(sales) as sales'), DB::raw('SUM(sales) as sales'),
DB::raw('SUM(expenditure) as expenditure'), DB::raw('SUM(expenditure) as expenditure'),
]) ])
->filter($request->input(), LedgerItemFilter::class) ->filter($request->input(), LedgerItemFilter::class)
->groupBy('store_id') ->groupBy('store_id')
->get() ->get()
@ -70,13 +70,14 @@ class StoreStatisticController extends AdminController
]; ];
return $stores->map(function ($store) use ($statistics) { return $stores->map(function ($store) use ($statistics) {
$statistic = $statistics->get($store->id); $statistic = $statistics->get($store->id);
return [
'title' => $store->title, return [
'sales' => trim_zeros($statistic->sales ?? '0'), 'title' => $store->title,
'expenditure' => trim_zeros($statistic->expenditure ?? '0'), 'sales' => trim_zeros($statistic->sales ?? '0'),
]; 'expenditure' => trim_zeros($statistic->expenditure ?? '0'),
}) ];
})
->sortBy($sortBy) ->sortBy($sortBy)
->values() ->values()
->map(fn ($statistic, $key) => array_merge($statistic, ['ranking' => $key + 1])) ->map(fn ($statistic, $key) => array_merge($statistic, ['ranking' => $key + 1]))

View File

@ -4,12 +4,12 @@ namespace App\Admin\Controllers\Hr;
use App\Admin\Controllers\AdminController; use App\Admin\Controllers\AdminController;
use App\Admin\Services\HolidayApplyService; use App\Admin\Services\HolidayApplyService;
use App\Enums\CheckStatus;
use App\Enums\EmployeeStatus;
use App\Traits\HasCheckActions;
use Slowlyo\OwlAdmin\Admin;
use Slowlyo\OwlAdmin\Renderers\Form; use Slowlyo\OwlAdmin\Renderers\Form;
use Slowlyo\OwlAdmin\Renderers\Page; use Slowlyo\OwlAdmin\Renderers\Page;
use Slowlyo\OwlAdmin\Admin;
use App\Enums\{CheckStatus, EmployeeStatus};
use App\Models\HolidayApply;
use App\Traits\HasCheckActions;
/** /**
* 请假管理 * 请假管理
@ -127,8 +127,8 @@ class HolidayController extends AdminController
'inited' => [ 'inited' => [
'actions' => [ 'actions' => [
['actionType' => 'reload', 'componentId' => $serviceId], ['actionType' => 'reload', 'componentId' => $serviceId],
] ],
] ],
])->body([ ])->body([
$detail, $detail,
amisMake()->Divider(), amisMake()->Divider(),

View File

@ -4,12 +4,12 @@ namespace App\Admin\Controllers\Hr;
use App\Admin\Controllers\AdminController; use App\Admin\Controllers\AdminController;
use App\Admin\Services\OfficalBusinessService; use App\Admin\Services\OfficalBusinessService;
use App\Enums\CheckStatus;
use App\Enums\EmployeeStatus;
use App\Traits\HasCheckActions;
use Slowlyo\OwlAdmin\Admin;
use Slowlyo\OwlAdmin\Renderers\Form; use Slowlyo\OwlAdmin\Renderers\Form;
use Slowlyo\OwlAdmin\Renderers\Page; use Slowlyo\OwlAdmin\Renderers\Page;
use Slowlyo\OwlAdmin\Admin;
use App\Enums\{CheckStatus, EmployeeStatus};
use App\Models\OfficalBusiness;
use App\Traits\HasCheckActions;
/** /**
* 出差报备 * 出差报备
@ -114,8 +114,8 @@ class OfficalBusinessController extends AdminController
'inited' => [ 'inited' => [
'actions' => [ 'actions' => [
['actionType' => 'reload', 'componentId' => $serviceId], ['actionType' => 'reload', 'componentId' => $serviceId],
] ],
] ],
])->body([ ])->body([
$detail, $detail,
amisMake()->Divider(), amisMake()->Divider(),

View File

@ -4,12 +4,12 @@ namespace App\Admin\Controllers\Hr;
use App\Admin\Controllers\AdminController; use App\Admin\Controllers\AdminController;
use App\Admin\Services\OvertimeApplyService; use App\Admin\Services\OvertimeApplyService;
use App\Enums\CheckStatus;
use App\Enums\EmployeeStatus;
use App\Traits\HasCheckActions;
use Slowlyo\OwlAdmin\Admin;
use Slowlyo\OwlAdmin\Renderers\Form; use Slowlyo\OwlAdmin\Renderers\Form;
use Slowlyo\OwlAdmin\Renderers\Page; use Slowlyo\OwlAdmin\Renderers\Page;
use Slowlyo\OwlAdmin\Admin;
use App\Enums\{CheckStatus, EmployeeStatus};
use App\Models\OvertimeApply;
use App\Traits\HasCheckActions;
/** /**
* 加班管理 * 加班管理
@ -116,8 +116,8 @@ class OvertimeController extends AdminController
'inited' => [ 'inited' => [
'actions' => [ 'actions' => [
['actionType' => 'reload', 'componentId' => $serviceId], ['actionType' => 'reload', 'componentId' => $serviceId],
] ],
] ],
])->body([ ])->body([
$detail, $detail,
amisMake()->Divider(), amisMake()->Divider(),

View File

@ -4,12 +4,12 @@ namespace App\Admin\Controllers\Hr;
use App\Admin\Controllers\AdminController; use App\Admin\Controllers\AdminController;
use App\Admin\Services\EmployeePromotionService; use App\Admin\Services\EmployeePromotionService;
use App\Enums\EmployeeStatus;
use App\Enums\PromotionStatus;
use App\Traits\HasCheckActions;
use Slowlyo\OwlAdmin\Admin;
use Slowlyo\OwlAdmin\Renderers\Form; use Slowlyo\OwlAdmin\Renderers\Form;
use Slowlyo\OwlAdmin\Renderers\Page; use Slowlyo\OwlAdmin\Renderers\Page;
use Slowlyo\OwlAdmin\Admin;
use App\Enums\{CheckStatus, PromotionStatus, EmployeeStatus};
use App\Models\EmployeePromotion;
use App\Traits\HasCheckActions;
/** /**
* 升职申请 * 升职申请
@ -125,8 +125,8 @@ class PromotionController extends AdminController
'inited' => [ 'inited' => [
'actions' => [ 'actions' => [
['actionType' => 'reload', 'componentId' => $serviceId], ['actionType' => 'reload', 'componentId' => $serviceId],
] ],
] ],
])->body([ ])->body([
$detail, $detail,
amisMake()->Divider(), amisMake()->Divider(),

View File

@ -5,9 +5,9 @@ namespace App\Admin\Controllers\Hr;
use App\Admin\Controllers\AdminController; use App\Admin\Controllers\AdminController;
use App\Admin\Services\EmployeeRestService; use App\Admin\Services\EmployeeRestService;
use App\Enums\EmployeeStatus; use App\Enums\EmployeeStatus;
use Slowlyo\OwlAdmin\Admin;
use Slowlyo\OwlAdmin\Renderers\Form; use Slowlyo\OwlAdmin\Renderers\Form;
use Slowlyo\OwlAdmin\Renderers\Page; use Slowlyo\OwlAdmin\Renderers\Page;
use Slowlyo\OwlAdmin\Admin;
/** /**
* 休息管理 * 休息管理

View File

@ -4,10 +4,12 @@ namespace App\Admin\Controllers\Hr;
use App\Admin\Controllers\AdminController; use App\Admin\Controllers\AdminController;
use App\Admin\Services\EmployeeSignService; use App\Admin\Services\EmployeeSignService;
use App\Enums\SignStatus;
use App\Enums\SignTime;
use App\Enums\SignType;
use Slowlyo\OwlAdmin\Admin;
use Slowlyo\OwlAdmin\Renderers\Form; use Slowlyo\OwlAdmin\Renderers\Form;
use Slowlyo\OwlAdmin\Renderers\Page; use Slowlyo\OwlAdmin\Renderers\Page;
use Slowlyo\OwlAdmin\Admin;
use App\Enums\{SignType, SignStatus, SignTime};
/** /**
* 考勤打卡 * 考勤打卡
@ -86,12 +88,13 @@ class SignController extends AdminController
amisMake()->TableColumn()->name('position.address')->label(__('employee_sign_log.position')), amisMake()->TableColumn()->name('position.address')->label(__('employee_sign_log.position')),
]) ])
); );
return $this->baseDetail()->title('')->onEvent([ return $this->baseDetail()->title('')->onEvent([
'inited' => [ 'inited' => [
'actions' => [ 'actions' => [
['actionType' => 'reload', 'componentId' => 'employee-sign-log-table'], ['actionType' => 'reload', 'componentId' => 'employee-sign-log-table'],
] ],
] ],
])->body([$detail, amisMake()->Divider()->title(__('employee_sign.log')), $logs]); ])->body([$detail, amisMake()->Divider()->title(__('employee_sign.log')), $logs]);
} }
@ -99,6 +102,7 @@ class SignController extends AdminController
{ {
$type = SignType::options(); $type = SignType::options();
$status = SignStatus::options(); $status = SignStatus::options();
return [ return [
__('employee_sign.date') => data_get($row, 'date'), __('employee_sign.date') => data_get($row, 'date'),
__('employee_sign.store_id') => data_get($row, 'store.title'), __('employee_sign.store_id') => data_get($row, 'store.title'),

View File

@ -12,6 +12,7 @@ class SignLogController extends AdminController
{ {
$with = $request->input('with', []); $with = $request->input('with', []);
$list = EmployeeSignLog::with($with)->filter($request->all())->orderBy('time', 'asc')->get(); $list = EmployeeSignLog::with($with)->filter($request->all())->orderBy('time', 'asc')->get();
return $this->response()->success($list); return $this->response()->success($list);
} }
} }

View File

@ -4,12 +4,13 @@ namespace App\Admin\Controllers\Hr;
use App\Admin\Controllers\AdminController; use App\Admin\Controllers\AdminController;
use App\Admin\Services\EmployeeSignRepairService; use App\Admin\Services\EmployeeSignRepairService;
use App\Enums\CheckStatus;
use App\Enums\EmployeeStatus;
use App\Enums\SignTime;
use App\Traits\HasCheckActions;
use Slowlyo\OwlAdmin\Admin;
use Slowlyo\OwlAdmin\Renderers\Form; use Slowlyo\OwlAdmin\Renderers\Form;
use Slowlyo\OwlAdmin\Renderers\Page; use Slowlyo\OwlAdmin\Renderers\Page;
use Slowlyo\OwlAdmin\Admin;
use App\Enums\{EmployeeStatus, SignTime, CheckStatus};
use App\Models\EmployeeSignRepair;
use App\Traits\HasCheckActions;
/** /**
* 补卡申请 * 补卡申请
@ -45,10 +46,10 @@ class SignRepairController extends AdminController
amisMake()->DateRangeControl()->name('date_range')->label(__('employee_sign_repair.date')) amisMake()->DateRangeControl()->name('date_range')->label(__('employee_sign_repair.date'))
->columnRatio(3) ->columnRatio(3)
->clearable(), ->clearable(),
amisMake()->SelectControl()->name('check_status')->label(__('employee_sign_repair.check_status')) amisMake()->SelectControl()->name('check_status')->label(__('employee_sign_repair.check_status'))
->options(CheckStatus::options()) ->options(CheckStatus::options())
->columnRatio(3) ->columnRatio(3)
->clearable() ->clearable(),
]), ]),
])) ]))
->columns([ ->columns([
@ -72,7 +73,7 @@ class SignRepairController extends AdminController
->visibleOn('${OR(workflow.check_status == '.CheckStatus::None->value.', workflow.check_status == '.CheckStatus::Cancel->value.', workflow.check_status == '.CheckStatus::Fail->value.')}'), ->visibleOn('${OR(workflow.check_status == '.CheckStatus::None->value.', workflow.check_status == '.CheckStatus::Cancel->value.', workflow.check_status == '.CheckStatus::Fail->value.')}'),
$this->applyAction(), $this->applyAction(),
$this->cancelAction(), $this->cancelAction(),
]) ]),
]); ]);
return $this->baseList($crud); return $this->baseList($crud);
@ -121,8 +122,8 @@ class SignRepairController extends AdminController
'inited' => [ 'inited' => [
'actions' => [ 'actions' => [
['actionType' => 'reload', 'componentId' => $serviceId], ['actionType' => 'reload', 'componentId' => $serviceId],
] ],
] ],
])->body([ ])->body([
$detail, $detail,
amisMake()->Divider(), amisMake()->Divider(),

View File

@ -48,6 +48,7 @@ class AdminUserController extends AdminController
amis()->SwitchControl()->saveImmediately()->mode('inline')->disabledOn('${id === 1}') amis()->SwitchControl()->saveImmediately()->mode('inline')->disabledOn('${id === 1}')
); );
} }
return $column->type('status')->source([ return $column->type('status')->source([
0 => ['label' => '未锁定', 'icon' => 'fa fa-times-circle', 'color' => '#30bf13'], 0 => ['label' => '未锁定', 'icon' => 'fa fa-times-circle', 'color' => '#30bf13'],
1 => ['label' => '已锁定', 'icon' => 'fa fa-check-circle', 'color' => '#f70e47'], 1 => ['label' => '已锁定', 'icon' => 'fa fa-check-circle', 'color' => '#f70e47'],

View File

@ -5,8 +5,10 @@ namespace App\Admin\Controllers\System;
use App\Admin\Controllers\AdminController; use App\Admin\Controllers\AdminController;
use App\Admin\Services\WorkFlowService; use App\Admin\Services\WorkFlowService;
use App\Enums\CheckType; use App\Enums\CheckType;
use App\Models\Employee;
use App\Models\Keyword; use App\Models\Keyword;
use App\Models\{Employee, WorkflowLog, WorkflowCheck}; use App\Models\WorkflowCheck;
use App\Models\WorkflowLog;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Slowlyo\OwlAdmin\Admin; use Slowlyo\OwlAdmin\Admin;
@ -109,13 +111,15 @@ class WorkflowController extends AdminController
try { try {
DB::beginTransaction(); DB::beginTransaction();
if (!$this->service->apply($model, $employee)) { if (! $this->service->apply($model, $employee)) {
return $this->response()->fail($this->service->getError()); return $this->response()->fail($this->service->getError());
} }
DB::commit(); DB::commit();
return $this->response()->success(); return $this->response()->success();
} catch (\Exception $e) { } catch (\Exception $e) {
DB::rollBack(); DB::rollBack();
return $this->response()->fail($e->getMessage()); return $this->response()->fail($e->getMessage());
} }
} }
@ -126,13 +130,15 @@ class WorkflowController extends AdminController
try { try {
DB::beginTransaction(); DB::beginTransaction();
if (!$this->service->cancel($model)) { if (! $this->service->cancel($model)) {
return $this->response()->fail($this->service->getError()); return $this->response()->fail($this->service->getError());
} }
DB::commit(); DB::commit();
return $this->response()->success(); return $this->response()->success();
} catch (\Exception $e) { } catch (\Exception $e) {
DB::rollBack(); DB::rollBack();
return $this->response()->fail($e->getMessage()); return $this->response()->fail($e->getMessage());
} }
} }
@ -141,43 +147,47 @@ class WorkflowController extends AdminController
{ {
$user = Admin::user(); $user = Admin::user();
$employee = Employee::where('admin_user_id', $user->id)->first(); $employee = Employee::where('admin_user_id', $user->id)->first();
if (!$employee) { if (! $employee) {
return $this->response()->fail('当前登录账户未关联员工'); return $this->response()->fail('当前登录账户未关联员工');
} }
$log = WorkflowLog::findOrFail($request->input('id')); $log = WorkflowLog::findOrFail($request->input('id'));
try { try {
DB::beginTransaction(); DB::beginTransaction();
if (!$this->service->check($employee, $log, true)) { if (! $this->service->check($employee, $log, true)) {
return $this->response()->fail($this->service->getError()); return $this->response()->fail($this->service->getError());
} }
DB::commit(); DB::commit();
return $this->response()->success(); return $this->response()->success();
} catch (\Exception $e) { } catch (\Exception $e) {
DB::rollBack(); DB::rollBack();
return $this->response()->fail($e->getMessage()); return $this->response()->fail($e->getMessage());
} }
} }
public function fail(Request $request) public function fail(Request $request)
{ {
if (!$request->input('remarks')) { if (! $request->input('remarks')) {
return $this->response()->fail('请填写未通过原因'); return $this->response()->fail('请填写未通过原因');
} }
$user = Admin::user(); $user = Admin::user();
$employee = Employee::where('admin_user_id', $user->id)->first(); $employee = Employee::where('admin_user_id', $user->id)->first();
if (!$employee) { if (! $employee) {
return $this->response()->fail('当前登录账户未关联员工'); return $this->response()->fail('当前登录账户未关联员工');
} }
$log = WorkflowLog::findOrFail($request->input('id')); $log = WorkflowLog::findOrFail($request->input('id'));
try { try {
DB::beginTransaction(); DB::beginTransaction();
if (!$this->service->check($employee, $log, false, ['remarks' => $request->input('remarks')])) { if (! $this->service->check($employee, $log, false, ['remarks' => $request->input('remarks')])) {
return $this->response()->fail($this->service->getError()); return $this->response()->fail($this->service->getError());
} }
DB::commit(); DB::commit();
return $this->response()->success(); return $this->response()->success();
} catch (\Exception $e) { } catch (\Exception $e) {
DB::rollBack(); DB::rollBack();
return $this->response()->fail($e->getMessage()); return $this->response()->fail($e->getMessage());
} }
} }
@ -185,6 +195,7 @@ class WorkflowController extends AdminController
public function logs(Request $request) public function logs(Request $request)
{ {
$list = WorkflowLog::with(['checkUser'])->where('check_id', $request->input('id'))->sort()->get(); $list = WorkflowLog::with(['checkUser'])->where('check_id', $request->input('id'))->sort()->get();
return $this->response()->success($list); return $this->response()->success($list);
} }

View File

@ -2,8 +2,8 @@
namespace App\Admin\Filters; namespace App\Admin\Filters;
use EloquentFilter\ModelFilter;
use Carbon\Carbon; use Carbon\Carbon;
use EloquentFilter\ModelFilter;
class EmployeeSignLogFilter extends ModelFilter class EmployeeSignLogFilter extends ModelFilter
{ {

View File

@ -2,8 +2,8 @@
namespace App\Admin\Filters; namespace App\Admin\Filters;
use EloquentFilter\ModelFilter;
use Carbon\Carbon; use Carbon\Carbon;
use EloquentFilter\ModelFilter;
class EmployeeSignRepairFilter extends ModelFilter class EmployeeSignRepairFilter extends ModelFilter
{ {

View File

@ -3,7 +3,6 @@
namespace App\Admin\Filters; namespace App\Admin\Filters;
use EloquentFilter\ModelFilter; use EloquentFilter\ModelFilter;
use Carbon\Carbon;
class HolidayApplyFilter extends ModelFilter class HolidayApplyFilter extends ModelFilter
{ {

View File

@ -31,7 +31,7 @@ class LedgerFilter extends ModelFilter
return; return;
} }
$this->related('store', function($query) use ($provinceCode, $cityCode) { $this->related('store', function ($query) use ($provinceCode, $cityCode) {
$query->when($provinceCode, fn ($query) => $query->where('region->provinceCode', $provinceCode)) $query->when($provinceCode, fn ($query) => $query->where('region->provinceCode', $provinceCode))
->when($cityCode, fn ($query) => $query->where('region->cityCode', $cityCode)); ->when($cityCode, fn ($query) => $query->where('region->cityCode', $cityCode));
}); });

View File

@ -24,7 +24,7 @@ class LedgerItemFilter extends ModelFilter
return; return;
} }
$this->related('store', function($query) use ($provinceCode, $cityCode) { $this->related('store', function ($query) use ($provinceCode, $cityCode) {
$query->when($provinceCode, fn ($query) => $query->where('region->provinceCode', $provinceCode)) $query->when($provinceCode, fn ($query) => $query->where('region->provinceCode', $provinceCode))
->when($cityCode, fn ($query) => $query->where('region->cityCode', $cityCode)); ->when($cityCode, fn ($query) => $query->where('region->cityCode', $cityCode));
}); });

View File

@ -2,8 +2,8 @@
namespace App\Admin\Filters; namespace App\Admin\Filters;
use EloquentFilter\ModelFilter;
use Carbon\Carbon; use Carbon\Carbon;
use EloquentFilter\ModelFilter;
class OfficalBusinessFilter extends ModelFilter class OfficalBusinessFilter extends ModelFilter
{ {

View File

@ -2,8 +2,8 @@
namespace App\Admin\Filters; namespace App\Admin\Filters;
use EloquentFilter\ModelFilter;
use Carbon\Carbon; use Carbon\Carbon;
use EloquentFilter\ModelFilter;
class OvertimeApplyFilter extends ModelFilter class OvertimeApplyFilter extends ModelFilter
{ {

View File

@ -3,7 +3,6 @@
namespace App\Admin\Filters; namespace App\Admin\Filters;
use EloquentFilter\ModelFilter; use EloquentFilter\ModelFilter;
use Carbon\Carbon;
class WorkflowCheckFilter extends ModelFilter class WorkflowCheckFilter extends ModelFilter
{ {

View File

@ -3,8 +3,8 @@
namespace App\Admin\Middleware; namespace App\Admin\Middleware;
use Closure; use Closure;
use Slowlyo\OwlAdmin\Admin;
use Illuminate\Http\Response; use Illuminate\Http\Response;
use Slowlyo\OwlAdmin\Admin;
class Authenticate class Authenticate
{ {

View File

@ -3,10 +3,12 @@
namespace App\Admin\Services; namespace App\Admin\Services;
use App\Admin\Filters\EmployeePromotionFilter; use App\Admin\Filters\EmployeePromotionFilter;
use App\Models\{EmployeePromotion, Employee};
use Illuminate\Support\Facades\{Validator, DB};
use App\Admin\WorkflowService; use App\Admin\WorkflowService;
use App\Enums\PromotionStatus; use App\Enums\PromotionStatus;
use App\Models\Employee;
use App\Models\EmployeePromotion;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
class EmployeePromotionService extends BaseService class EmployeePromotionService extends BaseService
{ {
@ -22,14 +24,15 @@ class EmployeePromotionService extends BaseService
if (isset($data['employee_id'])) { if (isset($data['employee_id'])) {
$data['store_id'] = Employee::where('id', $data['employee_id'])->value('store_id'); $data['store_id'] = Employee::where('id', $data['employee_id'])->value('store_id');
} }
return $data; return $data;
} }
/** /**
* 申请人完事资料 * 申请人完事资料
* *
* @param EmployeePromotion $model * @param EmployeePromotion $model
* @param array $data * @param array $data
* @return bool * @return bool
*/ */
public function apply($model, $data = []) public function apply($model, $data = [])
@ -55,9 +58,9 @@ class EmployeePromotionService extends BaseService
/** /**
* 邀请人填写推荐理由 * 邀请人填写推荐理由
* *
* @param EmployeePromotion $model * @param EmployeePromotion $model
* @param array $data * @param array $data
* @return bool * @return bool
*/ */
public function invitor($model, $data = []) public function invitor($model, $data = [])
@ -73,7 +76,7 @@ class EmployeePromotionService extends BaseService
DB::beginTransaction(); DB::beginTransaction();
$attributes = array_merge($model->employee_data, $data); $attributes = array_merge($model->employee_data, $data);
$model->update(['employee_data' => $data, 'promotion_status' => PromotionStatus::Processing]); $model->update(['employee_data' => $data, 'promotion_status' => PromotionStatus::Processing]);
// 发起审核申请 // 发起审核申请
$service = WorkflowService::make(); $service = WorkflowService::make();
if ($service->apply($model->workflow, $model->employee) !== true) { if ($service->apply($model->workflow, $model->employee) !== true) {
@ -82,6 +85,7 @@ class EmployeePromotionService extends BaseService
DB::commit(); DB::commit();
} catch (\Exception $e) { } catch (\Exception $e) {
DB::rollBack(); DB::rollBack();
return $this->setError($e->getMessage()); return $this->setError($e->getMessage());
} }
@ -101,6 +105,7 @@ class EmployeePromotionService extends BaseService
if ($validator->fails()) { if ($validator->fails()) {
return $validator->errors()->first(); return $validator->errors()->first();
} }
return true; return true;
} }
} }

View File

@ -72,7 +72,7 @@ class EmployeeService extends BaseService
public function resloveData($data, $model = null) public function resloveData($data, $model = null)
{ {
$adminUserService = AdminUserService::make(); $adminUserService = AdminUserService::make();
if (!$model) { if (! $model) {
// 添加管理员信息 // 添加管理员信息
if (! $adminUserService->store(Arr::only($data, ['username', 'password', 'confirm_password', 'name']))) { if (! $adminUserService->store(Arr::only($data, ['username', 'password', 'confirm_password', 'name']))) {
$this->setError($adminUserService->getError()); $this->setError($adminUserService->getError());

View File

@ -3,12 +3,11 @@
namespace App\Admin\Services; namespace App\Admin\Services;
use App\Admin\Filters\EmployeeSignRepairFilter; use App\Admin\Filters\EmployeeSignRepairFilter;
use App\Models\{EmployeeSignRepair, WorkflowCheck};
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use App\Models\Employee; use App\Models\Employee;
use App\Enums\CheckStatus; use App\Models\EmployeeSignRepair;
use App\Models\WorkflowCheck;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
class EmployeeSignRepairService extends BaseService class EmployeeSignRepairService extends BaseService
{ {
@ -37,9 +36,10 @@ class EmployeeSignRepairService extends BaseService
public function resloveData($data, $model = null) public function resloveData($data, $model = null)
{ {
// 获取员工所在的门店 // 获取员工所在的门店
if (!isset($data['store_id']) && isset($data['employee_id'])) { if (! isset($data['store_id']) && isset($data['employee_id'])) {
$data['store_id'] = Employee::where('id', $data['employee_id'])->value('store_id'); $data['store_id'] = Employee::where('id', $data['employee_id'])->value('store_id');
} }
return $data; return $data;
} }
@ -64,20 +64,21 @@ class EmployeeSignRepairService extends BaseService
'reason' => ['required'], 'reason' => ['required'],
]; ];
$updateRules = [ $updateRules = [
'date' => [$unique->ignore($model?->id)] 'date' => [$unique->ignore($model?->id)],
]; ];
$message = [ $message = [
'date.required' => __('employee_sign_repair.date') . '必填', 'date.required' => __('employee_sign_repair.date').'必填',
'store_id.required' => __('employee_sign_repair.store_id') . '必填', 'store_id.required' => __('employee_sign_repair.store_id').'必填',
'employee_id.required' => __('employee_sign_repair.employee_id') . '必填', 'employee_id.required' => __('employee_sign_repair.employee_id').'必填',
'reason.required' => __('employee_sign_repair.reason') . '必填', 'reason.required' => __('employee_sign_repair.reason').'必填',
'repair_type.required' => __('employee_sign_repair.repair_type') . '必填', 'repair_type.required' => __('employee_sign_repair.repair_type').'必填',
'date.unique' => __('employee_sign_repair.date') . ' 已经申请过了' 'date.unique' => __('employee_sign_repair.date').' 已经申请过了',
]; ];
$validator = Validator::make($data, $model ? $updateRules : $createRules, $message); $validator = Validator::make($data, $model ? $updateRules : $createRules, $message);
if ($validator->fails()) { if ($validator->fails()) {
return $validator->errors()->first(); return $validator->errors()->first();
} }
return true; return true;
} }
} }

View File

@ -3,13 +3,13 @@
namespace App\Admin\Services; namespace App\Admin\Services;
use App\Admin\Filters\EmployeeSignFilter; use App\Admin\Filters\EmployeeSignFilter;
use App\Models\EmployeeSign;
use App\Models\EmployeeSignLog;
use App\Models\EmployeeRest;
use App\Models\Employee;
use App\Enums\SignType;
use App\Enums\SignStatus; use App\Enums\SignStatus;
use App\Enums\SignTime; use App\Enums\SignTime;
use App\Enums\SignType;
use App\Models\Employee;
use App\Models\EmployeeRest;
use App\Models\EmployeeSign;
use App\Models\EmployeeSignLog;
class EmployeeSignService extends BaseService class EmployeeSignService extends BaseService
{ {
@ -43,7 +43,7 @@ class EmployeeSignService extends BaseService
$firstTime = null; $firstTime = null;
if ($item = $logs->where('sign_time', SignTime::Morning)->sortBy('time')->first()) { if ($item = $logs->where('sign_time', SignTime::Morning)->sortBy('time')->first()) {
$firstTime = $item->time; $firstTime = $item->time;
$status ++; $status++;
if ($item->sign_type == SignType::Outside) { if ($item->sign_type == SignType::Outside) {
$remarks = $item->remarks; $remarks = $item->remarks;
} }
@ -52,7 +52,7 @@ class EmployeeSignService extends BaseService
$lastTime = null; $lastTime = null;
if ($item = $logs->where('sign_time', SignTime::Afternoon)->sortByDesc('time')->first()) { if ($item = $logs->where('sign_time', SignTime::Afternoon)->sortByDesc('time')->first()) {
$lastTime = $item->time; $lastTime = $item->time;
$status ++; $status++;
if ($item->sign_type == SignType::Outside) { if ($item->sign_type == SignType::Outside) {
$remarks = $item->remarks; $remarks = $item->remarks;
} }
@ -68,7 +68,7 @@ class EmployeeSignService extends BaseService
'sign_type' => $type, 'sign_type' => $type,
'first_time' => $firstTime, 'first_time' => $firstTime,
'last_time' => $lastTime, 'last_time' => $lastTime,
'sign_status' => match($status) { 'sign_status' => match ($status) {
0 => SignStatus::Absent, 0 => SignStatus::Absent,
1 => SignStatus::Lose, 1 => SignStatus::Lose,
2 => SignStatus::Normal, 2 => SignStatus::Normal,

View File

@ -3,11 +3,10 @@
namespace App\Admin\Services; namespace App\Admin\Services;
use App\Admin\Filters\HolidayApplyFilter; use App\Admin\Filters\HolidayApplyFilter;
use App\Models\{HolidayApply, Employee}; use App\Models\Employee;
use Illuminate\Validation\Rule; use App\Models\HolidayApply;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Support\Facades\Validator;
class HolidayApplyService extends BaseService class HolidayApplyService extends BaseService
{ {
@ -20,15 +19,16 @@ class HolidayApplyService extends BaseService
public function resloveData($data, $model = null) public function resloveData($data, $model = null)
{ {
// 获取员工所在的门店 // 获取员工所在的门店
if (!isset($data['store_id']) && isset($data['employee_id'])) { if (! isset($data['store_id']) && isset($data['employee_id'])) {
$data['store_id'] = Employee::where('id', $data['employee_id'])->value('store_id'); $data['store_id'] = Employee::where('id', $data['employee_id'])->value('store_id');
} }
// 处理日期 // 处理日期
if (isset($data['date_range']) && !isset($data['start_at']) && !isset($data['end_at'])) { if (isset($data['date_range']) && ! isset($data['start_at']) && ! isset($data['end_at'])) {
$dates = explode(',', $data['date_range']); $dates = explode(',', $data['date_range']);
$data['start_at'] = Carbon::createFromFormat('Y-m-d', data_get($dates, 0))->startOfDay(); $data['start_at'] = Carbon::createFromFormat('Y-m-d', data_get($dates, 0))->startOfDay();
$data['end_at'] = Carbon::createFromFormat('Y-m-d', data_get($dates, 1))->endOfDay(); $data['end_at'] = Carbon::createFromFormat('Y-m-d', data_get($dates, 1))->endOfDay();
} }
return $data; return $data;
} }
@ -48,6 +48,7 @@ class HolidayApplyService extends BaseService
if ($validator->fails()) { if ($validator->fails()) {
return $validator->errors()->first(); return $validator->errors()->first();
} }
return true; return true;
} }
} }

View File

@ -3,11 +3,10 @@
namespace App\Admin\Services; namespace App\Admin\Services;
use App\Admin\Filters\OfficalBusinessFilter; use App\Admin\Filters\OfficalBusinessFilter;
use App\Models\{OfficalBusiness, Employee}; use App\Models\Employee;
use Illuminate\Validation\Rule; use App\Models\OfficalBusiness;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Support\Facades\Validator;
class OfficalBusinessService extends BaseService class OfficalBusinessService extends BaseService
{ {
@ -20,7 +19,7 @@ class OfficalBusinessService extends BaseService
public function resloveData($data, $model = null) public function resloveData($data, $model = null)
{ {
// 获取员工所在的门店 // 获取员工所在的门店
if (!isset($data['store_id']) && isset($data['employee_id'])) { if (! isset($data['store_id']) && isset($data['employee_id'])) {
$data['store_id'] = Employee::where('id', $data['employee_id'])->value('store_id'); $data['store_id'] = Employee::where('id', $data['employee_id'])->value('store_id');
} }
if (isset($data['date_range'])) { if (isset($data['date_range'])) {
@ -30,6 +29,7 @@ class OfficalBusinessService extends BaseService
$data['start_at'] = $start; $data['start_at'] = $start;
$data['end_at'] = $end; $data['end_at'] = $end;
} }
return $data; return $data;
} }
@ -48,6 +48,7 @@ class OfficalBusinessService extends BaseService
if ($validator->fails()) { if ($validator->fails()) {
return $validator->errors()->first(); return $validator->errors()->first();
} }
return true; return true;
} }
} }

View File

@ -3,11 +3,10 @@
namespace App\Admin\Services; namespace App\Admin\Services;
use App\Admin\Filters\OvertimeApplyFilter; use App\Admin\Filters\OvertimeApplyFilter;
use App\Models\{OvertimeApply, Employee}; use App\Models\Employee;
use Illuminate\Validation\Rule; use App\Models\OvertimeApply;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Support\Facades\Validator;
class OvertimeApplyService extends BaseService class OvertimeApplyService extends BaseService
{ {
@ -20,7 +19,7 @@ class OvertimeApplyService extends BaseService
public function resloveData($data, $model = null) public function resloveData($data, $model = null)
{ {
// 获取员工所在的门店 // 获取员工所在的门店
if (!isset($data['store_id']) && isset($data['employee_id'])) { if (! isset($data['store_id']) && isset($data['employee_id'])) {
$data['store_id'] = Employee::where('id', $data['employee_id'])->value('store_id'); $data['store_id'] = Employee::where('id', $data['employee_id'])->value('store_id');
} }
if (isset($data['datetime_range'])) { if (isset($data['datetime_range'])) {
@ -32,6 +31,7 @@ class OvertimeApplyService extends BaseService
$data['date'] = $start->format('Y-m-d'); $data['date'] = $start->format('Y-m-d');
$data['hours'] = $start->diffInHours($end); $data['hours'] = $start->diffInHours($end);
} }
return $data; return $data;
} }
@ -49,6 +49,7 @@ class OvertimeApplyService extends BaseService
if ($validator->fails()) { if ($validator->fails()) {
return $validator->errors()->first(); return $validator->errors()->first();
} }
return true; return true;
} }
} }

View File

@ -5,7 +5,6 @@ namespace App\Admin\Services;
use App\Admin\Filters\EmployeeFilter; use App\Admin\Filters\EmployeeFilter;
use App\Models\Employee; use App\Models\Employee;
use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
class StoreEmployeeService extends BaseService class StoreEmployeeService extends BaseService
{ {
@ -44,15 +43,18 @@ class StoreEmployeeService extends BaseService
$employees = Employee::whereIn('id', $data['employee_id'])->get(); $employees = Employee::whereIn('id', $data['employee_id'])->get();
foreach ($employees as $employee) { foreach ($employees as $employee) {
if ($employee->store_id > 0 && $employee->store_id != $storeId) { if ($employee->store_id > 0 && $employee->store_id != $storeId) {
$this->setError($employee->name . ' 已经有门店了'); $this->setError($employee->name.' 已经有门店了');
return false; return false;
} }
if ($employee->master_store_id > 0) { if ($employee->master_store_id > 0) {
$this->setError($employee->name . ' 已经是店长了'); $this->setError($employee->name.' 已经是店长了');
return false; return false;
} }
} }
Employee::whereIn('id', $data['employee_id'])->update(['store_id' => $storeId]); Employee::whereIn('id', $data['employee_id'])->update(['store_id' => $storeId]);
return true; return true;
} }
@ -60,6 +62,7 @@ class StoreEmployeeService extends BaseService
{ {
$id = explode(',', $ids); $id = explode(',', $ids);
Employee::whereIn('id', $id)->update(['store_id' => 0]); Employee::whereIn('id', $id)->update(['store_id' => 0]);
return true; return true;
} }
@ -75,6 +78,7 @@ class StoreEmployeeService extends BaseService
if ($validator->fails()) { if ($validator->fails()) {
return $validator->errors()->first(); return $validator->errors()->first();
} }
return true; return true;
} }
} }

View File

@ -5,7 +5,6 @@ namespace App\Admin\Services;
use App\Admin\Filters\StoreFilter; use App\Admin\Filters\StoreFilter;
use App\Models\Employee; use App\Models\Employee;
use App\Models\Store; use App\Models\Store;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule; use Illuminate\Validation\Rule;

View File

@ -2,11 +2,17 @@
namespace App\Admin\Services; namespace App\Admin\Services;
use App\Enums\{CheckType, CheckStatus}; use App\Contracts\Checkable;
use App\Models\{Employee, Store, Keyword, Workflow, WorkflowCheck, WorkflowLog}; use App\Enums\CheckStatus;
use App\Enums\CheckType;
use App\Models\Employee;
use App\Models\Keyword;
use App\Models\Store;
use App\Models\Workflow;
use App\Models\WorkflowCheck;
use App\Models\WorkflowLog;
use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule; use Illuminate\Validation\Rule;
use App\Contracts\Checkable;
class WorkFlowService extends BaseService class WorkFlowService extends BaseService
{ {
@ -21,10 +27,9 @@ class WorkFlowService extends BaseService
* 1. 待审核 Model 实现 Checkable * 1. 待审核 Model 实现 Checkable
* 2. 生成全部的审核流程 * 2. 生成全部的审核流程
* *
* @param WorkflowCheck $check 待审核记录 * @param WorkflowCheck $check 待审核记录
* @param Employee $user 申请人 * @param Employee $user 申请人
* * @return bool true: 成功, false: 失败, $this->getError(): 错误消息
* @return boolean true: 成功, false: 失败, $this->getError(): 错误消息
*/ */
public function apply(WorkflowCheck $check, Employee $user) public function apply(WorkflowCheck $check, Employee $user)
{ {
@ -37,8 +42,9 @@ class WorkFlowService extends BaseService
$workflow = Workflow::where('key', $check->key)->first(); $workflow = Workflow::where('key', $check->key)->first();
// 没有配置审核流程, 直接通过 // 没有配置审核流程, 直接通过
if (!$workflow || !$workflow->config) { if (! $workflow || ! $workflow->config) {
$this->success(); $this->success();
return true; return true;
} }
$jobs = Keyword::where('parent_key', 'job')->get(); $jobs = Keyword::where('parent_key', 'job')->get();
@ -49,28 +55,28 @@ class WorkFlowService extends BaseService
'check_status' => CheckStatus::Processing, 'check_status' => CheckStatus::Processing,
'employee_id' => $user->id, 'employee_id' => $user->id,
]); ]);
foreach($config as $item) { foreach ($config as $item) {
$checkValue = ''; $checkValue = '';
$checkName = ''; $checkName = '';
// 职位审核 // 职位审核
if ($item['type'] == CheckType::Job->value) { if ($item['type'] == CheckType::Job->value) {
// 没有门店, 则跳过 // 没有门店, 则跳过
if (!$user->store_id) { if (! $user->store_id) {
continue; continue;
} }
// 所属门店的职位审核 // 所属门店的职位审核
$store = Store::findOrFail($user->store_id); $store = Store::findOrFail($user->store_id);
$job = $jobs->firstWhere('key', $item['value']); $job = $jobs->firstWhere('key', $item['value']);
$checkValue = $store->id . '-' . $job->key; $checkValue = $store->id.'-'.$job->key;
$checkName = $store->title . '-' . $job->name; $checkName = $store->title.'-'.$job->name;
} }
// 指定用户审核 // 指定用户审核
else if ($item['type'] == CheckType::User->value) { elseif ($item['type'] == CheckType::User->value) {
$checkUser = Employee::findOrFail($item['value']); $checkUser = Employee::findOrFail($item['value']);
$checkValue = $checkUser->id; $checkValue = $checkUser->id;
$checkName = $checkUser->name; $checkName = $checkUser->name;
} else { } else {
return $this->setError('未知的审核类型: ' . $item['type']); return $this->setError('未知的审核类型: '.$item['type']);
break; break;
} }
$check->logs()->create([ $check->logs()->create([
@ -78,11 +84,12 @@ class WorkFlowService extends BaseService
'check_type' => $item['type'], 'check_type' => $item['type'],
'check_value' => $checkValue, 'check_value' => $checkValue,
'check_name' => $checkName, 'check_name' => $checkName,
'sort' => $item['sort'] 'sort' => $item['sort'],
]); ]);
} }
// 开启第一个审核流程 // 开启第一个审核流程
$this->next($check); $this->next($check);
return true; return true;
} }
@ -91,8 +98,9 @@ class WorkFlowService extends BaseService
$check->update([ $check->update([
'check_status' => CheckStatus::Success, 'check_status' => CheckStatus::Success,
'checked_at' => data_get($options, 'checked_at', now()), 'checked_at' => data_get($options, 'checked_at', now()),
'check_remarks' => data_get($options, 'remarks') 'check_remarks' => data_get($options, 'remarks'),
]); ]);
return true; return true;
} }
@ -103,6 +111,7 @@ class WorkFlowService extends BaseService
'check_remarks' => data_get($options, 'remarks'), 'check_remarks' => data_get($options, 'remarks'),
'checked_at' => data_get($options, 'checked_at', now()), 'checked_at' => data_get($options, 'checked_at', now()),
]); ]);
return true; return true;
} }
@ -110,7 +119,6 @@ class WorkFlowService extends BaseService
* 取消审核 * 取消审核
* 1. 删除未审核的流程 * 1. 删除未审核的流程
* 2. 更新申请记录的状态 * 2. 更新申请记录的状态
*
*/ */
public function cancel(WorkflowCheck $check) public function cancel(WorkflowCheck $check)
{ {
@ -125,18 +133,18 @@ class WorkFlowService extends BaseService
/** /**
* 审核单个流程 * 审核单个流程
* *
* @param Employee $user 审核人 * @param Employee $user 审核人
* @param WorkflowLog $log 审核流水记录 * @param WorkflowLog $log 审核流水记录
* @param boolean $status 通过/不通过 * @param bool $status 通过/不通过
* @param array $options {remarks: 不通过原因, time: 审核时间(默认当前时间)} * @param array $options {remarks: 不通过原因, time: 审核时间(默认当前时间)}
* @return boolean * @return bool
*/ */
public function check(Employee $user, WorkflowLog $log, $status, $options = []) public function check(Employee $user, WorkflowLog $log, $status, $options = [])
{ {
if ($log->check_status != CheckStatus::Processing) { if ($log->check_status != CheckStatus::Processing) {
return $this->setError('不可操作, 等待前面的审核完成'); return $this->setError('不可操作, 等待前面的审核完成');
} }
if (!$this->authCheck($user, $log)) { if (! $this->authCheck($user, $log)) {
return $this->setError('没有权限'); return $this->setError('没有权限');
} }
$attributes = ['check_status' => $status ? CheckStatus::Success : CheckStatus::Fail]; $attributes = ['check_status' => $status ? CheckStatus::Success : CheckStatus::Fail];
@ -156,8 +164,7 @@ class WorkFlowService extends BaseService
/** /**
* 开启下一个审核流程 * 开启下一个审核流程
* *
* @param WorkflowCheck $check * @return bool
* @return boolean
*/ */
public function next(WorkflowCheck $check) public function next(WorkflowCheck $check)
{ {
@ -186,15 +193,16 @@ class WorkFlowService extends BaseService
// } // }
if ($log->check_type == CheckType::User && $log->check_value == $user->id) { if ($log->check_type == CheckType::User && $log->check_value == $user->id) {
return true; return true;
} else if ($log->check_type == CheckType::Job) { } elseif ($log->check_type == CheckType::Job) {
$jobs = $user->jobs; $jobs = $user->jobs;
foreach($jobs as $job) { foreach ($jobs as $job) {
if ($log->check_value == $user->store_id . '-' . $job->key) { if ($log->check_value == $user->store_id.'-'.$job->key) {
return true; return true;
} }
} }
} }
return false; return false;
} }
@ -202,7 +210,7 @@ class WorkFlowService extends BaseService
{ {
if (isset($data['config'])) { if (isset($data['config'])) {
foreach ($data['config'] as $key => &$item) { foreach ($data['config'] as $key => &$item) {
if (!$item) { if (! $item) {
$data['config'] = null; $data['config'] = null;
break; break;
} }

View File

@ -12,8 +12,8 @@ use App\Admin\Controllers\Finance\StoreStatisticController;
use App\Admin\Controllers\Hr\EmployeeController; use App\Admin\Controllers\Hr\EmployeeController;
use App\Admin\Controllers\Hr\HolidayController; use App\Admin\Controllers\Hr\HolidayController;
use App\Admin\Controllers\Hr\OfficalBusinessController; use App\Admin\Controllers\Hr\OfficalBusinessController;
use App\Admin\Controllers\Hr\PromotionController;
use App\Admin\Controllers\Hr\OvertimeController; use App\Admin\Controllers\Hr\OvertimeController;
use App\Admin\Controllers\Hr\PromotionController;
use App\Admin\Controllers\Hr\RestController; use App\Admin\Controllers\Hr\RestController;
use App\Admin\Controllers\Hr\SignController; use App\Admin\Controllers\Hr\SignController;
use App\Admin\Controllers\Hr\SignLogController; use App\Admin\Controllers\Hr\SignLogController;
@ -109,7 +109,7 @@ Route::group([
'as' => 'complaint.', 'as' => 'complaint.',
], function (Router $router) { ], function (Router $router) {
// 举报投诉 // 举报投诉
$router->resource('complaints', ComplaintController::class)->only(['index']); $router->resource('complaints', ComplaintController::class)->only(['index', 'show']);
$router->post('complaints/{complaint}/start', [ComplaintController::class, 'start'])->name('complaints.start'); $router->post('complaints/{complaint}/start', [ComplaintController::class, 'start'])->name('complaints.start');
$router->post('complaints/{complaint}/complete', [ComplaintController::class, 'complete'])->name('complaints.complete'); $router->post('complaints/{complaint}/complete', [ComplaintController::class, 'complete'])->name('complaints.complete');
// 意见箱 // 意见箱

View File

@ -2,8 +2,8 @@
namespace App\Console\Commands; namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Admin\Services\EmployeeSignService; use App\Admin\Services\EmployeeSignService;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
class EmployeeSign extends Command class EmployeeSign extends Command

View File

@ -0,0 +1,28 @@
<?php
namespace App\Exceptions;
use Throwable;
class RuntimeException extends \RuntimeException
{
/**
* HTTP 响应状态码
*/
protected $httpStatusCode = 400;
public function __construct(string $message = 'Bad request', int $code = 10000, ?Throwable $previous = null)
{
parent::__construct($message, $code, $previous);
}
public function getHttpStatusCode(): int
{
return $this->httpStatusCode;
}
public function setHttpStatusCode(int $httpStatusCode): void
{
$this->httpStatusCode = $httpStatusCode;
}
}

View File

@ -0,0 +1,20 @@
<?php
namespace App\Filters;
use App\Models\Keyword;
use EloquentFilter\ModelFilter;
class KeywordFilter extends ModelFilter
{
public function parentKey($key)
{
$parent = Keyword::where('key', $key)->first();
$this->when(
$parent,
fn ($query) => $query->where('parent_id', $parent->id),
fn ($query) => $query->whereRaw('1!=1'),
);
}
}

View File

@ -0,0 +1,68 @@
<?php
namespace App\Http\Controllers\Api\Auth;
use App\Exceptions\RuntimeException;
use App\Http\Controllers\Api\Controller;
use App\Models\AdminUser;
use App\Models\Employee;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\ValidationException;
class AccessTokenController extends Controller
{
public function store(Request $request): array
{
$validated = $request->validate(
rules: [
'username' => ['bail', 'required'],
'password' => ['bail', 'required'],
],
attributes: [
'username' => '账号',
'password' => '密码',
],
);
$adminUser = AdminUser::where('username', $validated['username'])->first();
if (! Hash::check($validated['password'], (string) $adminUser?->password)) {
throw ValidationException::withMessages([
'username' => ['账号或密码错误'],
]);
}
$employee = Employee::where('admin_user_id', $adminUser->id)->first();
if (is_null($employee)) {
throw new RuntimeException('员工未找到');
}
if ($employee->isResigned()) {
throw new RuntimeException('员工已离职');
}
$employee->tokens()->delete();
/** @var \Laravel\Sanctum\NewAccessToken */
$accessToken = $employee->createToken(
name: 'api',
expiresAt: now()->addDays(15),
);
return [
'token' => $accessToken->plainTextToken,
];
}
public function destroy(Request $request)
{
/** @var Employee */
if ($employee = $this->guard()->user()) {
$employee->tokens()->delete();
}
return response()->noContent();
}
}

View File

@ -0,0 +1,31 @@
<?php
namespace App\Http\Controllers\Api;
use App\Models\Complaint;
use Illuminate\Http\Request;
class ComplaintController extends Controller
{
public function store(Request $request)
{
$validated = $request->validate(
rules: [
'content' => ['bail', 'required', 'string', 'min:20'],
'photos' => ['bail', 'array'],
'anonymous' => ['bail', 'boolean'],
],
attributes: [
'content' => '投诉内容',
'photos' => '证明材料',
'anonymous' => '匿名',
],
);
Complaint::create(
array_merge($validated, ['employee_id' => $request->user()->id])
);
return response()->noContent();
}
}

View File

@ -0,0 +1,17 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Support\Facades\Auth;
class Controller extends BaseController
{
/**
* @return \Illuminate\Contracts\Auth\Guard|\Illuminate\Contracts\Auth\StatefulGuard
*/
protected function guard()
{
return Auth::guard('api');
}
}

View File

@ -0,0 +1,28 @@
<?php
namespace App\Http\Controllers\Api;
use App\Models\Feedback;
use Illuminate\Http\Request;
class FeedbackController extends Controller
{
public function store(Request $request)
{
$validated = $request->validate(
rules: [
'content' => ['bail', 'required', 'string', 'min:20'],
],
attributes: [
'content' => '意见内容',
],
);
Feedback::create([
'employee_id' => $request->user()->id,
'content' => $validated['content'],
]);
return response()->noContent();
}
}

View File

@ -0,0 +1,19 @@
<?php
namespace App\Http\Controllers\Api;
use App\Models\Keyword;
class LotteryTypeController extends Controller
{
public function index()
{
/** @var \Illuminate\Database\Eloquent\Collection */
$lotteryTypes = Keyword::filter(['parent_key' => 'lottery_type'])->oldest('sort')->get();
return $lotteryTypes->map(fn ($item) => [
'id' => $item->value,
'name' => $item->name,
]);
}
}

View File

@ -5,13 +5,14 @@ namespace App\Models;
use App\Enums\ComplaintStatus; use App\Enums\ComplaintStatus;
use App\Traits\HasDateTimeFormatter; use App\Traits\HasDateTimeFormatter;
use EloquentFilter\Filterable; use EloquentFilter\Filterable;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Complaint extends Model class Complaint extends Model
{ {
use Filterable, HasFactory, HasDateTimeFormatter; use Filterable, HasDateTimeFormatter, HasFactory;
protected $attributes = [ protected $attributes = [
'anonymous' => false, 'anonymous' => false,
@ -24,7 +25,7 @@ class Complaint extends Model
]; ];
protected $fillable = [ protected $fillable = [
'employee_id', 'content', 'result', 'anonymous', 'complaint_status', 'employee_id', 'content', 'photos', 'result', 'anonymous', 'complaint_status',
]; ];
public function employee(): BelongsTo public function employee(): BelongsTo
@ -41,4 +42,18 @@ class Complaint extends Model
{ {
return $this->complaint_status === ComplaintStatus::Processing; return $this->complaint_status === ComplaintStatus::Processing;
} }
protected function photos(): Attribute
{
return Attribute::make(
get: function (mixed $value) {
if (! is_array($photos = json_decode($value ?? '', true))) {
$photos = [];
}
return $photos;
},
set: fn (mixed $value) => json_encode(is_array($value) ? $value : []),
);
}
} }

View File

@ -6,16 +6,19 @@ use App\Admin\Filters\EmployeeFilter;
use App\Enums\EmployeeStatus; use App\Enums\EmployeeStatus;
use App\Traits\HasDateTimeFormatter; use App\Traits\HasDateTimeFormatter;
use EloquentFilter\Filterable; use EloquentFilter\Filterable;
use Illuminate\Auth\Authenticatable;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Laravel\Sanctum\HasApiTokens;
use Slowlyo\OwlAdmin\Models\AdminUser; use Slowlyo\OwlAdmin\Models\AdminUser;
/** /**
* 员工 * 员工
*/ */
class Employee extends Model class Employee extends Model implements AuthenticatableContract
{ {
use Filterable, HasDateTimeFormatter; use Authenticatable, Filterable, HasApiTokens, HasDateTimeFormatter;
const JOB_KEY = 'job'; const JOB_KEY = 'job';
@ -76,6 +79,14 @@ class Employee extends Model
return $q->where('employee_status', EmployeeStatus::Online); return $q->where('employee_status', EmployeeStatus::Online);
} }
/**
* 确认当前员工是否已离职
*/
public function isResigned(): bool
{
return $this->employee_status === EmployeeStatus::Offline;
}
protected function employeeStatusText(): Attribute protected function employeeStatusText(): Attribute
{ {
return new Attribute( return new Attribute(

View File

@ -2,18 +2,18 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use App\Enums\PromotionStatus; use App\Enums\PromotionStatus;
use App\Traits\HasCheckable;
use App\Traits\HasDateTimeFormatter; use App\Traits\HasDateTimeFormatter;
use EloquentFilter\Filterable; use EloquentFilter\Filterable;
use App\Traits\HasCheckable; use Illuminate\Database\Eloquent\Model;
/** /**
* 员工升职申请 * 员工升职申请
*/ */
class EmployeePromotion extends Model class EmployeePromotion extends Model
{ {
use Filterable, HasDateTimeFormatter, HasCheckable; use Filterable, HasCheckable, HasDateTimeFormatter;
protected $fillable = ['store_id', 'employee_id', 'invitor_id', 'job_id', 'promotion_status', 'employee_data', 'remarks']; protected $fillable = ['store_id', 'employee_id', 'invitor_id', 'job_id', 'promotion_status', 'employee_data', 'remarks'];

View File

@ -5,15 +5,15 @@ namespace App\Models;
use App\Enums\SignStatus; use App\Enums\SignStatus;
use App\Enums\SignType; use App\Enums\SignType;
use App\Traits\HasDateTimeFormatter; use App\Traits\HasDateTimeFormatter;
use Illuminate\Database\Eloquent\Model;
use EloquentFilter\Filterable; use EloquentFilter\Filterable;
use Illuminate\Database\Eloquent\Model;
/** /**
* 员工-打卡情况 * 员工-打卡情况
*/ */
class EmployeeSign extends Model class EmployeeSign extends Model
{ {
use HasDateTimeFormatter, Filterable; use Filterable, HasDateTimeFormatter;
protected $table = 'employee_sign_dates'; protected $table = 'employee_sign_dates';

View File

@ -2,19 +2,19 @@
namespace App\Models; namespace App\Models;
use App\Enums\{SignType, SignTime}; use App\Enums\SignTime;
use Illuminate\Database\Eloquent\Model; use App\Enums\SignType;
use App\Traits\HasDateTimeFormatter; use App\Traits\HasDateTimeFormatter;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use EloquentFilter\Filterable; use EloquentFilter\Filterable;
use App\Admin\Filters\EmployeeSignLogFilter; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
/** /**
* 员工-打卡流水 * 员工-打卡流水
*/ */
class EmployeeSignLog extends Model class EmployeeSignLog extends Model
{ {
use HasDateTimeFormatter, HasFactory, Filterable; use Filterable, HasDateTimeFormatter, HasFactory;
protected $table = 'employee_sign_logs'; protected $table = 'employee_sign_logs';

View File

@ -2,18 +2,18 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use App\Enums\{SignTime}; use App\Enums\{SignTime};
use App\Traits\HasCheckable;
use App\Traits\HasDateTimeFormatter; use App\Traits\HasDateTimeFormatter;
use EloquentFilter\Filterable; use EloquentFilter\Filterable;
use App\Traits\HasCheckable; use Illuminate\Database\Eloquent\Model;
/** /**
* 补卡申请 * 补卡申请
*/ */
class EmployeeSignRepair extends Model class EmployeeSignRepair extends Model
{ {
use HasDateTimeFormatter, Filterable, HasCheckable; use Filterable, HasCheckable, HasDateTimeFormatter;
protected $table = 'employee_sign_repairs'; protected $table = 'employee_sign_repairs';

View File

@ -10,7 +10,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Feedback extends Model class Feedback extends Model
{ {
use Filterable, HasFactory, HasDateTimeFormatter; use Filterable, HasDateTimeFormatter, HasFactory;
protected $fillable = [ protected $fillable = [
'employee_id', 'content', 'employee_id', 'content',

View File

@ -2,11 +2,11 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Model; use App\Enums\{CheckStatus};
use App\Traits\HasCheckable; use App\Traits\HasCheckable;
use App\Traits\HasDateTimeFormatter; use App\Traits\HasDateTimeFormatter;
use EloquentFilter\Filterable; use EloquentFilter\Filterable;
use App\Enums\{CheckStatus}; use Illuminate\Database\Eloquent\Model;
/** /**
* 请假申请 * 请假申请

View File

@ -3,6 +3,7 @@
namespace App\Models; namespace App\Models;
use App\Admin\Components; use App\Admin\Components;
use App\Filters\KeywordFilter;
use EloquentFilter\Filterable; use EloquentFilter\Filterable;
use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
@ -72,6 +73,11 @@ class Keyword extends Model
.'-%' ?? ''); .'-%' ?? '');
} }
public function modelFilter(): string
{
return KeywordFilter::class;
}
public static function tagsMap(string $key) public static function tagsMap(string $key)
{ {
$mapArr = []; $mapArr = [];

View File

@ -2,7 +2,6 @@
namespace App\Models; namespace App\Models;
use App\Enums\LedgerStatus;
use App\Traits\HasCheckable; use App\Traits\HasCheckable;
use App\Traits\HasDateTimeFormatter; use App\Traits\HasDateTimeFormatter;
use EloquentFilter\Filterable; use EloquentFilter\Filterable;
@ -14,7 +13,7 @@ use Illuminate\Database\Eloquent\Relations\HasMany;
class Ledger extends Model class Ledger extends Model
{ {
use Filterable, HasDateTimeFormatter, HasFactory, HasCheckable; use Filterable, HasCheckable, HasDateTimeFormatter, HasFactory;
protected $appends = ['ledger_difference']; protected $appends = ['ledger_difference'];
@ -54,6 +53,7 @@ class Ledger extends Model
if (is_numeric($attributes['ledger_amount'])) { if (is_numeric($attributes['ledger_amount'])) {
return bcsub($attributes['handover_amount'], $attributes['ledger_amount'], 2); return bcsub($attributes['handover_amount'], $attributes['ledger_amount'], 2);
} }
return null; return null;
}, },
); );

View File

@ -4,7 +4,6 @@ namespace App\Models;
use App\Traits\HasDateTimeFormatter; use App\Traits\HasDateTimeFormatter;
use EloquentFilter\Filterable; use EloquentFilter\Filterable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;

View File

@ -2,18 +2,18 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Model; use App\Enums\{CheckStatus};
use App\Traits\HasCheckable; use App\Traits\HasCheckable;
use App\Traits\HasDateTimeFormatter; use App\Traits\HasDateTimeFormatter;
use EloquentFilter\Filterable; use EloquentFilter\Filterable;
use App\Enums\{CheckStatus}; use Illuminate\Database\Eloquent\Model;
/** /**
* 出差报备 * 出差报备
*/ */
class OfficalBusiness extends Model class OfficalBusiness extends Model
{ {
use HasCheckable, HasDateTimeFormatter, Filterable; use Filterable, HasCheckable, HasDateTimeFormatter;
protected $table = 'offical_business'; protected $table = 'offical_business';

View File

@ -2,18 +2,18 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Model; use App\Enums\{CheckStatus};
use App\Traits\HasCheckable; use App\Traits\HasCheckable;
use App\Traits\HasDateTimeFormatter; use App\Traits\HasDateTimeFormatter;
use EloquentFilter\Filterable; use EloquentFilter\Filterable;
use App\Enums\{CheckStatus}; use Illuminate\Database\Eloquent\Model;
/** /**
* 加班申请 * 加班申请
*/ */
class OvertimeApply extends Model class OvertimeApply extends Model
{ {
use Filterable, HasDateTimeFormatter, HasCheckable; use Filterable, HasCheckable, HasDateTimeFormatter;
protected $fillable = ['store_id', 'employee_id', 'date', 'start_at', 'end_at', 'hours', 'reason']; protected $fillable = ['store_id', 'employee_id', 'date', 'start_at', 'end_at', 'hours', 'reason'];

View File

@ -12,7 +12,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Reimbursement extends Model class Reimbursement extends Model
{ {
use Filterable, HasDateTimeFormatter, HasFactory, HasCheckable; use Filterable, HasCheckable, HasDateTimeFormatter, HasFactory;
protected $fillable = [ protected $fillable = [
'employee_id', 'employee_id',

View File

@ -6,8 +6,8 @@ use App\Enums\BusinessStatus;
use App\Traits\HasDateTimeFormatter; use App\Traits\HasDateTimeFormatter;
use EloquentFilter\Filterable; use EloquentFilter\Filterable;
use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
/** /**
* 门店 * 门店

View File

@ -2,7 +2,6 @@
namespace App\Models; namespace App\Models;
use App\Enums\StoreMasterCommissionApprovalStatus;
use App\Traits\HasCheckable; use App\Traits\HasCheckable;
use App\Traits\HasDateTimeFormatter; use App\Traits\HasDateTimeFormatter;
use EloquentFilter\Filterable; use EloquentFilter\Filterable;
@ -12,7 +11,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo;
class StoreMasterCommission extends Model class StoreMasterCommission extends Model
{ {
use Filterable, HasDateTimeFormatter, HasFactory, HasCheckable; use Filterable, HasCheckable, HasDateTimeFormatter, HasFactory;
protected $fillable = [ protected $fillable = [
'month', 'month',

View File

@ -2,19 +2,17 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\Employee;
use App\Enums\CheckStatus; use App\Enums\CheckStatus;
use App\Traits\HasDateTimeFormatter; use App\Traits\HasDateTimeFormatter;
use EloquentFilter\Filterable; use EloquentFilter\Filterable;
use Illuminate\Database\Eloquent\Model;
/** /**
* 审核申请 * 审核申请
*/ */
class WorkflowCheck extends Model class WorkflowCheck extends Model
{ {
use HasDateTimeFormatter, Filterable; use Filterable, HasDateTimeFormatter;
protected $attributes = [ protected $attributes = [
'check_status' => CheckStatus::None, 'check_status' => CheckStatus::None,

View File

@ -31,6 +31,7 @@ class AppServiceProvider extends ServiceProvider
Relation::enforceMorphMap( Relation::enforceMorphMap(
collect([ collect([
\App\Models\AdminUser::class, \App\Models\AdminUser::class,
\App\Models\Employee::class,
\App\Models\EmployeeSignRepair::class, \App\Models\EmployeeSignRepair::class,
\App\Models\HolidayApply::class, \App\Models\HolidayApply::class,
\App\Models\OvertimeApply::class, \App\Models\OvertimeApply::class,

View File

@ -28,7 +28,7 @@ trait HasCheckActions
->label('取消审核') ->label('取消审核')
->level('link') ->level('link')
->api(amisMake()->BaseApi()->url(admin_url('api/workflow/cancel'))->method('post')->data([ ->api(amisMake()->BaseApi()->url(admin_url('api/workflow/cancel'))->method('post')->data([
'id' => '${workflow.id}' 'id' => '${workflow.id}',
])) ]))
->confirmText(__('admin.confirm')) ->confirmText(__('admin.confirm'))
->visibleOn('${workflow.check_status == '.CheckStatus::Processing->value.'}'); ->visibleOn('${workflow.check_status == '.CheckStatus::Processing->value.'}');
@ -40,7 +40,7 @@ trait HasCheckActions
->AjaxAction() ->AjaxAction()
->label('审核通过') ->label('审核通过')
->level('link') ->level('link')
->api('post:' . admin_url('api/workflow/success?id=${id}')) ->api('post:'.admin_url('api/workflow/success?id=${id}'))
->confirmText(__('admin.confirm')) ->confirmText(__('admin.confirm'))
->visibleOn('${workflow.check_status == '.CheckStatus::Processing->value.'}'); ->visibleOn('${workflow.check_status == '.CheckStatus::Processing->value.'}');
} }

View File

@ -2,9 +2,7 @@
namespace App\Traits; namespace App\Traits;
use App\Enums\CheckStatus; use App\Models\WorkflowCheck;
use App\Models\{WorkflowCheck, Employee};
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Str; use Illuminate\Support\Str;
trait HasCheckable trait HasCheckable

View File

@ -15,7 +15,7 @@ if (! function_exists('trim_zeros')) {
$pos = strpos($var, '.'); $pos = strpos($var, '.');
if ($pos !== false) { if ($pos !== false) {
if ($pos === 0) { if ($pos === 0) {
$var = "0".$var; $var = '0'.$var;
} }
$var = rtrim(rtrim($var, '0'), '.'); $var = rtrim(rtrim($var, '0'), '.');
} }

View File

@ -2,19 +2,19 @@
return [ return [
// 应用名称 // 应用名称
'name' => 'Owl Admin', 'name' => 'Owl Admin',
// 应用 logo // 应用 logo
'logo' => '/admin-assets/logo.png', 'logo' => '/admin-assets/logo.png',
// 默认头像 // 默认头像
'default_avatar' => '/admin-assets/default-avatar.png', 'default_avatar' => '/admin-assets/default-avatar.png',
// 应用安装目录 // 应用安装目录
'directory' => app_path('Admin'), 'directory' => app_path('Admin'),
// 引导文件 // 引导文件
'bootstrap' => app_path('Admin/bootstrap.php'), 'bootstrap' => app_path('Admin/bootstrap.php'),
// 应用路由 // 应用路由
'route' => [ 'route' => [
@ -36,27 +36,27 @@ return [
'auth' => [ 'auth' => [
// 是否开启验证码 // 是否开启验证码
'login_captcha' => env('ADMIN_LOGIN_CAPTCHA', true), 'login_captcha' => env('ADMIN_LOGIN_CAPTCHA', true),
// 是否开启认证 // 是否开启认证
'enable' => true, 'enable' => true,
// 是否开启鉴权 // 是否开启鉴权
'permission' => true, 'permission' => true,
// token 有效期 (分钟), 为空则不会过期 // token 有效期 (分钟), 为空则不会过期
'token_expiration' => null, 'token_expiration' => null,
'guard' => 'admin', 'guard' => 'admin',
'guards' => [ 'guards' => [
'admin' => [ 'admin' => [
'driver' => 'sanctum', 'driver' => 'sanctum',
'provider' => 'admin', 'provider' => 'admin',
], ],
], ],
'providers' => [ 'providers' => [
'admin' => [ 'admin' => [
'driver' => 'eloquent', 'driver' => 'eloquent',
'model' => \App\Models\AdminUser::class, 'model' => \App\Models\AdminUser::class,
], ],
], ],
'except' => [ 'except' => [
], ],
], ],
@ -66,40 +66,40 @@ return [
// 文件上传目录 // 文件上传目录
'directory' => [ 'directory' => [
'image' => 'images', 'image' => 'images',
'file' => 'files', 'file' => 'files',
'rich' => 'rich', 'rich' => 'rich',
], ],
// 临时目录 // 临时目录
'tem_directory' => [ 'tem_directory' => [
'image' => 'temporary/images', 'image' => 'temporary/images',
'file' => 'temporary/file', 'file' => 'temporary/file',
'rich' => 'temporary/rich', 'rich' => 'temporary/rich',
] ],
], ],
'https' => env('ADMIN_HTTPS', false), 'https' => env('ADMIN_HTTPS', false),
// 是否显示 [开发者工具] // 是否显示 [开发者工具]
'show_development_tools' => env('ADMIN_SHOW_DEVELOPMENT_TOOLS', true), 'show_development_tools' => env('ADMIN_SHOW_DEVELOPMENT_TOOLS', true),
// 是否显示 [权限] 功能中的自动生成按钮 // 是否显示 [权限] 功能中的自动生成按钮
'show_auto_generate_permission_button' => env('ADMIN_SHOW_AUTO_GENERATE_PERMISSION_BUTTON', true), 'show_auto_generate_permission_button' => env('ADMIN_SHOW_AUTO_GENERATE_PERMISSION_BUTTON', true),
// 扩展 // 扩展
'extension' => [ 'extension' => [
'dir' => base_path('extensions'), 'dir' => base_path('extensions'),
], ],
'layout' => [ 'layout' => [
// 浏览器标题, 功能名称使用 %title% 代替 // 浏览器标题, 功能名称使用 %title% 代替
'title' => '%title% | OwlAdmin', 'title' => '%title% | OwlAdmin',
'header' => [ 'header' => [
// 是否显示 [刷新] 按钮 // 是否显示 [刷新] 按钮
'refresh' => true, 'refresh' => true,
// 是否显示 [暗色模式] 按钮 // 是否显示 [暗色模式] 按钮
'dark' => true, 'dark' => true,
// 是否显示 [全屏] 按钮 // 是否显示 [全屏] 按钮
'full_screen' => true, 'full_screen' => true,
// 是否显示 [主题配置] 按钮 // 是否显示 [主题配置] 按钮
'theme_config' => true, 'theme_config' => true,
], ],
@ -114,7 +114,7 @@ return [
*/ */
'keep_alive_exclude' => [], 'keep_alive_exclude' => [],
// 底部信息 // 底部信息
'footer' => '<a href="https://github.com/slowlyo/owl-admin" target="_blank">Owl Admin</a>', 'footer' => '<a href="https://github.com/slowlyo/owl-admin" target="_blank">Owl Admin</a>',
], ],
'database' => [ 'database' => [

View File

@ -38,7 +38,12 @@ return [
'guards' => [ 'guards' => [
'web' => [ 'web' => [
'driver' => 'session', 'driver' => 'session',
'provider' => 'users', 'provider' => 'admin_users',
],
'api' => [
'driver' => 'sanctum',
'provider' => 'employees',
], ],
], ],
@ -60,9 +65,14 @@ return [
*/ */
'providers' => [ 'providers' => [
'users' => [ 'admin_users' => [
'driver' => 'eloquent', 'driver' => 'eloquent',
'model' => App\Models\User::class, 'model' => App\Models\AdminUser::class,
],
'employees' => [
'driver' => 'eloquent',
'model' => App\Models\Employee::class,
], ],
// 'users' => [ // 'users' => [

View File

@ -3,10 +3,8 @@
namespace Database\Factories; namespace Database\Factories;
use App\Enums\ComplaintStatus; use App\Enums\ComplaintStatus;
use App\Models\Employee;
use App\Models\Complaint; use App\Models\Complaint;
use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Arr;
/** /**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Complaint> * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Complaint>

View File

@ -30,6 +30,7 @@ class EmployeeFactory extends Factory
'password' => AdminUser::where('id', 1)->value('password'), 'password' => AdminUser::where('id', 1)->value('password'),
'name' => $name, 'name' => $name,
]); ]);
return [ return [
'name' => $name, 'name' => $name,
'phone' => $phone, 'phone' => $phone,

View File

@ -2,10 +2,11 @@
namespace Database\Factories; namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory; use App\Enums\SignTime;
use App\Models\EmployeeSignLog; use App\Enums\SignType;
use App\Models\Employee; use App\Models\Employee;
use App\Enums\{SignType, SignTime}; use App\Models\EmployeeSignLog;
use Illuminate\Database\Eloquent\Factories\Factory;
/** /**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\EmployeeSign> * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\EmployeeSign>
@ -13,6 +14,7 @@ use App\Enums\{SignType, SignTime};
class EmployeeSignLogFactory extends Factory class EmployeeSignLogFactory extends Factory
{ {
protected $model = EmployeeSignLog::class; protected $model = EmployeeSignLog::class;
/** /**
* Define the model's default state. * Define the model's default state.
* *
@ -23,6 +25,7 @@ class EmployeeSignLogFactory extends Factory
$employee = Employee::where('store_id', '>', 0)->inRandomOrder()->first(); $employee = Employee::where('store_id', '>', 0)->inRandomOrder()->first();
$type = $this->faker->randomElement([SignType::Normal, SignType::Outside]); $type = $this->faker->randomElement([SignType::Normal, SignType::Outside]);
$time = $this->faker->randomElement(SignTime::class); $time = $this->faker->randomElement(SignTime::class);
return [ return [
'store_id' => $employee->store_id, 'store_id' => $employee->store_id,
'employee_id' => $employee->id, 'employee_id' => $employee->id,
@ -30,7 +33,7 @@ class EmployeeSignLogFactory extends Factory
'sign_time' => $time, 'sign_time' => $time,
'remarks' => $type == SignType::Outside ? '我在外面的' : '', 'remarks' => $type == SignType::Outside ? '我在外面的' : '',
'position' => ['province' => '重庆', 'city' => '重庆市', 'address' => '重庆市南川区东城街道办事处东环路三号'], 'position' => ['province' => '重庆', 'city' => '重庆市', 'address' => '重庆市南川区东城街道办事处东环路三号'],
'time' => $this->faker->dateTimeBetween('-7 days', 'now') 'time' => $this->faker->dateTimeBetween('-7 days', 'now'),
]; ];
} }
} }

View File

@ -2,10 +2,8 @@
namespace Database\Factories; namespace Database\Factories;
use App\Models\Employee;
use App\Models\Feedback; use App\Models\Feedback;
use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Arr;
/** /**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Feedback> * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Feedback>

View File

@ -22,6 +22,7 @@ class StoreFactory extends Factory
public function definition(): array public function definition(): array
{ {
$master = Employee::where('store_id', 0)->inRandomOrder()->first(); $master = Employee::where('store_id', 0)->inRandomOrder()->first();
return [ return [
'title' => $this->faker->word(), 'title' => $this->faker->word(),
'master_id' => $master->id, 'master_id' => $master->id,

View File

@ -1,9 +1,9 @@
<?php <?php
use App\Enums\CheckStatus;
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
use App\Enums\CheckStatus;
return new class extends Migration return new class extends Migration
{ {

View File

@ -4,7 +4,6 @@ use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
return new class extends Migration return new class extends Migration
{ {
/** /**

View File

@ -18,6 +18,7 @@ return new class extends Migration
$table->text('result')->nullable()->comment('处理结果'); $table->text('result')->nullable()->comment('处理结果');
$table->boolean('anonymous')->default(false)->comment('是否匿名'); $table->boolean('anonymous')->default(false)->comment('是否匿名');
$table->tinyInteger('complaint_status')->default(1)->comment('1: 未处理, 2 处理中, 3 已处理'); $table->tinyInteger('complaint_status')->default(1)->comment('1: 未处理, 2 处理中, 3 已处理');
$table->text('photos')->nullable()->comment('证明材料');
$table->timestamps(); $table->timestamps();
}); });
} }

View File

@ -169,7 +169,7 @@ class AdminPermissionSeeder extends Seeder
'name' => '举报投诉', 'name' => '举报投诉',
'icon' => 'pixelarticons:list-box', 'icon' => 'pixelarticons:list-box',
'uri' => '/complaint/complaints', 'uri' => '/complaint/complaints',
'resource' => ['list'], 'resource' => ['list', 'view'],
'children' => [ 'children' => [
'start' => '开始', 'start' => '开始',
'complete' => '完成', 'complete' => '完成',

View File

@ -3,8 +3,9 @@
namespace Database\Seeders; namespace Database\Seeders;
use App\Models\Employee; use App\Models\Employee;
use App\Models\EmployeeSign;
use App\Models\EmployeeSignLog;
use App\Models\Store; use App\Models\Store;
use App\Models\{EmployeeSign, EmployeeSignLog};
use Database\Factories\EmployeeFactory; use Database\Factories\EmployeeFactory;
use Illuminate\Database\Seeder; use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
@ -19,7 +20,7 @@ class EmployeeSeeder extends Seeder
// DB::table('employee_jobs')->truncate(); // DB::table('employee_jobs')->truncate();
// Employee::where('admin_user_id', '!=', 1)->delete(); // Employee::where('admin_user_id', '!=', 1)->delete();
// (new EmployeeFactory)->count(100)->create(); // (new EmployeeFactory)->count(100)->create();
// Store::truncate(); // Store::truncate();
// Store::factory()->count(10)->create(); // Store::factory()->count(10)->create();

View File

@ -14,7 +14,7 @@ class WorkflowSeeder extends Seeder
{ {
$now = now(); $now = now();
$config = json_encode([ $config = json_encode([
["sort" => 1, "type" => "user", "user" => 1, "title" => "员工", "value" => 1, "subTitle" => "Admin"], ['sort' => 1, 'type' => 'user', 'user' => 1, 'title' => '员工', 'value' => 1, 'subTitle' => 'Admin'],
]); ]);
Workflow::truncate(); Workflow::truncate();
Workflow::insert([ Workflow::insert([

View File

@ -10,6 +10,7 @@ return [
'created_at' => '投诉时间', 'created_at' => '投诉时间',
'start' => '开始', 'start' => '开始',
'complete' => '完成', 'complete' => '完成',
'photos' => '证明材料',
], ],
'feedback' => [ 'feedback' => [

View File

@ -1,19 +1,21 @@
<?php <?php
use Illuminate\Http\Request; use App\Http\Controllers\Api\Auth\AccessTokenController;
use App\Http\Controllers\Api\ComplaintController;
use App\Http\Controllers\Api\FeedbackController;
use App\Http\Controllers\Api\LotteryTypeController;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
/* Route::post('/auth/login', [AccessTokenController::class, 'store']);
|-------------------------------------------------------------------------- Route::delete('/auth/logout', [AccessTokenController::class, 'destroy']);
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "api" middleware group. Make something great!
|
*/
Route::middleware('auth:sanctum')->get('/user', function (Request $request) { Route::group([
return $request->user(); 'middleware' => ['auth:api'],
], function () {
// 彩种类型
Route::get('lottery-types', [LotteryTypeController::class, 'index']);
// 举报投诉
Route::post('complaints', [ComplaintController::class, 'store']);
// 意见箱
Route::post('feedback', [FeedbackController::class, 'store']);
}); });