Files
29WxOrder/29WxOrderWpf/Services/PullWXOrderService.cs
T
2026-08-19 15:35:42 +08:00

185 lines
5.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using AllBase;
using AllBase.Util;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Work.ERP.API;
using Work.ERP.API.Orders;
using Work.KJDServer.API.Models;
using Work.KJDServer.API.WXOrder;
using ServerTaskStatus = Work.ERP.API.TaskStatus;
namespace _29WxOrderWpf.Services
{
/// <summary>
/// 拉取微信订单 - 任务数据服务。
/// 维护一个任务列表,每次拉取操作都会记录为一条任务,供"任务列表"界面展示;
/// 拉取请求通过 <see cref="PullWXOrderServiceApi"/> 提交,提交后返回服务器任务ID;
/// 随后循环查询任务状态,直到完成/中断/超时。任务状态查询是另一个独立API
/// (查询 task 表),见 <see cref="QueryTaskAsync"/>(占位,需自行实现)。
/// </summary>
public class PullWXOrderService
{
/// <summary>循环查询服务器任务状态的间隔(秒)</summary>
private const int TaskStatusPollIntervalSeconds = 30;
/// <summary>循环查询服务器任务状态的最大等待时间</summary>
private static readonly TimeSpan TaskStatusMaxWait = TimeSpan.FromMinutes(10);
private static readonly Lazy<PullWXOrderService> _lazy = new Lazy<PullWXOrderService>(() => new PullWXOrderService());
/// <summary>单例(全局共享同一份任务列表)</summary>
public static PullWXOrderService Instance => _lazy.Value;
private readonly PullWXOrderServiceApi _erpApi = new PullWXOrderServiceApi();
private readonly WxOrderServiceApi _kjdApi = new WxOrderServiceApi();
private long _seq;
public PullWXOrderService()
{
Tasks = new ObservableCollection<OrderTask>();
}
/// <summary>任务列表(线程安全,界面可直接绑定)</summary>
public ObservableCollection<OrderTask> Tasks { get; }
/// <summary>
/// 拉取指定店铺的指定订单
/// </summary>
public async Task<bool> PullOrderDetailAsync(long shopId, string orderId)
{
return await _erpApi.PullOrderDetail(shopId, orderId);
}
///// <summary>
///// 拉取指定店铺的多个订单
///// </summary>
//public Task<PullWXOrderTaskItem> PullOrdersDetailAsync(long shopId, string[] orderIds)
//{
// return RunTaskAsync("批量拉取订单", shopId.ToString(), string.Join(",", orderIds ?? new string[0]),
// () => _erpApi.PullOrdersDetail(shopId, orderIds));
//}
/// <summary>
/// 按店铺与时间范围拉取订单
/// </summary>
public Task<bool> PullOrderByShopIdsAndTimeRangeAsync(long[] shopIds, DateTime startTime, DateTime endTime)
{
return _erpApi.PullOrderByShopIdsAndTimeRange(shopIds, startTime, endTime);
}
/// <summary>
/// 拉取指定店铺的售后订单
/// </summary>
public Task<bool> PullRefundOrderByShopsAsync(long[] shopIds, DateTime startTime, DateTime endTime)
{
return _erpApi.PullRefundOrder(shopIds, startTime, endTime);
}
/// <summary>
/// 拉取指定店铺的多个售后订单
/// </summary>
public Task<bool> PullAfterSaleOrdersAsync(long shopId, string[] afterSaleOrderIds)
{
return _erpApi.PullAfterSaleOrders(shopId, afterSaleOrderIds);
}
public async Task GetTaskStatus()
{
var tasks = await _kjdApi.GetWxTaskStatus();
if (tasks != null)
{
Tasks.Clear();
tasks.ForEach(a => Tasks.Add(a));
}
}
/// <summary>
/// 清空已完成/失败的任务(保留执行中的任务)
/// </summary>
public void ClearFinished()
{
}
/// <summary>
/// 清空所有任务
/// </summary>
public void ClearAll()
{
Tasks.Clear();
}
///// <summary>
///// 创建一个任务并执行:提交拉取请求获取服务器任务ID,再循环查询任务状态直至完成。
///// </summary>
//private async Task<PullWXOrderTaskItem> RunTaskAsync(string taskName, string shopIds, string orderIds, Func<Task<long>> action)
//{
// var task = new PullWXOrderTaskItem
// {
// Id = Interlocked.Increment(ref _seq),
// TaskName = taskName,
// ShopIds = shopIds,
// OrderIds = orderIds,
// StartTime = DateTime.Now,
// Status = PullWXOrderTaskStatus.Running
// };
// Tasks.Add(task);
// try
// {
// long serverTaskId = await action();
// task.ServerTaskId = serverTaskId;
// if (serverTaskId > 0)
// {
// await PollTaskStatusAsync(task, serverTaskId);
// }
// else
// {
// // 服务器直接完成,无需轮询
// task.EndTime = DateTime.Now;
// task.Message = "成功";
// task.Status = PullWXOrderTaskStatus.Success;
// }
// }
// catch (Exception ex)
// {
// task.EndTime = DateTime.Now;
// task.Message = ex.Message;
// task.Status = PullWXOrderTaskStatus.Failed;
// }
// return task;
//}
/// <summary>
/// 循环查询服务器任务状态,直到完成/中断/超时。
/// 每次查询都会用 task 表的可用字段刷新任务列表展示内容(任务描述/进度/失败原因等)。
/// </summary>
private async Task PollTaskStatusAsync(OrderTask task, long serverTaskId)
{
}
/// <summary>
/// 查询服务器任务信息(对应 task 表,任务状态查询接口返回的数据)。
/// TODO:任务状态查询是另一个独立API,请在这里接入你自己的查询实现,
/// 返回 <see cref="TaskInfo"/>;task 表 status 字段:1=执行中(Executing),2=已完成(Completed),3=已人为中断(ManuallyInterrupted)。
/// </summary>
//private async Task<TaskInfo> QueryTaskAsync()
//{
// await _kjdApi.GetWxTaskStatus();
// // ===================== 请在这里接入你自己的任务状态查询API =====================
// // 示例:
// // TaskInfo info = await 你的查询API.QueryTask(taskId);
// // return info;
// // ===============================================================================
// throw new NotImplementedException("任务状态查询API尚未实现,请在 PullWXOrderService.QueryTaskAsync 中接入");
//}
}
}