AdoS0QualitySpecImportDtos.cs 6.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using System.ComponentModel.DataAnnotations;
  2. using MiniExcelLibs.Attributes;
  3. namespace Admin.NET.Plugin.AiDOP.Dto.S0.Quality;
  4. // 检验规范 Excel 导入行 DTO:主表列 + 明细列平铺在一张表内,按“文件编号”分组还原为“一条主单 + 多条明细”。
  5. // 列名([ExcelColumnName])与各检验规范页 qualityConfigs 现有字段一一对齐,导出模板与导入解析共用同一 DTO,保证列头单一来源。
  6. //
  7. // 【为什么这里没有 [Required]】——同一主单的多行里,只有「文件编号」(分组键)必须逐行出现,
  8. // 其余头字段允许在续行留空。若在行 DTO 上加 [Required],合法续行会被误判为空值非法。
  9. // 因此必填性一律在归组 + 头字段合并之后,由 AdoS0QmsSpecAggregateGuard 按聚合校验。
  10. //
  11. // 【[MaxLength] 取值依据】——按 aidopdev 实测列长(information_schema,as_of 2026-09-02)逐列对齐,
  12. // 不做 255 一刀切:text 列(65535)不设限,上/下限是 varchar(50),
  13. // 且过程/FQC/OQC 的「物料编码」是 text 而原材料的是 varchar(255),两者不同。
  14. /// <summary>原材料检验规范导入行(对应 qms_jygf / qms_jygfzb)</summary>
  15. public class AdoS0QmsRawInspectionSpecImportRow
  16. {
  17. [ExcelColumnName("文件编号")] [MaxLength(255)] public string? FileNumber { get; set; }
  18. [ExcelColumnName("版本")] [MaxLength(255)] public string? VersionNo { get; set; }
  19. [ExcelColumnName("图号")] [MaxLength(255)] public string? DrawingNo { get; set; }
  20. [ExcelColumnName("原材料名称")] [MaxLength(255)] public string? RawMaterialName { get; set; }
  21. [ExcelColumnName("物料编码")] [MaxLength(255)] public string? MaterialCode { get; set; }
  22. [ExcelColumnName("生效日期")] [MaxLength(255)] public string? EffectiveDate { get; set; }
  23. [ExcelColumnName("图纸版本")] [MaxLength(255)] public string? DrawingVersion { get; set; }
  24. [ExcelColumnName("材质/材料牌号")] [MaxLength(255)] public string? MaterialGrade { get; set; }
  25. [ExcelColumnName("穴/模")] [MaxLength(255)] public string? CavityOrMold { get; set; }
  26. [ExcelColumnName("附件")] public string? Attachment { get; set; } // fj text
  27. [ExcelColumnName("附件文件名")] public string? FileName { get; set; } // filename text
  28. [ExcelColumnName("附件标题")] [MaxLength(255)] public string? Title { get; set; }
  29. [ExcelColumnName("明细-序号")] public int? Seq { get; set; }
  30. [ExcelColumnName("明细-检验项目")] public string? InspectionItem { get; set; } // jyxm text
  31. [ExcelColumnName("明细-检验标准")] public string? InspectionStandard { get; set; } // jybz text
  32. [ExcelColumnName("明细-检验工具/方法")] public string? InspectionMethod { get; set; } // jygjjyff text
  33. [ExcelColumnName("明细-抽样方案")] public string? SamplingScheme { get; set; } // cyfa text
  34. [ExcelColumnName("明细-上限")] [MaxLength(50)] public string? UpperLimit { get; set; }
  35. [ExcelColumnName("明细-下限")] [MaxLength(50)] public string? LowerLimit { get; set; }
  36. }
  37. /// <summary>过程 / FQC / OQC 检验规范导入行(三者字段一致,对应 qms_gcjygf(zb) / qms_fqcjygf(zb) / qms_oqcjygf(zb))</summary>
  38. public class AdoS0QmsProcessLikeInspectionSpecImportRow
  39. {
  40. [ExcelColumnName("适用型号")] [MaxLength(255)] public string? ApplicableModel { get; set; }
  41. [ExcelColumnName("文件编号")] [MaxLength(255)] public string? FileNumber { get; set; }
  42. [ExcelColumnName("版本")] [MaxLength(255)] public string? VersionNo { get; set; }
  43. [ExcelColumnName("生效日期")] [MaxLength(255)] public string? EffectiveDate { get; set; }
  44. [ExcelColumnName("物料编码")] public string? MaterialCode { get; set; } // wlbm text(与原材料表不同,不设 255)
  45. [ExcelColumnName("附件")] public string? Attachment { get; set; } // fj text
  46. [ExcelColumnName("附件2")] public string? Attachment2 { get; set; } // fj2 text
  47. [ExcelColumnName("版本号")] public int? Version { get; set; }
  48. [ExcelColumnName("明细-工序代号")] public string? OperationCode { get; set; } // gxdh text
  49. [ExcelColumnName("明细-工序名称")] public string? OperationName { get; set; } // gxmc text
  50. [ExcelColumnName("明细-检验项目")] public string? InspectionItem { get; set; } // jyxm text
  51. [ExcelColumnName("明细-检验方法")] public string? InspectionMethod { get; set; } // jyff text
  52. [ExcelColumnName("明细-检验规格")] public string? InspectionSpec { get; set; } // jygg text
  53. [ExcelColumnName("明细-检验频次")] public string? InspectionFrequency { get; set; } // jypc text
  54. [ExcelColumnName("明细-上限")] [MaxLength(50)] public string? UpperLimit { get; set; }
  55. [ExcelColumnName("明细-下限")] [MaxLength(50)] public string? LowerLimit { get; set; }
  56. }
  57. /// <summary>检验规范 Excel 导入结果</summary>
  58. public class AdoS0QmsSpecImportResultDto
  59. {
  60. /// <summary>本次导入是否被接受。false 时未写入任何数据(全或无语义)。</summary>
  61. public bool Accepted { get; set; }
  62. /// <summary>读取到的数据行总数(不含表头)</summary>
  63. public int TotalRows { get; set; }
  64. /// <summary>新增主表(规范)条数。Accepted=false 时恒为 0。</summary>
  65. public int ImportedMasters { get; set; }
  66. /// <summary>新增明细条数。Accepted=false 时恒为 0。</summary>
  67. public int ImportedItems { get; set; }
  68. /// <summary>不合格的行/组数量</summary>
  69. public int FailedRows { get; set; }
  70. /// <summary>跳过行数。全或无语义下不再跳过任何行,保留字段仅为兼容既有响应结构,恒为 0。</summary>
  71. public int SkippedRows { get; set; }
  72. /// <summary>逐行提示(不合格原因)。注意:不要命名为 errors,前端响应拦截器会把非空 errors 字段判为请求失败。</summary>
  73. public List<string> RowMessages { get; set; } = [];
  74. /// <summary>汇总文案</summary>
  75. public string Message { get; set; } = string.Empty;
  76. /// <summary>
  77. /// 派生映射同步告警(当前仅原材料检规导入使用)。导入本身已成功提交,
  78. /// 但 S5 IQC 检规物料桥表同步失败时在此说明,可调用 POST /api/S5IqcSpecMap/rebuild 幂等重建。
  79. /// 恒为可空,既有响应结构向后兼容。
  80. /// </summary>
  81. public string? SpecMapWarning { get; set; }
  82. }