WorkOrderProgressDashboardService.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. namespace Admin.NET.Plugin.AiDOP.Production;
  2. /// <summary>
  3. /// 工单执行进度看板(列表)📊
  4. /// 路由前缀:<c>/api/Production/work-order-progress/...</c>
  5. /// </summary>
  6. [ApiDescriptionSettings(Order = 266, Description = "工单执行进度看板")]
  7. [Route("api/Production")]
  8. [AllowAnonymous]
  9. [NonUnify]
  10. public class WorkOrderProgressDashboardService : IDynamicApiController, ITransient
  11. {
  12. private readonly ISqlSugarClient _db;
  13. public WorkOrderProgressDashboardService(ISqlSugarClient db)
  14. {
  15. _db = db;
  16. }
  17. /// <summary>工单执行进度看板分页列表</summary>
  18. [DisplayName("工单执行进度看板列表")]
  19. [HttpGet("work-order-progress/list")]
  20. public async Task<object> GetList([FromQuery] WorkOrderProgressDashboardListInput input)
  21. {
  22. const string C = "utf8mb4_general_ci";
  23. var pars = new List<SugarParameter>();
  24. var innerWhere = new List<string>
  25. {
  26. "IFNULL(wm.Status,'') <> ''"
  27. };
  28. if (!string.IsNullOrWhiteSpace(input.WorkOrd))
  29. {
  30. innerWhere.Add($"(wm.WorkOrd COLLATE {C}) LIKE @WorkOrd");
  31. pars.Add(new SugarParameter("@WorkOrd", $"%{input.WorkOrd.Trim()}%"));
  32. }
  33. if (!string.IsNullOrWhiteSpace(input.ItemNum))
  34. {
  35. innerWhere.Add($"(wm.ItemNum COLLATE {C}) = @ItemNum");
  36. pars.Add(new SugarParameter("@ItemNum", input.ItemNum.Trim()));
  37. }
  38. if (!string.IsNullOrWhiteSpace(input.OrdDateFrom))
  39. {
  40. innerWhere.Add("DATE(wm.OrdDate) >= @OrdDateFrom");
  41. pars.Add(new SugarParameter("@OrdDateFrom", input.OrdDateFrom.Trim()));
  42. }
  43. var baseSql = BuildListBaseSql(string.Join(" AND ", innerWhere), C);
  44. var offset = (input.Page - 1) * input.PageSize;
  45. var total = await _db.Ado.GetIntAsync(
  46. $"SELECT COUNT(*) FROM ({baseSql}) AS t", pars);
  47. var list = await _db.Ado.SqlQueryAsync<WorkOrderProgressDashboardListRow>(
  48. $"SELECT * FROM ({baseSql}) AS t ORDER BY t.OrdDate DESC, t.Id DESC LIMIT {input.PageSize} OFFSET {offset}",
  49. pars);
  50. return new { total, page = input.Page, pageSize = input.PageSize, list };
  51. }
  52. private static string BuildListBaseSql(string innerWhere, string C) => $"""
  53. SELECT
  54. wm.RecID AS Id,
  55. wm.WorkOrd AS WorkOrd,
  56. wm.Typed AS Typed,
  57. defaultLine.Workshop AS Workshop,
  58. wm.OrdDate AS OrdDate,
  59. wm.DueDate AS DueDate,
  60. wm.ItemNum AS ItemNum,
  61. im.Descr AS Descr,
  62. im.Descr1 AS Descr1,
  63. IFNULL(wm.QtyOrded, 0) AS QtyOrded,
  64. IFNULL(wm.QtyCompleted, 0) AS QtyCompleted,
  65. IFNULL(wm.QtyOrded, 0) - IFNULL(wm.QtyCompleted, 0) AS NoCompleted,
  66. mo.MaterialSituation AS MaterialSituation,
  67. LOWER(wm.Status) AS Status,
  68. CASE
  69. WHEN IFNULL(wm.QtyOrded, 0) = 0 THEN 0
  70. ELSE ROUND(100.0 * IFNULL(wm.QtyCompleted, 0) / wm.QtyOrded, 4)
  71. END AS Progress
  72. FROM WorkOrdMaster wm
  73. LEFT JOIN ItemMaster im
  74. ON wm.ItemNum COLLATE {C} = im.ItemNum COLLATE {C}
  75. AND wm.`Domain` COLLATE {C} = im.`Domain` COLLATE {C}
  76. LEFT JOIN mes_morder mo
  77. ON wm.WorkOrd COLLATE {C} = mo.morder_no COLLATE {C}
  78. AND wm.`Domain` COLLATE {C} = mo.factory_id COLLATE {C}
  79. LEFT JOIN LATERAL (
  80. SELECT psd0.`Line` AS `Line`
  81. FROM PeriodSequenceDet psd0
  82. WHERE psd0.ItemNum COLLATE {C} = wm.ItemNum COLLATE {C}
  83. AND psd0.`Domain` COLLATE {C} = wm.`Domain` COLLATE {C}
  84. LIMIT 1
  85. ) AS psd ON TRUE
  86. LEFT JOIN LATERAL (
  87. SELECT lm.Workshop AS Workshop
  88. FROM LineMaster lm
  89. WHERE lm.`Line` COLLATE {C} = psd.`Line` COLLATE {C}
  90. AND lm.`Domain` COLLATE {C} = wm.`Domain` COLLATE {C}
  91. LIMIT 1
  92. ) AS defaultLine ON TRUE
  93. WHERE {innerWhere}
  94. """;
  95. }