/// <summary> /// 添加警告信息 /// </summary> public void AddWarnings( SellerOrder order, IList <HtmlString> warnings, OrderOperatorType operatorType) { // 警告担保交易未确认收款 var orderManager = Application.Ioc.Resolve <SellerOrderManager>(); var transactions = orderManager.GetReleatedTransactions(order.Id); if (transactions.Any(t => t.State == PaymentTransactionState.SecuredPaid)) { if (operatorType == OrderOperatorType.Buyer) { warnings.Add(HtmlString.Encode( new T("You're using secured paid, please confirm transaction on payment platform after received goods"))); } else { warnings.Add(HtmlString.Encode( new T("Buyer is using secured paid, please tell the buyer confirm transaction on payment platform after received goods"))); } } // 警告关联交易的最后发生错误 var lastErrors = transactions.Select(t => t.LastError).Where(e => !string.IsNullOrEmpty(e)); foreach (var lastError in lastErrors) { warnings.Add(HtmlString.Encode( new T("Releated transaction contains error: {0}", new T(lastError)))); } }
/// <summary> /// 添加详细信息 /// </summary> public void AddSubjects( SellerOrder order, IList <HtmlString> subjects, OrderOperatorType operatorType) { // 收货地址 var templateManager = Application.Ioc.Resolve <TemplateManager>(); var address = order.OrderParameters.GetShippingAddress(); if (!string.IsNullOrEmpty(address.DetailedAddress)) { subjects.Add(new HtmlString(templateManager.RenderTemplate( "shopping.order/tmpl.order_view.details_subject_row.html", new { name = new T("ShippingAddress"), value = address.GenerateSummary() }))); } // 买家留言和卖家留言 var lastBuyerComment = order.OrderComments .Where(c => c.Side == OrderCommentSide.BuyerComment) .OrderBy(c => c.CreateTime) .LastOrDefault()?.Contents; var lastSellerComment = order.OrderComments .Where(c => c.Side == OrderCommentSide.SellerComment) .OrderBy(c => c.CreateTime) .LastOrDefault()?.Contents; subjects.Add(new HtmlString(templateManager.RenderTemplate( "shopping.order/tmpl.order_view.details_comment_row.html", new { name = new T("BuyerComment"), value = lastBuyerComment }))); subjects.Add(new HtmlString(templateManager.RenderTemplate( "shopping.order/tmpl.order_view.details_comment_row.html", new { name = new T("SellerComment"), value = lastSellerComment }))); // 订单编号 subjects.Add(new HtmlString(templateManager.RenderTemplate( "shopping.order/tmpl.order_view.details_subject_row.html", new { name = new T("OrderSerial"), value = order.Serial }))); // 下单时间 subjects.Add(new HtmlString(templateManager.RenderTemplate( "shopping.order/tmpl.order_view.details_subject_row.html", new { name = new T("CreateTime"), value = order.CreateTime.ToClientTimeString() }))); // 支付接口 var paymentApiManager = Application.Ioc.Resolve <PaymentApiManager>(); var paymentApiId = order.OrderParameters.GetPaymentApiId(); var payment = paymentApiManager.GetWithCache(paymentApiId); subjects.Add(new HtmlString(templateManager.RenderTemplate( "shopping.order/tmpl.order_view.details_subject_row.html", new { name = new T("PaymentApi"), value = new T(payment?.Name) }))); // 物流配送 // 这里只显示买家指定的,不显示后台实际发货使用的 var logisticsManager = Application.Ioc.Resolve <LogisticsManager>(); var logisticsId = order.OrderParameters.GetSellerToLogistics() .GetOrDefault(order.Owner?.Id ?? Guid.Empty); var logistics = logisticsManager.GetWithCache(logisticsId); if (logistics != null) { subjects.Add(new HtmlString(templateManager.RenderTemplate( "shopping.order/tmpl.order_view.details_subject_row.html", new { name = new T("OrderLogistics"), value = new T(logistics?.Name) }))); } }
/// <summary> /// 添加工具按钮 /// </summary> public void AddToolButtons( SellerOrder order, IList <HtmlString> toolButtons, OrderOperatorType operatorType) { // 复制收货人地址的按钮 var address = order.OrderParameters.GetShippingAddress(); if (!string.IsNullOrEmpty(address.DetailedAddress)) { var templateManager = Application.Ioc.Resolve <TemplateManager>(); toolButtons.Add(new HtmlString(templateManager.RenderTemplate( "shopping.order/tmpl.order_view.details_copy_address.html", new { summary = address.GenerateSummary() }))); } }
/// <summary> /// 添加订单操作 /// </summary> public void AddActions(SellerOrder order, IList <HtmlString> actions, OrderOperatorType operatorType) { // 买家 var productRatingManager = Application.Ioc.Resolve <ProductRatingManager>(); var templateManager = Application.Ioc.Resolve <TemplateManager>(); if (operatorType == OrderOperatorType.Buyer) { // 评价 var canRate = productRatingManager.CanRateOrder(order); if (canRate) { actions.Add(DefaultOrderDisplayInfoProvider.GetLinkAction(templateManager, new T("Rate"), productRatingManager.GetRatingUrl(order), "fa fa-star-o", "btn btn-primary")); } } }
/// <summary> /// 转换订单到显示信息 /// </summary> /// <param name="order">订单</param> /// <param name="operatorType">操作人类型</param> /// <returns></returns> public static OrderDisplayInfo ToDisplayInfo(this SellerOrder order, OrderOperatorType operatorType) { var currencyManager = Application.Ioc.Resolve <CurrencyManager>(); var currency = currencyManager.GetCurrency(order.Currency); var displayInfoProviders = Application.Ioc.ResolveMany <IOrderDisplayInfoProvider>(); var info = new OrderDisplayInfo(); info.Serial = order.Serial; info.BuyerId = order.Buyer?.Id; info.Buyer = order.Buyer?.Username; info.SellerId = order.Owner?.Id; info.Seller = order.Owner?.Username; info.State = order.State.ToString(); info.StateDescription = new T(order.State.GetDescription()); info.StateTimes = order.StateTimes.ToDictionary( e => e.Key.ToString(), e => e.Value.ToClientTimeString()); info.OrderParameters = order.OrderParameters; info.TotalCost = order.TotalCost; info.TotalCostString = currency.Format(info.TotalCost); info.TotalCostDescription = order.TotalCostCalcResult.Parts.GetDescription(); info.TotalCostCalcResult = order.TotalCostCalcResult; info.OriginalTotalCost = order.OriginalTotalCostCalcResult.Parts.Sum(); info.OriginalTotalCostString = currency.Format(info.OriginalTotalCost); info.OriginalTotalCostDescription = order.OriginalTotalCostCalcResult.Parts.GetDescription(); info.OriginalTotalCostResult = order.OriginalTotalCostCalcResult; info.Currency = currencyManager.GetCurrency(order.Currency); info.RemarkFlags = order.RemarkFlags; info.CreateTime = order.CreateTime.ToClientTimeString(); foreach (var provider in displayInfoProviders) { provider.AddWarnings(order, info.WarningHtmls, operatorType); provider.AddToolButtons(order, info.ToolButtonHtmls, operatorType); provider.AddSubjects(order, info.SubjectHtmls, operatorType); provider.AddActions(order, info.ActionHtmls, operatorType); } info.OrderProducts = order.OrderProducts.Select(p => p.ToDisplayInfo()).ToList(); return(info); }
/// <summary> /// 添加警告信息 /// </summary> public void AddWarnings(SellerOrder order, IList <HtmlString> warnings, OrderOperatorType operatorType) { }
/// <summary> /// 添加详细信息 /// </summary> public void AddSubjects(SellerOrder order, IList <HtmlString> subjects, OrderOperatorType operatorType) { }
/// <summary> /// 添加工具按钮 /// </summary> public void AddToolButtons(SellerOrder order, IList <HtmlString> toolButtons, OrderOperatorType operatorType) { }
/// <summary> /// 添加订单操作 /// </summary> public void AddActions( SellerOrder order, IList <HtmlString> actions, OrderOperatorType operatorType) { // 买家 var orderManager = Application.Ioc.Resolve <SellerOrderManager>(); var templateManager = Application.Ioc.Resolve <TemplateManager>(); if (operatorType == OrderOperatorType.Buyer) { // 立刻付款 var canPay = order.Check(c => c.CanPay); if (canPay.First) { actions.Add(GetLinkAction(templateManager, new T("PayNow"), orderManager.GetCheckoutUrl(order.Id), "fa fa-credit-card")); } // 取消订单 var canSetCancelled = order.Check(c => c.CanSetCancelled); if (canSetCancelled.First) { actions.Add(GetModalAction(templateManager, new T("CancelOrder"), $"/user/orders/cancel_order?serial={order.Serial}", "fa fa-exclamation-triangle", buttonClass: "btn btn-warning", dialogParameters: new { type = "type-warning", size = "size-normal" })); } // 确认收货 var canConfirm = order.Check(c => c.CanConfirm); if (canConfirm.First) { actions.Add(GetModalAction(templateManager, new T("ConfirmOrder"), $"/user/orders/confirm_order?serial={order.Serial}", "fa fa-check", buttonClass: "btn btn-success", dialogParameters: new { type = "type-success", size = "size-normal" })); } } // 管理员 if (operatorType == OrderOperatorType.Admin) { // 修改价格 var canEditCost = order.Check(c => c.CanEditCost); if (canEditCost.First) { actions.Add(GetModalAction(templateManager, new T("EditCost"), $"/admin/orders/edit_cost?id={order.Id}", "fa fa-credit-card")); } else { actions.Add(GetDisabledAction(templateManager, new T("EditCost"), canEditCost.Second, "fa fa-credit-card")); } // 修改地址 var canEditShippingAddress = order.Check(c => c.CanEditShippingAddress); if (canEditShippingAddress.First) { actions.Add(GetModalAction(templateManager, new T("EditShippingAddress"), $"/admin/orders/edit_shipping_address?id={order.Id}", "fa fa-location-arrow")); } else { actions.Add(GetDisabledAction(templateManager, new T("EditShippingAddress"), canEditShippingAddress.Second, "fa fa-location-arrow")); } // 发货 var canDeliveryGoods = order.Check(c => c.CanDeliveryGoods); if (canDeliveryGoods.First) { actions.Add(GetModalAction(templateManager, new T("DeliveryGoods"), $"/admin/orders/delivery_goods?id={order.Id}", "fa fa-truck")); } else { actions.Add(GetDisabledAction(templateManager, new T("DeliveryGoods"), canDeliveryGoods.Second, "fa fa-truck")); } // 代确认收货 var canConfirm = order.Check(c => c.CanConfirm); if (canConfirm.First) { actions.Add(GetModalAction(templateManager, new T("ConfirmInsteadOfBuyer"), $"/admin/orders/confirm_instead_of_buyer?id={order.Id}", "fa fa-check", buttonClass: "btn btn-success", dialogParameters: new { type = "type-success", size = "size-normal" })); } else { actions.Add(GetDisabledAction(templateManager, new T("ConfirmInsteadOfBuyer"), canConfirm.Second, "fa fa-check")); } // 作废 var canSetInvalid = order.Check(c => c.CanSetInvalid); if (canSetInvalid.First) { actions.Add(GetModalAction(templateManager, new T("SetInvalid"), $"/admin/orders/set_invalid?id={order.Id}", "fa fa-exclamation-triangle", buttonClass: "btn btn-danger", dialogParameters: new { type = "type-danger", size = "size-normal" })); } else { actions.Add(GetDisabledAction(templateManager, new T("SetInvalid"), canConfirm.Second, "fa fa-exclamation-triangle")); } } }
/// <summary> /// 初始化 /// </summary> public OrderEditCostForm(OrderOperatorType operatorType) { OperatorType = operatorType; }
/// <summary> /// 转换订单到显示信息 /// </summary> /// <param name="order">卖家订单</param> /// <param name="operatorType">操作人类型</param> /// <returns></returns> public static OrderDisplayInfo ToDisplayInfo(this SellerOrder order, OrderOperatorType operatorType) { var currencyManager = Application.Ioc.Resolve <CurrencyManager>(); var currency = currencyManager.GetCurrency(order.Currency); var displayInfoProviders = Application.Ioc.ResolveMany <IOrderDisplayInfoProvider>(); var info = new OrderDisplayInfo(); info.Id = order.Id; info.Serial = order.Serial; info.BuyerId = order.Buyer?.Id; info.Buyer = order.Buyer?.Username; info.SellerId = order.Owner?.Id; info.Seller = order.Owner?.Username; info.State = order.State.ToString(); info.StateDescription = new T(order.State.GetDescription()); info.StateTimes = order.StateTimes.ToDictionary( e => e.Key.ToString(), e => e.Value.ToClientTimeString()); info.OrderParameters = order.OrderParameters; info.TotalCost = order.TotalCost; info.TotalCostString = currency.Format(info.TotalCost); info.TotalCostDescription = order.TotalCostCalcResult.Parts.GetDescription(); info.TotalCostCalcResult = order.TotalCostCalcResult; info.OriginalTotalCost = order.OriginalTotalCostCalcResult.Parts.Sum(); info.OriginalTotalCostString = currency.Format(info.OriginalTotalCost); info.OriginalTotalCostDescription = order.OriginalTotalCostCalcResult.Parts.GetDescription(); info.OriginalTotalCostResult = order.OriginalTotalCostCalcResult; info.Currency = currencyManager.GetCurrency(order.Currency); info.RemarkFlags = order.RemarkFlags.ToString(); info.CreateTime = order.CreateTime.ToClientTimeString(); info.LastComment = order.OrderComments .OrderByDescending(c => c.CreateTime).FirstOrDefault()?.Contents; if (operatorType == OrderOperatorType.Admin) { info.ViewTransactionUrlFormat = "/admin/payment_transactions/edit?id={0}"; } else { info.ViewTransactionUrlFormat = ""; } if (operatorType == OrderOperatorType.Admin) { info.ViewDeliveryUrlFormat = "/admin/orders/delivery_view?id={0}"; } else if (operatorType == OrderOperatorType.Buyer) { info.ViewDeliveryUrlFormat = "/user/orders/delivery_view?id={0}"; } else if (operatorType == OrderOperatorType.Seller) { info.ViewDeliveryUrlFormat = "/seller/orders/delivery_view?id={0}"; } else { info.ViewDeliveryUrlFormat = ""; } foreach (var provider in displayInfoProviders) { provider.AddWarnings(order, info.WarningHtmls, operatorType); provider.AddToolButtons(order, info.ToolButtonHtmls, operatorType); provider.AddSubjects(order, info.SubjectHtmls, operatorType); provider.AddActions(order, info.ActionHtmls, operatorType); } info.OrderProducts = order.OrderProducts.Select(p => p.ToDisplayInfo()).ToList(); return(info); }