|
|
|
using System.Net.Http.Json;
|
|
|
|
using System.Text.Json;
|
|
|
|
using System.Text.Json;
|
|
|
|
using System.Text.Json.Nodes;
|
|
|
|
|
|
|
|
namespace IndustrialControl.Services
|
|
...
|
...
|
@@ -52,12 +51,12 @@ namespace IndustrialControl.Services |
|
|
|
(string?)cfg?["apiEndpoints"]?["workOrder"]?["dictList"]
|
|
|
|
?? "/normalService/pda/pmsWorkOrder/getWorkOrderDictList";
|
|
|
|
}
|
|
|
|
private static string BuildQuery(IDictionary<string, string> p)
|
|
|
|
=> string.Join("&", p.Select(kv => $"{Uri.EscapeDataString(kv.Key)}={Uri.EscapeDataString(kv.Value)}"));
|
|
|
|
// using System.Text.Json;
|
|
|
|
// using System.Text;
|
|
|
|
private static string BuildQuery(IDictionary<string, string> p)
|
|
|
|
=> string.Join("&", p.Select(kv => $"{Uri.EscapeDataString(kv.Key)}={Uri.EscapeDataString(kv.Value)}"));
|
|
|
|
// using System.Text.Json;
|
|
|
|
// using System.Text;
|
|
|
|
|
|
|
|
public async Task<WorkOrderPageResult> GetWorkOrdersAsync(WorkOrderQuery q, CancellationToken ct = default)
|
|
|
|
public async Task<WorkOrderPageResult> GetWorkOrdersAsync(WorkOrderQuery q, CancellationToken ct = default)
|
|
|
|
{
|
|
|
|
// 1) 先把所有要传的参数放进字典(只加有值的)
|
|
|
|
var p = new Dictionary<string, string>
|
|
...
|
...
|
@@ -103,76 +102,76 @@ namespace IndustrialControl.Services |
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 工单流程:/getWorkOrderWorkflow?id=...
|
|
|
|
/// 返回 result 为数组(statusValue/statusName/statusTime)
|
|
|
|
/// </summary>
|
|
|
|
public async Task<WorkflowResp?> GetWorkOrderWorkflowAsync(string id, CancellationToken ct = default)
|
|
|
|
{
|
|
|
|
var p = new Dictionary<string, string> { ["id"] = id?.Trim() ?? "" };
|
|
|
|
var url = _workflowEndpoint + "?" + BuildQuery(p);
|
|
|
|
/// <summary>
|
|
|
|
/// 工单流程:/getWorkOrderWorkflow?id=...
|
|
|
|
/// 返回 result 为数组(statusValue/statusName/statusTime)
|
|
|
|
/// </summary>
|
|
|
|
public async Task<WorkflowResp?> GetWorkOrderWorkflowAsync(string id, CancellationToken ct = default)
|
|
|
|
{
|
|
|
|
var p = new Dictionary<string, string> { ["id"] = id?.Trim() ?? "" };
|
|
|
|
var url = _workflowEndpoint + "?" + BuildQuery(p);
|
|
|
|
|
|
|
|
using var req = new HttpRequestMessage(HttpMethod.Get, url);
|
|
|
|
System.Diagnostics.Debug.WriteLine("[WorkOrderApi] GET " + url);
|
|
|
|
using var req = new HttpRequestMessage(HttpMethod.Get, url);
|
|
|
|
System.Diagnostics.Debug.WriteLine("[WorkOrderApi] GET " + url);
|
|
|
|
|
|
|
|
using var httpResp = await _http.SendAsync(req, ct);
|
|
|
|
var json = await httpResp.Content.ReadAsStringAsync(ct);
|
|
|
|
System.Diagnostics.Debug.WriteLine("[WorkOrderApi] Resp(getWorkOrderWorkflow): " + json[..Math.Min(300, json.Length)] + "...");
|
|
|
|
using var httpResp = await _http.SendAsync(req, ct);
|
|
|
|
var json = await httpResp.Content.ReadAsStringAsync(ct);
|
|
|
|
System.Diagnostics.Debug.WriteLine("[WorkOrderApi] Resp(getWorkOrderWorkflow): " + json[..Math.Min(300, json.Length)] + "...");
|
|
|
|
|
|
|
|
if (!httpResp.IsSuccessStatusCode)
|
|
|
|
return new WorkflowResp { success = false, message = $"HTTP {(int)httpResp.StatusCode}" };
|
|
|
|
if (!httpResp.IsSuccessStatusCode)
|
|
|
|
return new WorkflowResp { success = false, message = $"HTTP {(int)httpResp.StatusCode}" };
|
|
|
|
|
|
|
|
var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
|
|
|
|
var resp = JsonSerializer.Deserialize<WorkflowResp>(json, options) ?? new WorkflowResp();
|
|
|
|
return resp;
|
|
|
|
}
|
|
|
|
var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
|
|
|
|
var resp = JsonSerializer.Deserialize<WorkflowResp>(json, options) ?? new WorkflowResp();
|
|
|
|
return resp;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 工序分页:/pageWorkProcessTasks?pageNo=&pageSize=&workOrderNo=
|
|
|
|
/// 返回分页结构,数据在 result.records[]
|
|
|
|
/// </summary>
|
|
|
|
public async Task<PageResp<ProcessTask>?> PageWorkProcessTasksAsync(
|
|
|
|
string workOrderNo, int pageNo = 1, int pageSize = 50, CancellationToken ct = default)
|
|
|
|
{
|
|
|
|
var p = new Dictionary<string, string>
|
|
|
|
/// <summary>
|
|
|
|
/// 工序分页:/pageWorkProcessTasks?pageNo=&pageSize=&workOrderNo=
|
|
|
|
/// 返回分页结构,数据在 result.records[]
|
|
|
|
/// </summary>
|
|
|
|
public async Task<PageResp<ProcessTask>?> PageWorkProcessTasksAsync(
|
|
|
|
string workOrderNo, int pageNo = 1, int pageSize = 50, CancellationToken ct = default)
|
|
|
|
{
|
|
|
|
["pageNo"] = pageNo.ToString(),
|
|
|
|
["pageSize"] = pageSize.ToString()
|
|
|
|
};
|
|
|
|
if (!string.IsNullOrWhiteSpace(workOrderNo)) p["workOrderNo"] = workOrderNo.Trim();
|
|
|
|
var p = new Dictionary<string, string>
|
|
|
|
{
|
|
|
|
["pageNo"] = pageNo.ToString(),
|
|
|
|
["pageSize"] = pageSize.ToString()
|
|
|
|
};
|
|
|
|
if (!string.IsNullOrWhiteSpace(workOrderNo)) p["workOrderNo"] = workOrderNo.Trim();
|
|
|
|
|
|
|
|
var url = _processTasksEndpoint + "?" + BuildQuery(p);
|
|
|
|
var url = _processTasksEndpoint + "?" + BuildQuery(p);
|
|
|
|
|
|
|
|
using var req = new HttpRequestMessage(HttpMethod.Get, url);
|
|
|
|
System.Diagnostics.Debug.WriteLine("[WorkOrderApi] GET " + url);
|
|
|
|
using var req = new HttpRequestMessage(HttpMethod.Get, url);
|
|
|
|
System.Diagnostics.Debug.WriteLine("[WorkOrderApi] GET " + url);
|
|
|
|
|
|
|
|
using var httpResp = await _http.SendAsync(req, ct);
|
|
|
|
var json = await httpResp.Content.ReadAsStringAsync(ct);
|
|
|
|
System.Diagnostics.Debug.WriteLine("[WorkOrderApi] Resp(pageWorkProcessTasks): " + json[..Math.Min(300, json.Length)] + "...");
|
|
|
|
using var httpResp = await _http.SendAsync(req, ct);
|
|
|
|
var json = await httpResp.Content.ReadAsStringAsync(ct);
|
|
|
|
System.Diagnostics.Debug.WriteLine("[WorkOrderApi] Resp(pageWorkProcessTasks): " + json[..Math.Min(300, json.Length)] + "...");
|
|
|
|
|
|
|
|
if (!httpResp.IsSuccessStatusCode)
|
|
|
|
return new PageResp<ProcessTask> { success = false, message = $"HTTP {(int)httpResp.StatusCode}" };
|
|
|
|
|
|
|
|
if (!httpResp.IsSuccessStatusCode)
|
|
|
|
return new PageResp<ProcessTask> { success = false, message = $"HTTP {(int)httpResp.StatusCode}" };
|
|
|
|
var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
|
|
|
|
var resp = JsonSerializer.Deserialize<PageResp<ProcessTask>>(json, options) ?? new PageResp<ProcessTask>();
|
|
|
|
|
|
|
|
var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
|
|
|
|
var resp = JsonSerializer.Deserialize<PageResp<ProcessTask>>(json, options) ?? new PageResp<ProcessTask>();
|
|
|
|
// 兼容 result.records(你的实际返回就是 records,结构示例如你发的 JSON)
|
|
|
|
// 如果后端某些场景包在 result.list.records,也一并兼容
|
|
|
|
var nested = resp.result?.records ?? resp.result?.records;
|
|
|
|
if (nested is not null && resp.result is not null)
|
|
|
|
{
|
|
|
|
if (resp.result.records is null || resp.result.records.Count == 0)
|
|
|
|
resp.result.records = nested;
|
|
|
|
|
|
|
|
// 兼容 result.records(你的实际返回就是 records,结构示例如你发的 JSON)
|
|
|
|
// 如果后端某些场景包在 result.list.records,也一并兼容
|
|
|
|
var nested = resp.result?.records ?? resp.result?.records;
|
|
|
|
if (nested is not null && resp.result is not null)
|
|
|
|
{
|
|
|
|
if (resp.result.records is null || resp.result.records.Count == 0)
|
|
|
|
resp.result.records = nested;
|
|
|
|
if (resp.result.pageNo == 0 && resp.result is not null) resp.result.pageNo = resp.result.pageNo;
|
|
|
|
if (resp.result.pageSize == 0 && resp.result is not null) resp.result.pageSize = resp.result.pageSize;
|
|
|
|
if (resp.result.total == 0 && resp.result is not null) resp.result.total = resp.result.total;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (resp.result.pageNo == 0 && resp.result is not null) resp.result.pageNo = resp.result.pageNo;
|
|
|
|
if (resp.result.pageSize == 0 && resp.result is not null) resp.result.pageSize = resp.result.pageSize;
|
|
|
|
if (resp.result.total == 0 && resp.result is not null) resp.result.total = resp.result.total;
|
|
|
|
return resp;
|
|
|
|
}
|
|
|
|
|
|
|
|
return resp;
|
|
|
|
}
|
|
|
|
|
|
|
|
public async Task<DictBundle> GetWorkOrderDictsAsync(CancellationToken ct = default)
|
|
|
|
public async Task<DictBundle> GetWorkOrderDictsAsync(CancellationToken ct = default)
|
|
|
|
{
|
|
|
|
using var req = new HttpRequestMessage(HttpMethod.Get, _dictEndpoint);
|
|
|
|
using var res = await _http.SendAsync(req, ct);
|
|
...
|
...
|
@@ -257,7 +256,7 @@ public async Task<DictBundle> GetWorkOrderDictsAsync(CancellationToken ct = defa |
|
|
|
public string? lineName { get; set; }
|
|
|
|
public string? workShop { get; set; }
|
|
|
|
public string? workShopName { get; set; }
|
|
|
|
public string? urgent { get; set; }
|
|
|
|
public string? urgent { get; set; }
|
|
|
|
|
|
|
|
// ★ 这些时间都是 "yyyy-MM-dd HH:mm:ss" 字符串
|
|
|
|
public string? schemeStartDate { get; set; }
|
|
...
|
...
|
@@ -337,22 +336,22 @@ public async Task<DictBundle> GetWorkOrderDictsAsync(CancellationToken ct = defa |
|
|
|
public List<DictItem> AuditStatus { get; set; } = new();
|
|
|
|
public List<DictItem> Urgent { get; set; } = new();
|
|
|
|
}
|
|
|
|
public sealed class WorkflowResp { public bool success { get; set; } public string? message { get; set; } public int code { get; set; } public List<WorkflowItem>? result { get; set; } }
|
|
|
|
public sealed class WorkflowItem { public string? statusValue { get; set; } public string? statusName { get; set; } public string? statusTime { get; set; } }
|
|
|
|
public sealed class WorkflowResp { public bool success { get; set; } public string? message { get; set; } public int code { get; set; } public List<WorkflowItem>? result { get; set; } }
|
|
|
|
public sealed class WorkflowItem { public string? statusValue { get; set; } public string? statusName { get; set; } public string? statusTime { get; set; } }
|
|
|
|
|
|
|
|
public sealed class PageResp<T> { public bool success { get; set; } public string? message { get; set; } public int code { get; set; } public PageResult<T>? result { get; set; } }
|
|
|
|
public sealed class PageResult<T> { public int pageNo { get; set; } public int pageSize { get; set; } public int total { get; set; } public List<T>? records { get; set; } }
|
|
|
|
public sealed class PageResp<T> { public bool success { get; set; } public string? message { get; set; } public int code { get; set; } public PageResult<T>? result { get; set; } }
|
|
|
|
public sealed class PageResult<T> { public int pageNo { get; set; } public int pageSize { get; set; } public int total { get; set; } public List<T>? records { get; set; } }
|
|
|
|
|
|
|
|
public sealed class ProcessTask
|
|
|
|
{
|
|
|
|
public string? id { get; set; }
|
|
|
|
public string? processCode { get; set; }
|
|
|
|
public string? processName { get; set; }
|
|
|
|
public decimal? scheQty { get; set; }
|
|
|
|
public decimal? completedQty { get; set; }
|
|
|
|
public string? startDate { get; set; }
|
|
|
|
public string? endDate { get; set; }
|
|
|
|
public int? sortNumber { get; set; }
|
|
|
|
public string? auditStatus { get; set; }
|
|
|
|
}
|
|
|
|
public sealed class ProcessTask
|
|
|
|
{
|
|
|
|
public string? id { get; set; }
|
|
|
|
public string? processCode { get; set; }
|
|
|
|
public string? processName { get; set; }
|
|
|
|
public decimal? scheQty { get; set; }
|
|
|
|
public decimal? completedQty { get; set; }
|
|
|
|
public string? startDate { get; set; }
|
|
|
|
public string? endDate { get; set; }
|
|
|
|
public int? sortNumber { get; set; }
|
|
|
|
public string? auditStatus { get; set; }
|
|
|
|
}
|
|
|
|
} |
...
|
...
|
|