AdoS8OrderFlowDtos.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  1. namespace Admin.NET.Plugin.AiDOP.Dto.S8.OrderFlow;
  2. /// <summary>
  3. /// ORDER-FLOW-S8-INTEGRATED-DOMAIN-RESET-1 t3a:S8 订单执行链路 DTO 契约。
  4. /// 仅定义类型,不携带业务常量 / 不引用 Entity / 不接 service 逻辑。
  5. /// 后续 t3b/t3c 切片负责 service + controller 把 DTO 接到 ado_s8_order_flow_* 与 ado_s8_exception 实时聚合。
  6. /// </summary>
  7. #region 订单档案
  8. public class AdoS8OrderFlowOrderQueryDto
  9. {
  10. public long? TenantId { get; set; }
  11. public long? FactoryId { get; set; }
  12. public string? Keyword { get; set; }
  13. public string? CurrentFlowCode { get; set; }
  14. public string? CustomerCode { get; set; }
  15. public string? ProductLine { get; set; }
  16. public string? Region { get; set; }
  17. public string? WorkflowStatus { get; set; }
  18. public string? ScenarioCode { get; set; }
  19. }
  20. public class AdoS8OrderFlowOrderListItemDto
  21. {
  22. public string OrderCode { get; set; } = string.Empty;
  23. public string ProductName { get; set; } = string.Empty;
  24. public string ProductLine { get; set; } = string.Empty;
  25. public string CustomerCode { get; set; } = string.Empty;
  26. public string CustomerName { get; set; } = string.Empty;
  27. public string CustomerType { get; set; } = string.Empty;
  28. public string Region { get; set; } = string.Empty;
  29. public string Priority { get; set; } = string.Empty;
  30. public string WorkflowStatus { get; set; } = string.Empty;
  31. public string CurrentOrderFlowCode { get; set; } = string.Empty;
  32. public string CurrentOrderFlowName { get; set; } = string.Empty;
  33. public string CurrentStatus { get; set; } = string.Empty;
  34. public DateTime ReleaseAt { get; set; }
  35. public decimal TargetCycleDays { get; set; }
  36. public decimal? ActualCycleDays { get; set; }
  37. public decimal? CurrentCycleDays { get; set; }
  38. public decimal? NodeVarianceDays { get; set; }
  39. public decimal? CumulativeVarianceDays { get; set; }
  40. /// <summary>来自 ado_s8_exception 实时聚合(order 主档表无 exception_count 列)。</summary>
  41. public int ExceptionCount { get; set; }
  42. public string ExceptionStatus { get; set; } = string.Empty;
  43. public int? ResponseMinutes { get; set; }
  44. public int? ProcessingMinutes { get; set; }
  45. public int? TotalLossMinutes { get; set; }
  46. public string ScenarioCode { get; set; } = string.Empty;
  47. public string DataSource { get; set; } = string.Empty;
  48. }
  49. public class AdoS8OrderFlowOrderDetailDto : AdoS8OrderFlowOrderListItemDto
  50. {
  51. public List<AdoS8OrderFlowStageDto> Lifecycle { get; set; } = new();
  52. }
  53. #endregion
  54. #region 阶段 / L2 / L3
  55. public class AdoS8OrderFlowStageDto
  56. {
  57. public string OrderFlowCode { get; set; } = string.Empty;
  58. public string OrderFlowName { get; set; } = string.Empty;
  59. public string? OwnerDept { get; set; }
  60. public int SortNo { get; set; }
  61. public decimal PlannedDays { get; set; }
  62. public decimal? ActualDays { get; set; }
  63. public DateTime TargetAt { get; set; }
  64. public DateTime? ActualStartAt { get; set; }
  65. public DateTime? ActualEndAt { get; set; }
  66. public string Status { get; set; } = string.Empty;
  67. public decimal? NodeVarianceDays { get; set; }
  68. public decimal? CumulativeVarianceDays { get; set; }
  69. public List<AdoS8OrderFlowSubstepDto> Substeps { get; set; } = new();
  70. }
  71. public class AdoS8OrderFlowSubstepDto
  72. {
  73. public string SubstepCode { get; set; } = string.Empty;
  74. public string SubstepName { get; set; } = string.Empty;
  75. public decimal PiHours { get; set; }
  76. public decimal? ActualHours { get; set; }
  77. public string Status { get; set; } = string.Empty;
  78. public int SortNo { get; set; }
  79. public List<AdoS8OrderFlowSubstepUnitDto> Units { get; set; } = new();
  80. }
  81. public class AdoS8OrderFlowSubstepUnitDto
  82. {
  83. public string UnitCode { get; set; } = string.Empty;
  84. public string UnitName { get; set; } = string.Empty;
  85. public decimal PiHours { get; set; }
  86. public decimal? ActualHours { get; set; }
  87. public string Status { get; set; } = string.Empty;
  88. public int SortNo { get; set; }
  89. }
  90. #endregion
  91. #region 订单 + 采购透视组合
  92. public class AdoS8OrderFlowChainDto
  93. {
  94. public AdoS8OrderFlowOrderDetailDto Order { get; set; } = new();
  95. public AdoS8OrderFlowProcurementPivotDto? ProcurementPivot { get; set; }
  96. }
  97. #endregion
  98. #region 聚合 / Baseline
  99. public class AdoS8OrderFlowAggregateQueryDto
  100. {
  101. public long? TenantId { get; set; }
  102. public long? FactoryId { get; set; }
  103. public string Scope { get; set; } = string.Empty;
  104. public List<string>? OrderCodes { get; set; }
  105. }
  106. public class AdoS8OrderFlowAggregateDto
  107. {
  108. public string Scope { get; set; } = string.Empty;
  109. public int TotalOrders { get; set; }
  110. public int TotalCustomers { get; set; }
  111. public decimal AvgResponseMinutes { get; set; }
  112. public decimal AvgProcessingMinutes { get; set; }
  113. public decimal AvgLossMinutes { get; set; }
  114. public List<AdoS8OrderFlowStageAggregateDto> StageAggregates { get; set; } = new();
  115. /// <summary>
  116. /// FINAL_ASSEMBLY_DELIVERY 末端协同聚合摘要(基线 / 当前两条路径均填充)。
  117. /// 派生自 ado_s8_exception 现有异常类型,不新增业务表 / 不新增异常类型 / 不读 S0|S4 业务表。
  118. /// 字段全 nullable,老调用方无感知。
  119. /// </summary>
  120. public AdoS8FinalAssemblyCollabSummaryDto? FinalAssemblyCollabSummary { get; set; }
  121. }
  122. public class AdoS8FinalAssemblyCollabSummaryDto
  123. {
  124. /// <summary>主门禁(GATE)—— key 为前端固定 object_code(如 GOODS_HANDOVER / SHIPMENT_CONFIRMATION)。无映射的门禁不出现在字典中。</summary>
  125. public Dictionary<string, AdoS8FinalAssemblyObjectStatDto> Gates { get; set; } = new();
  126. /// <summary>并行准备(PARALLEL)—— key 为前端固定 object_code(如 SHIPPING_PLAN)。无映射的准备项不出现在字典中。</summary>
  127. public Dictionary<string, AdoS8FinalAssemblyObjectStatDto> Parallels { get; set; } = new();
  128. }
  129. public class AdoS8FinalAssemblyObjectStatDto
  130. {
  131. /// <summary>主门禁口径下的"影响订单"数 = 命中候选异常类型的去重 RelatedObjectCode 数;并行准备口径下保持 null。</summary>
  132. public int? ImpactedOrderCount { get; set; }
  133. /// <summary>并行准备口径下的"风险订单"数 = 命中候选异常类型的去重 RelatedObjectCode 数;主门禁口径下保持 null。</summary>
  134. public int? RiskOrderCount { get; set; }
  135. /// <summary>主要风险标题:候选异常中按 Severity(SERIOUS 优先) → CreatedAt(降序) 取首条 Title。无命中保持 null。</summary>
  136. public string? TopRiskTitle { get; set; }
  137. /// <summary>主要风险严重度:与 TopRiskTitle 来自同一条异常。无命中保持 null。</summary>
  138. public string? TopRiskSeverity { get; set; }
  139. }
  140. public class AdoS8OrderFlowStageAggregateDto
  141. {
  142. public string OrderFlowCode { get; set; } = string.Empty;
  143. public string OrderFlowName { get; set; } = string.Empty;
  144. public decimal KpiAvgDays { get; set; }
  145. public decimal ActualAvgDays { get; set; }
  146. /// <summary>整数百分比(例如 59 / 96 / 85 / 89 / 96),不是 0.59 小数。</summary>
  147. public int OnTimeRate { get; set; }
  148. public int Green { get; set; }
  149. public int Yellow { get; set; }
  150. public int Red { get; set; }
  151. public int Pending { get; set; }
  152. }
  153. #endregion
  154. #region 采购透视
  155. public class AdoS8OrderFlowProcurementPivotQueryDto
  156. {
  157. public long? TenantId { get; set; }
  158. public long? FactoryId { get; set; }
  159. public string Scope { get; set; } = string.Empty;
  160. /// <summary>
  161. /// 订单编码 CSV(与产品设计 drawings API 对齐)。
  162. /// 例如:单订单 "SO-2026-001";多订单 "SO-2026-001,SO-2026-002,SO-2026-006"。
  163. /// 与 axios 默认 brackets 序列化不兼容,统一用 CSV 字符串避免 ASP.NET Core List 绑定二义性。
  164. /// </summary>
  165. public string? OrderCodes { get; set; }
  166. }
  167. public class AdoS8OrderFlowProcurementPivotDto
  168. {
  169. public string Scope { get; set; } = string.Empty;
  170. public List<AdoS8OrderFlowKeyMaterialDto> KeyMaterials { get; set; } = new();
  171. public List<AdoS8OrderFlowSupplierBreakdownDto> SupplierBreakdown { get; set; } = new();
  172. public List<AdoS8OrderFlowSpecBreakdownDto> SpecBreakdown { get; set; } = new();
  173. public Dictionary<string, List<AdoS8OrderFlowProcurementMatrixRowDto>> MatrixByMaterial { get; set; } = new();
  174. }
  175. public class AdoS8OrderFlowKeyMaterialDto
  176. {
  177. public string MaterialCode { get; set; } = string.Empty;
  178. public decimal AvgCycleDays { get; set; }
  179. public string CycleStatus { get; set; } = string.Empty;
  180. public int? ImpactCount { get; set; }
  181. public decimal? KitRate { get; set; }
  182. public string ResultStatus { get; set; } = string.Empty;
  183. }
  184. public class AdoS8OrderFlowSupplierBreakdownDto
  185. {
  186. public string MaterialCode { get; set; } = string.Empty;
  187. public string SupplierCode { get; set; } = string.Empty;
  188. public decimal AvgCycleDays { get; set; }
  189. public string Status { get; set; } = string.Empty;
  190. }
  191. public class AdoS8OrderFlowSpecBreakdownDto
  192. {
  193. public string MaterialCode { get; set; } = string.Empty;
  194. public string SpecCode { get; set; } = string.Empty;
  195. public decimal AvgCycleDays { get; set; }
  196. public string Status { get; set; } = string.Empty;
  197. }
  198. public class AdoS8OrderFlowProcurementMatrixRowDto
  199. {
  200. public string SupplierCode { get; set; } = string.Empty;
  201. public Dictionary<string, AdoS8OrderFlowProcurementMatrixCellDto> Cells { get; set; } = new();
  202. }
  203. public class AdoS8OrderFlowProcurementMatrixCellDto
  204. {
  205. public decimal CycleDays { get; set; }
  206. public string Status { get; set; } = string.Empty;
  207. }
  208. #endregion
  209. #region 关联异常
  210. public class AdoS8OrderFlowRelatedExceptionQueryDto
  211. {
  212. public long? TenantId { get; set; }
  213. public long? FactoryId { get; set; }
  214. public string OrderCode { get; set; } = string.Empty;
  215. public string? OrderFlowCode { get; set; }
  216. }
  217. #endregion
  218. #region 产品设计图号
  219. /// <summary>
  220. /// S8-ORDER-CHAIN-PRODUCT-DESIGN-DRAWING-PERSIST-1:产品设计图号查询入参。
  221. /// orderCodes 为空 → 默认聚合全 20 单(scope=BASELINE_PPT);
  222. /// orderCodes 非空 → 仅命中订单范围聚合(scope=CURRENT_FILTERED)。
  223. /// productType 仅过滤 drawings 列表,不改变 summary.categories 的"常规/非标/合计"三档结构。
  224. /// </summary>
  225. public class AdoS8OrderFlowProductDesignDrawingsQueryDto
  226. {
  227. public long? TenantId { get; set; }
  228. public long? FactoryId { get; set; }
  229. /// <summary>逗号分隔订单号;为空时默认全 20 单。</summary>
  230. public string? OrderCodes { get; set; }
  231. /// <summary>STANDARD / NON_STANDARD;为空时返回全量并保留三档汇总。</summary>
  232. public string? ProductType { get; set; }
  233. }
  234. /// <summary>查询条件回显,便于前端固定下钻状态。</summary>
  235. public class AdoS8OrderFlowProductDesignFilterDto
  236. {
  237. public List<string> OrderCodes { get; set; } = new();
  238. public string? ProductType { get; set; }
  239. }
  240. public class AdoS8OrderFlowProductDesignDrawingItemDto
  241. {
  242. public string OrderCode { get; set; } = string.Empty;
  243. public string DrawingNo { get; set; } = string.Empty;
  244. /// <summary>STANDARD / NON_STANDARD。</summary>
  245. public string ProductType { get; set; } = string.Empty;
  246. /// <summary>责任单位/岗位(研发中心 / 结构设计组 / 电气设计组 / 工艺设计组 / 设计审核组)。</summary>
  247. public string ResponsiblePerson { get; set; } = string.Empty;
  248. public DateTime PlannedStartDate { get; set; }
  249. public DateTime PlannedEndDate { get; set; }
  250. public DateTime? ActualStartDate { get; set; }
  251. public DateTime? ActualEndDate { get; set; }
  252. public decimal KpiDays { get; set; }
  253. public decimal? ActualDays { get; set; }
  254. public bool IsAchieved { get; set; }
  255. /// <summary>green / yellow / red / pending。</summary>
  256. public string Status { get; set; } = string.Empty;
  257. /// <summary>该图号对应台数;台数/占比/加权达成率三种口径的唯一来源。</summary>
  258. public int ProductQuantity { get; set; }
  259. }
  260. public class AdoS8OrderFlowProductDesignOverallSummaryDto
  261. {
  262. public int DrawingCount { get; set; }
  263. public int TotalQuantity { get; set; }
  264. public decimal KpiDays { get; set; }
  265. /// <summary>图号 actual_days 算术平均(非加权),保留小数原值,由前端格式化为 2 位。</summary>
  266. public decimal AvgActualDays { get; set; }
  267. /// <summary>按 product_quantity 加权达标率,小数 0~1,由前端格式化为整数百分比。</summary>
  268. public decimal AchievementRate { get; set; }
  269. }
  270. public class AdoS8OrderFlowProductDesignCategorySummaryDto
  271. {
  272. /// <summary>STANDARD / NON_STANDARD / TOTAL。</summary>
  273. public string ProductType { get; set; } = string.Empty;
  274. public string Name { get; set; } = string.Empty;
  275. public int DrawingCount { get; set; }
  276. public int TotalQuantity { get; set; }
  277. /// <summary>product_quantity 占合计比例,小数 0~1,由前端格式化为 1 位百分比。</summary>
  278. public decimal Ratio { get; set; }
  279. /// <summary>S8-ORDER-CHAIN-PRODUCT-DESIGN-PPT-STATIC-AND-SINGLE-ORDER-ALIGN-1:常规/合计返回 null,前端展示 --;非标返回真实平均设计周期。</summary>
  280. public decimal? AvgActualDays { get; set; }
  281. /// <summary>常规/合计返回 null,前端展示 --;非标返回 3 天 PRODUCT_DESIGN 阶段 KPI。</summary>
  282. public decimal? KpiDays { get; set; }
  283. /// <summary>常规/合计返回 null,前端展示 --;非标返回加权达成率。</summary>
  284. public decimal? AchievementRate { get; set; }
  285. /// <summary>green / yellow / red / ''(空 = 无数据,前端展示 --)。由 achievement_rate 分档得出,不再二次判定。</summary>
  286. public string Status { get; set; } = string.Empty;
  287. }
  288. public class AdoS8OrderFlowProductDesignSummaryDto
  289. {
  290. public AdoS8OrderFlowProductDesignOverallSummaryDto Overall { get; set; } = new();
  291. public List<AdoS8OrderFlowProductDesignCategorySummaryDto> Categories { get; set; } = new();
  292. }
  293. public class AdoS8OrderFlowProductDesignDrawingsDto
  294. {
  295. /// <summary>BASELINE_PPT(默认全 20 单)/ CURRENT_FILTERED(命中订单子集)。</summary>
  296. public string Scope { get; set; } = string.Empty;
  297. public AdoS8OrderFlowProductDesignFilterDto Filter { get; set; } = new();
  298. public AdoS8OrderFlowProductDesignSummaryDto Summary { get; set; } = new();
  299. public List<AdoS8OrderFlowProductDesignDrawingItemDto> Drawings { get; set; } = new();
  300. }
  301. #endregion
  302. #region 本体生产(设备制造) — S8-ORDER-CHAIN-BODY-PRODUCTION-ORDER-LEVEL-SEED-FIX-1
  303. /// <summary>
  304. /// 本体生产「工序明细 / 损失因素 / 操作员表现」三表透视查询入参。
  305. /// orderCodes CSV:与产品设计 drawings API、采购透视 API 对齐,避免 axios brackets 与 ASP.NET Core List 绑定二义性。
  306. /// scope=BASELINE_PPT 时 orderCodes 忽略;scope=CURRENT_FILTERED 时 orderCodes 为空返回空骨架(不静默 fallback baseline)。
  307. /// </summary>
  308. public class AdoS8OrderFlowManufacturingPivotQueryDto
  309. {
  310. public long? TenantId { get; set; }
  311. public long? FactoryId { get; set; }
  312. /// <summary>BASELINE_PPT | CURRENT_FILTERED</summary>
  313. public string Scope { get; set; } = string.Empty;
  314. /// <summary>逗号分隔订单号;scope=CURRENT_FILTERED 时使用。</summary>
  315. public string? OrderCodes { get; set; }
  316. }
  317. /// <summary>
  318. /// 工序明细行:P10 / P20 / P30 / P40 / TOTAL。
  319. /// pi_days / actual_days 保留 decimal(6,3) 精度;plan_qty 在 TOTAL 行为 null。
  320. /// achievement_rate 在 TOTAL 行 baseline 来自 fixture(0.9000)、订单级按 plan_qty 加权平均;其它行 baseline 复用。
  321. /// </summary>
  322. public class AdoS8OrderFlowManufacturingProcessDto
  323. {
  324. public string ProcessCode { get; set; } = string.Empty;
  325. public string ProcessName { get; set; } = string.Empty;
  326. public decimal PiDays { get; set; }
  327. public decimal ActualDays { get; set; }
  328. public string CycleStatus { get; set; } = string.Empty;
  329. public int? PlanQty { get; set; }
  330. public decimal? AchievementRate { get; set; }
  331. public string AchievementStatus { get; set; } = string.Empty;
  332. public int SortNo { get; set; }
  333. }
  334. /// <summary>损失因素行:MATERIAL / EQUIPMENT / QUALITY / EFFICIENCY / SUBTOTAL。</summary>
  335. public class AdoS8OrderFlowManufacturingLossFactorDto
  336. {
  337. public string FactorCode { get; set; } = string.Empty;
  338. public string FactorName { get; set; } = string.Empty;
  339. public int? CountValue { get; set; }
  340. public decimal? RatioPct { get; set; }
  341. public decimal? LossHours { get; set; }
  342. public int SortNo { get; set; }
  343. }
  344. /// <summary>操作员表现行:OP_ZHANG / OP_LI / OP_WANG。</summary>
  345. public class AdoS8OrderFlowManufacturingOperatorDto
  346. {
  347. public string OperatorCode { get; set; } = string.Empty;
  348. public string OperatorName { get; set; } = string.Empty;
  349. public decimal AvgHours { get; set; }
  350. public string Status { get; set; } = string.Empty;
  351. public int SortNo { get; set; }
  352. }
  353. /// <summary>本体生产透视聚合结果:scope + 工序 / 损失 / 操作员 三组。</summary>
  354. public class AdoS8OrderFlowManufacturingPivotDto
  355. {
  356. /// <summary>BASELINE_PPT | CURRENT_FILTERED</summary>
  357. public string Scope { get; set; } = string.Empty;
  358. public List<AdoS8OrderFlowManufacturingProcessDto> Processes { get; set; } = new();
  359. public List<AdoS8OrderFlowManufacturingLossFactorDto> LossFactors { get; set; } = new();
  360. public List<AdoS8OrderFlowManufacturingOperatorDto> Operators { get; set; } = new();
  361. }
  362. #endregion