| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635 |
- //----------------------------------------------------------------
- //Module Name: GoodsService
- //Purpose:
- //CopyRight: Muchinfo
- //History:
- //----------------------------------------------------------------
- //DateTime Author Description
- //----------------------------------------------------------------
- //2014-03-22 deng.yinping Create
- //----------------------------------------------------------------
- using Muchinfo.MTPClient.Data;
- using Muchinfo.MTPClient.Data.DTO;
- using Muchinfo.MTPClient.Data.Enums;
- using Muchinfo.MTPClient.Data.Model;
- using Muchinfo.MTPClient.Data.Model.GoodRules;
- using Muchinfo.MTPClient.Infrastructure.Cache;
- using Muchinfo.MTPClient.Infrastructure.Utilities;
- using Muchinfo.MTPClient.IService;
- using Muchinfo.MTPClient.Resources;
- using Muchinfo.MTPClient.Service.Utilities;
- using Muchinfo.PC.Common.Extensions;
- using System;
- using System.Collections.Generic;
- using System.Collections.ObjectModel;
- using System.Linq;
- namespace Muchinfo.MTPClient.Service
- {
- public class GoodsService : IGoodsService
- {
- #region IGoodsService
- /// <summary>
- /// 获取交易所列表
- /// </summary>
- /// <returns>Dictionary{System.StringSystem.String}.</returns>
- /// <exception cref="System.NotImplementedException"></exception>
- public Dictionary<int, string> GetExchanges()
- {
- //todo:
- throw new NotImplementedException();
- }
- /// <summary>
- /// 生成交易所商品树
- /// </summary>
- /// <returns>ObservableCollection{TreeViewEntity}.</returns>
- /// <exception cref="System.NotImplementedException"></exception>
- public ObservableCollection<TreeViewEntity> GetExchangeTree()
- {
- //todo:
- throw new NotImplementedException();
- }
- /// <summary>
- /// 获取商品信息By商品代码
- /// </summary>
- /// <param name="goodsCodeList">The goods code list.</param>
- /// <returns>ObservableCollection{QuoteGoods}.</returns>
- public ObservableCollection<QuoteGoods> GetQuoteGoodsByCodes(List<string> goodsCodeList)
- {
- var cacheGoodsList = CacheManager.CacheGoodsBaseInfos;
- if (cacheGoodsList == null || !cacheGoodsList.Any()) return null;
- var result = new List<QuoteGoods>();
- //循环取以保持顺序
- foreach (var goodsCode in goodsCodeList)
- {
- var goods = cacheGoodsList.FirstOrDefault(z => z.GoodsCode == goodsCode);
- if (goods == null) continue;
- result.Add(goods);
- }
- return ConvertToQuoteGoodses(result);
- }
- /// <summary>
- /// 获取命令行商品
- /// </summary>
- /// <param name="commandType">Type of the command.</param>
- /// <param name="additionalInfo">The additional info.</param>
- /// <returns>IEnumerable{QuoteGoods}.</returns>
- public ObservableCollection<QuoteGoods> GetGoodsInfoList(MenuCommandType commandType, string additionalInfo)
- {
- var favoriteService = new FavoriteService();
- switch (commandType)
- {
- case MenuCommandType.SelectedGoodses:
- uint id;
- if (uint.TryParse(additionalInfo, out id))
- {
- return favoriteService.GetMyFavoriteGoodses(id);
- }
- return null;
- case MenuCommandType.CustomQuote:
- case MenuCommandType.BidQuote:
- return GetGoodsInfoList(additionalInfo);
- default:
- return null;
- }
- }
- ///// <summary>
- ///// 更新商品盘面信息
- ///// </summary>
- ///// <param name="goodsList">The goods list.</param>
- //public void UpdateFromDayQuote(List<QuoteGoods> goodsList)
- //{
- // if (goodsList == null || !goodsList.Any()) return;
- // var symbols = goodsList.Select((goods) => goods.Symbol).ToList();
- // if (!symbols.Any()) return;
- // var link = LinkManager.Instance.QuoteTcpLinkProxy;
- // link.QueryDayQuote(goodsList);
- //}
- public ObservableCollection<QuoteGoods> GetAllGoods()
- {
- var cacheGoodsList = CacheManager.CacheGoodsBaseInfos;
- if (cacheGoodsList == null) return null;
- var result = cacheGoodsList as IList<QuoteGoods>;
- if (!result.Any()) return null;
- return result.ToObservableCollection();
- }
- /// <summary>
- /// 更新的昨日结算价
- /// </summary>
- /// <param name="goodses">商品</param>
- /// <param name="account">账号</param>
- /// <exception cref="System.NotImplementedException"></exception>
- public void UpdateLastReckonPrice(List<QuoteGoods> goodses, MTPClient.Data.Model.Account.TradeAccount account)
- {
- //todo:
- throw new NotImplementedException();
- }
- /// <summary>
- /// 更新的交收价
- /// </summary>
- /// <param name="goodses">商品</param>
- /// <param name="account">账号</param>
- /// <exception cref="System.NotImplementedException"></exception>
- public void UpdateDeliveryPrice(List<QuoteGoods> goodses, MTPClient.Data.Model.Account.TradeAccount account)
- {
- //todo:
- throw new NotImplementedException();
- }
- /// <summary>
- /// Queries the parameter rule.
- /// </summary>
- /// <param name="contRightCode">The cont right code.</param>
- /// <param name="goodsCode">The goods code.</param>
- /// <param name="isBidMarket">if set to <c>true</c> [is bid market].</param>
- /// <param name="loginCode">The login code.</param>
- /// <returns>List{ParameterRule}.</returns>
- /// <exception cref="System.NotImplementedException"></exception>
- public List<ParameterRule> QueryParameterRule(int contRightCode, string goodsCode, bool isBidMarket, string loginCode)
- {
- //todo:
- throw new NotImplementedException();
- }
- /// <summary>
- /// 商品开市
- /// </summary>
- /// <param name="goodsCodes">商品代码</param>
- /// <exception cref="System.NotImplementedException"></exception>
- public void MarketOpenUpdateDayQuote(string[] goodsCodes)
- {
- //todo:
- throw new NotImplementedException();
- }
- #endregion
- #region Private Methods
- /// <summary>
- /// 获取交易所,市场商品
- /// </summary>
- /// <param name="marketIdString">The market identifier string.</param>
- /// <returns>ObservableCollection{QuoteGoods}.</returns>
- private ObservableCollection<QuoteGoods> GetGoodsInfoList(string marketIdString)
- {
- if (string.IsNullOrWhiteSpace(marketIdString)) return null;
- int marketId = 0;
- int.TryParse(marketIdString, out marketId);
- var cacheGoodsList = CacheManager.CacheGoodsBaseInfos;
- if (cacheGoodsList == null) return null;
- var filterList = cacheGoodsList.Where(z => z.GoodsParameters.SortId == marketId);
- return ConvertToQuoteGoodses(filterList);
- }
- /// <summary>
- /// Converts to quote goodses.
- /// </summary>
- /// <param name="goodsList">The goods list.</param>
- /// <returns>ObservableCollection{QuoteGoods}.</returns>
- private ObservableCollection<QuoteGoods> ConvertToQuoteGoodses(IEnumerable<QuoteGoods> goodsList)
- {
- var dataModels = goodsList as IList<QuoteGoods> ?? goodsList.ToList();
- if (!dataModels.Any()) return null;
- var result = new ObservableCollection<QuoteGoods>();
- var showIndex = 1;
- foreach (var dataModel in dataModels)
- {
- dataModel.ShowIndex = showIndex++;
- result.Add(dataModel);
- }
- return result;
- }
- #endregion
- /// <summary>
- /// 根据symbol获取商品
- /// </summary>
- /// <param name="symbol">The symbol.</param>
- /// <returns>QuoteGoods.</returns>
- public QuoteGoods GetQuoteGoodsBySymbol(string symbol)
- {
- if (string.IsNullOrWhiteSpace(symbol)) return null;
- return CacheManager.CacheGoodsBaseInfos.FirstOrDefault(z => z.Symbol == symbol);
- }
- /// <summary>
- /// 获取商品DTO对象集合
- /// </summary>
- /// <param name="commandType">Type of the command.</param>
- /// <param name="goodsGroup">The goods group.</param>
- /// <returns>IEnumerable{QuoteGoods}.</returns>
- public ObservableCollection<QuoteGoodsDTO> GetQuoteGoodsDTOList(MenuCommandType commandType, MarketsInfoModel goodsGroup)
- {
- if (goodsGroup == null) return null;
- var cacheGoodsList = CacheManager.CacheGoodsBaseInfos;
- if (cacheGoodsList == null) return null;
- var filterList = new List<QuoteGoods>();
- if (goodsGroup.TradeMode == eTradeMode.AllGoods || goodsGroup.TradeMode == eTradeMode.QuotePAndX)
- {
- filterList = SortByAllGoodses();
- }
- else
- {
- //filterList = cacheGoodsList.Where(z => z != null && z.MarketID == goodsGroup.MarketID).OrderBy(p => p.GoodsCode).ToList();
- //MTP2.0 资管使用外部交易所做为分组标签
- filterList = GetGoodsListByExExchangeId(goodsGroup.MarketID);
- }
- var quoteGoodses = filterList as IList<QuoteGoods> ?? filterList.ToList();
- if (!quoteGoodses.Any()) return null;
- var showIndex = 1;
- var result = new ObservableCollection<QuoteGoodsDTO>();
- foreach (var quoteGoods in quoteGoodses)
- {
- if (quoteGoods == null) continue;
- quoteGoods.ShowIndex = showIndex++;
-
- ////取交易参数中的最小建仓数量
- var minLot = GetGoodsParamerRule((int)quoteGoods.GoodsId, goodsGroup.TradeMode,
- GoodsTradeConts.MINOPENTRADEQTY);
- var dto = new QuoteGoodsDTO(quoteGoods);
- if (minLot != null)
- {
- dto.MinOpenNumber = minLot.FeeValue;
- dto.Lot = ApplicationParameter.DefaultOrderLot; ////默认下单数量
- }
- else
- {
- dto.MinOpenNumber = 1;
- dto.Lot = 1;
- }
- if (ApplicationParameter.DefaultOrderLot == 0)
- {
- if (minLot != null)
- dto.Lot = minLot.FeeValue; ;
- }
- else
- {
- dto.Lot = ApplicationParameter.DefaultOrderLot; ////默认下单数量
- }
- dto.AgreeUnitDisplay = quoteGoods.AgreeUnit + quoteGoods.GoodsUnit; ///合约单位
- result.Add(dto);
- }
- ////P+X标签显示方式
- if (goodsGroup.IsDeliveryMode)
- {
- return ToPAndXList(result);
- }
- return result;
- }
- /// <summary>
- /// 根据外部交易所ID获取商品列表
- /// </summary>
- /// <param name="exExchangeId">The ex exchange identifier.</param>
- /// <returns>List{QuoteGoods}.</returns>
- public List<QuoteGoods> GetGoodsListByExExchangeId(uint exExchangeId)
- {
- //MTP2.0 资管使用外部交易所做为分组标签
- var cacheGoodsList = CacheManager.CacheGoodsBaseInfos;
- if (cacheGoodsList == null) return null;
- var cacheGoodsGroupsList = CacheManager.CacheGoodsGroups;
- if (cacheGoodsGroupsList != null)
- {
- var tmp = cacheGoodsGroupsList.Where(z => z.ExChangeId == exExchangeId);
- if (tmp != null)
- {
- var groupIds = tmp.Select(z => z.GoodsGroupid).ToList();
- return cacheGoodsList.Where(z => groupIds.Contains(z.GroupID)).OrderBy(p => p.GoodsCode).ToList();
- }
- }
- return null;
- }
- /// <summary>
- /// 所有商品的排序
- /// </summary>
- /// <returns></returns>
- private List<QuoteGoods> SortByAllGoodses()
- {
- var cacheGoodsList = CacheManager.CacheGoodsBaseInfos;
- // var filterList = cacheGoodsList.Where(z => z != null && z.GoodsParameters.TradeMode != eTradeMode.TRADEMODE_SALE).ToList();
- List<QuoteGoods> allGoodses=new List<QuoteGoods>();
- if (CacheManager.CacheAvailableMarketList != null)
- {
- foreach (var marketId in CacheManager.CacheAvailableMarketList)
- {
- var goodsList = cacheGoodsList.Where(z => z != null && z.MarketID == marketId).ToList();
- allGoodses.AddRange(goodsList);
- }
- }
- allGoodses = allGoodses.OrderBy(p => p.GoodsCode).ToList();
- return allGoodses;
- }
- /// <summary>
- /// P+X标签显示方式
- /// </summary>
- /// <param name="origianlList">The origianl list.</param>
- /// <returns>ObservableCollection{QuoteGoodsDTO}.</returns>
- private ObservableCollection<QuoteGoodsDTO> ToPAndXList(ObservableCollection<QuoteGoodsDTO> origianlList)
- {
- ////P与X的关系为1:N, P为关联商品,X为交易商品,以P为主显示可以避免P出现多次。
- var list = new ObservableCollection<QuoteGoodsDTO>();
- var index = 1;
- var pIdList = CacheManager.AllDeliveryRelationList.Where(z => z.RelationMode == eDeliveryContractLink.PAndX).Select(z => z.RelationGoodsId).Distinct();
- foreach (var pId in pIdList)
- {
- if (pId <= 0) continue;
- var pGoods = origianlList.FirstOrDefault(z => z.GoodsId == pId);
- if (pGoods == null) continue;
- pGoods.ShowIndex = index++;
- pGoods.IsMain = true;
- list.Add(pGoods);
- var xIdList = CacheManager.AllDeliveryRelationList.Where(z => z.RelationMode == eDeliveryContractLink.PAndX && z.RelationGoodsId == pId).Select(z => z.GoodsId).Distinct();
- foreach (var xId in xIdList)
- {
- if (xId <= 0) continue;
- var xGoods = origianlList.FirstOrDefault(z => z.GoodsId == xId);
- if (xGoods == null) continue;
- xGoods.ShowIndex = null;
- xGoods.IsMain = false;
- list.Add(xGoods);
- }
- }
- return list;
- }
- public Data.Model.GoodRules.GoodsFeeType GetGoodsParamerRule(int goodsId, eTradeMode tradeMode, GoodsTradeConts ruletype)
- {
- int ruleId = 1;
- switch (ruletype)
- {
- #region 单笔最小建仓数量
- case GoodsTradeConts.MINOPENTRADEQTY:
- ruleId = (int)eTradeRule.TRADERULE_SINGLEMINOPENQTY;
- break;
- #endregion
- #region 单笔最大建仓数量
- case GoodsTradeConts.MAXOPENTRADEQTY: ///单笔最大建仓数量
- ruleId = (int)eTradeRule.TRADERULE_SINGLEMAXOPENQTY;
- break;
- #endregion
- #region 允许最大偏移点差
- case GoodsTradeConts.AllowPips: ///允许最大偏移点差
- ruleId = (int)eTradeRule.TRADERULE_MAXOFFSETRANGE;
- break;
- #endregion
- #region 单笔最小交割数量
- case GoodsTradeConts.MinDeliveryQty:
- ruleId = (int)eTradeRule.TRADERULE_SINGLEMINDELIVERYQTY;
- break;
- #endregion
- #region 单笔最大交割数量
- case GoodsTradeConts.MaxDeliveryQty:
- ruleId = (int)eTradeRule.TRADERULE_SINGLEMAXDELIVERYQTY;
- break;
- #endregion
- #region 最大买持仓量
- case GoodsTradeConts.MaxTotalBuyHolderQty:
- ruleId = (int)eTradeRule.TRADERULE_MAXBUYHOLDERQTY;
- break;
- #endregion
- #region 最大卖持仓量
- case GoodsTradeConts.MaxTotalSellHolderQty:
- ruleId = (int)eTradeRule.TRADERULE_MAXSELLHOLDERQTY;
- break;
- #endregion
- #region 手续费交易规则
- case GoodsTradeConts.TradeChargeRule:
- ruleId = (int)eTradeRule.TRADERULE_TRADECHARGERULE;
- break;
- #endregion
- }
- return CacheManager.GetTradeRule(goodsId, ruleId);
- }
- //public eTradeFee GetTradeFee(eTradeMode tradeMode)
- //{
- // eTradeFee tradeFeeType = 0;
- // switch (tradeMode)
- // {
- // case eTradeMode.TRADEMODE_MARKETMAKE:
- // tradeFeeType = eTradeFee.TRADECOST_MOPENTRADEMARGIN;
- // break;
- // case eTradeMode.TRADEMODE_BIDDING:
- // tradeFeeType = eTradeFee.TRADECOST_BOPENTRADEMARGIN;
- // break;
- // case eTradeMode.TRADEMODE_BIDDINGMARKETMAKE:
- // tradeFeeType = eTradeFee.TRADECOST_XOPENTRADEMARGIN;
- // break;
- // }
- // return tradeFeeType;
- //}
- /// <summary>
- /// 获取指定【交易模式】和【交易费用类型】的费用
- /// </summary>
- /// <param name="tradeMode"></param>
- /// <param name="feeType"></param>
- /// <returns></returns>
- public eTradeFee GetTradeFee(eTradeMode tradeMode, eTradeFeeType feeType)
- {
- eTradeFee tradeFeeType = 0;
- switch (feeType)
- {
- //#region 建仓保证金
- ////建仓保证金
- //case eTradeFeeType.TRADECOST_OPENTRADEMARGIN:
- // switch (tradeMode)
- // {
- // case eTradeMode.TRADEMODE_MARKETMAKE:
- // tradeFeeType = eTradeFee.TRADECOST_MOPENTRADEMARGIN;
- // break;
- // case eTradeMode.TRADEMODE_BIDDING:
- // tradeFeeType = eTradeFee.TRADECOST_BOPENTRADEMARGIN;
- // break;
- // case eTradeMode.TRADEMODE_BIDDINGMARKETMAKE:
- // tradeFeeType = eTradeFee.TRADECOST_XOPENTRADEMARGIN;
- // break;
- // case eTradeMode.TRADEMODE_SALE:
- // tradeFeeType = eTradeFee.TRADECOST_IOPENTRADEMARGIN;
- // break;
- // }
- // break;
- //#endregion
- //#region 买建仓手续费
- ////买建仓手续费
- //case eTradeFeeType.TRADECOST_BUYOPENTRADECHARGE:
- // switch (tradeMode)
- // {
- // case eTradeMode.TRADEMODE_MARKETMAKE:
- // tradeFeeType = eTradeFee.TRADECOST_MBUYOPENTRADECHARGE;
- // break;
- // case eTradeMode.TRADEMODE_BIDDING:
- // tradeFeeType = eTradeFee.TRADECOST_BBUYOPENTRADECHARGE;
- // break;
- // case eTradeMode.TRADEMODE_BIDDINGMARKETMAKE:
- // tradeFeeType = eTradeFee.TRADECOST_XBUYOPENTRADECHARGE;
- // break;
- // case eTradeMode.TRADEMODE_SALE:
- // tradeFeeType = eTradeFee.TRADECOST_ISSUESUBSCRIBECHARGESET;
- // break;
- // }
- // break;
- //#endregion
- //#region 卖建仓手续费
- ////卖建仓手续费
- //case eTradeFeeType.TRADECOST_SELLOPENTRADECHARGE:
- // switch (tradeMode)
- // {
- // case eTradeMode.TRADEMODE_MARKETMAKE:
- // tradeFeeType = eTradeFee.TRADECOST_MSELLOPENTRADECHARGE;
- // break;
- // case eTradeMode.TRADEMODE_BIDDING:
- // tradeFeeType = eTradeFee.TRADECOST_BSELLOPENTRADECHARGE;
- // break;
- // case eTradeMode.TRADEMODE_BIDDINGMARKETMAKE:
- // tradeFeeType = eTradeFee.TRADECOST_XSELLOPENTRADECHARGE;
- // break;
- // case eTradeMode.TRADEMODE_SALE:
- // tradeFeeType = eTradeFee.TRADECOST_ISSUESUBSCRIBECHARGESET;
- // break;
- // }
- // break;
- //#endregion
- }
- return tradeFeeType;
- }
- /// <summary>
- /// 转换商品类型
- /// </summary>
- /// <param name="goodses">交易商品</param>
- /// <returns></returns>
- public ObservableCollection<QuoteGoodsDTO> ConvertGoodsDtos(List<QuoteGoods> goodses)
- {
- var result = new ObservableCollection<QuoteGoodsDTO>();
- var quoteGoodses = goodses as IList<QuoteGoods> ?? goodses.ToList();
- if (!quoteGoodses.Any()) return result;
- var showIndex = 1;
- foreach (var quoteGoods in quoteGoodses)
- {
- if (quoteGoods == null) continue;
- quoteGoods.ShowIndex = showIndex++;
- ////取交易参数中的最小建仓数量
- var minLot = GetGoodsParamerRule((int)quoteGoods.GoodsId, quoteGoods.TradeMode,GoodsTradeConts.MINOPENTRADEQTY);
- var dto = new QuoteGoodsDTO(quoteGoods);
- if (minLot != null)
- {
- dto.MinOpenNumber = minLot.FeeValue;
- }
- else if (ApplicationParameter.DefaultOrderLot > 0)
- {
- dto.MinOpenNumber = ApplicationParameter.DefaultOrderLot;
- }
- else
- {
- dto.MinOpenNumber = 1;
- }
- dto.Lot = dto.MinOpenNumber;
- dto.DeliveryGoodsName = quoteGoods.DeliveryGoodsName; ////交割商品
- dto.AgreeUnitDisplay = quoteGoods.AgreeUnitDisplay; ///合约单位
- result.Add(dto);
- }
- return result;
- }
- public void QueryMarketReckonInfo(int MarkerTypeID, Action<List<MarketReckon>> successAction, Action<ErrorEntity> errorAction)
- {
- List<QueryCommonParam> queryCommonParams = new List<QueryCommonParam>();
- queryCommonParams.Add(new QueryCommonParam() { ParamKey = "markettypeid", ParamValue = MarkerTypeID + string.Empty });
- QueryCommonHelper.QueryCommon(QueryStatement.QueryMarketReckon, queryCommonParams, new Action<List<MarketReckon>>((marketReckons) =>
- {
- if (successAction != null)
- {
- successAction(marketReckons);
- }
- }), (error) =>
- {
- if (errorAction != null)
- {
- //RequestFunc = string.Format("查询结算信息({0})"
- error.RequestFunc = string.Format(Client_Resource.Resources_Service_QueryMarketReckonInfo, MarkerTypeID);
- errorAction(error);
- }
- });
- }
- /// <summary>
- /// 委托预埋单数量查询
- /// </summary>
- /// <param name="AccountId"></param>
- /// <param name="successAction"></param>
- /// <param name="errorAction"></param>
- public void QueryPrePostDetailQty(ulong AccountId, Action<List<PreOrderParameter>> successAction, Action<ErrorEntity> errorAction)
- {
- var queryCommonParams = new List<QueryCommonParam>();
- queryCommonParams.Add(new QueryCommonParam() { ParamKey = "accountId", ParamValue = AccountId + string.Empty });
- QueryCommonHelper.QueryCommon(QueryStatement.SearchPrePostDetailQty, queryCommonParams,
- new Action<List<PreOrderParameter>>((orderDetails) =>
- {
- if (successAction != null)
- {
- successAction(orderDetails);
- }
- }), (error) =>
- {
- if (errorAction != null)
- {
- //RequestFunc = 委托单参数查询
- error.RequestFunc = Client_Resource.Resources_Service_QueryPreOrderParameter;
- errorAction(error);
- }
- });
- }
- }
- }
|