feat(odf-ports): Add port side support for optical distribution frame ports

- Add PortSide property to distinguish between left (0) and right (1) sides of optical frames
- Implement row number parsing logic to handle both letter (A-C) and numeric formats
- Update port name generation to support both sides: letter format (A-1) for left side, numeric format (1-1) for right side
- Add RowNumberRaw property to capture raw input before parsing and conversion
- Add RowNumberDisplay property for display purposes while keeping RowNumber as internal numeric value
- Mark PortSide and RowNumber as ExcelIgnore to prevent export conflicts
- Clean up formatting inconsistencies in OdfPortsDto class
- Update port query logic to include PortSide in filtering criteria
- Enhance port creation to properly assign PortSide based on rack type and row format
This commit is contained in:
zpc 2026-04-04 18:31:19 +08:00
parent 7c4b0adde4
commit 4ac2cd85c4
3 changed files with 120 additions and 20 deletions

View File

@ -728,18 +728,39 @@ namespace ZR.Admin.WebApi.Controllers.Business
addFrameCount++;
}
//添加端口
var port = _OdfPortsService.AsQueryable().Where(it => it.FrameId == frame.Id && it.RowNumber == excelItem.RowNumber && it.PortNumber == excelItem.PortNumber).First();
// 生成端口名称:光交箱用 A-1 格式ODF用 1-1 格式
string portName;
if (rack.RackType == 1)
// 解析行号:字母(A,B,C...)表示光交箱左侧数字表示右侧或普通ODF
int rowNumber;
int portSide = 0; // 默认左侧/普通
var rowRaw = excelItem.RowNumberRaw?.Trim().ToUpper();
if (!string.IsNullOrEmpty(rowRaw) && rowRaw.Length == 1 && char.IsLetter(rowRaw[0]))
{
// 光交箱:行号转字母 (1=A, 2=B, 3=C...)
string rowLetter = ((char)(64 + excelItem.RowNumber)).ToString();
portName = $"{rowLetter}-{excelItem.PortNumber}";
// 字母行号A=1, B=2, C=3... 光交箱左侧
rowNumber = rowRaw[0] - 64;
portSide = 0;
}
else
{
portName = excelItem.RowNumber + "-" + excelItem.PortNumber;
rowNumber = int.Parse(rowRaw);
// 光交箱的数字行号是右侧
portSide = rack.RackType == 1 ? 1 : 0;
}
var port = _OdfPortsService.AsQueryable().Where(it => it.FrameId == frame.Id && it.RowNumber == rowNumber && it.PortNumber == excelItem.PortNumber && it.PortSide == portSide).First();
// 生成端口名称:光交箱用 A-1 格式ODF用 1-1 格式
string portName;
if (rack.RackType == 1 && portSide == 0)
{
// 光交箱左侧:行号转字母 (1=A, 2=B, 3=C...)
string rowLetter = ((char)(64 + rowNumber)).ToString();
portName = $"{rowLetter}-{excelItem.PortNumber}";
}
else if (rack.RackType == 1 && portSide == 1)
{
portName = rowNumber + "-" + excelItem.PortNumber;
}
else
{
portName = rowNumber + "-" + excelItem.PortNumber;
}
string remarks = "";
if (!string.IsNullOrEmpty(excelItem.Remarks))
@ -778,7 +799,7 @@ namespace ZR.Admin.WebApi.Controllers.Business
RoomId = room.Id,
RoomName = room.RoomName,
Name = portName,
RowNumber = excelItem.RowNumber,
RowNumber = rowNumber,
PortNumber = excelItem.PortNumber,
Status = excelItem.Status,
Remarks = remarks,
@ -787,6 +808,7 @@ namespace ZR.Admin.WebApi.Controllers.Business
OpticalCableOffRemarks = excelItem.OpticalCableOffRemarks,
BusinessType = excelItem.BusinessType,
EquipmentModel = excelItem.EquipmentModel,
PortSide = portSide,
};
port = _OdfPortsService.AddOdfPorts(port);
addPortCount++;

View File

@ -254,7 +254,7 @@ namespace ZR.Model.Business.Dto
/// <summary>
/// 端口输入输出对象
/// </summary>
public class OdfPortsfDto
public class OdfPortsfDto
{
[Required(ErrorMessage = "Id不能为空")]
[ExcelColumn(Name = "Id")]
@ -311,8 +311,17 @@ namespace ZR.Model.Business.Dto
[Required(ErrorMessage = "行号1-6不能为空")]
[ExcelColumn(Name = "行号1-6")]
[ExcelColumnName("行号1-6")]
public string RowNumberDisplay { get; set; }
[ExcelIgnore]
public int RowNumber { get; set; }
/// <summary>
/// 端口侧不导出0=左侧, 1=右侧
/// </summary>
[ExcelIgnore]
public int PortSide { get; set; }
[Required(ErrorMessage = "端口号1-12不能为空")]
[ExcelColumn(Name = "端口号1-12")]
[ExcelColumnName("端口号1-12")]
@ -331,8 +340,6 @@ namespace ZR.Model.Business.Dto
[ExcelColumnName("光衰值dB")]
public string OpticalAttenuation { get; set; }
[ExcelColumn(Name = "光缆断信息")]
[ExcelColumnName("光缆断信息")]
public string OpticalCableOffRemarks { get; set; }
@ -341,7 +348,6 @@ namespace ZR.Model.Business.Dto
[ExcelColumnName("历史故障记录")]
public string HistoryRemarks { get; set; }
[Required(ErrorMessage = "创建时间不能为空")]
[ExcelColumn(Name = "创建时间", Format = "yyyy-MM-dd HH:mm:ss", Width = 20)]
[ExcelColumnName("创建时间")]
@ -352,7 +358,6 @@ namespace ZR.Model.Business.Dto
[ExcelColumnName("修改时间")]
public DateTime? UpdatedAt { get; set; }
private string _statusLabel;
[ExcelColumn(Name = "连接状态0正常1断开")]
public string StatusLabel
@ -373,7 +378,6 @@ namespace ZR.Model.Business.Dto
[ExcelColumn(Name = "部门名称")]
public string DeptName { get; set; }
/// <summary>
/// 设备型号
/// </summary>
@ -388,6 +392,7 @@ namespace ZR.Model.Business.Dto
public string BusinessType { get; set; }
}
/// <summary>
/// 端口输入对象
/// </summary>
@ -427,7 +432,7 @@ namespace ZR.Model.Business.Dto
[Required(ErrorMessage = "行号不能为空")]
[ExcelColumn(Name = "行号1-6")]
[ExcelColumnName("行号1-6")]
public int RowNumber { get; set; }
public string RowNumberRaw { get; set; }
[Required(ErrorMessage = "端口号1-12不能为空")]
[ExcelColumn(Name = "端口号1-12")]
@ -694,6 +699,12 @@ namespace ZR.Model.Business.Dto
[ExcelColumn(Name = "行号1-6", Width = 12)]
[ExcelColumnName("行号1-6")]
public string RowNumberDisplay { get; set; }
/// <summary>
/// 原始行号(不导出,仅用于内部转换)
/// </summary>
[ExcelIgnore]
public int RowNumber { get; set; }
[ExcelColumn(Name = "端口号1-12", Width = 12)]
@ -755,6 +766,12 @@ namespace ZR.Model.Business.Dto
[ExcelColumn(Name = "修改时间", Format = "yyyy-MM-dd HH:mm:ss", Width = 20)]
[ExcelColumnName("修改时间")]
public DateTime? UpdatedAt { get; set; }
/// <summary>
/// 端口侧不导出仅用于内部判断0=左侧, 1=右侧
/// </summary>
[ExcelIgnore]
public int PortSide { get; set; }
}
/// <summary>

View File

@ -142,12 +142,37 @@ namespace ZR.Service.Business
var response = Queryable()
.Where(predicate.ToExpression())
.OrderBy("RoomId asc,RackId asc,FrameId asc,RowNumber asc,PortNumber Asc")
.OrderBy("RoomId asc,RackId asc,FrameId asc,RowNumber asc,PortSide asc,PortNumber Asc")
.Select((it) => new OdfPortsfDto()
{
}, true)
.ToPage(parm);
// 查询机架类型
var rackIds = response.Result.Select(r => r.RackId).Distinct().ToList();
var racks = Context.Queryable<OdfRacks>()
.Where(r => rackIds.Contains(r.Id))
.Select(r => new { r.Id, r.RackType })
.ToList();
var rackTypeDict = racks.ToDictionary(r => r.Id, r => r.RackType);
foreach (var item in response.Result)
{
if (rackTypeDict.TryGetValue(item.RackId, out var rackType))
{
item.RackType = rackType;
}
// 光交箱左侧行号转为字母
if (item.RackType == 1 && item.PortSide == 0)
{
item.RowNumberDisplay = ((char)(64 + item.RowNumber)).ToString();
}
else
{
item.RowNumberDisplay = item.RowNumber.ToString();
}
}
return response;
}
@ -164,12 +189,37 @@ namespace ZR.Service.Business
var response = Queryable()
.Where(predicate.ToExpression())
.OrderBy("RoomId asc,RackId asc,FrameId asc,RowNumber asc,PortNumber Asc")
.OrderBy("RoomId asc,RackId asc,FrameId asc,RowNumber asc,PortSide asc,PortNumber Asc")
.Select((it) => new OdfPortsfDto()
{
}, true)
.ToPage(parm);
// 查询机架类型
var rackIds = response.Result.Select(r => r.RackId).Distinct().ToList();
var racks = Context.Queryable<OdfRacks>()
.Where(r => rackIds.Contains(r.Id))
.Select(r => new { r.Id, r.RackType })
.ToList();
var rackTypeDict = racks.ToDictionary(r => r.Id, r => r.RackType);
foreach (var item in response.Result)
{
if (rackTypeDict.TryGetValue(item.RackId, out var rackType))
{
item.RackType = rackType;
}
// 光交箱左侧行号转为字母
if (item.RackType == 1 && item.PortSide == 0)
{
item.RowNumberDisplay = ((char)(64 + item.RowNumber)).ToString();
}
else
{
item.RowNumberDisplay = item.RowNumber.ToString();
}
}
return response;
}
@ -187,7 +237,7 @@ namespace ZR.Service.Business
var response = Queryable()
.Where(predicate.ToExpression())
.OrderBy("RoomId asc,RackId asc,FrameId asc,RowNumber asc,PortNumber Asc")
.OrderBy("RoomId asc,RackId asc,FrameId asc,RowNumber asc,PortSide asc,PortNumber Asc")
.Select((it) => new OdfPortsExportForImportDto()
{
RoomName = it.RoomName,
@ -204,7 +254,8 @@ namespace ZR.Service.Business
EquipmentModel = it.EquipmentModel ?? "",
BusinessType = it.BusinessType ?? "",
CreatedAt = it.CreatedAt,
UpdatedAt = it.UpdatedAt
UpdatedAt = it.UpdatedAt,
PortSide = it.PortSide
})
.ToPage(parm);
@ -226,6 +277,16 @@ namespace ZR.Service.Business
item.RackType = rackType;
}
// 光交箱左侧行号转为字母 A,B,C,D...
if (item.RackType == 1 && item.PortSide == 0)
{
item.RowNumberDisplay = ((char)(64 + item.RowNumber)).ToString(); // 1->A, 2->B, 3->C...
}
else
{
item.RowNumberDisplay = item.RowNumber.ToString();
}
ParseRemarksToFields(item);
}