UniversalWorkOrderService.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. namespace Admin.NET.Plugin.AiDOP.Universal;
  2. /// <summary>
  3. /// 通用工单选择服务
  4. /// </summary>
  5. [ApiDescriptionSettings(Order = 281, Description = "通用-工单选择")]
  6. [Route("api/Universal")]
  7. [AllowAnonymous]
  8. [NonUnify]
  9. public class UniversalWorkOrderService : IDynamicApiController, ITransient
  10. {
  11. private readonly ISqlSugarClient _db;
  12. private readonly UserManager _userManager;
  13. public UniversalWorkOrderService(ISqlSugarClient db, UserManager userManager)
  14. {
  15. _db = db;
  16. _userManager = userManager;
  17. }
  18. [DisplayName("获取工单选择列表")]
  19. [HttpGet("work-order/page")]
  20. public async Task<object> GetPage([FromQuery] UniversalWorkOrderPageInput input)
  21. {
  22. var page = input.Page <= 0 ? 1 : input.Page;
  23. var pageSize = input.PageSize <= 0 ? 10 : input.PageSize;
  24. var offset = (page - 1) * pageSize;
  25. var tenantId = _userManager.TenantId;
  26. var where = new List<string>
  27. {
  28. "a.tenant_id = @TenantId",
  29. "a.Status!='c'",
  30. // 只展示:至少存在一个“外协工序+供应商”尚未生成 PW 采购单的工单
  31. @"EXISTS (
  32. SELECT 1
  33. FROM WorkOrdRouting r
  34. INNER JOIN RoutingOpDetail d ON r.Op = d.Op AND r.ItemNum = d.RoutingCode
  35. WHERE r.WorkOrd = a.WorkOrd
  36. AND r.ProcessOut = 1
  37. AND IFNULL(TRIM(d.SupplierCode),'') <> ''
  38. AND NOT EXISTS (
  39. SELECT 1 FROM PurOrdMaster p
  40. WHERE p.WorkOrd = a.WorkOrd AND p.Supp = d.SupplierCode AND p.Potype = 'PW'
  41. )
  42. )"
  43. };
  44. var pars = new List<SugarParameter> { new SugarParameter("@TenantId", tenantId) };
  45. if (!string.IsNullOrWhiteSpace(input.WorkOrd))
  46. {
  47. where.Add("a.WorkOrd LIKE @WorkOrd");
  48. pars.Add(new SugarParameter("@WorkOrd", $"%{input.WorkOrd.Trim()}%"));
  49. }
  50. var fromSql = $"""
  51. FROM WorkOrdMaster a
  52. LEFT JOIN ItemMaster b ON a.ItemNum=b.ItemNum
  53. WHERE {string.Join(" AND ", where)}
  54. """;
  55. var total = await _db.Ado.GetIntAsync($"SELECT COUNT(1) {fromSql}", pars);
  56. var list = await _db.Ado.SqlQueryAsync<UniversalWorkOrderOutput>(
  57. $"""
  58. SELECT
  59. a.recid AS Id,
  60. a.Batch AS Batch,
  61. a.Drawing AS Drawing,
  62. a.Typed AS Typed,
  63. a.WorkOrd AS WorkOrd,
  64. a.OrdDate AS OrdDate,
  65. a.DueDate AS DueDate,
  66. a.ItemNum AS ItemNum,
  67. a.Project AS Project,
  68. a.QtyOrded AS QtyOrded,
  69. a.QtyCompleted AS QtyCompleted,
  70. a.Remark AS Remark,
  71. LOWER(a.Status) AS Status,
  72. a.WoTyped AS WoTyped,
  73. b.Descr AS Descr,
  74. b.Descr1 AS Descr1,
  75. a.lbrvar AS Lbrvar
  76. {fromSql}
  77. ORDER BY {BuildOrderBy(input.SortField, input.SortOrder)}
  78. LIMIT {pageSize} OFFSET {offset}
  79. """,
  80. pars);
  81. return new { total, page, pageSize, list };
  82. }
  83. private static string BuildOrderBy(string? sortField, string? sortOrder)
  84. {
  85. var dir = string.Equals(sortOrder, "asc", StringComparison.OrdinalIgnoreCase) ? "ASC" : "DESC";
  86. return sortField?.ToLowerInvariant() switch
  87. {
  88. "workord" => $"a.WorkOrd {dir}",
  89. "itemnum" => $"a.ItemNum {dir}",
  90. "descr" => $"b.Descr {dir}",
  91. "orddate" => $"a.OrdDate {dir}",
  92. _ => "a.RecID DESC"
  93. };
  94. }
  95. }