using F9WebAiTest.Application.Dtos.SYS.Reports;
using F9WebAiTest.Domain.Common;
using F9WebAiTest.Domain.Entities.Base;
using F9WebAiTest.Domain.Entities.Prod;
using MediatR;
using SysDept = F9WebAiTest.Domain.Entities.SYS.Departments;
namespace F9WebAiTest.Application.CQRS.SYS.Reports.Queries;
///
/// 落丝记录报表查询(对应 DsName = RepDt_Prod_Lsjl)。
/// 参数:日期范围 / 车间(含子车间)/ 机组 / 庄口 / 关键字(庄口、规格、颜色)。
/// 输出字段名与 F9 落丝记录报表模板一致(中文列名)。
///
public record GetLsjlRepQuery(
DateTime? DateStart,
DateTime? DateEnd,
long DepId,
int Jizu,
long GyzkId,
string Like) : IRequest;
public class GetLsjlRepQueryHandler : IRequestHandler
{
private readonly IRepository _repo;
private readonly IRepository _deptRepo;
private readonly IRepository _zkRepo;
public GetLsjlRepQueryHandler(
IRepository repo,
IRepository deptRepo,
IRepository zkRepo)
{
_repo = repo;
_deptRepo = deptRepo;
_zkRepo = zkRepo;
}
public async Task Handle(GetLsjlRepQuery query, CancellationToken cancellationToken)
{
var all = await _repo.GetAllAsync();
var depts = await _deptRepo.GetAllAsync();
var zks = await _zkRepo.GetAllAsync();
var deptDict = depts.GroupBy(d => d.Id).ToDictionary(g => g.Key, g => g.First().Name);
var zkDict = zks.GroupBy(z => z.Id).ToDictionary(g => g.Key, g => g.First().ZhuangKouName);
var depIds = ResolveDepIds(depts, query.DepId);
IEnumerable rows = all;
if (query.DateStart.HasValue)
{
var start = query.DateStart.Value.Date;
rows = rows.Where(x => x.WorkDate.Date >= start);
}
if (query.DateEnd.HasValue)
{
var end = query.DateEnd.Value.Date;
rows = rows.Where(x => x.WorkDate.Date <= end);
}
if (depIds != null)
rows = rows.Where(x => depIds.Contains(x.DeptId));
if (query.Jizu > 0)
rows = rows.Where(x => x.Jizu == query.Jizu);
if (query.GyzkId > 0)
rows = rows.Where(x => x.GyzkId == query.GyzkId);
if (!string.IsNullOrWhiteSpace(query.Like))
{
var kw = query.Like.Trim();
rows = rows.Where(x =>
deptDict.GetValueOrDefault(x.DeptId, "").Contains(kw) ||
zkDict.GetValueOrDefault(x.GyzkId, "").Contains(kw) ||
(x.Guige ?? "").Contains(kw) ||
(x.Yanse ?? "").Contains(kw));
}
var list = rows
.OrderBy(x => x.WorkDate)
.ThenBy(x => deptDict.GetValueOrDefault(x.DeptId, ""))
.ThenBy(x => x.Jizu)
.ThenBy(x => x.LuosiTime)
.ToList();
// 明细行:键名与 .grf 模板 DetailGrid.Recordset.Field 完全一致(中文列名)
var fieldRows = new List