This commit is contained in:
parent
a578e5b643
commit
c11ba8aebd
|
|
@ -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=光交箱
|
||||
|
|
|
|||
|
|
@ -58,6 +58,13 @@
|
|||
"navigationBarTitleText": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/optical-box-detail/index",
|
||||
"style": {
|
||||
"navigationStyle": "custom",
|
||||
"navigationBarTitleText": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/search/index",
|
||||
"style": {
|
||||
|
|
|
|||
214
odf-uniapp/pages/optical-box-detail/index.vue
Normal file
214
odf-uniapp/pages/optical-box-detail/index.vue
Normal 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>
|
||||
|
|
@ -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) => {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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>();
|
||||
}
|
||||
}
|
||||
|
|
@ -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; }
|
||||
}
|
||||
}
|
||||
|
|
@ -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; }
|
||||
}
|
||||
}
|
||||
|
|
@ -112,5 +112,10 @@ namespace ZR.Model.Business
|
|||
/// </summary>
|
||||
public string BusinessType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 端口侧:0=左侧(光交箱端子/默认), 1=右侧(ODF端子)
|
||||
/// </summary>
|
||||
public int PortSide { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user