.NETAdmin/ZR.Admin.WebApi/Controllers/Business/OdfRoomsController.cs
2025-08-07 17:20:29 +08:00

664 lines
27 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.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
{
/// <summary>
/// 机房列表
/// </summary>
[Route("business/OdfRooms")]
public class OdfRoomsController : BaseController
{
/// <summary>
/// 机房列表接口
/// </summary>
private readonly IOdfRoomsService _OdfRoomsService;
/// <summary>
/// 部门接口
/// </summary>
private readonly ISysDeptService sysDeptService;
/// <summary>
///
/// </summary>
private readonly ISysUserService _SysUserService;
/// <summary>
///机架
/// </summary>
private readonly IOdfRacksService _OdfRacksService;
/// <summary>
/// 框
/// </summary>
private readonly IOdfFramesService _OdfFramesService;
/// <summary>
/// 端口
/// </summary>
private readonly IOdfPortsService _OdfPortsService;
public OdfRoomsController(IOdfRoomsService OdfRoomsService,
ISysDeptService sysDeptService,
ISysUserService sysUserService,
IOdfPortsService odfPortsService,
IOdfFramesService odfFramesService,
IOdfRacksService odfRacksService)
{
_OdfRoomsService = OdfRoomsService;
this.sysDeptService = sysDeptService;
_SysUserService = sysUserService;
_OdfPortsService = odfPortsService;
_OdfFramesService = odfFramesService;
_OdfRacksService = odfRacksService;
}
/// <summary>
/// 查询机房列表列表
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
[HttpGet("list")]
[ActionPermissionFilter(Permission = "odfrooms:list")]
public IActionResult QueryOdfRooms([FromQuery] OdfRoomsQueryDto parm)
{
//long userId = HttpContext.GetUId();
//var user = _SysUserService.SelectUserById(userId);
////user.RoleIds
//if (!user.IsAdmin && user.Roles.Any(it => it.DataScope == 4))
//{
// //user.DeptId;
// //parm.DeptIds = user.DeptIds;
//}
//else if (!user.IsAdmin && user.Roles.Any(it => it.DataScope == 3))
//{
// parm.DeptIds = new List<long>() { user.DeptId };
//}
var response = _OdfRoomsService.GetList(parm);
return SUCCESS(response);
}
/// <summary>
/// 查询机房列表列表
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
[HttpGet("tree")]
[ActionPermissionFilter(Permission = "odfrooms:list")]
public IActionResult GetTreeList([FromQuery] OdfRoomsTreeQueryDto parm)
{
List<OdfRoomsTreeDto> list = new List<OdfRoomsTreeDto>();
if (parm.Level == 1)
{
var response = _OdfRoomsService.GetList(parm);
response.ForEach(it =>
{
list.Add(new OdfRoomsTreeDto
{
Key = it.Id.ToString(),
Id = it.Id.ToString(),
Name = it.RoomName,
DeptId = it.DeptId ?? 0,
Level = 2,
Leaf = false,
RoomId = it.Id,
});
});
}
else if (parm.Level == 2)
{
var response = _OdfRacksService.AsQueryable().Where(it => it.RoomId == parm.RoomId).OrderBy(it => it.SequenceNumber).ToList();
response.ForEach(it =>
{
list.Add(new OdfRoomsTreeDto
{
Key = parm.RoomId + "_" + it.Id.ToString(),
Id = parm.RoomId + "_" + it.Id.ToString(),
Name = it.RackName,
DeptId = it.DeptId,
Level = 3,
Leaf = false,
RoomId = parm.RoomId,
RacksId = it.Id,
});
});
}
else if (parm.Level == 3)
{
var response = _OdfFramesService.AsQueryable().Where(it => it.RackId == parm.RacksId).OrderBy(it => it.SequenceNumber).ToList();
response.ForEach(it =>
{
list.Add(new OdfRoomsTreeDto
{
Key = parm.RoomId + "_" + parm.RacksId + "_" + it.Id.ToString(),
Id = parm.RoomId + "_" + parm.RacksId + "_" + it.Id.ToString(),
Name = it.PortsName,
DeptId = it.DeptId ?? 0,
Level = 4,
Leaf = true,
RoomId = parm.RoomId,
RacksId = parm.RacksId,
FramesId = it.Id,
});
});
}
return SUCCESS(list);
}
/// <summary>
/// 查询机房列表详情
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
[HttpGet("{Id}")]
[ActionPermissionFilter(Permission = "odfrooms:query")]
public IActionResult GetOdfRooms(int Id)
{
var response = _OdfRoomsService.GetInfo(Id);
var info = response.Adapt<OdfRoomsDto>();
return SUCCESS(info);
}
/// <summary>
/// 添加机房列表
/// </summary>
/// <returns></returns>
[HttpPost]
[ActionPermissionFilter(Permission = "odfrooms:add")]
[Log(Title = "机房列表", BusinessType = BusinessType.INSERT)]
public async Task<IActionResult> AddOdfRooms([FromBody] OdfRoomsDto parm)
{
parm.CreatedAt = DateTime.Now;
parm.UpdatedAt = DateTime.Now;
if (parm.DeptId == 0)
{
parm.DeptName = "未知部门";
}
else
{
var dept = await sysDeptService.AsQueryable().Where(it => it.DeptId == parm.DeptId).FirstAsync();
if (dept == null)
{
return ToResponse(ResultCode.CUSTOM_ERROR, "部门不存在,请选择正确的部门!");
}
//var dept = _DeptService.GetInfo(parm.DeptId);
parm.DeptName = dept.DeptName;
}
var modal = parm.Adapt<OdfRooms>().ToCreate(HttpContext);
var response = _OdfRoomsService.AddOdfRooms(modal);
return SUCCESS(response);
}
/// <summary>
/// 添加机房列表
/// </summary>
/// <returns></returns>
[HttpPost("expert")]
[ActionPermissionFilter(Permission = "odfrooms:add")]
[Log(Title = "机房列表", BusinessType = BusinessType.INSERT)]
public async Task<IActionResult> AddExpertOdfRooms([FromBody] OdfRoomsExpertDto parm)
{
parm.CreatedAt = DateTime.Now;
parm.UpdatedAt = DateTime.Now;
if (parm.DeptId == 0)
{
parm.DeptName = "未知部门";
}
else
{
var dept = await sysDeptService.AsQueryable().Where(it => it.DeptId == parm.DeptId).FirstAsync();
if (dept == null)
{
return ToResponse(ResultCode.CUSTOM_ERROR, "部门不存在,请选择正确的部门!");
}
//var dept = _DeptService.GetInfo(parm.DeptId);
parm.DeptName = dept.DeptName;
}
var modal = parm.Adapt<OdfRooms>().ToCreate(HttpContext);
modal.DeptId = parm.DeptId;
modal.DeptName = parm.DeptName;
var response = _OdfRoomsService.AddOdfRooms(modal);
if (parm.RacksCount > 0)
{
var roomId = response.Id;
var roomName = response.RoomName;
List<OdfRacks> racksList = new List<OdfRacks>();
//添加机架
for (int i = 0; i < parm.RacksCount; i++)
{
var t = await _OdfRacksService.InsertReturnEntityAsync(new OdfRacks
{
CreatedAt = DateTime.Now,
FrameCount = parm.FramesCount,
DeptId = response.DeptId ?? 0,
RackName = $"odf-{(i + 1)}",
RoomId = roomId,
SequenceNumber = i + 1,
UpdatedAt = DateTime.Now,
}); // 直接插入机架
racksList.Add(t);
}
//机架添加完成
//return Insertable(model).ExecuteReturnEntity();
if (parm.FramesCount > 0)
{
//添加机框
List<OdfFrames> framesList = new List<OdfFrames>();
foreach (var rack in racksList)
{
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,
DeptId = rack.DeptId,
PortsRow = parm.PortsCount,
PortsName = $"{(i + 1)}框",
RackId = rack.Id,
SequenceNumber = i + 1
});
framesList.Add(t);
}
}
//添加机框结束
if (parm.RowCount > 0)
{
//添加行
if (parm.PortsCount > 0)
{
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 < parm.RowCount; row++)
{
for (int port = 0; port < parm.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,
PortNumber = port,
OpticalAttenuation = "",
HistoryRemarks = "",
Remarks = "",
Status = parm.DefaultStatus,
UpdatedAt = DateTime.Now,
});
}
}
await _OdfPortsService.AsInsertable(ports).ExecuteReturnEntityAsync(true);
//如果超过100个机框则休眠一下防止服务器死机
index++;
if (index > 100)
{
Thread.Sleep(50);
index = 0;
}
}
}
}
}
}
return SUCCESS(response);
}
/// <summary>
/// 更新机房列表
/// </summary>
/// <returns></returns>
[HttpPut]
[ActionPermissionFilter(Permission = "odfrooms:edit")]
[Log(Title = "机房列表", BusinessType = BusinessType.UPDATE)]
public async Task<IActionResult> UpdateOdfRooms([FromBody] OdfRoomsDto parm)
{
parm.UpdatedAt = DateTime.Now;
if (parm.DeptId == 0)
{
parm.DeptName = "未知部门";
}
else
{
var dept = await sysDeptService.AsQueryable().Where(it => it.DeptId == parm.DeptId).FirstAsync();
if (dept == null)
{
return ToResponse(ResultCode.CUSTOM_ERROR, "部门不存在,请选择正确的部门!");
}
//var dept = _DeptService.GetInfo(parm.DeptId);
parm.DeptName = dept.DeptName;
}
var oldModel = _OdfRoomsService.GetById(parm.Id);
var modal = parm.Adapt<OdfRooms>().ToUpdate(HttpContext);
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)
{
// 最直接的转换
await _OdfPortsService.UpdateAsync(
it => it.RoomId == oldRoomId, // WHERE条件
it => new OdfPorts // SET部分
{
DeptId = deptId,
DeptName = deptName
}
);
// 1. 更新 odf_racks
var racksUpdated = await _OdfRacksService.UpdateAsync(
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 == oldRoomId && r.Id == f.RackId)
.Any(),
f => new OdfFrames { DeptId = deptId }
);
// update odf_frames f set DeptId=0 where RackId exists ( select id from odf_racks where roomid=1 and id=f.RackId )
// update odf_racks set DeptId=0 where roomid=1
//_OdfFramesService
//_OdfRacksService
}
if (oldModel.RoomName != modal.RoomName)
{
// 最直接的转换
await _OdfPortsService.UpdateAsync(
it => it.RoomId == oldRoomId, // WHERE条件
it => new OdfPorts // SET部分
{
RoomName = roomName,
}
);
}
}
return ToResponse(response);
}
/// <summary>
/// 删除机房列表
/// </summary>
/// <returns></returns>
[HttpPost("delete/{ids}")]
[ActionPermissionFilter(Permission = "odfrooms:delete")]
[Log(Title = "机房列表", BusinessType = BusinessType.DELETE)]
public IActionResult DeleteOdfRooms([FromRoute] string ids)
{
var idArr = Tools.SplitAndConvert<int>(ids);
return ToResponse(_OdfRoomsService.Delete(idArr, "删除机房列表"));
}
/// <summary>
/// 导出机房列表
/// </summary>
/// <returns></returns>
[Log(Title = "机房列表", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
[HttpGet("export")]
[ActionPermissionFilter(Permission = "odfrooms:export")]
public IActionResult Export([FromQuery] OdfRoomsQueryDto parm)
{
var list = _OdfRoomsService.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 = "odfrooms:import")]
public async Task<IActionResult> ImportData([FromForm(Name = "file")] IFormFile formFile)
{
List<OdfRoomsImDto> list = new();
using (var stream = formFile.OpenReadStream())
{
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();
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 = excelItem.RoomAddress,
UpdatedAt = DateTime.Now,
DeptId = dept.DeptId,
DeptName = dept.DeptName,
RacksCount = excelItem.RacksCount,
Remarks = excelItem.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);
successCount++;
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>
/// 机房列表导入模板下载
/// </summary>
/// <returns></returns>
[HttpGet("importTemplate")]
[Log(Title = "机房列表模板", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
[AllowAnonymous]
public IActionResult ImportTemplateExcel()
{
var result = DownloadImportTemplate(new List<OdfRoomsDto>() { }, "OdfRooms");
return ExportExcel(result.Item2, result.Item1);
}
}
}