using F9WebAiTest.Application.Common; using F9WebAiTest.Application.Dtos.Prod; using F9WebAiTest.Domain.Common; using F9WebAiTest.Domain.Entities.Base; using F9WebAiTest.Domain.Entities.Prod; using SysDept = F9WebAiTest.Domain.Entities.SYS.Departments; namespace F9WebAiTest.Application.Services.Prod; /// 丝片检查:按「日期 + 车间 + 工艺庄口 + 规格」记录前缫/后缫疵点片数 public interface ISpjcService { Task> GetPagedAsync(int pageIndex, int pageSize, DateTime? date, long? deptId, string like); Task GetForEditAsync(long id); Task SaveAsync(SpjcSaveDto dto); Task DeleteAsync(long id); } public class SpjcService : ISpjcService { private readonly IRepository _spjcRepo; private readonly IRepository _deptRepo; private readonly IRepository _zkRepo; public SpjcService( IRepository spjcRepo, IRepository deptRepo, IRepository zkRepo) { _spjcRepo = spjcRepo; _deptRepo = deptRepo; _zkRepo = zkRepo; } public async Task> GetPagedAsync(int pageIndex, int pageSize, DateTime? date, long? deptId, string like) { var all = await _spjcRepo.GetAllAsync(); var q = all.AsQueryable(); if (date.HasValue) q = q.Where(x => x.Date.Date == date.Value.Date); if (deptId.HasValue) q = q.Where(x => x.DeptId == deptId.Value); var depts = await _deptRepo.GetAllAsync(); var deptDict = depts.ToDictionary(d => d.Id, d => d.Name); var zks = await _zkRepo.GetAllAsync(); var zkDict = zks.ToDictionary(z => z.Id, z => z.ZhuangKouName); if (!string.IsNullOrWhiteSpace(like)) { var kwDeptIds = depts.Where(d => d.Name.Contains(like)).Select(d => d.Id).ToHashSet(); var kwZkIds = zks.Where(z => z.ZhuangKouName.Contains(like)).Select(z => z.Id).ToHashSet(); q = q.Where(x => kwDeptIds.Contains(x.DeptId) || kwZkIds.Contains(x.GyzkId) || x.Guige.Contains(like)); } var total = q.LongCount(); var items = q.OrderByDescending(x => x.Date).ThenByDescending(x => x.Id) .Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList(); return new PageResult { Items = items.Select(x => ToListDto(x, deptDict, zkDict)).ToList(), Total = total, PageIndex = pageIndex, PageSize = pageSize }; } public async Task GetForEditAsync(long id) { var e = await _spjcRepo.GetByIdAsync(id); if (e == null) throw new ServiceException("丝片检查不存在或已删除", 404); var dept = await _deptRepo.GetByIdAsync(e.DeptId); var zk = await _zkRepo.GetByIdAsync(e.GyzkId); return new SpjcSaveDto { Id = e.Id, Date = e.Date, DeptId = e.DeptId, DeptName = dept?.Name ?? "", GyzkId = e.GyzkId, GyzkName = zk?.ZhuangKouName ?? "", Guige = e.Guige, Pianshu = e.Pianshu, PianshuXuegong = e.PianshuXuegong, QsJiahua = e.QsJiahua, QsYouwu = e.QsYouwu, QsHeidian = e.QsHeidian, QsShangsi = e.QsShangsi, QsYetiao = e.QsYetiao, QsXiaosipian = e.QsXiaosipian, QsQita = e.QsQita, HsYouwu = e.HsYouwu, HsShangsi = e.HsShangsi, HsShuangsi = e.HsShuangsi, HsZhisi = e.HsZhisi, HsZhantiao = e.HsZhantiao, HsYingjiao = e.HsYingjiao, HsGuojiao = e.HsGuojiao, HsShouchu = e.HsShouchu, HsWuran = e.HsWuran, HsLiansi = e.HsLiansi, HsWdmt = e.HsWdmt, HsMaoluan = e.HsMaoluan, HsQita = e.HsQita, Memo = e.Memo }; } public async Task SaveAsync(SpjcSaveDto dto) { if (dto.DeptId == 0) throw new ServiceException("请选择车间"); if (dto.GyzkId == 0) throw new ServiceException("请选择工艺庄口"); if (string.IsNullOrWhiteSpace(dto.Guige)) throw new ServiceException("请选择规格"); var date = dto.Date.Date; var guige = dto.Guige.Trim(); Spjc e; if (dto.Id > 0) { e = await _spjcRepo.GetByIdAsync(dto.Id); if (e == null) throw new ServiceException("丝片检查不存在或已删除", 404); var dup = await _spjcRepo.FirstOrDefaultAsync(x => x.Id != dto.Id && x.Date.Date == date && x.DeptId == dto.DeptId && x.GyzkId == dto.GyzkId && x.Guige == guige); if (dup != null) throw new ServiceException("已存在相同的丝片检查!"); } else { var exists = await _spjcRepo.AnyAsync(x => x.Date.Date == date && x.DeptId == dto.DeptId && x.GyzkId == dto.GyzkId && x.Guige == guige); if (exists) throw new ServiceException("已存在相同的丝片检查!"); e = new Spjc(); await _spjcRepo.AddAsync(e); } e.Date = date; e.DeptId = dto.DeptId; e.GyzkId = dto.GyzkId; e.Guige = guige; e.Pianshu = dto.Pianshu; e.PianshuXuegong = dto.PianshuXuegong; e.QsJiahua = dto.QsJiahua; e.QsYouwu = dto.QsYouwu; e.QsHeidian = dto.QsHeidian; e.QsShangsi = dto.QsShangsi; e.QsYetiao = dto.QsYetiao; e.QsXiaosipian = dto.QsXiaosipian; e.QsQita = dto.QsQita; e.HsYouwu = dto.HsYouwu; e.HsShangsi = dto.HsShangsi; e.HsShuangsi = dto.HsShuangsi; e.HsZhisi = dto.HsZhisi; e.HsZhantiao = dto.HsZhantiao; e.HsYingjiao = dto.HsYingjiao; e.HsGuojiao = dto.HsGuojiao; e.HsShouchu = dto.HsShouchu; e.HsWuran = dto.HsWuran; e.HsLiansi = dto.HsLiansi; e.HsWdmt = dto.HsWdmt; e.HsMaoluan = dto.HsMaoluan; e.HsQita = dto.HsQita; e.Memo = dto.Memo ?? ""; // 合计由服务端重算(与 F9 的 Qs_heji / Hs_heji 一致) e.QsHeji = e.QsJiahua + e.QsYouwu + e.QsHeidian + e.QsShangsi + e.QsYetiao + e.QsXiaosipian + e.QsQita; e.HsHeji = e.HsYouwu + e.HsShangsi + e.HsShuangsi + e.HsZhisi + e.HsZhantiao + e.HsYingjiao + e.HsGuojiao + e.HsShouchu + e.HsWuran + e.HsLiansi + e.HsWdmt + e.HsMaoluan + e.HsQita; await _spjcRepo.UpdateAsync(e); return e.Id; } public async Task DeleteAsync(long id) { var e = await _spjcRepo.GetByIdAsync(id); if (e == null) throw new ServiceException("丝片检查不存在或已删除", 404); // 业务键带唯一索引,物理删除避免「删除后重建」撞索引(与煮茧日报同一策略) await _spjcRepo.HardDeleteAsync(e); } private static SpjcListItemDto ToListDto(Spjc x, Dictionary deptDict, Dictionary zkDict) => new() { Id = x.Id, Date = x.Date, DeptId = x.DeptId, DeptName = deptDict.GetValueOrDefault(x.DeptId, ""), GyzkId = x.GyzkId, GyzkName = zkDict.GetValueOrDefault(x.GyzkId, ""), Guige = x.Guige, Pianshu = x.Pianshu, PianshuXuegong = x.PianshuXuegong, QsJiahua = x.QsJiahua, QsYouwu = x.QsYouwu, QsHeidian = x.QsHeidian, QsShangsi = x.QsShangsi, QsYetiao = x.QsYetiao, QsXiaosipian = x.QsXiaosipian, QsQita = x.QsQita, QsHeji = x.QsHeji, HsYouwu = x.HsYouwu, HsShangsi = x.HsShangsi, HsShuangsi = x.HsShuangsi, HsZhisi = x.HsZhisi, HsZhantiao = x.HsZhantiao, HsYingjiao = x.HsYingjiao, HsGuojiao = x.HsGuojiao, HsShouchu = x.HsShouchu, HsWuran = x.HsWuran, HsLiansi = x.HsLiansi, HsWdmt = x.HsWdmt, HsMaoluan = x.HsMaoluan, HsQita = x.HsQita, HsHeji = x.HsHeji, Memo = x.Memo }; }