This commit is contained in:
zpc 2025-09-21 20:45:25 +08:00
parent 23223d6fc8
commit 88140f8ab9
5 changed files with 238 additions and 10 deletions

View File

@ -13,6 +13,8 @@ using Aliyun.OSS;
using System.Linq;
using ZR.Model.System.Dto;
using Microsoft.AspNetCore.Connections.Features;
using System.Text.RegularExpressions;
using System.Text;
//创建时间2025-08-05
namespace ZR.Admin.WebApi.Controllers.Business
@ -310,6 +312,7 @@ namespace ZR.Admin.WebApi.Controllers.Business
var modal = parm.Adapt<OdfPorts>().ToCreate(HttpContext);
modal.CreatedAt = DateTime.Now;
modal.UpdatedAt = DateTime.Now;
modal.HistoryRemarks = ToHistoryString(parm.HistoryFault);
var response = _OdfPortsService.AddOdfPorts(modal);
if (parm.HistoryFault != null && parm.HistoryFault.Count > 0)
{
@ -339,6 +342,7 @@ namespace ZR.Admin.WebApi.Controllers.Business
{
var modal = parm.Adapt<OdfPorts>().ToUpdate(HttpContext);
modal.UpdatedAt = DateTime.Now;
modal.HistoryRemarks = ToHistoryString(parm.HistoryFault);
var response = _OdfPortsService.UpdateOdfPorts(modal);
var count = await _OdfPortFaultService.CountAsync(it => it.PortId == modal.Id);
if (count > 0)
@ -386,10 +390,12 @@ namespace ZR.Admin.WebApi.Controllers.Business
if (port.Status == 0)
{
port.Remarks = "";
port.OpticalCableOffRemarks = "";
}
port.HistoryRemarks = ToHistoryString(parm.HistoryFault);
var response = _OdfPortsService.UpdateOdfPorts(port);
var count = await _OdfPortFaultService.CountAsync(it => it.PortId == port.Id);
if (count > 0)
{
await _OdfPortFaultService.DeleteAsync(it => it.PortId == port.Id);
@ -411,6 +417,32 @@ namespace ZR.Admin.WebApi.Controllers.Business
return ToResponse(response);
}
/// <summary>
/// 将历史记录集合转换为字符串
/// </summary>
/// <param name="items">日期+原因集合</param>
/// <param name="includeTime">是否输出时间true: yyyy-MM-dd HH:mm:ss, false: 仅日期)</param>
/// <returns>拼接好的字符串</returns>
private string ToHistoryString(List<OdfPortsHistoryDto> items, bool includeTime = true)
{
if (items == null || items.Count == 0)
return string.Empty;
StringBuilder sb = new StringBuilder();
foreach (var item in items)
{
// 判断是否输出时间
string datePart = includeTime
? item.FaultTime.ToString("yyyy-MM-dd HH:mm:ss")
: item.FaultTime.ToString("yyyy-MM-dd");
sb.AppendLine($"{datePart} {item.FaultReason}");
}
return sb.ToString().TrimEnd(); // 去掉最后多余的换行符
}
/// <summary>
@ -611,12 +643,13 @@ namespace ZR.Admin.WebApi.Controllers.Business
HistoryRemarks = excelItem.HistoryRemarks?.Trim(),
OpticalCableOffRemarks = excelItem.OpticalCableOffRemarks
};
await _OdfPortsService.InsertAsync(port);
port = _OdfPortsService.AddOdfPorts(port);
addPortCount++;
}
else
{
port.HistoryRemarks = excelItem.HistoryRemarks?.Trim();
port.Remarks = excelItem.Remarks?.Trim();
port.OpticalAttenuation = excelItem.OpticalAttenuation?.Trim();
port.Status = excelItem.Status;
@ -624,6 +657,40 @@ namespace ZR.Admin.WebApi.Controllers.Business
port.UpdatedAt = DateTime.Now;
await _OdfPortsService.UpdateAsync(port);
}
if (string.IsNullOrEmpty(port.HistoryRemarks))
{
var count = await _OdfPortFaultService.CountAsync(it => it.PortId == port.Id);
if (count > 0)
{
await _OdfPortFaultService.DeleteAsync(it => it.PortId == port.Id);
}
}
else
{
var count = await _OdfPortFaultService.CountAsync(it => it.PortId == port.Id);
if (count > 0)
{
await _OdfPortFaultService.DeleteAsync(it => it.PortId == port.Id);
}
var list2 = ParseHistory(port.HistoryRemarks);
if (list2.Count > 0)
{
var list3 = new List<OdfPortFault>();
foreach (var item in list2)
{
var o = new OdfPortFault()
{
CreateTime = item.Date,
FaultReason = item.Reason,
FaultTime = item.Date,
PortId = port.Id,
};
list3.Add(o);
}
await _OdfPortFaultService.InsertRangeAsync(list3);
}
}
successCount++;
}
catch (Exception)
@ -636,6 +703,51 @@ namespace ZR.Admin.WebApi.Controllers.Business
return SUCCESS($"共查询{list.Count}条数据,导入成功{successCount}条数据!导入失败{errorCount}条!{(addRoomCount > 0 ? "" + addRoomCount + "," : "")}{(addRackCount > 0 ? "" + addRackCount + "" : "")}{(addFrameCount > 0 ? "" + addFrameCount + "" : "")}");
}
/// <summary>
/// 解析历史备注字符串,提取日期/时间和原因
/// </summary>
/// <param name="historyRemarks">原始字符串</param>
/// <returns>日期+原因集合</returns>
private List<(DateTime Date, string Reason)> ParseHistory(string historyRemarks)
{
var result = new List<(DateTime, string)>();
try
{
if (string.IsNullOrWhiteSpace(historyRemarks))
return result;
// 按行拆分
string[] lines = historyRemarks.Split(new[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries);
// 正则:日期 + 可选时间 + 原因
Regex regex = new Regex(@"^(?<date>\d{4}-\d{2}-\d{2})(\s+(?<time>\d{2}:\d{2}:\d{2}))?\s+(?<reason>.+)$");
foreach (var line in lines)
{
var match = regex.Match(line.Trim());
if (match.Success)
{
string datePart = match.Groups["date"].Value;
string timePart = match.Groups["time"].Success ? match.Groups["time"].Value : "00:00:00";
string reason = match.Groups["reason"].Value;
if (DateTime.TryParse($"{datePart} {timePart}", out DateTime date))
{
result.Add((date, reason));
}
}
}
}
catch (Exception ex)
{
}
return result;
}
/// <summary>
/// 端口导入模板下载
/// </summary>

View File

@ -200,6 +200,122 @@ namespace ZR.Model.Business.Dto
public DateTime? UpdatedAt { get; set; }
private string _statusLabel;
[ExcelColumn(Name = "连接状态0正常1断开")]
public string StatusLabel
{
get
{
return Status == 0 ? "断开" : "正常";
}
set
{
this._statusLabel = value;
}
}
/// <summary>
/// 部门名称
/// </summary>
[ExcelColumn(Name = "部门名称")]
public string DeptName { get; set; }
}
/// <summary>
/// 端口输入输出对象
/// </summary>
public class OdfPortsfDto
{
[Required(ErrorMessage = "Id不能为空")]
[ExcelColumn(Name = "Id")]
[ExcelColumnName("Id")]
public int Id { get; set; }
[Required(ErrorMessage = "端口名称不能为空")]
[ExcelColumn(Name = "端口名称")]
[ExcelColumnName("端口名称")]
public string Name { get; set; }
[Required(ErrorMessage = "机房ID不能为空")]
[ExcelColumn(Name = "机房ID")]
[ExcelColumnName("机房ID")]
public int RoomId { get; set; }
[Required(ErrorMessage = "机房名称不能为空")]
[ExcelColumn(Name = "机房名称")]
[ExcelColumnName("机房名称")]
public string RoomName { get; set; }
[Required(ErrorMessage = "机架ID不能为空")]
[ExcelColumn(Name = "机架ID")]
[ExcelColumnName("机架ID")]
public int RackId { get; set; }
[Required(ErrorMessage = "机架名称不能为空")]
[ExcelColumn(Name = "机架名称")]
[ExcelColumnName("机架名称")]
public string RackName { get; set; }
[Required(ErrorMessage = "框ID不能为空")]
[ExcelColumn(Name = "框ID")]
[ExcelColumnName("框ID")]
public int FrameId { get; set; }
[Required(ErrorMessage = "框名称不能为空")]
[ExcelColumn(Name = "框名称")]
[ExcelColumnName("框名称")]
public string FrameName { get; set; }
[Required(ErrorMessage = "部门ID不能为空")]
[ExcelColumn(Name = "部门ID")]
[ExcelColumnName("部门ID")]
public long DeptId { get; set; }
[Required(ErrorMessage = "行号1-6不能为空")]
[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 = "连接状态0正常1断开")]
[ExcelColumnName("连接状态0正常1断开")]
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 OpticalCableOffRemarks { get; set; }
[ExcelColumn(Name = "历史故障记录")]
[ExcelColumnName("历史故障记录")]
public string HistoryRemarks { get; set; }
[Required(ErrorMessage = "创建时间不能为空")]
[ExcelColumn(Name = "创建时间", Format = "yyyy-MM-dd HH:mm:ss", Width = 20)]
[ExcelColumnName("创建时间")]
public DateTime? CreatedAt { get; set; }
[Required(ErrorMessage = "修改时间不能为空")]
[ExcelColumn(Name = "修改时间", Format = "yyyy-MM-dd HH:mm:ss", Width = 20)]
[ExcelColumnName("修改时间")]
public DateTime? UpdatedAt { get; set; }
private string _statusLabel;
[ExcelColumn(Name = "连接状态0正常1断开")]
public string StatusLabel

View File

@ -18,7 +18,7 @@ namespace ZR.Service.Business.IBusinessService
(string, object, object) ImportOdfPorts(List<OdfPorts> list);
PagedInfo<OdfPortsDto> ExportList(OdfPortsQueryDto parm);
PagedInfo<OdfPortsDto> ExportList(OdfPortsQuerysDto parm);
PagedInfo<OdfPortsfDto> ExportList(OdfPortsQueryDto parm);
PagedInfo<OdfPortsfDto> ExportList(OdfPortsQuerysDto parm);
}
}

View File

@ -134,16 +134,16 @@ namespace ZR.Service.Business
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
public PagedInfo<OdfPortsDto> ExportList(OdfPortsQueryDto parm)
public PagedInfo<OdfPortsfDto> ExportList(OdfPortsQueryDto parm)
{
parm.PageNum = 1;
parm.PageSize = 100000;
parm.PageSize = 10000000;
var predicate = QueryExp(parm);
var response = Queryable()
.Where(predicate.ToExpression())
.OrderBy("RoomId asc,RackId asc,FrameId asc,RowNumber asc,PortNumber Asc")
.Select((it) => new OdfPortsDto()
.Select((it) => new OdfPortsfDto()
{
}, true)
.ToPage(parm);
@ -156,16 +156,16 @@ namespace ZR.Service.Business
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
public PagedInfo<OdfPortsDto> ExportList(OdfPortsQuerysDto parm)
public PagedInfo<OdfPortsfDto> ExportList(OdfPortsQuerysDto parm)
{
parm.PageNum = 1;
parm.PageSize = 100000;
parm.PageSize = 10000000;
var predicate = QueryExp(parm);
var response = Queryable()
.Where(predicate.ToExpression())
.OrderBy("RoomId asc,RackId asc,FrameId asc,RowNumber asc,PortNumber Asc")
.Select((it) => new OdfPortsDto()
.Select((it) => new OdfPortsfDto()
{
}, true)
.ToPage(parm);