/// <summary>
        /// 查询退款信息
        /// </summary>
        /// <param name="order"></param>
        /// <returns></returns>
        public async Task <(bool ok, string msg)> QueryRefundInfo(BackupOrderItem order)
        {
            if (order == null)
            {
                throw new ArgumentNullException(nameof(order));
            }

            if (!order.HasRefundInfo)
            {
                return(false, "无退款信息");
            }

            if (order.RefundInfo != null)
            {
                return(true, null);
            }

            var data = new
            {
                trade_no   = order.RefundTradeNo,
                trade_mode = 1,
                query_flag = 2,
                start_time = order.ReserveTime.ToString("yyyyMMddHHmmss"),
                stop_time  = order.ReserveTime.AddDays(15).AddSeconds(-1).ToString("yyyyMMddHHmmss")
            };
            var apiUrl = "queryRefund/queryRefundInfo";

            var ctx = await Session.NetClient.RunRequestLoopAsync(
                _ => Session.NetClient.Create <OtnWebResponse <RefundInfoContainer> >(
                    HttpMethod.Post,
                    apiUrl,
                    data: data
                    )
                );

            if (!ctx.IsValid() || !ctx.Result.IsValid() || ctx.Result.Data?.Flag != true)
            {
                return(false, ctx.Get12306ErrorMessage());
            }

            order.RefundInfo = ctx.Result.Data.Data;

            return(true, null);
        }
        public async Task <(bool ok, string msg)> CancelNotCompleteOrder(BackupOrderItem order, Func <double, bool> confirm)
        {
            var api  = order.StatusCode == 1 ? "afterNateOrder/cancelNotComplete" : "afterNateOrder/reserveReturnCheck";
            var data = order.StatusCode == 1 ? (object)new { reserve_no = order.ReserveNo } : new { sequence_no = order.ReserveNo };

            var ctx = await Session.NetClient.RunRequestLoopAsync(
                _ => Session.NetClient.Create(
                    HttpMethod.Post,
                    api,
                    data: data,
                    result: OtnWebResponse.Create(new { flag = false, msg = "", data = 0.0 }))
                );

            if (!ctx.IsValid() || ctx.Result.Data?.flag != true)
            {
                return(false, ctx.Get12306ErrorMessage(Assets.SR.Error_DefaultServerError));
            }

            if (order.StatusCode > 1)
            {
                //确认退费
                if (confirm?.Invoke(ctx.Result.Data.data) == false)
                {
                    return(false, "已终止取消订单");
                }

                var ctxRet = await Session.NetClient.RunRequestLoopAsync(
                    _ => Session.NetClient.Create(
                        HttpMethod.Post,
                        "afterNateOrder/reserveReturn",
                        data: data,
                        result: OtnWebResponse.Create(new { flag = false, msg = "" }))
                    );

                if (!ctxRet.IsValid() || ctxRet.Result.Data?.flag != true)
                {
                    return(false, ctxRet.Get12306ErrorMessage(Assets.SR.Error_DefaultServerError));
                }
            }

            return(true, null);
        }
 public HbOrderListViewGroup(BackupOrderItem order)
 {
     _order = order;
     CreateGroup();
 }
        public async Task <(bool ok, string msg, Dictionary <string, string> form)> CreatePayForm(BackupOrderItem order)
        {
            var ctx = await Session.NetClient.RunRequestLoopAsync(
                _ => Session.NetClient.Create <OtnWebResponse <BaseOtnApiResponseWithFlagAndMsg> >(
                    HttpMethod.Post,
                    "afterNateOrder/continuePayNoCompleteMyOrder",
                    data: new { reserve_no = order.ReserveNo })
                );

            if (!ctx.IsValid() || ctx.Result.Data?.Flag != true)
            {
                return(false, ctx.Get12306ErrorMessage(Assets.SR.Error_DefaultServerError), null);
            }

            var ctxPay = await Session.NetClient.RunRequestLoopAsync(
                _ => Session.NetClient.Create(
                    HttpMethod.Post,
                    "afterNatePay/paycheck",
                    result: OtnWebResponse.Create(new { flag = false, payForm = new Dictionary <string, string>() }))
                );

            if (!ctxPay.IsValid() || ctxPay.Result.Data?.flag != true || ctxPay.Result.Data?.payForm == null)
            {
                return(false, ctx.Get12306ErrorMessage(Assets.SR.Error_DefaultServerError), null);
            }

            return(true, null, ctxPay.Result.Data.payForm);
        }