feat(光缆故障): 重构导出逻辑,增加计算字段与增强故障时间展示

- 将导出数据从手动构建Dictionary改为直接使用DTO序列化,简化Controller逻辑
- 为OdfCableFaultExportDto添加ExcelColumnName属性实现声明式中文列映射
- 在导出前填充计算字段FaultTimesDisplay和DisplayMileage
- 将FaultTime和Mileage标记为ExcelIgnore,防止内部字段被导出
- Service层批量查询故障频次时间,并在分页结果中返回供前端使用
- 前端表格故障时间列增强展示,显示首次故障时间及额外频次时间列表
This commit is contained in:
zpc 2026-04-03 11:24:48 +08:00
parent 793c1dd691
commit 8e552ef6b5
4 changed files with 89 additions and 33 deletions

View File

@ -118,8 +118,7 @@ namespace ZR.Admin.WebApi.Controllers.Business
var faultIds = list.Select(item => item.Id).ToList();
var allFaultTimes = _OdfCableFaultsService.GetFaultTimesByFaultIds(faultIds);
// 构建中文列头的导出数据
var exportList = new List<Dictionary<string, object>>();
// 填充计算字段
foreach (var item in list)
{
// 拼接所有故障时间(首次 + 增加的频次时间)
@ -130,28 +129,13 @@ namespace ZR.Admin.WebApi.Controllers.Business
times.AddRange(allFaultTimes[item.Id].Select(t => t.ToString("yyyy-MM-dd HH:mm:ss")));
}
times.Sort();
item.FaultTimesDisplay = string.Join("\n", times);
var row = new Dictionary<string, object>
{
["编号"] = item.Id,
["光缆编号"] = item.CableId,
["故障时间"] = string.Join("\n", times),
["故障发生频次"] = item.FaultCount,
["人员"] = item.Personnel,
["故障原因"] = item.FaultReason,
["表显故障里程"] = CalcDisplayMileage(item.Mileage, item.MileageCorrection),
["表显里程矫正"] = item.MileageCorrection,
["地点"] = item.Location,
["纬度"] = item.Latitude,
["经度"] = item.Longitude,
["备注"] = item.Remark,
["创建时间"] = item.CreatedAt,
["所属光缆"] = item.CableName
};
exportList.Add(row);
// 表显故障里程 = 原始里程 + 矫正值
item.DisplayMileage = CalcDisplayMileage(item.Mileage, item.MileageCorrection);
}
var result = ExportExcelMini(exportList, "故障列表", "故障列表");
var result = ExportExcelMini(list, "故障列表", "故障列表");
return ExportExcel(result.Item2, result.Item1);
}

View File

@ -114,19 +114,52 @@ namespace ZR.Model.Business.Dto
/// </summary>
public class OdfCableFaultExportDto
{
[ExcelColumnName("编号")]
public int Id { get; set; }
[ExcelColumnName("光缆编号")]
public int CableId { get; set; }
public DateTime FaultTime { get; set; }
public string Personnel { get; set; }
public string FaultReason { get; set; }
public string Mileage { get; set; }
public string MileageCorrection { get; set; }
public string Location { get; set; }
public decimal Latitude { get; set; }
public decimal Longitude { get; set; }
public string Remark { get; set; }
public DateTime? CreatedAt { get; set; }
[ExcelColumnName("故障时间")]
public string FaultTimesDisplay { get; set; }
[ExcelColumnName("故障发生频次")]
public int FaultCount { get; set; }
[ExcelColumnName("人员")]
public string Personnel { get; set; }
[ExcelColumnName("故障原因")]
public string FaultReason { get; set; }
[ExcelColumnName("表显故障里程")]
public string DisplayMileage { get; set; }
[ExcelColumnName("表显里程矫正")]
public string MileageCorrection { get; set; }
[ExcelColumnName("地点")]
public string Location { get; set; }
[ExcelColumnName("纬度")]
public decimal Latitude { get; set; }
[ExcelColumnName("经度")]
public decimal Longitude { get; set; }
[ExcelColumnName("备注")]
public string Remark { get; set; }
[ExcelColumnName("创建时间")]
public DateTime? CreatedAt { get; set; }
[ExcelColumnName("所属光缆")]
public string CableName { get; set; }
// 以下字段不导出,仅内部使用
[ExcelIgnore]
public DateTime FaultTime { get; set; }
[ExcelIgnore]
public string Mileage { get; set; }
}
}

View File

@ -49,9 +49,40 @@ namespace ZR.Service.Business
.OrderByDescending(it => it.FaultTime)
.ToPageList(parm.PageNum, parm.PageSize, ref total);
// 批量查询频次时间记录
var faultIds = list.Select(x => x.Id).ToList();
var allFaultTimes = GetFaultTimesByFaultIds(faultIds);
var resultList = list.Select(item =>
{
var times = new List<string>();
if (allFaultTimes.ContainsKey(item.Id))
{
times = allFaultTimes[item.Id].Select(t => t.ToString("yyyy-MM-dd HH:mm:ss")).ToList();
}
return new
{
item.Id,
item.CableId,
item.FaultTime,
item.Personnel,
item.FaultReason,
item.Mileage,
item.MileageCorrection,
item.Location,
item.Latitude,
item.Longitude,
item.Remark,
item.CreatedAt,
item.FaultCount,
item.CableName,
FaultTimes = times
};
}).ToList();
return new PagedInfo<dynamic>
{
Result = list.Cast<dynamic>().ToList(),
Result = resultList.Cast<dynamic>().ToList(),
TotalNum = total,
PageIndex = parm.PageNum,
PageSize = parm.PageSize

View File

@ -79,7 +79,15 @@
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" />
<el-table-column prop="id" label="Id" align="center" v-if="columns.showColumn('id')" />
<el-table-column prop="faultTime" label="故障时间" align="center" :show-overflow-tooltip="true" v-if="columns.showColumn('faultTime')" />
<el-table-column prop="faultTime" label="故障时间" align="center" :show-overflow-tooltip="false" v-if="columns.showColumn('faultTime')">
<template #default="scope">
<div v-if="scope.row.faultTimes && scope.row.faultTimes.length > 0">
<div>{{ scope.row.faultTime }}</div>
<div v-for="(t, i) in scope.row.faultTimes" :key="i" style="color: #909399;">{{ t }}</div>
</div>
<span v-else>{{ scope.row.faultTime }}</span>
</template>
</el-table-column>
<el-table-column prop="personnel" label="人员" align="center" :show-overflow-tooltip="true" v-if="columns.showColumn('personnel')" />
<el-table-column prop="faultReason" label="故障原因" align="center" :show-overflow-tooltip="true" v-if="columns.showColumn('faultReason')" />
<el-table-column label="表显故障里程" align="center" :show-overflow-tooltip="true" v-if="columns.showColumn('mileage')">