private SOCreateRequestInfo Convert2ContractInfo(OrderImportRowData item) { SOCreateRequestInfo contractInfo = new SOCreateRequestInfo(); contractInfo.MerchantOrderID = item.MerchantOrderID.Value; contractInfo.ServerType = item.ServerType.ExtractValue; contractInfo.WarehouseID = int.Parse(item.WarehouseID.Value); contractInfo.ArteryLogisticID = int.Parse(item.ArteryLogisticID.Value); contractInfo.IsMerchantSelfFEP = int.Parse(item.IsMerchantSelfFEP.Value); contractInfo.PayInfo = new SOPayInfo(); contractInfo.PayInfo.ProductAmount = decimal.Parse(item.ProductAmount.Value); contractInfo.PayInfo.ShippingAmount = decimal.Parse(item.ShippingAmount.Value); contractInfo.PayInfo.TaxAmount = 0; contractInfo.PayInfo.CommissionAmount = 0; contractInfo.PayInfo.PayTypeSysNo = int.Parse(item.PayTypeID.ExtractValue); contractInfo.PayInfo.PaySerialNumber = item.PaySerialNumber.Value; contractInfo.ShippingInfo = new SOShippingInfo(); contractInfo.ShippingInfo.ReceiveName = item.ReceiveName.Value; contractInfo.ShippingInfo.ReceivePhone = item.ReceiveCellPhone.Value; contractInfo.ShippingInfo.ReceiveAddress = item.ReceiveAddress.Value; contractInfo.ShippingInfo.ReceiveAreaName = item.ReceiveAreaName.Value.Substring(0, item.ReceiveAreaName.Value.LastIndexOf('[')); contractInfo.ShippingInfo.ReceiveAreaCode = item.ReceiveAreaName.ExtractValue.Substring(item.ReceiveAreaName.ExtractValue.LastIndexOf(',') + 1); contractInfo.ShippingInfo.ReceiveZip = item.ReceiveZip.Value; contractInfo.ShippingInfo.ShipTypeID = int.Parse(item.ShipTypeID.Value); contractInfo.AuthenticationInfo = new SOAuthenticationInfo(); contractInfo.AuthenticationInfo.Name = item.AuthName.Value; contractInfo.AuthenticationInfo.IDCardType = 0; contractInfo.AuthenticationInfo.IDCardNumber = item.IDCardNumber.Value; contractInfo.AuthenticationInfo.PhoneNumber = item.AuthCellPhone.Value; contractInfo.AuthenticationInfo.Email = item.AuthEmail.Value; contractInfo.ItemList = new List <SOItemInfo>(); string[] productIDs = item.ProductIDs.Value.Split(new char[] { ',', ',' }, StringSplitOptions.RemoveEmptyEntries); string[] productQtys = item.ProductQtys.Value.Split(new char[] { ',', ',' }, StringSplitOptions.RemoveEmptyEntries); string[] productPrices = item.ProductPrices.Value.Split(new char[] { ',', ',' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < productIDs.Length; i++) { contractInfo.ItemList.Add(new SOItemInfo() { ProductID = productIDs[i], Quantity = int.Parse(productQtys[i]), SalePrice = decimal.Parse(productPrices[i]), TaxPrice = 0 }); } return(contractInfo); }
public void Import(string templateFilePath) { ConfigData configData = ConfigDataProcessor.GetConfigData(); if (configData == null) { throw new BusinessException("配置不存在,请先保存基础配置"); } if (!File.Exists(templateFilePath)) { throw new BusinessException("文件\"{0}\"不存在", templateFilePath); } string ext = Path.GetExtension(templateFilePath); if (string.Compare(ext, ".xlsx", true) != 0) { throw new BusinessException("订单模板文件格式错误"); } List <OrderImportRowData> docData = ReadDocumentToList(templateFilePath); OnOrderImportFileReadComplate(this, docData == null ? 0 : docData.Count); if (docData == null || docData.Count <= 0) { return; } string frequencyCfg = ConfigurationManager.AppSettings["order.socreate.frequency"]; double frequencyValue; TimeSpan frequency = TimeSpan.FromSeconds(0); if (!string.IsNullOrWhiteSpace(frequencyCfg) && double.TryParse(frequencyCfg, out frequencyValue)) { frequency = TimeSpan.FromSeconds(frequencyValue); } int millisecondsDelay = (int)frequency.TotalMilliseconds; string errorMsg = null; foreach (var item in docData) { if (!ValidateData(item, out errorMsg)) { OnOrderImportComplate(this, new OrderCreateResponseResult() { Code = -1, Data = new OrderCreateResponseData() { MerchantOrderID = item.MerchantOrderID.Value }, Desc = errorMsg }); } else { SOCreateRequestInfo contractInfo = Convert2ContractInfo(item); contractInfo.SaleChannelSysNo = configData.SaleChannelSysNo; ImportOrder(contractInfo, configData); } Thread.Sleep(millisecondsDelay); } }
private void ImportOrder(SOCreateRequestInfo contractInfo, ConfigData configData) { OrderCreateResponseResult result = new OrderCreateResponseResult() { Data = new OrderCreateResponseData() { MerchantOrderID = contractInfo.MerchantOrderID } }; var parameters = new NameValueCollection(); parameters.Add("method", "Order.SOCreate"); parameters.Add("data", JsonSerializer.Serialize(contractInfo)); parameters.Add("format", "json"); parameters.Add("version", "1.0"); parameters.Add("nonce", new Random().NextDouble().ToString()); parameters.Add("appid", configData.AppId); parameters.Add("timestamp", DateTime.Now.ToString("yyyyMMddhhmmss")); string sign = SignatureUtil.Build(parameters, configData.SecretKey); StringBuilder httpContentStringBuilder = new StringBuilder(); foreach (string key in parameters.AllKeys) { httpContentStringBuilder.AppendFormat("&{0}={1}", key, SignatureUtil.UrlEncode(parameters[key])); } httpContentStringBuilder.AppendFormat("&{0}={1}", "sign", sign); var content = httpContentStringBuilder.ToString().TrimStart('&'); WebRequest request = WebRequest.Create(configData.OpenApiUrl); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; using (Stream requestStream = request.GetRequestStream()) { byte[] postData = Encoding.UTF8.GetBytes(content); requestStream.Write(postData, 0, postData.Length); } try { string responseData = ""; WebResponse response = request.GetResponse(); using (Stream responseStream = response.GetResponseStream()) { using (StreamReader reader = new StreamReader(responseStream)) { responseData = reader.ReadToEnd(); } } result = JsonSerializer.Deserialize <OrderCreateResponseResult>(responseData); if (result.Data == null) { result.Data = new OrderCreateResponseData() { MerchantOrderID = contractInfo.MerchantOrderID }; } } catch (AggregateException aex) { result.Code = -10; var egex = (AggregateException)aex; Exception innerExp = null; if (egex.InnerExceptions != null && egex.InnerExceptions.Count > 0) { innerExp = egex.InnerExceptions[0]; } if (innerExp == null) { result.Desc = egex.Message; } else { Exception tempExp; GetInnerException(innerExp, out tempExp); if (tempExp != null) { result.Desc = tempExp.Message; } else { result.Desc = innerExp.Message; } } } catch (Exception ex) { result.Code = -10; result.Desc = ex.Message; } OnOrderImportComplate(this, result); }