This commit is contained in:
zpc 2025-08-07 16:58:17 +08:00
parent 7ef76129c6
commit b46027e9b0
8 changed files with 470 additions and 18 deletions

View File

@ -152,11 +152,29 @@ namespace ZR.Admin.WebApi.Controllers.Business
[HttpPut]
[ActionPermissionFilter(Permission = "odfframes:edit")]
[Log(Title = "框-信息", BusinessType = BusinessType.UPDATE)]
public IActionResult UpdateOdfFrames([FromBody] OdfFramesDto parm)
public async Task<IActionResult> UpdateOdfFrames([FromBody] OdfFramesDto parm)
{
var modal = parm.Adapt<OdfFrames>().ToUpdate(HttpContext);
var oldModel = _OdfFramesService.GetById(parm.Id);
var response = _OdfFramesService.UpdateOdfFrames(modal);
if (response > 0)
{
var rortsName = oldModel.PortsName;
var frameId = modal.Id;
var rackId = modal.RackId;
if (oldModel.PortsName != modal.PortsName)
{
// 最直接的转换
await _OdfPortsService.UpdateAsync(
it => it.FrameId == frameId && it.RackId == rackId, // WHERE条件
it => new OdfPorts // SET部分
{
FrameName = modal.PortsName,
}
);
}
}
return ToResponse(response);
}

View File

@ -10,6 +10,7 @@ using static SKIT.FlurlHttpClient.Wechat.Api.Models.WxaBusinessGetLiveInfoRespon
using System.Threading.Tasks;
using ZR.Repository;
using Aliyun.OSS;
using System.Linq;
//创建时间2025-08-05
namespace ZR.Admin.WebApi.Controllers.Business
@ -30,12 +31,16 @@ namespace ZR.Admin.WebApi.Controllers.Business
private readonly IOdfRoomsService _OdfRoomsService;
private readonly ISysDeptService _SysDeptService;
/// <summary>
///
/// </summary>
private readonly ISysUserService _SysUserService;
/// <summary>
///机架
/// </summary>
@ -51,13 +56,17 @@ namespace ZR.Admin.WebApi.Controllers.Business
ISysUserService sysUserService,
IOdfPortsService odfPortsService,
IOdfFramesService odfFramesService,
IOdfRacksService odfRacksService)
IOdfRacksService odfRacksService
)
{
_OdfRoomsService = OdfRoomsService;
_SysUserService = sysUserService;
_OdfPortsService = odfPortsService;
_OdfFramesService = odfFramesService;
_OdfRacksService = odfRacksService;
_SysDeptService = sysDeptService;
}
/// <summary>
@ -339,15 +348,143 @@ namespace ZR.Admin.WebApi.Controllers.Business
[HttpPost("importData")]
[Log(Title = "端口导入", BusinessType = BusinessType.IMPORT, IsSaveRequestData = false)]
[ActionPermissionFilter(Permission = "odfports:import")]
public IActionResult ImportData([FromForm(Name = "file")] IFormFile formFile)
public async Task<IActionResult> ImportData([FromForm(Name = "file")] IFormFile formFile)
{
List<OdfPortsDto> list = new();
List<OdfPortsImportDto> list = new();
using (var stream = formFile.OpenReadStream())
{
list = stream.Query<OdfPortsDto>(startCell: "A1").ToList();
list = stream.Query<OdfPortsImportDto>(startCell: "A1").ToList();
}
int errorCount = 0;
int successCount = 0;
int addRoomCount = 0;
int addRackCount = 0;
int addFrameCount = 0;
int addPortCount = 0;
if (list.Count > 0)
{
List<OdfPorts> odfPorts = new List<OdfPorts>();
var deptName = list.Select(it => it.DeptName.Trim()).Distinct().ToList();
var deptInfo = _SysDeptService.AsQueryable().Where(it => deptName.Contains(it.DeptName)).Select(it => new { it.DeptId, it.DeptName }).ToList();
return SUCCESS(_OdfPortsService.ImportOdfPorts(list.Adapt<List<OdfPorts>>()));
var roomNameList = list.Select(it => it.RoomName).Select(it => it.Trim()).Distinct().ToList();
var roomList = _OdfRoomsService.AsQueryable().Where(it => roomNameList.Contains(it.RoomName)).ToList();
foreach (var excelItem in list)
{
try
{
var dept = deptInfo.Find(it => it.DeptName == excelItem.DeptName);
if (dept == null)
{
//没有部门,下一个数据
errorCount++;
continue;
}
var room = roomList.Find(it => it.RoomName == excelItem.RoomName);
if (room == null)
{
//添加机房
var roomItem = new OdfRooms()
{
CreatedAt = DateTime.Now,
RoomAddress = "",
UpdatedAt = DateTime.Now,
DeptId = dept.DeptId,
DeptName = dept.DeptName,
RacksCount = 0,
Remarks = "",
RoomName = excelItem.RoomName
};
await _OdfRoomsService.InsertReturnEntityAsync(roomItem);
addRoomCount++;
roomList.Add(roomItem);
room = roomItem;
}
//添加机架
var rack = _OdfRacksService.AsQueryable().Where(it => it.RoomId == room.Id && it.RackName == excelItem.RackName).First();
if (rack == null)
{
var sequenceNumber = _OdfRacksService.AsQueryable().Where(it => it.RoomId == room.Id).Max(it => (int?)it.SequenceNumber) ?? 0;
sequenceNumber++;
rack = new OdfRacks()
{
CreatedAt = DateTime.Now,
UpdatedAt = DateTime.Now,
RoomId = room.Id,
RackName = excelItem.RackName,
DeptId = dept.DeptId,
FrameCount = 0,
SequenceNumber = sequenceNumber,
};
await _OdfRacksService.InsertReturnEntityAsync(rack);
addRackCount++;
}
//添加框
var frame = _OdfFramesService.AsQueryable().Where(it => it.RackId == rack.Id && it.PortsName == excelItem.FrameName).First();
if (frame == null)
{
var sequenceNumber = _OdfFramesService.AsQueryable().Where(it => it.RackId == rack.Id).Max(it => (int?)it.SequenceNumber) ?? 0;
sequenceNumber++;
frame = new OdfFrames()
{
CreatedAt = DateTime.Now,
UpdateAt = DateTime.Now,
RackId = rack.Id,
PortsName = excelItem.FrameName,
SequenceNumber = sequenceNumber,
PortsCol = 0,
PortsCount = 0,
DeptId = dept.DeptId,
PortsRow = 0,
};
await _OdfFramesService.InsertReturnEntityAsync(frame);
addFrameCount++;
}
//添加端口
var port = _OdfPortsService.AsQueryable().Where(it => it.FrameId == frame.Id && it.RowNumber == excelItem.RowNumber && it.PortNumber == excelItem.PortNumber).First();
if (port == null)
{
port = new OdfPorts()
{
CreatedAt = DateTime.Now,
UpdatedAt = DateTime.Now,
DeptId = dept.DeptId,
DeptName = dept.DeptName,
FrameId = frame.Id,
FrameName = frame.PortsName,
RackId = rack.Id,
RackName = rack.RackName,
RoomId = room.Id,
RoomName = room.RoomName,
Name = excelItem.RowNumber + "-" + excelItem.PortNumber,
RowNumber = excelItem.RowNumber,
PortNumber = excelItem.PortNumber,
Status = excelItem.Status,
Remarks = excelItem.Remarks?.Trim(),
OpticalAttenuation = excelItem.OpticalAttenuation?.Trim(),
HistoryRemarks = excelItem.HistoryRemarks?.Trim(),
};
await _OdfPortsService.InsertAsync(port);
addPortCount++;
}
else
{
port.HistoryRemarks = excelItem.HistoryRemarks?.Trim();
port.Remarks = excelItem.Remarks?.Trim();
port.OpticalAttenuation = excelItem.OpticalAttenuation?.Trim();
port.Status = excelItem.Status;
await _OdfPortsService.UpdateAsync(port);
}
successCount++;
}
catch (Exception)
{
errorCount++;
}
}
}
return SUCCESS($"共查询{list.Count}条数据,导入成功{successCount}条数据!导入失败{errorCount}条!{(addRoomCount > 0 ? "" + addRoomCount + "," : "")}{(addRackCount > 0 ? "" + addRackCount + "" : "")}{(addFrameCount > 0 ? "" + addFrameCount + "" : "")}");
}
/// <summary>

View File

@ -4,6 +4,7 @@ using ZR.Model.Business;
using ZR.Service.Business.IBusinessService;
using MiniExcelLibs;
using ZR.Service.Business;
using SqlSugar;
//创建时间2025-08-05
namespace ZR.Admin.WebApi.Controllers.Business
@ -207,11 +208,29 @@ namespace ZR.Admin.WebApi.Controllers.Business
[HttpPut]
[ActionPermissionFilter(Permission = "odfracks:edit")]
[Log(Title = "机架列表", BusinessType = BusinessType.UPDATE)]
public IActionResult UpdateOdfRacks([FromBody] OdfRacksDto parm)
public async Task<IActionResult> UpdateOdfRacks([FromBody] OdfRacksDto parm)
{
var modal = parm.Adapt<OdfRacks>().ToUpdate(HttpContext);
var oldModel = _OdfRacksService.GetById(parm.Id);
var response = _OdfRacksService.UpdateOdfRacks(modal);
if (response > 0)
{
var rackName = oldModel.RackName;
var oldRoomId = modal.RoomId;
var rackId = modal.Id;
if (oldModel.RackName != modal.RackName)
{
// 最直接的转换
await _OdfPortsService.UpdateAsync(
it => it.RoomId == oldRoomId && it.RackId == rackId, // WHERE条件
it => new OdfPorts // SET部分
{
RackName = modal.RackName,
}
);
}
}
return ToResponse(response);
}

View File

@ -7,6 +7,9 @@ using ZR.ServiceCore.Services;
using System.Threading.Tasks;
using ZR.Service.Business;
using SqlSugar;
using static SKIT.FlurlHttpClient.Wechat.Api.Models.WxaBusinessGetLiveInfoResponse.Types;
using Aliyun.OSS;
using Azure;
//创建时间2025-08-05
namespace ZR.Admin.WebApi.Controllers.Business
@ -342,7 +345,7 @@ namespace ZR.Admin.WebApi.Controllers.Business
}
}
}
}
@ -378,14 +381,17 @@ namespace ZR.Admin.WebApi.Controllers.Business
var response = _OdfRoomsService.UpdateOdfRooms(modal);
if (response > 0)
{
var deptId = modal.DeptId ?? 0;
var deptName = modal.DeptName;
var roomName = modal.RoomName;
var oldRoomId = oldModel.Id;
if (oldModel.DeptId != modal.DeptId)
{
var deptId = modal.DeptId ?? 0;
var deptName = modal.DeptName;
var roomId = oldModel.Id;
// 最直接的转换
await _OdfPortsService.UpdateAsync(
it => it.RoomId == roomId, // WHERE条件
it => it.RoomId == oldRoomId, // WHERE条件
it => new OdfPorts // SET部分
{
DeptId = deptId,
@ -394,14 +400,14 @@ namespace ZR.Admin.WebApi.Controllers.Business
);
// 1. 更新 odf_racks
var racksUpdated = await _OdfRacksService.UpdateAsync(
r => r.RoomId == roomId,
r => r.RoomId == oldRoomId,
r => new OdfRacks { DeptId = deptId }
);
// 2. 更新 odf_frames方法1子查询
var framesUpdated = await _OdfFramesService.UpdateAsync(
f => SqlFunc.Subqueryable<OdfRacks>()
.Where(r => r.RoomId == roomId && r.Id == f.RackId)
.Where(r => r.RoomId == oldRoomId && r.Id == f.RackId)
.Any(),
f => new OdfFrames { DeptId = deptId }
);
@ -410,6 +416,17 @@ namespace ZR.Admin.WebApi.Controllers.Business
//_OdfFramesService
//_OdfRacksService
}
if (oldModel.RoomName != modal.RoomName)
{
// 最直接的转换
await _OdfPortsService.UpdateAsync(
it => it.RoomId == oldRoomId, // WHERE条件
it => new OdfPorts // SET部分
{
RoomName = roomName,
}
);
}
}
return ToResponse(response);
}
@ -454,15 +471,179 @@ namespace ZR.Admin.WebApi.Controllers.Business
[HttpPost("importData")]
[Log(Title = "机房列表导入", BusinessType = BusinessType.IMPORT, IsSaveRequestData = false)]
[ActionPermissionFilter(Permission = "odfrooms:import")]
public IActionResult ImportData([FromForm(Name = "file")] IFormFile formFile)
public async Task<IActionResult> ImportData([FromForm(Name = "file")] IFormFile formFile)
{
List<OdfRoomsDto> list = new();
List<OdfRoomsImDto> list = new();
using (var stream = formFile.OpenReadStream())
{
list = stream.Query<OdfRoomsDto>(startCell: "A1").ToList();
list = stream.Query<OdfRoomsImDto>(startCell: "A1").ToList();
}
int errorCount = 0;
int successCount = 0;
int addRoomCount = 0;
int addRackCount = 0;
int addFrameCount = 0;
int addPortCount = 0;
if (list.Count > 0)
{
List<OdfPorts> odfPorts = new List<OdfPorts>();
var deptName = list.Select(it => it.DeptName.Trim()).Distinct().ToList();
var deptInfo = sysDeptService.AsQueryable().Where(it => deptName.Contains(it.DeptName)).Select(it => new { it.DeptId, it.DeptName }).ToList();
return SUCCESS(_OdfRoomsService.ImportOdfRooms(list.Adapt<List<OdfRooms>>()));
var roomNameList = list.Select(it => it.RoomName).Select(it => it.Trim()).Distinct().ToList();
var roomList = _OdfRoomsService.AsQueryable().Where(it => roomNameList.Contains(it.RoomName)).ToList();
foreach (var excelItem in list)
{
try
{
var dept = deptInfo.Find(it => it.DeptName == excelItem.DeptName);
if (dept == null)
{
//没有部门,下一个数据
errorCount++;
continue;
}
var room = roomList.Find(it => it.RoomName == excelItem.RoomName);
if (room == null)
{
//添加机房
var roomItem = new OdfRooms()
{
CreatedAt = DateTime.Now,
RoomAddress = "",
UpdatedAt = DateTime.Now,
DeptId = dept.DeptId,
DeptName = dept.DeptName,
RacksCount = excelItem.RacksCount,
Remarks = "",
RoomName = excelItem.RoomName
};
await _OdfRoomsService.InsertReturnEntityAsync(roomItem);
addRoomCount++;
roomList.Add(roomItem);
room = roomItem;
}
else
{
room.RoomAddress = excelItem.RoomAddress?.Trim();
room.Remarks = excelItem.Remarks?.Trim();
room.RacksCount = excelItem.RacksCount ?? 0;
room.UpdatedAt = DateTime.Now;
await _OdfRoomsService.UpdateAsync(room);
continue;
}
if (excelItem.RacksCount > 0)
{
var roomId = room.Id;
var roomName = room.RoomName;
List<OdfRacks> racksList = new List<OdfRacks>();
//添加机架
for (int i = 0; i < excelItem.RacksCount; i++)
{
var t = await _OdfRacksService.InsertReturnEntityAsync(new OdfRacks
{
CreatedAt = DateTime.Now,
FrameCount = excelItem.FrameCount,
DeptId = room.DeptId ?? 0,
RackName = $"odf-{(i + 1)}",
RoomId = roomId,
SequenceNumber = i + 1,
UpdatedAt = DateTime.Now,
}); // 直接插入机架
racksList.Add(t);
}
//机架添加完成
//return Insertable(model).ExecuteReturnEntity();
if (excelItem.FrameCount > 0)
{
//添加机框
List<OdfFrames> framesList = new List<OdfFrames>();
foreach (var rack in racksList)
{
for (int i = 0; i < excelItem.FrameCount; i++)
{
var t = await _OdfFramesService.InsertReturnEntityAsync(new OdfFrames()
{
CreatedAt = DateTime.Now,
UpdateAt = DateTime.Now,
PortsCol = 12,
PortsRow = 6,
PortsCount = 6 * 12,
DeptId = rack.DeptId,
PortsName = $"{(i + 1)}框",
RackId = rack.Id,
SequenceNumber = i + 1
});
framesList.Add(t);
}
}
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>();
for (int row = 0; row < 6; row++)
{
for (int port = 0; port < 12; port++)
{
ports.Add(new OdfPorts()
{
CreatedAt = DateTime.Now,
DeptId = frame.DeptId ?? 0,
DeptName = room.DeptName,
RackId = frame.RackId,
RackName = ra.RackName,
RoomId = roomId,
RoomName = roomName,
FrameId = frame.Id,
FrameName = frame.PortsName,
Name = $"{(row + 1)}-{(port + 1)}",
RowNumber = row,
PortNumber = port,
OpticalAttenuation = "",
HistoryRemarks = "",
Remarks = "",
Status = 1,
UpdatedAt = DateTime.Now,
});
}
}
await _OdfPortsService.AsInsertable(ports).ExecuteReturnEntityAsync(true);
//如果超过100个机框则休眠一下防止服务器死机
index++;
if (index > 100)
{
Thread.Sleep(50);
index = 0;
}
}
}
}
successCount++;
}
catch (Exception)
{
errorCount++;
}
}
}
return SUCCESS($"导入成功{successCount}条数据,失败{errorCount}");
}
/// <summary>

Binary file not shown.

View File

@ -204,6 +204,69 @@ namespace ZR.Model.Business.Dto
public string DeptName { get; set; }
}
/// <summary>
/// 端口输入对象
/// </summary>
public class OdfPortsImportDto
{
[Required(ErrorMessage = "机房名称不能为空")]
[ExcelColumn(Name = "机房名称")]
[ExcelColumnName("机房名称")]
public string RoomName { get; set; }
[Required(ErrorMessage = "机架名称不能为空")]
[ExcelColumn(Name = "机架名称")]
[ExcelColumnName("机架名称")]
public string RackName { get; set; }
[Required(ErrorMessage = "机框名称不能为空")]
[ExcelColumn(Name = "机框名称")]
[ExcelColumnName("机框名称")]
public string FrameName { get; set; }
[Required(ErrorMessage = "行号不能为空")]
[ExcelColumn(Name = "行号1-6")]
[ExcelColumnName("行号1-6")]
public int RowNumber { get; set; }
[Required(ErrorMessage = "端口号1-12不能为空")]
[ExcelColumn(Name = "端口号1-12")]
[ExcelColumnName("端口号1-12")]
public int PortNumber { get; set; }
[Required(ErrorMessage = "连接状态0正常1断开不能为空")]
[ExcelColumn(Name = "连接状态1正常0断开")]
[ExcelColumnName("连接状态1正常0断开")]
public int Status { get; set; }
[ExcelColumn(Name = "备注")]
[ExcelColumnName("备注")]
public string Remarks { get; set; }
[ExcelColumn(Name = "光衰值dB")]
[ExcelColumnName("光衰值dB")]
public string OpticalAttenuation { get; set; }
[ExcelColumn(Name = "历史故障记录")]
[ExcelColumnName("历史故障记录")]
public string HistoryRemarks { get; set; }
/// <summary>
/// 部门名称
/// </summary>
[ExcelColumn(Name = "部门名称")]
public string DeptName { get; set; }
}
/// <summary>
/// 端口输入输出对象

View File

@ -105,9 +105,43 @@ namespace ZR.Model.Business.Dto
[ExcelColumn(Name = "修改时间", Format = "yyyy-MM-dd HH:mm:ss", Width = 20)]
[ExcelColumnName("修改时间")]
public DateTime? UpdatedAt { get; set; }
}
/// <summary>
/// 机房列表输入输出对象
/// </summary>
public class OdfRoomsImDto
{
[ExcelColumn(Name = "部门名称")]
[ExcelColumnName("部门名称")]
public string DeptName { get; set; }
[Required(ErrorMessage = "机房名称不能为空")]
[ExcelColumn(Name = "机房名称")]
[ExcelColumnName("机房名称")]
public string RoomName { get; set; }
[ExcelColumn(Name = "机房位置")]
[ExcelColumnName("机房位置")]
public string RoomAddress { get; set; }
[ExcelColumn(Name = "备注")]
[ExcelColumnName("备注")]
public string Remarks { get; set; }
[ExcelColumn(Name = "机架数量")]
[ExcelColumnName("机架数量")]
public int? RacksCount { get; set; }
[ExcelColumn(Name = "机框数量")]
[ExcelColumnName("机框数量")]
public int? FrameCount { get; set; }
[ExcelColumn(Name = "是否生成端口数据1生成0只导入机房列表")]
[ExcelColumnName("是否生成端口数据1生成0只导入机房列表")]
public int? CreateRoomInfo { get; set; }
}
/// <summary>