PickBillUserMessages.cs 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. "WO_MES_NOT_READY" =>
  29. "下达失败!MES 端尚未具备完整工单(头/明细/工序),请先完成订单评审或计划刷新推送,或调用工单推送补偿后重试。",
  30. _ => BuildFallback(reason, hint)
  31. };
  32. return msg;
  33. }
  34. /// <summary>MES 补偿按钮等非「下达」入口,措辞改为「建领料失败」。</summary>
  35. public static string ForPickCreateFailure(string? reasonCode, string? reason = null, string? hint = null, IEnumerable<string>? items = null)
  36. => ForReleaseFailure(reasonCode, reason, hint, items)
  37. .Replace("下达失败!", "建领料失败!", StringComparison.Ordinal);
  38. private static string BuildFallback(string? reason, string? hint)
  39. {
  40. if (!string.IsNullOrWhiteSpace(reason) && reason.Contains("下达失败", StringComparison.Ordinal))
  41. return reason.Trim();
  42. if (!string.IsNullOrWhiteSpace(reason) && LooksLikeConnectionIssue(reason))
  43. return "下达失败!因无法连接 MES 端数据库,请联系系统管理员后重试。";
  44. var detail = string.IsNullOrWhiteSpace(reason) ? "原因未知" : Trunc(reason.Trim(), 120);
  45. var action = string.IsNullOrWhiteSpace(hint) ? "请联系系统管理员。" : hint.Trim();
  46. return $"下达失败!{detail}。{action}";
  47. }
  48. private static bool LooksLikeConnectionIssue(string text)
  49. {
  50. return text.Contains("不可达", StringComparison.OrdinalIgnoreCase)
  51. || text.Contains("timeout", StringComparison.OrdinalIgnoreCase)
  52. || text.Contains("连接", StringComparison.Ordinal)
  53. || text.Contains("network", StringComparison.OrdinalIgnoreCase)
  54. || text.Contains("MES_UNREACHABLE", StringComparison.OrdinalIgnoreCase);
  55. }
  56. private static string FormatItems(IEnumerable<string>? items)
  57. {
  58. if (items == null) return "";
  59. var list = items.Where(x => !string.IsNullOrWhiteSpace(x)).Distinct(StringComparer.OrdinalIgnoreCase).Take(15).ToList();
  60. return list.Count == 0 ? "" : " 涉及物料:" + string.Join("、", list) + (list.Count >= 15 ? "…" : "");
  61. }
  62. private static string Trunc(string s, int max) =>
  63. s.Length <= max ? s : s[..max] + "…";
  64. }