odf_new/server/ZR.Admin.WebApi/Controllers/Business/OdfRacksController.cs
zpc 996e1abc24
Some checks reported errors
continuous-integration/drone/push Build encountered an error
21
2026-04-21 21:57:28 +08:00

494 lines
20 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Microsoft.AspNetCore.Mvc;
using ZR.Model.Business.Dto;
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
{
/// <summary>
/// 机架列表
/// </summary>
[Route("business/OdfRacks")]
public class OdfRacksController : BaseController
{
/// <summary>
/// 机架列表接口
/// </summary>
private readonly IOdfRacksService _OdfRacksService;
private readonly IOdfRoomsService _odfRooms;
/// <summary>
/// 框
/// </summary>
private readonly IOdfFramesService _OdfFramesService;
/// <summary>
/// 端口
/// </summary>
private readonly IOdfPortsService _OdfPortsService;
private readonly IOdfAuditLogsService _auditLogsService;
public OdfRacksController(IOdfRacksService OdfRacksService, IOdfRoomsService odfRooms,
IOdfFramesService odfFramesService,
IOdfPortsService odfPortsService,
IOdfAuditLogsService auditLogsService)
{
_OdfRacksService = OdfRacksService;
_odfRooms = odfRooms;
_OdfFramesService = odfFramesService;
_OdfPortsService = odfPortsService;
_auditLogsService = auditLogsService;
}
/// <summary>
/// 查询机架列表列表
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
[HttpGet("list")]
[ActionPermissionFilter(Permission = "odfracks:list")]
public IActionResult QueryOdfRacks([FromQuery] OdfRacksQueryDto parm)
{
var response = _OdfRacksService.GetList(parm);
return SUCCESS(response);
}
/// <summary>
/// 查询机架列表详情
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
[HttpGet("{Id}")]
[ActionPermissionFilter(Permission = "odfracks:query")]
public IActionResult GetOdfRacks(int Id)
{
var response = _OdfRacksService.GetInfo(Id);
var info = response.Adapt<OdfRacksDto>();
return SUCCESS(info);
}
/// <summary>
/// 添加机架列表
/// </summary>
/// <returns></returns>
[HttpPost]
[ActionPermissionFilter(Permission = "odfracks:add")]
[Log(Title = "机架列表", BusinessType = BusinessType.INSERT)]
public IActionResult AddOdfRacks([FromBody] OdfRacksDto parm)
{
var modal = parm.Adapt<OdfRacks>().ToCreate(HttpContext);
if (modal.RoomId > 0)
{
var rooms = _odfRooms.GetById(modal.RoomId);
if (rooms == null)
{
return ToResponse(ResultCode.FAIL, "机房不存在");
}
modal.DeptId = rooms.DeptId ?? 0;
}
var response = _OdfRacksService.AddOdfRacks(modal);
// 手动记录 INSERT 审计日志
try
{
var newRecord = _OdfRacksService.GetFirst(f => f.Id == response.Id);
string newData = BuildAuditJson(new Dictionary<string, object>
{
["Id"] = newRecord.Id,
["机房ID"] = newRecord.RoomId,
["序号"] = newRecord.SequenceNumber,
["ODF名称"] = newRecord.RackName,
["框数量"] = newRecord.FrameCount,
["创建时间"] = newRecord.CreatedAt,
["修改时间"] = newRecord.UpdatedAt,
["部门ID"] = newRecord.DeptId,
["机架类型"] = newRecord.RackType,
});
_auditLogsService.AddLog(BuildAuditLog("odf_racks", response.Id, "INSERT", null, newData));
}
catch (Exception ex)
{
NLog.LogManager.GetCurrentClassLogger().Error(ex, "审计日志写入失败");
}
return SUCCESS(response);
}
/// <summary>
/// 添加机架列表
/// </summary>
/// <returns></returns>
[HttpPost("expert")]
[ActionPermissionFilter(Permission = "odfracks:add")]
[Log(Title = "机架列表", BusinessType = BusinessType.INSERT)]
public async Task<IActionResult> AddOdfRacksExpert([FromBody] OdfRacksExpertDto parm)
{
var modal = parm.Adapt<OdfRacks>().ToCreate(HttpContext);
if (modal.RoomId == 0)
{
return ToResponse(ResultCode.FAIL, "机房不存在");
}
var rooms = _odfRooms.GetById(modal.RoomId);
if (rooms == null)
{
return ToResponse(ResultCode.FAIL, "机房不存在");
}
modal.DeptId = rooms.DeptId ?? 0;
modal.FrameCount = parm.FramesCount;
var response = _OdfRacksService.AddOdfRacks(modal);
var roomId = rooms.Id;
var roomName = rooms.RoomName;
if (parm.FramesCount > 0)
{
//添加机框
List<OdfFrames> framesList = new List<OdfFrames>();
var rack = response;
// 光交箱用左右端口数ODF用portsCount
var portsCount = modal.RackType == 1 ? parm.LeftPortsCount : parm.PortsCount;
for (int i = 0; i < parm.FramesCount; i++)
{
var t = await _OdfFramesService.InsertReturnEntityAsync(new OdfFrames()
{
CreatedAt = DateTime.Now,
UpdateAt = DateTime.Now,
PortsCol = portsCount,
PortsCount = portsCount,
DeptId = rack.DeptId,
PortsRow = portsCount,
PortsName = $"{(i + 1)}框",
RackId = rack.Id,
SequenceNumber = i + 1
});
framesList.Add(t);
}
//添加机框结束
if (parm.RowCount > 0)
{
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 leftCount = parm.LeftPortsCount;
var rightCount = parm.RightPortsCount;
for (int row = 0; row < parm.RowCount; row++)
{
string rowLetter = ((char)(65 + row)).ToString(); // A, B, C...
// 左侧光交箱端子 PortSide=0
for (int port = 0; port < leftCount; 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 < rightCount; 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 = 1,
OpticalAttenuation = "",
HistoryRemarks = "",
Remarks = "",
OpticalCableOffRemarks = "",
Status = parm.DefaultStatus,
UpdatedAt = DateTime.Now,
});
}
}
}
else
{
// ODF机架保持原有逻辑
if (portsCount > 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;
}
}
}
}
// 手动记录 INSERT 审计日志(仅记录机架)
try
{
var newRecord = _OdfRacksService.GetFirst(f => f.Id == response.Id);
string newData = BuildAuditJson(new Dictionary<string, object>
{
["Id"] = newRecord.Id,
["机房ID"] = newRecord.RoomId,
["序号"] = newRecord.SequenceNumber,
["ODF名称"] = newRecord.RackName,
["框数量"] = newRecord.FrameCount,
["创建时间"] = newRecord.CreatedAt,
["修改时间"] = newRecord.UpdatedAt,
["部门ID"] = newRecord.DeptId,
["机架类型"] = newRecord.RackType,
});
_auditLogsService.AddLog(BuildAuditLog("odf_racks", response.Id, "INSERT", null, newData));
}
catch (Exception ex)
{
NLog.LogManager.GetCurrentClassLogger().Error(ex, "审计日志写入失败");
}
return SUCCESS(response);
}
/// <summary>
/// 更新机架列表
/// </summary>
/// <returns></returns>
[HttpPut]
[ActionPermissionFilter(Permission = "odfracks:edit")]
[Log(Title = "机架列表", BusinessType = BusinessType.UPDATE)]
public async Task<IActionResult> UpdateOdfRacks([FromBody] OdfRacksDto parm)
{
var modal = parm.Adapt<OdfRacks>().ToUpdate(HttpContext);
// 查旧数据
var oldRecord = _OdfRacksService.GetFirst(f => f.Id == parm.Id);
string oldData = BuildAuditJson(new Dictionary<string, object>
{
["ODF名称"] = oldRecord.RackName,
["序号"] = oldRecord.SequenceNumber,
["框数量"] = oldRecord.FrameCount,
["机架类型"] = oldRecord.RackType,
["修改时间"] = oldRecord.UpdatedAt,
});
var oldModel = _OdfRacksService.GetById(parm.Id);
var response = _OdfRacksService.UpdateOdfRacks(modal);
// 查新数据并记录 UPDATE 审计日志
try
{
var newRecord = _OdfRacksService.GetFirst(f => f.Id == parm.Id);
string newData = BuildAuditJson(new Dictionary<string, object>
{
["ODF名称"] = newRecord.RackName,
["序号"] = newRecord.SequenceNumber,
["框数量"] = newRecord.FrameCount,
["机架类型"] = newRecord.RackType,
["修改时间"] = newRecord.UpdatedAt,
});
_auditLogsService.AddLog(BuildAuditLog("odf_racks", parm.Id, "UPDATE", oldData, newData));
}
catch (Exception ex)
{
NLog.LogManager.GetCurrentClassLogger().Error(ex, "审计日志写入失败");
}
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);
}
/// <summary>
/// 删除机架列表
/// </summary>
/// <returns></returns>
[HttpPost("delete/{ids}")]
[ActionPermissionFilter(Permission = "odfracks:delete")]
[Log(Title = "机架列表", BusinessType = BusinessType.DELETE)]
public async Task<IActionResult> DeleteOdfRacks([FromRoute] string ids)
{
var idArr = Tools.SplitAndConvert<int>(ids);
// 循环每条记录分别记录 DELETE 审计日志
foreach (var racksId in idArr)
{
var oldRecord = _OdfRacksService.GetFirst(f => f.Id == racksId);
string oldData = BuildAuditJson(new Dictionary<string, object>
{
["Id"] = oldRecord.Id,
["机房ID"] = oldRecord.RoomId,
["序号"] = oldRecord.SequenceNumber,
["ODF名称"] = oldRecord.RackName,
["框数量"] = oldRecord.FrameCount,
["创建时间"] = oldRecord.CreatedAt,
["修改时间"] = oldRecord.UpdatedAt,
["部门ID"] = oldRecord.DeptId,
["机架类型"] = oldRecord.RackType,
});
try
{
_auditLogsService.AddLog(BuildAuditLog("odf_racks", racksId, "DELETE", oldData, null));
}
catch (Exception ex)
{
NLog.LogManager.GetCurrentClassLogger().Error(ex, "审计日志写入失败");
}
}
foreach (var racksId in idArr)
{
var racks = _OdfRacksService.GetById(racksId);
if (racks == null)
{
return ToResponse(ResultCode.FAIL, "删除失败");
}
//删除机房下的所有端口
await _OdfPortsService.AsDeleteable().Where(it => it.RackId == racks.Id).ExecuteCommandAsync();
//删除机房下所有的框
var deletedCount = await _OdfFramesService.AsDeleteable().Where(it => it.RackId == racks.Id).ExecuteCommandAsync();
//删除机架
_OdfRacksService.Delete(racks);
}
return ToResponse(_OdfRacksService.Delete(idArr, "删除机架列表"));
}
/// <summary>
/// 导出机架列表
/// </summary>
/// <returns></returns>
[Log(Title = "机架列表", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
[HttpGet("export")]
[ActionPermissionFilter(Permission = "odfracks:export")]
public IActionResult Export([FromQuery] OdfRacksQueryDto parm)
{
var list = _OdfRacksService.ExportList(parm).Result;
if (list == null || list.Count <= 0)
{
return ToResponse(ResultCode.FAIL, "没有要导出的数据");
}
var result = ExportExcelMini(list, "机架列表", "机架列表");
return ExportExcel(result.Item2, result.Item1);
}
/// <summary>
/// 导入
/// </summary>
/// <param name="formFile"></param>
/// <returns></returns>
[HttpPost("importData")]
[Log(Title = "机架列表导入", BusinessType = BusinessType.IMPORT, IsSaveRequestData = false)]
[ActionPermissionFilter(Permission = "odfracks:import")]
public IActionResult ImportData([FromForm(Name = "file")] IFormFile formFile)
{
List<OdfRacksDto> list = new();
using (var stream = formFile.OpenReadStream())
{
list = stream.Query<OdfRacksDto>(startCell: "A1").ToList();
}
return SUCCESS(_OdfRacksService.ImportOdfRacks(list.Adapt<List<OdfRacks>>()));
}
/// <summary>
/// 机架列表导入模板下载
/// </summary>
/// <returns></returns>
[HttpGet("importTemplate")]
[Log(Title = "机架列表模板", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
[AllowAnonymous]
public IActionResult ImportTemplateExcel()
{
var result = DownloadImportTemplate(new List<OdfRacksDto>() { }, "OdfRacks");
return ExportExcel(result.Item2, result.Item1);
}
}
}