PickBillUserMessages.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. namespace Admin.NET.Plugin.AiDOP.WorkOrder;
  2. /// <summary>领料建单 / 工单下达面向业务用户的失败提示(不暴露内部错误码作主文案)。</summary>
  3. public static class PickBillUserMessages
  4. {
  5. public static string ForReleaseFailure(string? reasonCode, string? reason = null, string? hint = null, IEnumerable<string>? items = null)
  6. {
  7. var involved = FormatItems(items);
  8. var msg = (reasonCode ?? "").Trim().ToUpperInvariant() switch
  9. {
  10. "MES_UNREACHABLE" =>
  11. "下达失败!因无法连接 MES 端数据库,请联系系统管理员后重试。",
  12. "MES_WRITE_FAILED" =>
  13. "下达失败!MES 端写入领料单失败,请联系系统管理员。",
  14. "SEQ_FAILED" =>
  15. "下达失败!MES 端领料单号取号失败,请联系系统管理员。",
  16. "NO_KEEPER" =>
  17. "下达失败!部分物料未配置保管员或库位,请先在仓储基础数据中补齐后重试。" + involved,
  18. "KEEPER_RULE_UNSAFE" =>
  19. "下达失败!物料号或保管员职责区间含不支持的字符,请联系系统管理员处理。" + involved,
  20. "NO_DETAIL" =>
  21. "下达失败!工单无物料明细,请先同步或维护物料后重试。",
  22. "ITEM_INVALID" =>
  23. "下达失败!工单物料主数据缺失或无效,请先补齐物料主数据后重试。",
  24. "WO_STATE_INVALID" =>
  25. "下达失败!当前工单状态不允许下达,请刷新列表后重试。",
  26. "ORPHAN_DETECTED" =>
  27. "下达失败!MES 端存在异常领料单数据,请联系系统管理员处理。",
  28. _ => BuildFallback(reason, hint)
  29. };
  30. return msg;
  31. }
  32. /// <summary>MES 补偿按钮等非「下达」入口,措辞改为「建领料失败」。</summary>
  33. public static string ForPickCreateFailure(string? reasonCode, string? reason = null, string? hint = null, IEnumerable<string>? items = null)
  34. => ForReleaseFailure(reasonCode, reason, hint, items)
  35. .Replace("下达失败!", "建领料失败!", StringComparison.Ordinal);
  36. private static string BuildFallback(string? reason, string? hint)
  37. {
  38. if (!string.IsNullOrWhiteSpace(reason) && reason.Contains("下达失败", StringComparison.Ordinal))
  39. return reason.Trim();
  40. if (!string.IsNullOrWhiteSpace(reason) && LooksLikeConnectionIssue(reason))
  41. return "下达失败!因无法连接 MES 端数据库,请联系系统管理员后重试。";
  42. var detail = string.IsNullOrWhiteSpace(reason) ? "原因未知" : Trunc(reason.Trim(), 120);
  43. var action = string.IsNullOrWhiteSpace(hint) ? "请联系系统管理员。" : hint.Trim();
  44. return $"下达失败!{detail}。{action}";
  45. }
  46. private static bool LooksLikeConnectionIssue(string text)
  47. {
  48. return text.Contains("不可达", StringComparison.OrdinalIgnoreCase)
  49. || text.Contains("timeout", StringComparison.OrdinalIgnoreCase)
  50. || text.Contains("连接", StringComparison.Ordinal)
  51. || text.Contains("network", StringComparison.OrdinalIgnoreCase)
  52. || text.Contains("MES_UNREACHABLE", StringComparison.OrdinalIgnoreCase);
  53. }
  54. private static string FormatItems(IEnumerable<string>? items)
  55. {
  56. if (items == null) return "";
  57. var list = items.Where(x => !string.IsNullOrWhiteSpace(x)).Distinct(StringComparer.OrdinalIgnoreCase).Take(15).ToList();
  58. return list.Count == 0 ? "" : " 涉及物料:" + string.Join("、", list) + (list.Count >= 15 ? "…" : "");
  59. }
  60. private static string Trunc(string s, int max) =>
  61. s.Length <= max ? s : s[..max] + "…";
  62. }