185 lines
5.9 KiB
C#
185 lines
5.9 KiB
C#
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 中接入");
|
||
//}
|
||
}
|
||
}
|