This commit is contained in:
baodev0
2026-10-08 11:25:28 +07:00
parent 1544629a1f
commit 8651dde6b1
45 changed files with 1543 additions and 357 deletions
@@ -79,12 +79,16 @@ class CustomerServiceProvisioningService
$service = Service::where('customer_id', $customer->id)->where('id', $serviceId)->first();
abort_if(!$service, 404, 'Không tìm thấy dịch vụ');
return DB::transaction(function () use ($service, $data) {
$vmFields = ['os_id', 'vm_cpu', 'vm_ram_mb', 'vm_disk_gb', 'vm_ip', 'vm_dns', 'vm_user', 'vm_password', 'vm_port'];
return DB::transaction(function () use ($customer, $service, $data) {
$vmFields = ['virtual_machine_id', 'os_id', 'vm_cpu', 'vm_ram_mb', 'vm_disk_gb', 'vm_ip', 'vm_dns', 'vm_user', 'vm_password', 'vm_port'];
$service->fill(collect($data)->except(['price', ...$vmFields])->all());
$service->save();
if (!empty($data['virtual_machine_id'])) {
$this->assignVirtualMachine($service, $customer, (int) $data['virtual_machine_id']);
}
if (array_key_exists('price', $data) && $data['price'] !== null && $service->orderItem) {
$service->orderItem->update(['price' => $data['price']]);
}
@@ -117,6 +121,49 @@ class CustomerServiceProvisioningService
});
}
private function assignVirtualMachine(Service $service, Customer $customer, int $virtualMachineId): void
{
$vm = VirtualMachines::with('datacenter')->findOrFail($virtualMachineId);
$current = $service->vmware;
if ($current && ($current->virtual_machine_id === $vm->id || $current->vmware_id === $vm->vm_id)) {
return;
}
$takenBy = DB::table('module_vmware as mv')
->join('services as s', 's.vm_id', '=', 'mv.id')
->where(fn($q) => $q->where('mv.virtual_machine_id', $vm->id)->orWhere('mv.vmware_id', $vm->vm_id))
->where('s.id', '!=', $service->id)
->value('s.id');
abort_if($takenBy, 422, "VM {$vm->name} đang gán cho dịch vụ #{$takenBy}.");
if ($current) {
$current->update([
'virtual_machine_id' => $vm->id,
'vmware_id' => $vm->vm_id,
'name' => $vm->name,
'vcenter_id' => $vm->datacenter->vcenter_id ?? null,
'cpu' => $vm->cpu,
'ram_mb' => $vm->ram_mb,
'ip' => $vm->ip,
]);
return;
}
$price = (int) ($service->orderItem->price ?? 0);
$vmId = $this->createModuleVmwareIfNeeded(
['virtual_machine_id' => $vm->id, 'server_name' => $service->server_name],
$customer,
$service->orderItem?->order,
$price,
$service->expires_at ?? now(),
);
ModuleVmware::where('id', $vmId)->update(['service_id' => $service->id]);
$service->update(['vm_id' => $vmId]);
}
/**
* Gửi email nhắc gia hạn dịch vụ cho khách hàng.
*/
@@ -285,7 +332,7 @@ class CustomerServiceProvisioningService
});
}
private function createModuleVmwareIfNeeded(array $data, Customer $customer, Order $order, int $basePrice, string|Carbon $expiresAt): ?int
private function createModuleVmwareIfNeeded(array $data, Customer $customer, ?Order $order, int $basePrice, string|Carbon $expiresAt): ?int
{
if (empty($data['virtual_machine_id'])) {
return null;
@@ -298,7 +345,7 @@ class CustomerServiceProvisioningService
['virtual_machine_id' => $vm->id],
[
'customer_id' => $customer->id,
'order_id' => $order->id,
'order_id' => $order?->id,
'name' => $vm->name,
'vmware_id' => $vm->vm_id,
'vcenter_id' => $vcenterId,