21
Some checks are pending
continuous-integration/drone/push Build is running

This commit is contained in:
zpc 2026-04-04 11:04:37 +08:00
parent a578e5b643
commit c11ba8aebd
14 changed files with 572 additions and 73 deletions

View File

@ -2,5 +2,5 @@
-- 新增光交箱机架类型支持
-- SQL Server 语法
ALTER TABLE odf_racks ADD rack_type INT NOT NULL DEFAULT 0;
ALTER TABLE odf_racks ADD RackType INT NOT NULL DEFAULT 0;
-- rack_type: 机架类型0=ODF机架, 1=光交箱

View File

@ -58,6 +58,13 @@
"navigationBarTitleText": ""
}
},
{
"path": "pages/optical-box-detail/index",
"style": {
"navigationStyle": "custom",
"navigationBarTitleText": ""
}
},
{
"path": "pages/search/index",
"style": {

View File

@ -0,0 +1,214 @@
<template>
<view class="rack-detail-page">
<view class="content">
<!-- 顶部导航栏 -->
<view class="nav-bar" :style="{ paddingTop: statusBarHeight + 'px' }">
<view class="nav-bar-inner">
<image class="nav-icon" src="/static/images/ic_back.png" mode="aspectFit" @click="goBack" />
<text class="nav-title">{{ rackName }}详情</text>
<view class="nav-icon-placeholder" />
</view>
</view>
<!-- 机房名称 + 机架类型 -->
<view class="room-name-bar">
<text class="room-name-text">{{ roomName }}</text>
<text class="rack-type-text">类型光交箱</text>
</view>
<!-- 状态图例 -->
<view class="legend-bar">
<view class="legend-item">
<view class="legend-dot legend-dot-green" />
<text class="legend-label">已连接</text>
</view>
<view class="legend-item">
<view class="legend-dot legend-dot-red" />
<text class="legend-label">已断开</text>
</view>
</view>
<!-- 加载中 -->
<view v-if="loading" class="loading-box">
<text class="loading-text">loading...</text>
</view>
<!-- Frame 列表 -->
<view v-else class="frame-list">
<view class="frame-card" v-for="frame in frameList" :key="frame.id">
<text class="frame-name">{{ frame.name }}</text>
<scroll-view class="port-scroll" scroll-x>
<view class="optical-box-wrapper">
<!-- 左栏光交箱端子 -->
<view class="optical-left-col">
<view class="optical-col-header">
<text class="optical-col-title">光交箱端子</text>
</view>
<view
class="optical-port-row"
v-for="(row, rowIdx) in frame.leftPortsList"
:key="'left-' + rowIdx"
>
<text class="optical-row-name">{{ getRowLetter(rowIdx) }}</text>
<view class="port-list">
<view
class="port-item"
v-for="port in row.rowList"
:key="'lp-' + port.id"
@click="openPortEdit(port)"
>
<view class="port-circle" :class="port.status === 1 ? 'port-green' : 'port-red'">
<text class="port-tips">{{ port.tips }}</text>
</view>
<text class="port-name">{{ port.name }}</text>
</view>
</view>
</view>
</view>
<!-- 中间分隔线 -->
<view class="optical-divider" />
<!-- 右栏ODF端子 -->
<view class="optical-right-col">
<view class="optical-col-header">
<text class="optical-col-title">ODF端子</text>
</view>
<view
class="optical-port-row"
v-for="(row, rowIdx) in frame.rightPortsList"
:key="'right-' + rowIdx"
>
<text class="optical-row-name">{{ rowIdx + 1 }}</text>
<view class="port-list">
<view
class="port-item"
v-for="port in row.rowList"
:key="'rp-' + port.id"
@click="openPortEdit(port)"
>
<view class="port-circle" :class="port.status === 1 ? 'port-green' : 'port-red'">
<text class="port-tips">{{ port.tips }}</text>
</view>
<text class="port-name">{{ port.name }}</text>
</view>
</view>
</view>
</view>
</view>
</scroll-view>
</view>
</view>
</view>
<!-- 端口编辑弹窗 -->
<portEditDialog
:visible="showPortEdit"
:portId="currentPortId"
@close="showPortEdit = false"
@saved="onPortSaved"
/>
</view>
</template>
<script setup>
import { ref } from 'vue'
import { onLoad } from '@dcloudio/uni-app'
import { getOpticalBoxDetail } from '@/services/machine'
import portEditDialog from '@/components/port-edit-dialog.vue'
const statusBarHeight = uni.getSystemInfoSync().statusBarHeight || 0
const rackId = ref('')
const rackName = ref('')
const roomName = ref('')
const frameList = ref([])
const loading = ref(false)
const showPortEdit = ref(false)
const currentPortId = ref('')
let pendingPortId = ''
function getRowLetter(index) {
return String.fromCharCode(65 + index)
}
async function loadDetail() {
loading.value = true
try {
const res = await getOpticalBoxDetail(rackId.value)
if (res.code === 200 && res.data) {
frameList.value = res.data
}
} finally {
loading.value = false
if (pendingPortId) {
currentPortId.value = pendingPortId
showPortEdit.value = true
pendingPortId = ''
}
}
}
function goBack() {
uni.navigateBack()
}
function openPortEdit(port) {
currentPortId.value = port.id
showPortEdit.value = true
}
function onPortSaved() {
showPortEdit.value = false
loadDetail()
}
onLoad((options) => {
if (options.rackId) rackId.value = options.rackId
if (options.rackName) rackName.value = decodeURIComponent(options.rackName)
if (options.roomName) roomName.value = decodeURIComponent(options.roomName)
if (options.portId) pendingPortId = options.portId
loadDetail()
})
</script>
<style scoped>
.rack-detail-page { position: relative; min-height: 100vh; background-color: transparent; }
.content { position: relative; z-index: 1; }
.nav-bar { width: 100%; }
.nav-bar-inner { display: flex; align-items: center; justify-content: space-between; height: 88rpx; padding: 0 24rpx; }
.nav-icon { width: 44rpx; height: 44rpx; }
.nav-icon-placeholder { width: 44rpx; height: 44rpx; }
.nav-title { font-size: 34rpx; font-weight: 600; color: #fff; }
.room-name-bar { display: flex; align-items: center; justify-content: space-between; padding: 8rpx 24rpx 0; }
.room-name-text { font-size: 30rpx; font-weight: 700; color: #1A73EC; }
.rack-type-text { font-size: 26rpx; color: #fff; }
.legend-bar { display: flex; align-items: center; padding: 16rpx 24rpx; gap: 32rpx; }
.legend-item { display: flex; align-items: center; gap: 8rpx; }
.legend-dot { width: 20rpx; height: 20rpx; border-radius: 50%; }
.legend-dot-green { background-color: #4CAF50; }
.legend-dot-red { background-color: #F44336; }
.legend-label { font-size: 24rpx; color: #666; }
.loading-box { display: flex; justify-content: center; padding: 60rpx 0; }
.loading-text { font-size: 28rpx; color: #999; }
.frame-list { padding: 0 24rpx 24rpx; }
.frame-card { background-color: #fff; border-radius: 12rpx; padding: 24rpx; margin-bottom: 20rpx; box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.06); }
.frame-name { font-size: 30rpx; font-weight: 600; color: #333; margin-bottom: 16rpx; }
.port-scroll { width: 100%; white-space: nowrap; }
.port-list { display: flex; flex-direction: row; gap: 16rpx; }
.port-item { display: flex; flex-direction: column; align-items: center; flex-shrink: 0; }
.port-circle { width: 80rpx; height: 80rpx; border-radius: 50%; display: flex; align-items: center; justify-content: center; }
.port-green { background-color: #4CAF50; }
.port-red { background-color: #F44336; }
.port-tips { font-size: 20rpx; color: #fff; text-align: center; }
.port-name { font-size: 20rpx; color: #333; margin-top: 6rpx; text-align: center; }
.optical-box-wrapper { display: inline-flex; flex-direction: row; min-width: 100%; }
.optical-left-col { background-color: #FFC0CB; padding: 16rpx; border-radius: 8rpx 0 0 8rpx; }
.optical-left-col .optical-port-row { background-color: #FFB6C1; border-radius: 8rpx; padding: 12rpx; margin-bottom: 12rpx; }
.optical-right-col { background-color: #E0F7FA; padding: 16rpx; border-radius: 0 8rpx 8rpx 0; }
.optical-right-col .optical-port-row { background-color: #B3E5FC; border-radius: 8rpx; padding: 12rpx; margin-bottom: 12rpx; }
.optical-divider { width: 4rpx; background-color: #999; flex-shrink: 0; }
.optical-col-header { padding: 0 0 12rpx; text-align: center; }
.optical-col-title { font-size: 26rpx; font-weight: 600; color: #333; }
.optical-port-row { display: flex; flex-direction: row; align-items: center; }
.optical-row-name { font-size: 24rpx; color: #666; font-weight: 600; margin-right: 12rpx; flex-shrink: 0; width: 32rpx; text-align: center; }
</style>

View File

@ -89,12 +89,21 @@ function goSearch() {
}
function goDetail(item) {
uni.navigateTo({
url: '/pages/rack-detail/index?rackId=' + item.id
+ '&rackName=' + encodeURIComponent(item.rackName)
+ '&roomName=' + encodeURIComponent(roomName.value)
+ '&rackType=' + (item.rackType || 0)
})
if (item.rackType === 1) {
//
uni.navigateTo({
url: '/pages/optical-box-detail/index?rackId=' + item.id
+ '&rackName=' + encodeURIComponent(item.rackName)
+ '&roomName=' + encodeURIComponent(roomName.value)
})
} else {
uni.navigateTo({
url: '/pages/rack-detail/index?rackId=' + item.id
+ '&rackName=' + encodeURIComponent(item.rackName)
+ '&roomName=' + encodeURIComponent(roomName.value)
+ '&rackType=' + (item.rackType || 0)
})
}
}
onLoad((options) => {

View File

@ -6,5 +6,6 @@ export const getRoomList = (pageNum, pageSize, deptId) =>
export const getRackList = (pageNum, pageSize, roomId) =>
get('/business/OdfRacks/list', { pageNum, pageSize, roomId })
export const getRackDetail = (RackId) => get('/business/OdfPorts/mlist', { RackId })
export const getOpticalBoxDetail = (RackId) => get('/business/OdfPorts/mlist/optical', { RackId })
export const getPortDetail = (id) => get(`/business/OdfPorts/${id}`)
export const savePort = (data) => post('/business/OdfPorts/save', data)

View File

@ -167,6 +167,76 @@ namespace ZR.Admin.WebApi.Controllers.Business
return SUCCESS(list);
}
/// <summary>
/// 查询光交箱端口列表(左右分开)
/// </summary>
[HttpGet("mlist/optical")]
[ActionPermissionFilter(Permission = "odfports:list")]
public async Task<IActionResult> GetOpticalBoxPorts([FromQuery] OdfPortsMQueryDto parm)
{
var frames = await _OdfFramesService.AsQueryable().Where(it => it.RackId == parm.RackId)
.Select(it => new { it.Id, it.PortsName }).ToListAsync();
var result = new List<OdfOpticalBoxFrameDto>();
foreach (var frame in frames)
{
var allPorts = await _OdfPortsService.AsQueryable().Where(it => it.FrameId == frame.Id)
.Select(it => new OdfPortsMDtoc()
{
Id = it.Id,
Name = it.Name,
Status = it.Status,
PortNumber = it.PortNumber,
RowNumber = it.RowNumber,
Tips = it.Remarks,
OpticalAttenuation = it.OpticalAttenuation,
EquipmentModel = it.EquipmentModel,
BusinessType = it.BusinessType,
}).ToListAsync();
// 通过PortSide区分左右但OdfPortsMDtoc没有PortSide需要重新查
var allPortsWithSide = await _OdfPortsService.AsQueryable().Where(it => it.FrameId == frame.Id)
.Select(it => new { it.Id, it.Name, it.Status, it.PortNumber, it.RowNumber, it.Remarks, it.OpticalAttenuation, it.EquipmentModel, it.BusinessType, it.PortSide })
.ToListAsync();
var leftPorts = allPortsWithSide.Where(it => it.PortSide == 0).ToList();
var rightPorts = allPortsWithSide.Where(it => it.PortSide == 1).ToList();
var dto = new OdfOpticalBoxFrameDto
{
Id = frame.Id,
Name = frame.PortsName
};
// 左侧按行分组
leftPorts.GroupBy(it => it.RowNumber).OrderBy(g => g.Key).ToList().ForEach(g =>
{
var li = g.OrderBy(it => it.PortNumber).Select(it =>
{
var tips = it.Status == 0 ? it.OpticalAttenuation ?? "" : "";
return new OdfPortsMDto { Id = it.Id, Name = it.Name, Status = it.Status, Tips = tips };
}).ToList();
dto.LeftPortsList.Add(new OdfPortsMDtot() { RowList = li, Name = g.Key.ToString() });
});
// 右侧按行分组
rightPorts.GroupBy(it => it.RowNumber).OrderBy(g => g.Key).ToList().ForEach(g =>
{
var li = g.OrderBy(it => it.PortNumber).Select(it =>
{
var tips = it.Status == 0 ? it.OpticalAttenuation ?? "" : "";
return new OdfPortsMDto { Id = it.Id, Name = it.Name, Status = it.Status, Tips = tips };
}).ToList();
dto.RightPortsList.Add(new OdfPortsMDtot() { RowList = li, Name = g.Key.ToString() });
});
result.Add(dto);
}
return SUCCESS(result);
}
/// <summary>

View File

@ -122,20 +122,23 @@ namespace ZR.Admin.WebApi.Controllers.Business
if (parm.FramesCount > 0)
{
//添加机框
List<OdfFrames> framesList = new List<OdfFrames>();
var rack = response;
// 光交箱固定每侧12个端口
var portsCount = modal.RackType == 1 ? 12 : parm.PortsCount;
for (int i = 0; i < parm.FramesCount; i++)
{
var t = await _OdfFramesService.InsertReturnEntityAsync(new OdfFrames()
{
CreatedAt = DateTime.Now,
UpdateAt = DateTime.Now,
PortsCol = parm.PortsCount,
PortsCount = parm.PortsCount,
PortsCol = portsCount,
PortsCount = portsCount,
DeptId = rack.DeptId,
PortsRow = parm.PortsCount,
PortsRow = portsCount,
PortsName = $"{(i + 1)}框",
RackId = rack.Id,
SequenceNumber = i + 1
@ -145,22 +148,48 @@ namespace ZR.Admin.WebApi.Controllers.Business
//添加机框结束
if (parm.RowCount > 0)
{
//添加行
if (parm.PortsCount > 0)
int index = 0;
foreach (var frame in framesList)
{
int index = 0;
//添加端口
foreach (var frame in framesList)
var ra = rack;
if (ra == null) continue;
List<OdfPorts> ports = new List<OdfPorts>();
if (modal.RackType == 1)
{
var ra = rack;
if (ra == null)
{
continue;
}
List<OdfPorts> ports = new List<OdfPorts>();
// 光交箱每行生成24个端口左12+右12
for (int row = 0; row < parm.RowCount; row++)
{
for (int port = 0; port < parm.PortsCount; port++)
string rowLetter = ((char)(65 + row)).ToString(); // A, B, C...
// 左侧光交箱端子 PortSide=0
for (int port = 0; port < 12; port++)
{
ports.Add(new OdfPorts()
{
CreatedAt = DateTime.Now,
DeptId = rooms.DeptId ?? 0,
DeptName = rooms.DeptName,
RackId = frame.RackId,
RackName = ra.RackName,
RoomId = roomId,
RoomName = roomName,
FrameId = frame.Id,
FrameName = frame.PortsName,
Name = $"{rowLetter}-{(port + 1)}",
RowNumber = row + 1,
PortNumber = port + 1,
PortSide = 0,
OpticalAttenuation = "",
HistoryRemarks = "",
Remarks = "",
OpticalCableOffRemarks = "",
Status = parm.DefaultStatus,
UpdatedAt = DateTime.Now,
});
}
// 右侧ODF端子 PortSide=1
for (int port = 0; port < 12; port++)
{
ports.Add(new OdfPorts()
{
@ -176,9 +205,9 @@ namespace ZR.Admin.WebApi.Controllers.Business
Name = $"{(row + 1)}-{(port + 1)}",
RowNumber = row + 1,
PortNumber = port + 1,
PortSide = 1,
OpticalAttenuation = "",
HistoryRemarks = "",
Remarks = "",
OpticalCableOffRemarks = "",
Status = parm.DefaultStatus,
@ -186,16 +215,53 @@ namespace ZR.Admin.WebApi.Controllers.Business
});
}
}
await _OdfPortsService.AsInsertable(ports).ExecuteReturnEntityAsync(true);
//如果超过100个机框则休眠一下防止服务器死机
index++;
if (index > 100)
}
else
{
// ODF机架保持原有逻辑
if (portsCount > 0)
{
Thread.Sleep(50);
index = 0;
for (int row = 0; row < parm.RowCount; row++)
{
for (int port = 0; port < portsCount; port++)
{
ports.Add(new OdfPorts()
{
CreatedAt = DateTime.Now,
DeptId = rooms.DeptId ?? 0,
DeptName = rooms.DeptName,
RackId = frame.RackId,
RackName = ra.RackName,
RoomId = roomId,
RoomName = roomName,
FrameId = frame.Id,
FrameName = frame.PortsName,
Name = $"{(row + 1)}-{(port + 1)}",
RowNumber = row + 1,
PortNumber = port + 1,
PortSide = 0,
OpticalAttenuation = "",
HistoryRemarks = "",
Remarks = "",
OpticalCableOffRemarks = "",
Status = parm.DefaultStatus,
UpdatedAt = DateTime.Now,
});
}
}
}
}
if (ports.Count > 0)
{
await _OdfPortsService.AsInsertable(ports).ExecuteReturnEntityAsync(true);
}
index++;
if (index > 100)
{
Thread.Sleep(50);
index = 0;
}
}
}
}

View File

@ -289,21 +289,20 @@ namespace ZR.Admin.WebApi.Controllers.Business
CreatedAt = DateTime.Now,
FrameCount = parm.FramesCount,
DeptId = response.DeptId ?? 0,
RackName = $"odf-{(i + 1)}",
RackName = parm.RackType == 1 ? $"光交箱-{(i + 1)}" : $"odf-{(i + 1)}",
RoomId = roomId,
SequenceNumber = i + 1,
UpdatedAt = DateTime.Now,
}); // 直接插入机架
RackType = parm.RackType,
});
racksList.Add(t);
}
//机架添加完成
//return Insertable(model).ExecuteReturnEntity();
// 光交箱固定每侧12个端口
var portsCount = parm.RackType == 1 ? 12 : parm.PortsCount;
if (parm.FramesCount > 0)
{
//添加机框
List<OdfFrames> framesList = new List<OdfFrames>();
foreach (var rack in racksList)
@ -314,10 +313,10 @@ namespace ZR.Admin.WebApi.Controllers.Business
{
CreatedAt = DateTime.Now,
UpdateAt = DateTime.Now,
PortsCol = parm.PortsCount,
PortsCount = parm.PortsCount,
PortsCol = portsCount,
PortsCount = portsCount,
DeptId = rack.DeptId,
PortsRow = parm.PortsCount,
PortsRow = portsCount,
PortsName = $"{(i + 1)}框",
RackId = rack.Id,
SequenceNumber = i + 1
@ -326,25 +325,50 @@ namespace ZR.Admin.WebApi.Controllers.Business
}
}
//添加机框结束
if (parm.RowCount > 0)
{
//添加行
if (parm.PortsCount > 0)
int index = 0;
foreach (var frame in framesList)
{
int index = 0;
//添加端口
foreach (var frame in framesList)
var ra = racksList.Find(it => it.Id == frame.RackId);
if (ra == null) continue;
List<OdfPorts> ports = new List<OdfPorts>();
if (parm.RackType == 1)
{
var ra = racksList.Find(it => it.Id == frame.RackId);
if (ra == null)
{
continue;
}
List<OdfPorts> ports = new List<OdfPorts>();
// 光交箱每行生成24个端口左12+右12
for (int row = 0; row < parm.RowCount; row++)
{
for (int port = 0; port < parm.PortsCount; port++)
string rowLetter = ((char)(65 + row)).ToString();
// 左侧光交箱端子
for (int port = 0; port < 12; port++)
{
ports.Add(new OdfPorts()
{
CreatedAt = DateTime.Now,
DeptId = frame.DeptId ?? 0,
DeptName = modal.DeptName,
RackId = frame.RackId,
RackName = ra.RackName,
RoomId = roomId,
RoomName = roomName,
FrameId = frame.Id,
FrameName = frame.PortsName,
Name = $"{rowLetter}-{(port + 1)}",
RowNumber = row + 1,
PortNumber = port + 1,
PortSide = 0,
OpticalAttenuation = "",
HistoryRemarks = "",
OpticalCableOffRemarks = "",
Remarks = "",
Status = parm.DefaultStatus,
UpdatedAt = DateTime.Now,
});
}
// 右侧ODF端子
for (int port = 0; port < 12; port++)
{
ports.Add(new OdfPorts()
{
@ -360,6 +384,7 @@ namespace ZR.Admin.WebApi.Controllers.Business
Name = $"{(row + 1)}-{(port + 1)}",
RowNumber = row + 1,
PortNumber = port + 1,
PortSide = 1,
OpticalAttenuation = "",
HistoryRemarks = "",
OpticalCableOffRemarks = "",
@ -369,20 +394,56 @@ namespace ZR.Admin.WebApi.Controllers.Business
});
}
}
await _OdfPortsService.AsInsertable(ports).ExecuteReturnEntityAsync(true);
//如果超过100个机框则休眠一下防止服务器死机
index++;
if (index > 100)
}
else
{
// ODF机架保持原有逻辑
if (portsCount > 0)
{
Thread.Sleep(50);
index = 0;
for (int row = 0; row < parm.RowCount; row++)
{
for (int port = 0; port < portsCount; port++)
{
ports.Add(new OdfPorts()
{
CreatedAt = DateTime.Now,
DeptId = frame.DeptId ?? 0,
DeptName = modal.DeptName,
RackId = frame.RackId,
RackName = ra.RackName,
RoomId = roomId,
RoomName = roomName,
FrameId = frame.Id,
FrameName = frame.PortsName,
Name = $"{(row + 1)}-{(port + 1)}",
RowNumber = row + 1,
PortNumber = port + 1,
PortSide = 0,
OpticalAttenuation = "",
HistoryRemarks = "",
OpticalCableOffRemarks = "",
Remarks = "",
Status = parm.DefaultStatus,
UpdatedAt = DateTime.Now,
});
}
}
}
}
if (ports.Count > 0)
{
await _OdfPortsService.AsInsertable(ports).ExecuteReturnEntityAsync(true);
}
index++;
if (index > 100)
{
Thread.Sleep(50);
index = 0;
}
}
}
}
}

View File

@ -756,4 +756,21 @@ namespace ZR.Model.Business.Dto
[ExcelColumnName("修改时间")]
public DateTime? UpdatedAt { get; set; }
}
/// <summary>
/// 光交箱机架详情DTO - 每个框包含左右两侧端口
/// </summary>
public class OdfOpticalBoxFrameDto
{
public int Id { get; set; }
public string Name { get; set; }
/// <summary>
/// 左侧光交箱端子PortSide=0
/// </summary>
public List<OdfPortsMDtot> LeftPortsList { get; set; } = new List<OdfPortsMDtot>();
/// <summary>
/// 右侧ODF端子PortSide=1
/// </summary>
public List<OdfPortsMDtot> RightPortsList { get; set; } = new List<OdfPortsMDtot>();
}
}

View File

@ -67,13 +67,12 @@ namespace ZR.Model.Business.Dto
/// </summary>
public int RowCount { get; set; }
/// <summary>
/// 端口数量
/// 端口数量ODF机架用光交箱固定12
/// </summary>
public int PortsCount { get; set; }
/// <summary>
///
/// 默认连接状态
/// </summary>
public int DefaultStatus { get; set; }
}
}

View File

@ -172,15 +172,16 @@ namespace ZR.Model.Business.Dto
/// </summary>
public int RowCount { get; set; }
/// <summary>
/// 端口数量
/// 端口数量ODF机架用光交箱固定12
/// </summary>
public int PortsCount { get; set; }
/// <summary>
///
/// 默认连接状态
/// </summary>
public int DefaultStatus { get; set; }
/// <summary>
/// 机架类型0=ODF机架, 1=光交箱
/// </summary>
public int RackType { get; set; }
}
}

View File

@ -112,5 +112,10 @@ namespace ZR.Model.Business
/// </summary>
public string BusinessType { get; set; }
/// <summary>
/// 端口侧0=左侧(光交箱端子/默认), 1=右侧(ODF端子)
/// </summary>
public int PortSide { get; set; }
}
}

View File

@ -23,6 +23,15 @@
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item label="机架类型" prop="rackType">
<el-select v-model="form.rackType" :disabled="isView || isEdit" placeholder="请选择机架类型" @change="handleRackTypeChange">
<el-option label="ODF机架" :value="0"></el-option>
<el-option label="光交箱" :value="1"></el-option>
</el-select>
</el-form-item>
</el-col>
<!-- 高级 -->
<el-col v-if="isAdd" :lg="24">
<el-divider content-position="left">
@ -42,12 +51,18 @@
<div class="form-tip">每个机框中有多少行</div>
</el-form-item>
</el-col>
<el-col v-if="isAdd" :lg="12">
<el-col v-if="isAdd && form.rackType !== 1" :lg="12">
<el-form-item label="端口数" prop="portsCount">
<el-input v-model.number="form.portsCount" :disabled="isView" placeholder="请输入端口数" />
<div class="form-tip">每个机框中每行端口数量</div>
</el-form-item>
</el-col>
<el-col v-if="isAdd && form.rackType === 1" :lg="12">
<el-form-item label="端口数">
<el-input :model-value="'每侧12个固定'" disabled />
<div class="form-tip">光交箱每行左右各12个端口共24个</div>
</el-form-item>
</el-col>
<el-col v-if="isAdd" :lg="12">
<el-form-item label="默认连接状态" prop="defaultStatus">
<el-radio-group v-model="form.defaultStatus">
@ -134,6 +149,7 @@ const form = ref({
sequenceNumber: null,
rackName: null,
frameCount: 9, // 9
rackType: 0, // 0=ODF, 1=
createdAt: null,
updatedAt: null,
framesCount: 9,
@ -146,7 +162,16 @@ const form = ref({
const rules = {
roomId: [{ required: true, message: '机房不能为空', trigger: 'change', type: 'number' }],
sequenceNumber: [{ required: true, message: '序号不能为空', trigger: 'blur', type: 'number' }],
rackName: [{ required: true, message: 'ODF名称不能为空', trigger: 'blur' }]
rackName: [{ required: true, message: 'ODF名称不能为空', trigger: 'blur' }],
rackType: [{ required: true, message: '机架类型不能为空', trigger: 'change', type: 'number' }]
}
//
function handleRackTypeChange(val) {
if (val === 1) {
// 12
form.value.portsCount = 12
}
}
//
@ -171,6 +196,7 @@ function resetForm() {
sequenceNumber: null,
rackName: null,
frameCount: 9, // 9
rackType: 0,
createdAt: null,
updatedAt: null,
framesCount: 9,

View File

@ -49,6 +49,14 @@
<span style="color: #909399; font-size: 12px">高级信息</span>
</el-divider>
</el-col>
<el-col v-if="isAdd" :lg="12">
<el-form-item label="机架类型" prop="rackType">
<el-select v-model="form.rackType" :disabled="isView" placeholder="请选择机架类型" @change="handleRackTypeChange">
<el-option label="ODF机架" :value="0"></el-option>
<el-option label="光交箱" :value="1"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col v-if="isAdd" :lg="12">
<el-form-item label="ODF机架数量" prop="racksCount">
<el-input v-model.number="form.racksCount" :disabled="isView" placeholder="请输入ODF机架数量" />
@ -67,12 +75,18 @@
<div class="form-tip">每个机框中有多少行</div>
</el-form-item>
</el-col>
<el-col v-if="isAdd" :lg="12">
<el-col v-if="isAdd && form.rackType !== 1" :lg="12">
<el-form-item label="端口数" prop="portsCount">
<el-input v-model.number="form.portsCount" :disabled="isView" placeholder="请输入端口数" />
<div class="form-tip">每个机框中每行端口数量</div>
</el-form-item>
</el-col>
<el-col v-if="isAdd && form.rackType === 1" :lg="12">
<el-form-item label="端口数">
<el-input :model-value="'每侧12个固定'" disabled />
<div class="form-tip">光交箱每行左右各12个端口共24个</div>
</el-form-item>
</el-col>
<el-col v-if="isAdd" :lg="12">
<el-form-item label="默认连接状态" prop="defaultStatus">
<el-radio-group v-model="form.defaultStatus">
@ -178,7 +192,8 @@ const form = ref({
rowCount: 6,
portsCount: 12,
defaultStatus: 0,
orderby: 0
orderby: 0,
rackType: 0
})
//
@ -186,6 +201,13 @@ const rules = {
roomName: [{ required: true, message: '机房名称不能为空', trigger: 'blur' }]
}
//
function handleRackTypeChange(val) {
if (val === 1) {
form.value.portsCount = 12
}
}
//
function getDeptTreeData() {
treeselect().then((response) => {
@ -209,7 +231,8 @@ function resetForm() {
framesCount: 9,
rowCount: 6,
portsCount: 12,
defaultStatus: 0
defaultStatus: 0,
rackType: 0
}
nextTick(() => {
proxy.resetForm('formRef')