Compare commits
11
Commits
1080f6bd2c
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c778639f05 | ||
|
|
a29faa3b47 | ||
|
|
a163ac1766 | ||
|
|
d104286a37 | ||
|
|
f97fe4d9d3 | ||
|
|
893191880f | ||
|
|
d3f3076db8 | ||
|
|
5474ebe96c | ||
|
|
21d70c40c6 | ||
|
|
2327209e95 | ||
|
|
1141486129 |
@@ -25,3 +25,4 @@ docker/redis/data/
|
|||||||
|
|
||||||
# Logs
|
# Logs
|
||||||
*.log
|
*.log
|
||||||
|
.ace-tool/
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class CareExceptionController extends Controller
|
|||||||
$query = CareException::query()->with(['profile.customer', 'reporter', 'handler']);
|
$query = CareException::query()->with(['profile.customer', 'reporter', 'handler']);
|
||||||
$query->when($request->care_profile_id, fn($q, $v) => $q->where('care_profile_id', $v));
|
$query->when($request->care_profile_id, fn($q, $v) => $q->where('care_profile_id', $v));
|
||||||
$query->when($request->level, fn($q, $v) => $q->where('level', $v));
|
$query->when($request->level, fn($q, $v) => $q->where('level', $v));
|
||||||
$query->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
$query->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
|
|
||||||
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ class CarePlanController extends Controller
|
|||||||
$query->when($request->care_profile_id, fn($q, $v) => $q->where('care_profile_id', $v));
|
$query->when($request->care_profile_id, fn($q, $v) => $q->where('care_profile_id', $v));
|
||||||
$query->when($request->plan_date, fn($q, $v) => $q->whereDate('plan_date', $v));
|
$query->when($request->plan_date, fn($q, $v) => $q->whereDate('plan_date', $v));
|
||||||
$query->when($request->nurse_id, fn($q, $v) => $q->where('nurse_id', $v));
|
$query->when($request->nurse_id, fn($q, $v) => $q->where('nurse_id', $v));
|
||||||
$query->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
$query->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
|
|
||||||
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class ChannelController extends Controller
|
|||||||
$query = Channel::query();
|
$query = Channel::query();
|
||||||
$query->when($request->name, fn($q, $v) => $q->where('name', 'like', "%{$v}%"));
|
$query->when($request->name, fn($q, $v) => $q->where('name', 'like', "%{$v}%"));
|
||||||
$query->when($request->type, fn($q, $v) => $q->where('type', $v));
|
$query->when($request->type, fn($q, $v) => $q->where('type', $v));
|
||||||
$query->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
$query->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
|
|
||||||
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class ComplaintController extends Controller
|
|||||||
$query = Complaint::query()->with(['customer', 'handler']);
|
$query = Complaint::query()->with(['customer', 'handler']);
|
||||||
$query->when($request->customer_id, fn($q, $v) => $q->where('customer_id', $v));
|
$query->when($request->customer_id, fn($q, $v) => $q->where('customer_id', $v));
|
||||||
$query->when($request->type, fn($q, $v) => $q->where('type', $v));
|
$query->when($request->type, fn($q, $v) => $q->where('type', $v));
|
||||||
$query->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
$query->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
|
|
||||||
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class ContractController extends Controller
|
|||||||
$query = Contract::query()->with(['customer', 'auditor']);
|
$query = Contract::query()->with(['customer', 'auditor']);
|
||||||
$query->when($request->contract_no, fn($q, $v) => $q->where('contract_no', 'like', "%{$v}%"));
|
$query->when($request->contract_no, fn($q, $v) => $q->where('contract_no', 'like', "%{$v}%"));
|
||||||
$query->when($request->customer_id, fn($q, $v) => $q->where('customer_id', $v));
|
$query->when($request->customer_id, fn($q, $v) => $q->where('customer_id', $v));
|
||||||
$query->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
$query->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
|
|
||||||
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ class QuestionnaireController extends Controller
|
|||||||
$query = QuestionnaireTemplate::query();
|
$query = QuestionnaireTemplate::query();
|
||||||
$query->when($request->title, fn($q, $v) => $q->where('title', 'like', "%{$v}%"));
|
$query->when($request->title, fn($q, $v) => $q->where('title', 'like', "%{$v}%"));
|
||||||
$query->when($request->type, fn($q, $v) => $q->where('type', $v));
|
$query->when($request->type, fn($q, $v) => $q->where('type', $v));
|
||||||
$query->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
$query->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
|
|
||||||
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class FinanceCategoryController extends Controller
|
|||||||
{
|
{
|
||||||
$query = FinanceCategory::query();
|
$query = FinanceCategory::query();
|
||||||
$query->when($request->type, fn($q, $v) => $q->where('type', $v));
|
$query->when($request->type, fn($q, $v) => $q->where('type', $v));
|
||||||
$query->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
$query->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
|
|
||||||
$categories = $query->orderBy('sort')->get();
|
$categories = $query->orderBy('sort')->get();
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class FinanceRecordController extends Controller
|
|||||||
$query = FinanceRecord::query()->with(['category']);
|
$query = FinanceRecord::query()->with(['category']);
|
||||||
$query->when($request->type, fn($q, $v) => $q->where('type', $v));
|
$query->when($request->type, fn($q, $v) => $q->where('type', $v));
|
||||||
$query->when($request->category_id, fn($q, $v) => $q->where('category_id', $v));
|
$query->when($request->category_id, fn($q, $v) => $q->where('category_id', $v));
|
||||||
$query->when($request->has('audit_status'), fn($q) => $q->where('audit_status', $request->audit_status));
|
$query->when($request->filled('audit_status'), fn($q) => $q->where('audit_status', $request->audit_status));
|
||||||
$query->when($request->start_date, fn($q, $v) => $q->where('record_date', '>=', $v));
|
$query->when($request->start_date, fn($q, $v) => $q->where('record_date', '>=', $v));
|
||||||
$query->when($request->end_date, fn($q, $v) => $q->where('record_date', '<=', $v));
|
$query->when($request->end_date, fn($q, $v) => $q->where('record_date', '<=', $v));
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class InvoiceController extends Controller
|
|||||||
$query = Invoice::query()->with(['customer']);
|
$query = Invoice::query()->with(['customer']);
|
||||||
$query->when($request->invoice_no, fn($q, $v) => $q->where('invoice_no', 'like', "%{$v}%"));
|
$query->when($request->invoice_no, fn($q, $v) => $q->where('invoice_no', 'like', "%{$v}%"));
|
||||||
$query->when($request->customer_id, fn($q, $v) => $q->where('customer_id', $v));
|
$query->when($request->customer_id, fn($q, $v) => $q->where('customer_id', $v));
|
||||||
$query->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
$query->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
$query->when($request->type, fn($q, $v) => $q->where('type', $v));
|
$query->when($request->type, fn($q, $v) => $q->where('type', $v));
|
||||||
|
|
||||||
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class PrepaidCardController extends Controller
|
|||||||
{
|
{
|
||||||
$query = PrepaidCard::query();
|
$query = PrepaidCard::query();
|
||||||
$query->when($request->name, fn($q, $v) => $q->where('name', 'like', "%{$v}%"));
|
$query->when($request->name, fn($q, $v) => $q->where('name', 'like', "%{$v}%"));
|
||||||
$query->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
$query->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
|
|
||||||
return $this->paginate($query->orderBy('sort')->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->orderBy('sort')->paginate($request->input('per_page', 15)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ class AttendanceRecordController extends Controller
|
|||||||
$query->when($request->user_id, fn($q, $v) => $q->where('user_id', $v));
|
$query->when($request->user_id, fn($q, $v) => $q->where('user_id', $v));
|
||||||
$query->when($request->start_date, fn($q, $v) => $q->where('attendance_date', '>=', $v));
|
$query->when($request->start_date, fn($q, $v) => $q->where('attendance_date', '>=', $v));
|
||||||
$query->when($request->end_date, fn($q, $v) => $q->where('attendance_date', '<=', $v));
|
$query->when($request->end_date, fn($q, $v) => $q->where('attendance_date', '<=', $v));
|
||||||
$query->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
$query->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
|
|
||||||
return $this->paginate($query->latest('attendance_date')->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->latest('attendance_date')->paginate($request->input('per_page', 15)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class EmployeeProfileController extends Controller
|
|||||||
{
|
{
|
||||||
$query = EmployeeProfile::query()->with('user');
|
$query = EmployeeProfile::query()->with('user');
|
||||||
$query->when($request->user_id, fn($q, $v) => $q->where('user_id', $v));
|
$query->when($request->user_id, fn($q, $v) => $q->where('user_id', $v));
|
||||||
$query->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
$query->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
|
|
||||||
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class LeaveRequestController extends Controller
|
|||||||
$query = LeaveRequest::query()->with('user');
|
$query = LeaveRequest::query()->with('user');
|
||||||
$query->when($request->user_id, fn($q, $v) => $q->where('user_id', $v));
|
$query->when($request->user_id, fn($q, $v) => $q->where('user_id', $v));
|
||||||
$query->when($request->type, fn($q, $v) => $q->where('type', $v));
|
$query->when($request->type, fn($q, $v) => $q->where('type', $v));
|
||||||
$query->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
$query->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
|
|
||||||
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class SalaryRecordController extends Controller
|
|||||||
$query = SalaryRecord::query()->with('user');
|
$query = SalaryRecord::query()->with('user');
|
||||||
$query->when($request->user_id, fn($q, $v) => $q->where('user_id', $v));
|
$query->when($request->user_id, fn($q, $v) => $q->where('user_id', $v));
|
||||||
$query->when($request->year_month, fn($q, $v) => $q->where('year_month', $v));
|
$query->when($request->year_month, fn($q, $v) => $q->where('year_month', $v));
|
||||||
$query->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
$query->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
|
|
||||||
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class InventoryCheckController extends Controller
|
|||||||
$query = InventoryCheck::query()
|
$query = InventoryCheck::query()
|
||||||
->with(['warehouse', 'operator'])
|
->with(['warehouse', 'operator'])
|
||||||
->when($request->warehouse_id, fn($q, $v) => $q->where('warehouse_id', $v))
|
->when($request->warehouse_id, fn($q, $v) => $q->where('warehouse_id', $v))
|
||||||
->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
|
|
||||||
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ class PurchaseOrderController extends Controller
|
|||||||
$query = PurchaseOrder::query()->with(['supplier','auditor']);
|
$query = PurchaseOrder::query()->with(['supplier','auditor']);
|
||||||
$query->when($request->order_no, fn($q, $v) => $q->where('order_no', 'like', "%{$v}%"));
|
$query->when($request->order_no, fn($q, $v) => $q->where('order_no', 'like', "%{$v}%"));
|
||||||
$query->when($request->supplier_id, fn($q, $v) => $q->where('supplier_id', $v));
|
$query->when($request->supplier_id, fn($q, $v) => $q->where('supplier_id', $v));
|
||||||
$query->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
$query->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
||||||
}
|
}
|
||||||
public function store(Request $request): JsonResponse
|
public function store(Request $request): JsonResponse
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class StockMovementController extends Controller
|
|||||||
$query = StockMovement::query()->with('warehouse');
|
$query = StockMovement::query()->with('warehouse');
|
||||||
$query->when($request->warehouse_id, fn($q, $v) => $q->where('warehouse_id', $v));
|
$query->when($request->warehouse_id, fn($q, $v) => $q->where('warehouse_id', $v));
|
||||||
$query->when($request->type, fn($q, $v) => $q->where('type', $v));
|
$query->when($request->type, fn($q, $v) => $q->where('type', $v));
|
||||||
$query->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
$query->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
||||||
}
|
}
|
||||||
public function store(Request $request): JsonResponse
|
public function store(Request $request): JsonResponse
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class TransferOrderController extends Controller
|
|||||||
$query = TransferOrder::query()
|
$query = TransferOrder::query()
|
||||||
->with(['fromWarehouse', 'toWarehouse', 'operator'])
|
->with(['fromWarehouse', 'toWarehouse', 'operator'])
|
||||||
->when($request->transfer_no, fn($q, $v) => $q->where('transfer_no', 'like', "%{$v}%"))
|
->when($request->transfer_no, fn($q, $v) => $q->where('transfer_no', 'like', "%{$v}%"))
|
||||||
->when($request->has('status'), fn($q) => $q->where('status', $request->status))
|
->when($request->filled('status'), fn($q) => $q->where('status', $request->status))
|
||||||
->when($request->from_warehouse_id, fn($q, $v) => $q->where('from_warehouse_id', $v));
|
->when($request->from_warehouse_id, fn($q, $v) => $q->where('from_warehouse_id', $v));
|
||||||
|
|
||||||
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ class DailyMealPlanController extends Controller
|
|||||||
$query->when($request->customer_id, fn($q, $v) => $q->where('customer_id', $v));
|
$query->when($request->customer_id, fn($q, $v) => $q->where('customer_id', $v));
|
||||||
$query->when($request->plan_date, fn($q, $v) => $q->whereDate('plan_date', $v));
|
$query->when($request->plan_date, fn($q, $v) => $q->whereDate('plan_date', $v));
|
||||||
$query->when($request->meal_type, fn($q, $v) => $q->where('meal_type', $v));
|
$query->when($request->meal_type, fn($q, $v) => $q->where('meal_type', $v));
|
||||||
$query->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
$query->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
|
|
||||||
return $this->paginate($query->latest()->paginate($request->input('per_page', 30)));
|
return $this->paginate($query->latest()->paginate($request->input('per_page', 30)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class DishController extends Controller
|
|||||||
$query = Dish::query();
|
$query = Dish::query();
|
||||||
$query->when($request->name, fn($q, $v) => $q->where('name', 'like', "%{$v}%"));
|
$query->when($request->name, fn($q, $v) => $q->where('name', 'like', "%{$v}%"));
|
||||||
$query->when($request->category, fn($q, $v) => $q->where('category', $v));
|
$query->when($request->category, fn($q, $v) => $q->where('category', $v));
|
||||||
$query->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
$query->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
|
|
||||||
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class MealPlanTemplateController extends Controller
|
|||||||
$query = MealPlanTemplate::query();
|
$query = MealPlanTemplate::query();
|
||||||
$query->when($request->name, fn($q, $v) => $q->where('name', 'like', "%{$v}%"));
|
$query->when($request->name, fn($q, $v) => $q->where('name', 'like', "%{$v}%"));
|
||||||
$query->when($request->stage, fn($q, $v) => $q->where('stage', $v));
|
$query->when($request->stage, fn($q, $v) => $q->where('stage', $v));
|
||||||
$query->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
$query->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
|
|
||||||
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ class NannyOrderController extends Controller
|
|||||||
$query = NannyOrder::query()->with(['customer','nanny']);
|
$query = NannyOrder::query()->with(['customer','nanny']);
|
||||||
$query->when($request->customer_id, fn($q, $v) => $q->where('customer_id', $v));
|
$query->when($request->customer_id, fn($q, $v) => $q->where('customer_id', $v));
|
||||||
$query->when($request->nanny_id, fn($q, $v) => $q->where('nanny_id', $v));
|
$query->when($request->nanny_id, fn($q, $v) => $q->where('nanny_id', $v));
|
||||||
$query->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
$query->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ class ApprovalController extends Controller
|
|||||||
public function index(Request $request): JsonResponse
|
public function index(Request $request): JsonResponse
|
||||||
{
|
{
|
||||||
$query = Approval::query()->with(['template', 'applicant']);
|
$query = Approval::query()->with(['template', 'applicant']);
|
||||||
$query->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
$query->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
$query->when($request->applicant_id, fn($q, $v) => $q->where('applicant_id', $v));
|
$query->when($request->applicant_id, fn($q, $v) => $q->where('applicant_id', $v));
|
||||||
|
|
||||||
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class ApprovalTemplateController extends Controller
|
|||||||
{
|
{
|
||||||
$query = ApprovalTemplate::query();
|
$query = ApprovalTemplate::query();
|
||||||
$query->when($request->type, fn($q, $v) => $q->where('type', $v));
|
$query->when($request->type, fn($q, $v) => $q->where('type', $v));
|
||||||
$query->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
$query->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
|
|
||||||
return $this->paginate($query->orderBy('sort')->latest()->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->orderBy('sort')->latest()->paginate($request->input('per_page', 15)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ class ReservationController extends Controller
|
|||||||
$query = Reservation::query()->with(['customer', 'room.roomType']);
|
$query = Reservation::query()->with(['customer', 'room.roomType']);
|
||||||
$query->when($request->customer_id, fn($q, $v) => $q->where('customer_id', $v));
|
$query->when($request->customer_id, fn($q, $v) => $q->where('customer_id', $v));
|
||||||
$query->when($request->room_id, fn($q, $v) => $q->where('room_id', $v));
|
$query->when($request->room_id, fn($q, $v) => $q->where('room_id', $v));
|
||||||
$query->when($request->status, fn($q, $v) => $q->where('status', $v));
|
$query->when($request->filled('status'), fn($q, $v) => $q->where('status', $v));
|
||||||
$query->when($request->check_in_date, fn($q, $v) => $q->whereDate('check_in_date', $v));
|
$query->when($request->check_in_date, fn($q, $v) => $q->whereDate('check_in_date', $v));
|
||||||
|
|
||||||
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class RoomTypeController extends Controller
|
|||||||
{
|
{
|
||||||
$query = RoomType::query()->withCount('rooms');
|
$query = RoomType::query()->withCount('rooms');
|
||||||
$query->when($request->name, fn($q, $v) => $q->where('name', 'like', "%{$v}%"));
|
$query->when($request->name, fn($q, $v) => $q->where('name', 'like', "%{$v}%"));
|
||||||
$query->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
$query->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
|
|
||||||
return $this->paginate($query->orderBy('sort')->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->orderBy('sort')->paginate($request->input('per_page', 15)));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ class ServiceExecutionController extends Controller
|
|||||||
$query = ServiceExecution::query()->with(['order','serviceItem','customer','technician']);
|
$query = ServiceExecution::query()->with(['order','serviceItem','customer','technician']);
|
||||||
$query->when($request->service_order_id, fn($q, $v) => $q->where('service_order_id', $v));
|
$query->when($request->service_order_id, fn($q, $v) => $q->where('service_order_id', $v));
|
||||||
$query->when($request->technician_id, fn($q, $v) => $q->where('technician_id', $v));
|
$query->when($request->technician_id, fn($q, $v) => $q->where('technician_id', $v));
|
||||||
$query->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
$query->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ class ServiceItemController extends Controller
|
|||||||
$query = ServiceItem::query();
|
$query = ServiceItem::query();
|
||||||
$query->when($request->name, fn($q, $v) => $q->where('name', 'like', "%{$v}%"));
|
$query->when($request->name, fn($q, $v) => $q->where('name', 'like', "%{$v}%"));
|
||||||
$query->when($request->category, fn($q, $v) => $q->where('category', $v));
|
$query->when($request->category, fn($q, $v) => $q->where('category', $v));
|
||||||
$query->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
$query->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class ServiceOrderController extends Controller
|
|||||||
$query->when($request->order_no, fn($q, $v) => $q->where('order_no', 'like', "%{$v}%"));
|
$query->when($request->order_no, fn($q, $v) => $q->where('order_no', 'like', "%{$v}%"));
|
||||||
$query->when($request->customer_id, fn($q, $v) => $q->where('customer_id', $v));
|
$query->when($request->customer_id, fn($q, $v) => $q->where('customer_id', $v));
|
||||||
$query->when($request->type, fn($q, $v) => $q->where('type', $v));
|
$query->when($request->type, fn($q, $v) => $q->where('type', $v));
|
||||||
$query->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
$query->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ class ServicePackageController extends Controller
|
|||||||
{
|
{
|
||||||
$query = ServicePackage::query();
|
$query = ServicePackage::query();
|
||||||
$query->when($request->name, fn($q, $v) => $q->where('name', 'like', "%{$v}%"));
|
$query->when($request->name, fn($q, $v) => $q->where('name', 'like', "%{$v}%"));
|
||||||
$query->when($request->has('status'), fn($q) => $q->where('status', $request->status));
|
$query->when($request->filled('status'), fn($q) => $q->where('status', $request->status));
|
||||||
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
return $this->paginate($query->latest()->paginate($request->input('per_page', 15)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class RegistrationPackageController extends Controller
|
|||||||
{
|
{
|
||||||
$packages = RegistrationPackage::when($request->keyword, fn($q) =>
|
$packages = RegistrationPackage::when($request->keyword, fn($q) =>
|
||||||
$q->where('name', 'like', "%{$request->keyword}%"))
|
$q->where('name', 'like', "%{$request->keyword}%"))
|
||||||
->when($request->has('status'), fn($q) =>
|
->when($request->filled('status'), fn($q) =>
|
||||||
$q->where('status', $request->status))
|
$q->where('status', $request->status))
|
||||||
->orderBy('sort')->orderByDesc('id')
|
->orderBy('sort')->orderByDesc('id')
|
||||||
->paginate($request->input('page_size', 20));
|
->paginate($request->input('page_size', 20));
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ class UserController extends Controller
|
|||||||
if ($request->department_id) {
|
if ($request->department_id) {
|
||||||
$query->where('department_id', $request->department_id);
|
$query->where('department_id', $request->department_id);
|
||||||
}
|
}
|
||||||
if ($request->has('status')) {
|
if ($request->filled('status')) {
|
||||||
$query->where('status', $request->status);
|
$query->where('status', $request->status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -80,10 +80,13 @@ class CareController extends Controller
|
|||||||
->where('care_profile_id', $profile->id);
|
->where('care_profile_id', $profile->id);
|
||||||
|
|
||||||
if ($request->filled('metric_type')) {
|
if ($request->filled('metric_type')) {
|
||||||
$query->where('metric_type', $request->input('metric_type'));
|
$query->where('metric_type', (string) $request->input('metric_type'));
|
||||||
}
|
}
|
||||||
|
|
||||||
$list = $query->orderByDesc('measured_at')->limit(30)->get();
|
$limit = (int) $request->input('limit', 30);
|
||||||
|
$limit = max(1, min($limit, 50));
|
||||||
|
|
||||||
|
$list = $query->orderByDesc('recorded_at')->limit($limit)->get();
|
||||||
|
|
||||||
return $this->success($list);
|
return $this->success($list);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ class ComplaintController extends Controller
|
|||||||
$customer = $request->user();
|
$customer = $request->user();
|
||||||
|
|
||||||
$validated = $request->validate([
|
$validated = $request->validate([
|
||||||
'type' => 'required|string|max:50',
|
'type' => 'required|integer|in:1,2,3,4',
|
||||||
'content' => 'required|string|max:1000',
|
'content' => 'required|string|max:1000',
|
||||||
'images' => 'nullable|array',
|
'images' => 'nullable|array',
|
||||||
'images.*' => 'nullable|string|max:500',
|
'images.*' => 'nullable|string|max:500',
|
||||||
@@ -44,7 +44,7 @@ class ComplaintController extends Controller
|
|||||||
$complaint = Complaint::create([
|
$complaint = Complaint::create([
|
||||||
'customer_id' => $customer->id,
|
'customer_id' => $customer->id,
|
||||||
'store_id' => $customer->store_id,
|
'store_id' => $customer->store_id,
|
||||||
'type' => $validated['type'],
|
'type' => (int) $validated['type'],
|
||||||
'content' => $validated['content'],
|
'content' => $validated['content'],
|
||||||
'images' => $validated['images'] ?? null,
|
'images' => $validated['images'] ?? null,
|
||||||
'status' => 1,
|
'status' => 1,
|
||||||
|
|||||||
@@ -20,8 +20,7 @@ class ServiceController extends Controller
|
|||||||
$customer = $request->user();
|
$customer = $request->user();
|
||||||
|
|
||||||
$query = ServiceOrder::withoutGlobalScope('store')
|
$query = ServiceOrder::withoutGlobalScope('store')
|
||||||
->where('customer_id', $customer->id)
|
->where('customer_id', $customer->id);
|
||||||
->with('package:id,name', 'item:id,name');
|
|
||||||
|
|
||||||
if ($request->filled('status')) {
|
if ($request->filled('status')) {
|
||||||
$query->where('status', (int) $request->input('status'));
|
$query->where('status', (int) $request->input('status'));
|
||||||
|
|||||||
@@ -17,7 +17,9 @@ trait BelongsToStore
|
|||||||
{
|
{
|
||||||
// 查询自动过滤门店
|
// 查询自动过滤门店
|
||||||
static::addGlobalScope('store', function (Builder $builder) {
|
static::addGlobalScope('store', function (Builder $builder) {
|
||||||
if ($storeId = self::getCurrentStoreId()) {
|
// 超管:不带 X-Store-Id 时默认“总览”(不加 store 过滤)
|
||||||
|
// 普通用户:按自身 store_id 过滤
|
||||||
|
if ($storeId = self::getQueryStoreId()) {
|
||||||
$builder->where($builder->getModel()->getTable() . '.store_id', $storeId);
|
$builder->where($builder->getModel()->getTable() . '.store_id', $storeId);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -25,7 +27,10 @@ trait BelongsToStore
|
|||||||
// 创建时自动填入 store_id
|
// 创建时自动填入 store_id
|
||||||
static::creating(function ($model) {
|
static::creating(function ($model) {
|
||||||
if (empty($model->store_id)) {
|
if (empty($model->store_id)) {
|
||||||
$model->store_id = self::getCurrentStoreId();
|
// 创建时:超管若指定 X-Store-Id 则写入该门店;否则落到自身 store_id
|
||||||
|
if ($storeId = self::getCreateStoreId()) {
|
||||||
|
$model->store_id = $storeId;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -35,12 +40,35 @@ trait BelongsToStore
|
|||||||
return $this->belongsTo(Store::class);
|
return $this->belongsTo(Store::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static function getCurrentStoreId(): ?int
|
private static function getQueryStoreId(): ?int
|
||||||
{
|
{
|
||||||
$user = auth()->user();
|
$user = auth()->user();
|
||||||
if ($user && $user->is_super && request()->header('X-Store-Id')) {
|
if (!$user) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 超管默认总览:不传 X-Store-Id 则不做门店过滤
|
||||||
|
if ($user->is_super) {
|
||||||
|
if (request()->header('X-Store-Id')) {
|
||||||
|
return (int) request()->header('X-Store-Id');
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $user?->store_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function getCreateStoreId(): ?int
|
||||||
|
{
|
||||||
|
$user = auth()->user();
|
||||||
|
if (!$user) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($user->is_super && request()->header('X-Store-Id')) {
|
||||||
return (int) request()->header('X-Store-Id');
|
return (int) request()->header('X-Store-Id');
|
||||||
}
|
}
|
||||||
|
|
||||||
return $user?->store_id;
|
return $user?->store_id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ export const mealApi = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const accountApi = {
|
export const accountApi = {
|
||||||
index: () => clientRequest.get('/account/'),
|
index: () => clientRequest.get('/account'),
|
||||||
transactions: (params) => clientRequest.get('/account/transactions', { params }),
|
transactions: (params) => clientRequest.get('/account/transactions', { params }),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ onMounted(async () => {
|
|||||||
</div>
|
</div>
|
||||||
<div class="metric-body">
|
<div class="metric-body">
|
||||||
<span class="metric-type">{{ metricTypeLabel[m.metric_type] || '指标' }}</span>
|
<span class="metric-type">{{ metricTypeLabel[m.metric_type] || '指标' }}</span>
|
||||||
<span class="metric-time">{{ m.measured_at?.slice(0, 16) }}</span>
|
<span class="metric-time">{{ m.recorded_at?.slice(0, 16) }}</span>
|
||||||
</div>
|
</div>
|
||||||
<span class="metric-val" :style="{ color: typeColor[m.metric_type] }">
|
<span class="metric-val" :style="{ color: typeColor[m.metric_type] }">
|
||||||
{{ m.value }} {{ metricUnit[m.metric_type] || '' }}
|
{{ m.value }} {{ metricUnit[m.metric_type] || '' }}
|
||||||
|
|||||||
@@ -33,14 +33,6 @@ const checkinDays = computed(() => {
|
|||||||
return diff > 0 ? diff : null
|
return diff > 0 ? diff : null
|
||||||
})
|
})
|
||||||
|
|
||||||
const features = [
|
|
||||||
{ label: '月子餐', bg: '#fff0f4', icon: '🍲', path: '/meal' },
|
|
||||||
{ label: '护理记录', bg: '#fffbeb', icon: '📋', path: '/care/records' },
|
|
||||||
{ label: '健康档案', bg: '#f0fdf4', icon: '💊', path: '/grow' },
|
|
||||||
{ label: '服务包', bg: '#eff6ff', icon: '🛁', path: '/service/orders' },
|
|
||||||
{ label: '我的月嫂', bg: '#f5f3ff', icon: '👩', path: '/nanny' },
|
|
||||||
{ label: '账户余额', bg: '#fff7ed', icon: '💳', path: '/account' },
|
|
||||||
]
|
|
||||||
|
|
||||||
const today = new Date().toLocaleDateString('zh-CN', { year: 'numeric', month: 'long', day: 'numeric' })
|
const today = new Date().toLocaleDateString('zh-CN', { year: 'numeric', month: 'long', day: 'numeric' })
|
||||||
</script>
|
</script>
|
||||||
@@ -86,18 +78,43 @@ const today = new Date().toLocaleDateString('zh-CN', { year: 'numeric', month: '
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- ── 6 格功能入口(圆形图标 3×2) ── -->
|
<!-- ── 6 格功能入口(静态 van-icon,3×2) ── -->
|
||||||
<div class="features-row">
|
<div class="features-row">
|
||||||
<div
|
<div class="feat-item" @click="router.push('/meal')">
|
||||||
v-for="f in features"
|
<div class="feat-circle" style="background:#fff0f4">
|
||||||
:key="f.path"
|
<van-icon name="fire-o" color="#f43f5e" size="26" />
|
||||||
class="feat-item"
|
|
||||||
@click="router.push(f.path)"
|
|
||||||
>
|
|
||||||
<div class="feat-circle" :style="{ background: f.bg }">
|
|
||||||
<span class="feat-icon">{{ f.icon }}</span>
|
|
||||||
</div>
|
</div>
|
||||||
<span class="feat-label">{{ f.label }}</span>
|
<span class="feat-label">月子餐</span>
|
||||||
|
</div>
|
||||||
|
<div class="feat-item" @click="router.push('/care/records')">
|
||||||
|
<div class="feat-circle" style="background:#fffbeb">
|
||||||
|
<van-icon name="notes-o" color="#f59e0b" size="26" />
|
||||||
|
</div>
|
||||||
|
<span class="feat-label">护理记录</span>
|
||||||
|
</div>
|
||||||
|
<div class="feat-item" @click="router.push('/grow')">
|
||||||
|
<div class="feat-circle" style="background:#f0fdf4">
|
||||||
|
<van-icon name="records-o" color="#10b981" size="26" />
|
||||||
|
</div>
|
||||||
|
<span class="feat-label">健康档案</span>
|
||||||
|
</div>
|
||||||
|
<div class="feat-item" @click="router.push('/service/orders')">
|
||||||
|
<div class="feat-circle" style="background:#eff6ff">
|
||||||
|
<van-icon name="gift-o" color="#3b82f6" size="26" />
|
||||||
|
</div>
|
||||||
|
<span class="feat-label">服务包</span>
|
||||||
|
</div>
|
||||||
|
<div class="feat-item" @click="router.push('/nanny')">
|
||||||
|
<div class="feat-circle" style="background:#f5f3ff">
|
||||||
|
<van-icon name="manager-o" color="#8b5cf6" size="26" />
|
||||||
|
</div>
|
||||||
|
<span class="feat-label">我的月嫂</span>
|
||||||
|
</div>
|
||||||
|
<div class="feat-item" @click="router.push('/account')">
|
||||||
|
<div class="feat-circle" style="background:#fff7ed">
|
||||||
|
<van-icon name="balance-o" color="#f97316" size="26" />
|
||||||
|
</div>
|
||||||
|
<span class="feat-label">账户余额</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -251,14 +268,19 @@ const today = new Date().toLocaleDateString('zh-CN', { year: 'numeric', month: '
|
|||||||
padding: 18px 8px 16px;
|
padding: 18px 8px 16px;
|
||||||
box-shadow: 0 2px 12px rgba(0,0,0,0.05);
|
box-shadow: 0 2px 12px rgba(0,0,0,0.05);
|
||||||
}
|
}
|
||||||
.feat-item { display: flex; flex-direction: column; align-items: center; gap: 8px; cursor: pointer; }
|
.feat-item {
|
||||||
|
display: flex; flex-direction: column; align-items: center; gap: 8px;
|
||||||
|
cursor: pointer;
|
||||||
|
-webkit-tap-highlight-color: transparent;
|
||||||
|
}
|
||||||
|
.feat-item:active .feat-circle { transform: scale(0.92); }
|
||||||
.feat-circle {
|
.feat-circle {
|
||||||
width: 56px; height: 56px;
|
width: 56px; height: 56px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
display: flex; align-items: center; justify-content: center;
|
display: flex; align-items: center; justify-content: center;
|
||||||
box-shadow: 0 3px 10px rgba(0,0,0,0.08);
|
box-shadow: 0 3px 10px rgba(0,0,0,0.08);
|
||||||
|
transition: transform 0.15s;
|
||||||
}
|
}
|
||||||
.feat-icon { font-size: 24px; line-height: 1; }
|
|
||||||
.feat-label { font-size: 12px; font-weight: 600; color: #374151; text-align: center; }
|
.feat-label { font-size: 12px; font-weight: 600; color: #374151; text-align: center; }
|
||||||
|
|
||||||
/* ── Schedule Card ── */
|
/* ── Schedule Card ── */
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ function onCall() {
|
|||||||
<router-view />
|
<router-view />
|
||||||
<div class="tabbar">
|
<div class="tabbar">
|
||||||
<div class="tab-item" :class="{ active: active === 'home' }" @click="go('home')">
|
<div class="tab-item" :class="{ active: active === 'home' }" @click="go('home')">
|
||||||
<van-icon :name="active === 'home' ? 'home' : 'home-o'" size="23" />
|
<van-icon name="home-o" size="23" />
|
||||||
<span>首页</span>
|
<span>首页</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="tab-item" :class="{ active: active === 'meal' }" @click="go('meal')">
|
<div class="tab-item" :class="{ active: active === 'meal' }" @click="go('meal')">
|
||||||
@@ -46,7 +46,7 @@ function onCall() {
|
|||||||
<span>成长</span>
|
<span>成长</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="tab-item" :class="{ active: active === 'my' }" @click="go('my')">
|
<div class="tab-item" :class="{ active: active === 'my' }" @click="go('my')">
|
||||||
<van-icon :name="active === 'my' ? 'contact' : 'contact-o'" size="23" />
|
<van-icon name="contact-o" size="23" />
|
||||||
<span>我的</span>
|
<span>我的</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -26,12 +26,12 @@ onMounted(async () => {
|
|||||||
<!-- 现金余额 -->
|
<!-- 现金余额 -->
|
||||||
<div class="bal-card rose">
|
<div class="bal-card rose">
|
||||||
<p class="bal-label">现金余额</p>
|
<p class="bal-label">现金余额</p>
|
||||||
<p class="bal-val">¥ {{ (account.cash_balance || 0).toFixed(2) }}</p>
|
<p class="bal-val">¥ {{ Number(account.cash_balance ?? 0).toFixed(2) }}</p>
|
||||||
</div>
|
</div>
|
||||||
<!-- 储值卡余额 -->
|
<!-- 储值卡余额 -->
|
||||||
<div class="bal-card blue">
|
<div class="bal-card blue">
|
||||||
<p class="bal-label">储值卡余额</p>
|
<p class="bal-label">储值卡余额</p>
|
||||||
<p class="bal-val">¥ {{ (account.card_balance || 0).toFixed(2) }}</p>
|
<p class="bal-val">¥ {{ Number(account.card_balance ?? 0).toFixed(2) }}</p>
|
||||||
</div>
|
</div>
|
||||||
<!-- 积分 -->
|
<!-- 积分 -->
|
||||||
<div class="bal-card amber">
|
<div class="bal-card amber">
|
||||||
|
|||||||
@@ -17,8 +17,10 @@ const typeOptions = [
|
|||||||
{ text: '其他', value: '其他' },
|
{ text: '其他', value: '其他' },
|
||||||
]
|
]
|
||||||
|
|
||||||
const statusLabel = { 1: '待处理', 2: '处理中', 3: '已解决' }
|
const statusLabel = { 0: '待处理', 1: '处理中', 2: '已解决', 3: '已关闭' }
|
||||||
const statusColor = { 1: 'warning', 2: 'primary', 3: 'success' }
|
const statusColor = { 0: 'warning', 1: 'primary', 2: 'success', 3: 'default' }
|
||||||
|
|
||||||
|
const typeLabel = { 1: '服务质量', 2: '餐饮问题', 3: '环境卫生', 4: '其他' }
|
||||||
|
|
||||||
onMounted(fetchList)
|
onMounted(fetchList)
|
||||||
|
|
||||||
@@ -37,7 +39,14 @@ async function submit() {
|
|||||||
}
|
}
|
||||||
submitting.value = true
|
submitting.value = true
|
||||||
try {
|
try {
|
||||||
await complaintApi.create(form.value)
|
// 后端 complaints.type 是 tinyInteger,这里把中文选项映射为数字
|
||||||
|
const typeMap = { '服务质量': 1, '餐饮问题': 2, '环境卫生': 3, '其他': 4 }
|
||||||
|
const payload = {
|
||||||
|
...form.value,
|
||||||
|
type: typeMap[form.value.type] ?? form.value.type,
|
||||||
|
}
|
||||||
|
|
||||||
|
await complaintApi.create(payload)
|
||||||
showToast({ type: 'success', message: '提交成功' })
|
showToast({ type: 'success', message: '提交成功' })
|
||||||
showForm.value = false
|
showForm.value = false
|
||||||
form.value = { type: '', content: '' }
|
form.value = { type: '', content: '' }
|
||||||
@@ -60,7 +69,7 @@ async function submit() {
|
|||||||
<div v-else>
|
<div v-else>
|
||||||
<div v-for="item in list" :key="item.id" class="item-card">
|
<div v-for="item in list" :key="item.id" class="item-card">
|
||||||
<div class="item-header">
|
<div class="item-header">
|
||||||
<span class="item-type">{{ item.type }}</span>
|
<span class="item-type">{{ typeLabel[item.type] || '其他' }}</span>
|
||||||
<van-tag :type="statusColor[item.status] || 'default'" size="small">{{ statusLabel[item.status] || '待处理' }}</van-tag>
|
<van-tag :type="statusColor[item.status] || 'default'" size="small">{{ statusLabel[item.status] || '待处理' }}</van-tag>
|
||||||
</div>
|
</div>
|
||||||
<p class="item-content">{{ item.content }}</p>
|
<p class="item-content">{{ item.content }}</p>
|
||||||
|
|||||||
@@ -1,6 +1,30 @@
|
|||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
import { ElMessage } from 'element-plus'
|
import { ElMessage } from 'element-plus'
|
||||||
|
|
||||||
|
function normalizeParams(params) {
|
||||||
|
if (!params || typeof params !== 'object') return params
|
||||||
|
|
||||||
|
const p = { ...params }
|
||||||
|
|
||||||
|
// Normalize pagination params (some endpoints use per_page, some use page_size)
|
||||||
|
if (p.per_page !== undefined && p.per_page !== null && p.page_size === undefined) {
|
||||||
|
p.page_size = p.per_page
|
||||||
|
}
|
||||||
|
if (p.page_size !== undefined && p.page_size !== null && p.per_page === undefined) {
|
||||||
|
p.per_page = p.page_size
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove empty filters to avoid backend `has('status')` treating '' as a real filter
|
||||||
|
for (const key of Object.keys(p)) {
|
||||||
|
const v = p[key]
|
||||||
|
if (v === '' || v === null || v === undefined) {
|
||||||
|
delete p[key]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
const request = axios.create({
|
const request = axios.create({
|
||||||
baseURL: '/api/v1',
|
baseURL: '/api/v1',
|
||||||
timeout: 15000,
|
timeout: 15000,
|
||||||
@@ -17,6 +41,11 @@ request.interceptors.request.use(
|
|||||||
if (token) {
|
if (token) {
|
||||||
config.headers['Authorization'] = `Bearer ${token}`
|
config.headers['Authorization'] = `Bearer ${token}`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (config.params) {
|
||||||
|
config.params = normalizeParams(config.params)
|
||||||
|
}
|
||||||
|
|
||||||
return config
|
return config
|
||||||
},
|
},
|
||||||
(error) => {
|
(error) => {
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ async function fetchList() {
|
|||||||
loading.value = true
|
loading.value = true
|
||||||
try {
|
try {
|
||||||
const res = await financeCategoryApi.getList({ ...searchForm, ...pagination })
|
const res = await financeCategoryApi.getList({ ...searchForm, ...pagination })
|
||||||
tableData.value = res.data?.list || res.data?.data || []
|
tableData.value = Array.isArray(res.data) ? res.data : (res.data?.list || res.data?.data || [])
|
||||||
total.value = res.data?.total || 0
|
total.value = res.data?.total || 0
|
||||||
} finally { loading.value = false }
|
} finally { loading.value = false }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,7 +73,8 @@ async function fetchTypeList() {
|
|||||||
keyword: typeSearch.keyword,
|
keyword: typeSearch.keyword,
|
||||||
...typePagination
|
...typePagination
|
||||||
})
|
})
|
||||||
typeList.value = res.data?.list || []
|
const types = Array.isArray(res.data) ? res.data : (res.data?.list || res.data?.data || [])
|
||||||
|
typeList.value = types
|
||||||
typeTotal.value = res.data?.total || 0
|
typeTotal.value = res.data?.total || 0
|
||||||
// Auto-select first type
|
// Auto-select first type
|
||||||
if (!selectedType.value && typeList.value.length > 0) {
|
if (!selectedType.value && typeList.value.length > 0) {
|
||||||
|
|||||||
@@ -64,8 +64,8 @@ async function fetchTree() {
|
|||||||
loading.value = true
|
loading.value = true
|
||||||
try {
|
try {
|
||||||
const res = await menuApi.getList({ per_page: 500 })
|
const res = await menuApi.getList({ per_page: 500 })
|
||||||
const flat = res.data?.list || res.data?.data || []
|
const raw = Array.isArray(res.data) ? res.data : (res.data?.list || res.data?.data || [])
|
||||||
treeData.value = buildTree(flat)
|
treeData.value = buildTree(raw)
|
||||||
} catch {
|
} catch {
|
||||||
//
|
//
|
||||||
} finally {
|
} finally {
|
||||||
|
|||||||
Reference in New Issue
Block a user