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 { /// /// 拉取微信订单 - 任务数据服务。 /// 维护一个任务列表,每次拉取操作都会记录为一条任务,供"任务列表"界面展示; /// 拉取请求通过 提交,提交后返回服务器任务ID; /// 随后循环查询任务状态,直到完成/中断/超时。任务状态查询是另一个独立API /// (查询 task 表),见 (占位,需自行实现)。 /// public class PullWXOrderService { /// 循环查询服务器任务状态的间隔(秒) private const int TaskStatusPollIntervalSeconds = 30; /// 循环查询服务器任务状态的最大等待时间 private static readonly TimeSpan TaskStatusMaxWait = TimeSpan.FromMinutes(10); private static readonly Lazy _lazy = new Lazy(() => new PullWXOrderService()); /// 单例(全局共享同一份任务列表) 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(); } /// 任务列表(线程安全,界面可直接绑定) public ObservableCollection Tasks { get; } /// /// 拉取指定店铺的指定订单 /// public async Task PullOrderDetailAsync(long shopId, string orderId) { return await _erpApi.PullOrderDetail(shopId, orderId); } ///// ///// 拉取指定店铺的多个订单 ///// //public Task PullOrdersDetailAsync(long shopId, string[] orderIds) //{ // return RunTaskAsync("批量拉取订单", shopId.ToString(), string.Join(",", orderIds ?? new string[0]), // () => _erpApi.PullOrdersDetail(shopId, orderIds)); //} /// /// 按店铺与时间范围拉取订单 /// public Task PullOrderByShopIdsAndTimeRangeAsync(long[] shopIds, DateTime startTime, DateTime endTime) { return _erpApi.PullOrderByShopIdsAndTimeRange(shopIds, startTime, endTime); } /// /// 拉取指定店铺的售后订单 /// public Task PullRefundOrderByShopsAsync(long[] shopIds, DateTime startTime, DateTime endTime) { return _erpApi.PullRefundOrder(shopIds, startTime, endTime); } /// /// 拉取指定店铺的多个售后订单 /// public Task 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)); } } /// /// 清空已完成/失败的任务(保留执行中的任务) /// public void ClearFinished() { } /// /// 清空所有任务 /// public void ClearAll() { Tasks.Clear(); } ///// ///// 创建一个任务并执行:提交拉取请求获取服务器任务ID,再循环查询任务状态直至完成。 ///// //private async Task RunTaskAsync(string taskName, string shopIds, string orderIds, Func> 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; //} /// /// 循环查询服务器任务状态,直到完成/中断/超时。 /// 每次查询都会用 task 表的可用字段刷新任务列表展示内容(任务描述/进度/失败原因等)。 /// private async Task PollTaskStatusAsync(OrderTask task, long serverTaskId) { } /// /// 查询服务器任务信息(对应 task 表,任务状态查询接口返回的数据)。 /// TODO:任务状态查询是另一个独立API,请在这里接入你自己的查询实现, /// 返回 ;task 表 status 字段:1=执行中(Executing),2=已完成(Completed),3=已人为中断(ManuallyInterrupted)。 /// //private async Task QueryTaskAsync() //{ // await _kjdApi.GetWxTaskStatus(); // // ===================== 请在这里接入你自己的任务状态查询API ===================== // // 示例: // // TaskInfo info = await 你的查询API.QueryTask(taskId); // // return info; // // =============================================================================== // throw new NotImplementedException("任务状态查询API尚未实现,请在 PullWXOrderService.QueryTaskAsync 中接入"); //} } }