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 =>
{
if (!string.IsNullOrEmpty(a.TaskFailReason))
{
if (a.TaskFailReason.Contains("任务执行异常"))
{
a.Status = 4;
}
}
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 中接入");
//}
}
}