From c11ba8aebdc047fda638abafd8ef6b91afe330ef Mon Sep 17 00:00:00 2001 From: zpc Date: Sat, 4 Apr 2026 11:04:37 +0800 Subject: [PATCH] 21 --- docs/v1.0.2.1/migration.sql | 2 +- odf-uniapp/pages.json | 7 + odf-uniapp/pages/optical-box-detail/index.vue | 214 ++++++++++++++++++ odf-uniapp/pages/rack/index.vue | 21 +- odf-uniapp/services/machine.js | 1 + .../Business/OdfPortsController.cs | 70 ++++++ .../Business/OdfRacksController.cs | 112 +++++++-- .../Business/OdfRoomsController.cs | 121 +++++++--- server/ZR.Model/Business/Dto/OdfPortsDto.cs | 17 ++ server/ZR.Model/Business/Dto/OdfRacksDto.cs | 5 +- server/ZR.Model/Business/Dto/OdfRoomsDto.cs | 11 +- server/ZR.Model/Business/OdfPorts.cs | 5 + .../components/business/OdfRackExpertForm.vue | 30 ++- .../components/business/OdfRoomExpertForm.vue | 29 ++- 14 files changed, 572 insertions(+), 73 deletions(-) create mode 100644 odf-uniapp/pages/optical-box-detail/index.vue diff --git a/docs/v1.0.2.1/migration.sql b/docs/v1.0.2.1/migration.sql index 08c7628..4c3207d 100644 --- a/docs/v1.0.2.1/migration.sql +++ b/docs/v1.0.2.1/migration.sql @@ -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=光交箱 diff --git a/odf-uniapp/pages.json b/odf-uniapp/pages.json index c1c1fc4..362f0b0 100644 --- a/odf-uniapp/pages.json +++ b/odf-uniapp/pages.json @@ -58,6 +58,13 @@ "navigationBarTitleText": "" } }, + { + "path": "pages/optical-box-detail/index", + "style": { + "navigationStyle": "custom", + "navigationBarTitleText": "" + } + }, { "path": "pages/search/index", "style": { diff --git a/odf-uniapp/pages/optical-box-detail/index.vue b/odf-uniapp/pages/optical-box-detail/index.vue new file mode 100644 index 0000000..47e4764 --- /dev/null +++ b/odf-uniapp/pages/optical-box-detail/index.vue @@ -0,0 +1,214 @@ + + + + + \ No newline at end of file diff --git a/odf-uniapp/pages/rack/index.vue b/odf-uniapp/pages/rack/index.vue index bc59ad9..6151bc4 100644 --- a/odf-uniapp/pages/rack/index.vue +++ b/odf-uniapp/pages/rack/index.vue @@ -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) => { diff --git a/odf-uniapp/services/machine.js b/odf-uniapp/services/machine.js index 488d377..305538c 100644 --- a/odf-uniapp/services/machine.js +++ b/odf-uniapp/services/machine.js @@ -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) diff --git a/server/ZR.Admin.WebApi/Controllers/Business/OdfPortsController.cs b/server/ZR.Admin.WebApi/Controllers/Business/OdfPortsController.cs index 4cd1635..2f45f12 100644 --- a/server/ZR.Admin.WebApi/Controllers/Business/OdfPortsController.cs +++ b/server/ZR.Admin.WebApi/Controllers/Business/OdfPortsController.cs @@ -167,6 +167,76 @@ namespace ZR.Admin.WebApi.Controllers.Business return SUCCESS(list); } + /// + /// 查询光交箱端口列表(左右分开) + /// + [HttpGet("mlist/optical")] + [ActionPermissionFilter(Permission = "odfports:list")] + public async Task 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(); + + 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); + } + /// diff --git a/server/ZR.Admin.WebApi/Controllers/Business/OdfRacksController.cs b/server/ZR.Admin.WebApi/Controllers/Business/OdfRacksController.cs index 5898eef..5b5d69e 100644 --- a/server/ZR.Admin.WebApi/Controllers/Business/OdfRacksController.cs +++ b/server/ZR.Admin.WebApi/Controllers/Business/OdfRacksController.cs @@ -122,20 +122,23 @@ namespace ZR.Admin.WebApi.Controllers.Business if (parm.FramesCount > 0) { - //添加机框 List framesList = new List(); 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 ports = new List(); + + if (modal.RackType == 1) { - var ra = rack; - if (ra == null) - { - continue; - } - List ports = new List(); + // 光交箱:每行生成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; + } } } } diff --git a/server/ZR.Admin.WebApi/Controllers/Business/OdfRoomsController.cs b/server/ZR.Admin.WebApi/Controllers/Business/OdfRoomsController.cs index edcab35..8664bd5 100644 --- a/server/ZR.Admin.WebApi/Controllers/Business/OdfRoomsController.cs +++ b/server/ZR.Admin.WebApi/Controllers/Business/OdfRoomsController.cs @@ -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 framesList = new List(); 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 ports = new List(); + + if (parm.RackType == 1) { - var ra = racksList.Find(it => it.Id == frame.RackId); - if (ra == null) - { - continue; - } - List ports = new List(); + // 光交箱:每行生成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; + } } } } - } diff --git a/server/ZR.Model/Business/Dto/OdfPortsDto.cs b/server/ZR.Model/Business/Dto/OdfPortsDto.cs index ecfbfe8..8b9e9b5 100644 --- a/server/ZR.Model/Business/Dto/OdfPortsDto.cs +++ b/server/ZR.Model/Business/Dto/OdfPortsDto.cs @@ -756,4 +756,21 @@ namespace ZR.Model.Business.Dto [ExcelColumnName("修改时间")] public DateTime? UpdatedAt { get; set; } } + + /// + /// 光交箱机架详情DTO - 每个框包含左右两侧端口 + /// + public class OdfOpticalBoxFrameDto + { + public int Id { get; set; } + public string Name { get; set; } + /// + /// 左侧光交箱端子(PortSide=0) + /// + public List LeftPortsList { get; set; } = new List(); + /// + /// 右侧ODF端子(PortSide=1) + /// + public List RightPortsList { get; set; } = new List(); + } } \ No newline at end of file diff --git a/server/ZR.Model/Business/Dto/OdfRacksDto.cs b/server/ZR.Model/Business/Dto/OdfRacksDto.cs index fe84316..31955d5 100644 --- a/server/ZR.Model/Business/Dto/OdfRacksDto.cs +++ b/server/ZR.Model/Business/Dto/OdfRacksDto.cs @@ -67,13 +67,12 @@ namespace ZR.Model.Business.Dto /// public int RowCount { get; set; } /// - /// 端口数量 + /// 端口数量(ODF机架用,光交箱固定12) /// public int PortsCount { get; set; } /// - /// + /// 默认连接状态 /// - public int DefaultStatus { get; set; } } } \ No newline at end of file diff --git a/server/ZR.Model/Business/Dto/OdfRoomsDto.cs b/server/ZR.Model/Business/Dto/OdfRoomsDto.cs index ced1191..57b8362 100644 --- a/server/ZR.Model/Business/Dto/OdfRoomsDto.cs +++ b/server/ZR.Model/Business/Dto/OdfRoomsDto.cs @@ -172,15 +172,16 @@ namespace ZR.Model.Business.Dto /// public int RowCount { get; set; } /// - /// 端口数量 + /// 端口数量(ODF机架用,光交箱固定12) /// public int PortsCount { get; set; } /// - /// + /// 默认连接状态 /// - public int DefaultStatus { get; set; } - - + /// + /// 机架类型:0=ODF机架, 1=光交箱 + /// + public int RackType { get; set; } } } \ No newline at end of file diff --git a/server/ZR.Model/Business/OdfPorts.cs b/server/ZR.Model/Business/OdfPorts.cs index 063d2bb..0ad85bd 100644 --- a/server/ZR.Model/Business/OdfPorts.cs +++ b/server/ZR.Model/Business/OdfPorts.cs @@ -112,5 +112,10 @@ namespace ZR.Model.Business /// public string BusinessType { get; set; } + /// + /// 端口侧:0=左侧(光交箱端子/默认), 1=右侧(ODF端子) + /// + public int PortSide { get; set; } + } } \ No newline at end of file diff --git a/server/ZR.Vue/src/components/business/OdfRackExpertForm.vue b/server/ZR.Vue/src/components/business/OdfRackExpertForm.vue index 785a8c1..bd6c5e6 100644 --- a/server/ZR.Vue/src/components/business/OdfRackExpertForm.vue +++ b/server/ZR.Vue/src/components/business/OdfRackExpertForm.vue @@ -23,6 +23,15 @@ + + + + + + + + + @@ -42,12 +51,18 @@
每个机框中有多少行
- +
每个机框中每行端口数量
+ + + +
光交箱每行左右各12个端口,共24个
+
+
@@ -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, diff --git a/server/ZR.Vue/src/components/business/OdfRoomExpertForm.vue b/server/ZR.Vue/src/components/business/OdfRoomExpertForm.vue index 80e1be1..9ca9fa1 100644 --- a/server/ZR.Vue/src/components/business/OdfRoomExpertForm.vue +++ b/server/ZR.Vue/src/components/business/OdfRoomExpertForm.vue @@ -49,6 +49,14 @@ 高级信息 + + + + + + + + @@ -67,12 +75,18 @@
每个机框中有多少行
- +
每个机框中每行端口数量
+ + + +
光交箱每行左右各12个端口,共24个
+
+
@@ -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')