Browse Source

Merge branch '1688purchase'

qianyi
shanji 3 years ago
parent
commit
a962fd77a8
  1. 39
      BBWY.1688SDK/APIFacade.cs
  2. 43
      BBWY.1688SDK/APIId.cs
  3. 16
      BBWY.1688SDK/BBWY.1688SDK.csproj
  4. 23
      BBWY.1688SDK/GatewayAPIRequest.cs
  5. 14
      BBWY.1688SDK/GatewayAPIResponse.cs
  6. 66
      BBWY.1688SDK/Request.cs
  7. 56
      BBWY.1688SDK/Response.cs
  8. 117
      BBWY.1688SDK/SyncAPIClient.cs
  9. 159
      BBWY.1688SDK/entity/AuthorizationToken.cs
  10. 35
      BBWY.1688SDK/entity/ErrorExceptionDesc.cs
  11. 49
      BBWY.1688SDK/entity/OrderPreview/CreateOrderPreview.cs
  12. 28
      BBWY.1688SDK/entity/ResponseStatus.cs
  13. 40
      BBWY.1688SDK/entity/ResponseWrapper.cs
  14. 88
      BBWY.1688SDK/example/ExampleFacade.cs
  15. 160
      BBWY.1688SDK/example/param/apiexample/ExampleCar.cs
  16. 144
      BBWY.1688SDK/example/param/apiexample/ExampleFamily.cs
  17. 41
      BBWY.1688SDK/example/param/apiexample/ExampleFamilyGetParam.cs
  18. 37
      BBWY.1688SDK/example/param/apiexample/ExampleFamilyGetResult.cs
  19. 81
      BBWY.1688SDK/example/param/apiexample/ExampleFamilyPostParam.cs
  20. 56
      BBWY.1688SDK/example/param/apiexample/ExampleFamilyPostResult.cs
  21. 102
      BBWY.1688SDK/example/param/apiexample/ExampleHouse.cs
  22. 99
      BBWY.1688SDK/example/param/apiexample/ExamplePerson.cs
  23. 58
      BBWY.1688SDK/exception/OceanException.cs
  24. 243
      BBWY.1688SDK/http/HttpClient.cs
  25. 70
      BBWY.1688SDK/policy/ClientPolicy.cs
  26. 17
      BBWY.1688SDK/policy/GrantType.cs
  27. 26
      BBWY.1688SDK/policy/Protocol.cs
  28. 113
      BBWY.1688SDK/policy/RequestPolicy.cs
  29. 36
      BBWY.1688SDK/primitive/NullableBool.cs
  30. 36
      BBWY.1688SDK/primitive/NullableByte.cs
  31. 36
      BBWY.1688SDK/primitive/NullableChar.cs
  32. 36
      BBWY.1688SDK/primitive/NullableDateTime.cs
  33. 36
      BBWY.1688SDK/primitive/NullableDouble.cs
  34. 36
      BBWY.1688SDK/primitive/NullableFloat.cs
  35. 36
      BBWY.1688SDK/primitive/NullableInt.cs
  36. 36
      BBWY.1688SDK/primitive/NullableLong.cs
  37. 12
      BBWY.1688SDK/primitive/NullablePrimitiveObject.cs
  38. 21
      BBWY.1688SDK/serialize/DeSerializer.cs
  39. 56
      BBWY.1688SDK/serialize/Json2Deserializer.cs
  40. 137
      BBWY.1688SDK/serialize/Param2RequestSerializer.cs
  41. 18
      BBWY.1688SDK/serialize/Serializer.cs
  42. 60
      BBWY.1688SDK/serialize/SerializerProvider.cs
  43. 66
      BBWY.1688SDK/util/DateUtil.cs
  44. 74
      BBWY.1688SDK/util/SignatureUtil.cs
  45. 2
      BBWY.Client/APIServices/OrderService.cs
  46. 79
      BBWY.Client/APIServices/PurchaseOrderService.cs
  47. 1
      BBWY.Client/App.xaml
  48. 21
      BBWY.Client/Converters/EnumToBooleanConverter.cs
  49. 5
      BBWY.Client/Models/APIModel/Response/Order/OrderResponse.cs
  50. 9
      BBWY.Client/Models/APIModel/Response/PurchaseOrder/OnlinePurchase/OrderTradeTypeResponse.cs
  51. 25
      BBWY.Client/Models/APIModel/Response/PurchaseOrder/OnlinePurchase/PreviewOrderResponse.cs
  52. 0
      BBWY.Client/Models/APIModel/Response/PurchaseOrder/PurchaseOrderResponse.cs
  53. 22
      BBWY.Client/Models/APIModel/Response/Shop/ShopResponse.cs
  54. 9
      BBWY.Client/Models/Enums.cs
  55. 8
      BBWY.Client/Models/MappingProfile.cs
  56. 5
      BBWY.Client/Models/Order/Order.cs
  57. 19
      BBWY.Client/Models/Order/RelationPurchaseOrderSku.cs
  58. 11
      BBWY.Client/Models/Shop/Shop.cs
  59. 25
      BBWY.Client/ViewModels/Order/ChoosePurchaseSchemeViewModel.cs
  60. 39
      BBWY.Client/ViewModels/Order/OrderListViewModel.cs
  61. 165
      BBWY.Client/ViewModels/Purchase/1688PreviewPurchaseViewModel.cs
  62. 7
      BBWY.Client/ViewModels/Ware/BindingPurchaseProductViewModel.cs
  63. 13
      BBWY.Client/Views/Order/ChoosePurchaseScheme.xaml.cs
  64. 2
      BBWY.Client/Views/Order/OrderList.xaml
  65. 2
      BBWY.Client/Views/Order/RelationPurchaseOrder.xaml
  66. 43
      BBWY.Client/Views/Purchase/1688Purchase.xaml
  67. 17
      BBWY.Client/Views/Purchase/1688Purchase.xaml.cs
  68. 10
      BBWY.Server.API/Controllers/OrderController.cs
  69. 13
      BBWY.Server.API/Controllers/PlatformSDKController.cs
  70. 26
      BBWY.Server.API/Controllers/PurchaseOrderController.cs
  71. 1
      BBWY.Server.API/Startup.cs
  72. 7
      BBWY.Server.Business/BBWY.Server.Business.csproj
  73. 79
      BBWY.Server.Business/Order/OrderBusiness.cs
  74. 18
      BBWY.Server.Business/PlatformSDK/JDBusiness.cs
  75. 7
      BBWY.Server.Business/PlatformSDK/PDDBusiness.cs
  76. 20
      BBWY.Server.Business/PlatformSDK/PlatformSDKBusiness.cs
  77. 7
      BBWY.Server.Business/PlatformSDK/TaoBaoBusiness.cs
  78. 212
      BBWY.Server.Business/PlatformSDK/_1688Business.cs
  79. 132
      BBWY.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs
  80. 9
      BBWY.Server.Business/PurchaseScheme/PurchaseSchemeBusiness.cs
  81. 4
      BBWY.Server.Business/Statistics/StatisticsBusiness.cs
  82. 2
      BBWY.Server.Business/Vender/VenderBusiness.cs
  83. 3
      BBWY.Server.Model/Db/Order/Order.cs
  84. 6
      BBWY.Server.Model/Db/Order/OrderDropShipping.cs
  85. 28
      BBWY.Server.Model/Db/Order/OrderSyncTask.cs
  86. 3
      BBWY.Server.Model/Db/PurchaseOrder/PurchaseOrder.cs
  87. 13
      BBWY.Server.Model/Dto/Request/Order/SyncOrderByDateRequest.cs
  88. 14
      BBWY.Server.Model/Dto/Request/PurchaseOrder/OnlinePurchase/CargoParamRequest.cs
  89. 43
      BBWY.Server.Model/Dto/Request/PurchaseOrder/OnlinePurchase/ConsigneeRequest.cs
  90. 32
      BBWY.Server.Model/Dto/Request/PurchaseOrder/OnlinePurchase/CreateOnlinePurchaseOrderRequest.cs
  91. 17
      BBWY.Server.Model/Dto/Request/PurchaseOrder/OnlinePurchase/PreviewOrderReuqest.cs
  92. 5
      BBWY.Server.Model/Dto/Response/Order/OrderResponse.cs
  93. 30
      BBWY.Server.Model/Dto/Response/PurchaseOrder/OnlinePurchase/CreateOnlinePurchaseOrderResponse.cs
  94. 9
      BBWY.Server.Model/Dto/Response/PurchaseOrder/OnlinePurchase/OrderTradeTypeResponse.cs
  95. 25
      BBWY.Server.Model/Dto/Response/PurchaseOrder/OnlinePurchase/PreviewOrderResponse.cs
  96. 18
      BBWY.Server.Model/Enums.cs
  97. 11
      BBWY.sln

39
BBWY.1688SDK/APIFacade.cs

@ -0,0 +1,39 @@
using com.alibaba.openapi.client;
using com.alibaba.openapi.client.entity;
using com.alibaba.openapi.client.policy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace NetSdkClient.sdk
{
public class APIFacade
{
private ClientPolicy clientPolicy;
public APIFacade(ClientPolicy clientPolicy)
{
this.clientPolicy = clientPolicy;
}
private SyncAPIClient getAPIClient()
{
return new SyncAPIClient(clientPolicy);
}
public AuthorizationToken getToken(string code)
{
return getAPIClient().getToken(code);
}
public AuthorizationToken refreshToken(String refreshToken)
{
return getAPIClient().refreshToken(refreshToken);
}
}
}

43
BBWY.1688SDK/APIId.cs

@ -0,0 +1,43 @@
using System;
namespace com.alibaba.openapi.client
{
public class APIId
{
public APIId()
{
}
public APIId(String namespaceValue,String name, int version)
{
this.NamespaceValue = namespaceValue;
this.Name = name;
this.version = version;
}
private String namespaceValue;
public String NamespaceValue
{
get { return namespaceValue; }
set { namespaceValue = value; }
}
private String name;
public String Name
{
get { return name; }
set { name = value; }
}
private int version;
public int Version
{
get { return version; }
set { version = value; }
}
}
}

16
BBWY.1688SDK/BBWY.1688SDK.csproj

@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace>BBWY._1688SDK</RootNamespace>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\BBWY.Common\BBWY.Common.csproj" />
</ItemGroup>
</Project>

23
BBWY.1688SDK/GatewayAPIRequest.cs

@ -0,0 +1,23 @@
using com.alibaba.openapi.client.entity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client
{
public class GatewayAPIRequest
{
[DataMember(Order = 0)]
private APIId apiId;
public APIId ApiId
{
get { return apiId; }
set { apiId = value; }
}
}
}

14
BBWY.1688SDK/GatewayAPIResponse.cs

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client
{
[DataContract(Namespace = "com.alibaba.openapi.client")]
public class GatewayAPIResponse
{
}
}

66
BBWY.1688SDK/Request.cs

@ -0,0 +1,66 @@
using com.alibaba.openapi.client.entity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client
{
[DataContract(Namespace = "com.alibaba.openapi.client")]
public class Request
{
[DataMember(Order = 0)]
private APIId apiId;
public APIId ApiId
{
get { return apiId; }
set { apiId = value; }
}
private Dictionary<String, Object> addtionalParams = new Dictionary<String, Object>();
public Dictionary<String, Object> AddtionalParams
{
get { return addtionalParams; }
set { addtionalParams = value; }
}
private Object requestEntity;
public Object RequestEntity
{
get { return requestEntity; }
set { requestEntity = value; }
}
private Dictionary<String, String> attachments;
public Dictionary<String, String> Attachments
{
get { return attachments; }
set { attachments = value; }
}
private String authCodeKey;
public String AuthCodeKey
{
get { return authCodeKey; }
set { authCodeKey = value; }
}
[DataMember(Order = 1)]
private String accessToken;
public String AccessToken
{
get { return accessToken; }
set { accessToken = value; }
}
private AuthorizationToken authToken;
internal AuthorizationToken AuthToken
{
get { return authToken; }
set { authToken = value; }
}
}
}

56
BBWY.1688SDK/Response.cs

@ -0,0 +1,56 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using com.alibaba.openapi.client.entity;
namespace com.alibaba.openapi.client
{
public class Response
{
private int statusCode;
public int StatusCode
{
get { return statusCode; }
set { statusCode = value; }
}
private Object result;
public Object Result
{
get { return result; }
set { result = value; }
}
private Exception exception;
public Exception Exception
{
get { return exception; }
set { exception = value; }
}
private String charset = "UTF-8";
public String Charset
{
get { return charset; }
set { charset = value; }
}
private String encoding;
public String Encoding
{
get { return encoding; }
set { encoding = value; }
}
private ResponseWrapper responseWrapper;
internal ResponseWrapper ResponseWrapper
{
get { return responseWrapper; }
set { responseWrapper = value; }
}
}
}

117
BBWY.1688SDK/SyncAPIClient.cs

@ -0,0 +1,117 @@
using BBWY.Common.Http;
using com.alibaba.openapi.client.entity;
using com.alibaba.openapi.client.http;
using com.alibaba.openapi.client.policy;
using Newtonsoft.Json.Linq;
using System;
namespace com.alibaba.openapi.client
{
public class SyncAPIClient
{
private ClientPolicy clientPolicy;
private RestApiService restApiService;
private HttpClient alibabaHttpClient;
public SyncAPIClient(String appKey, String appSecret)
{
this.clientPolicy = new ClientPolicy();
this.clientPolicy.AppKey = appKey;
this.clientPolicy.SecretKey = appSecret;
}
public SyncAPIClient(String appKey, String appSecret, RestApiService restApiService)
{
this.clientPolicy = new ClientPolicy();
this.clientPolicy.AppKey = appKey;
this.clientPolicy.SecretKey = appSecret;
this.restApiService = restApiService;
this.alibabaHttpClient = new HttpClient(clientPolicy, restApiService);
}
public SyncAPIClient(String appKey, String appSecret, String gatewayHost)
{
this.clientPolicy = new ClientPolicy();
this.clientPolicy.AppKey = appKey;
this.clientPolicy.SecretKey = appSecret;
this.clientPolicy.ServerHost = gatewayHost;
}
public SyncAPIClient(ClientPolicy clientPolicy)
{
this.clientPolicy = clientPolicy;
}
public JObject NewRequest(Request request, RequestPolicy policy)
{
return alibabaHttpClient.NewRequest(request, policy);
}
public T send<T>(Request request, RequestPolicy policy)
{
HttpClient httpClient = new HttpClient(clientPolicy);
T result = httpClient.request<T>(request, policy);
return result;
}
public Res execute<Res>(GatewayAPIRequest gatewayAPIRequest, String accessToken)
{
HttpClient httpClient = new HttpClient(clientPolicy);
RequestPolicy policy = new RequestPolicy();
policy.UseHttps = true;
Request request = new Request();
request.ApiId = gatewayAPIRequest.ApiId;
request.RequestEntity = gatewayAPIRequest;
request.AccessToken = accessToken;
Res result = httpClient.request<Res>(request, policy);
return result;
}
public AuthorizationToken getToken(String code)
{
APIId apiId = new APIId();
apiId.Name = "getToken";
apiId.NamespaceValue = "system.oauth2";
apiId.Version = 1;
Request request = new Request();
request.ApiId = apiId;
request.AddtionalParams["code"] = code;
request.AddtionalParams["grant_type"] = "authorization_code";
request.AddtionalParams["need_refresh_token"] = true;
request.AddtionalParams["client_id"] = clientPolicy.AppKey;
request.AddtionalParams["client_secret"] = clientPolicy.SecretKey;
request.AddtionalParams["redirect_uri"] = "default";
RequestPolicy oauthPolicy = new RequestPolicy();
oauthPolicy.UseHttps = true;
return this.send<AuthorizationToken>(request, oauthPolicy);
}
public AuthorizationToken refreshToken(String refreshToken)
{
APIId apiId = new APIId();
apiId.Name = "getToken";
apiId.NamespaceValue = "system.oauth2";
apiId.Version = 1;
Request request = new Request();
request.ApiId = apiId;
request.AddtionalParams["refreshToken"] = refreshToken;
request.AddtionalParams["grant_type"] = "refresh_token";
request.AddtionalParams["client_id"] = clientPolicy.AppKey;
request.AddtionalParams["client_secret"] = clientPolicy.SecretKey;
request.AddtionalParams["redirect_uri"] = "default";
RequestPolicy oauthPolicy = new RequestPolicy();
oauthPolicy.UseHttps = true;
return this.send<AuthorizationToken>(request, oauthPolicy);
}
}
}

159
BBWY.1688SDK/entity/AuthorizationToken.cs

@ -0,0 +1,159 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client.entity
{
[DataContract(Namespace = "com.alibaba.openapi.client")]
public class AuthorizationToken
{
[DataMember(Order = 0)]
private String access_token;
[DataMember(Order = 1)]
private String refresh_token;
[DataMember(Order = 2)]
private long expires_in;
[DataMember(Order = 3)]
private DateTime expires_time;
[DataMember(Order = 4)]
private DateTime refresh_token_timeout;
[DataMember(Order = 5)]
private String resource_owner;
[DataMember(Order = 6)]
private String uid;
[DataMember(Order = 7)]
private long aliId;
[DataMember(Order = 8)]
private String memberId;
/**
* access_token
*
* @return the accessToken
*/
public String getAccess_token()
{
return access_token;
}
/**
* access_token过期时间
*
* @return the accessTokenTimeout
*/
public long getExpires_in()
{
return expires_in;
}
/**
* refresh_token
*
* @return the refreshToken
*/
public String getRefresh_token()
{
return refresh_token;
}
/**
* refresh_token过期时间
*
* @return the refreshTokenTimeout
*/
public DateTime getRefresh_token_timeout()
{
return refresh_token_timeout;
}
public String getMemberId()
{
return memberId;
}
public void setMemberId(String memberId)
{
this.memberId = memberId;
}
/**
* resource_owner
*
* @return the resourceOwnerId
*/
public String getResource_owner()
{
return resource_owner;
}
/**
* uid
*
* @return the uid
*/
public String getUid()
{
return uid;
}
/**
* aliId
*
* @return the aliId
*/
public long getAliId()
{
return aliId;
}
public void setAccess_token(String accessToken)
{
this.access_token = accessToken;
}
public void setRefresh_token(String refreshToken)
{
this.refresh_token = refreshToken;
}
public void setExpires_in(long accessTokenTimeout)
{
this.expires_in = accessTokenTimeout;
DateTime now = new DateTime();
this.expires_time = now.AddSeconds(accessTokenTimeout);
}
public void setRefresh_token_timeout(DateTime refresh_token_timeout)
{
this.refresh_token_timeout = refresh_token_timeout;
}
public void setResource_owner(String resourceOwnerId)
{
this.resource_owner = resourceOwnerId;
}
public void setUid(String uid)
{
this.uid = uid;
}
public void setAliId(long aliId)
{
this.aliId = aliId;
}
/**
* access_token过期时间,Date格式
*
* @return the accessTokenTimeout
*/
public DateTime getExpires_time()
{
return expires_time;
}
}
}

35
BBWY.1688SDK/entity/ErrorExceptionDesc.cs

@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client.entity
{
[DataContract(Namespace = "com.alibaba.openapi.client")]
public class ErrorExceptionDesc
{
[DataMember(Order = 0)]
private string error_code;
[DataMember(Order = 1)]
private string error_message;
[DataMember(Order = 2)]
private string exception;
public string getError_code()
{
return this.error_code;
}
public string getError_message()
{
return this.error_message;
}
public string getException()
{
return this.exception;
}
}
}

49
BBWY.1688SDK/entity/OrderPreview/CreateOrderPreview.cs

@ -0,0 +1,49 @@
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace BBWY._1688SDK.entity.OrderPreview
{
[DataContract]
public class CreateOrderPreview
{
[DataMember]
public AddressParam addressParam { get; set; }
[DataMember]
public IList<CargoParam> cargoParamList { get; set; }
[DataMember]
public string flow { get; set; }
}
[DataContract]
public class AddressParam
{
[DataMember]
public string fullName { get; set; }
[DataMember]
public string mobile { get; set; }
[DataMember]
public string phone { get; set; }
[DataMember]
public string postCode { get; set; }
[DataMember]
public string address { get; set; }
[DataMember]
public string provinceText { get; set; }
[DataMember]
public string cityText { get; set; }
[DataMember]
public string areaText { get; set; }
[DataMember]
public string townText { get; set; }
}
[DataContract]
public class CargoParam
{
[DataMember]
public long offerId { get; set; }
[DataMember]
public string specId { get; set; }
[DataMember]
public int quantity { get; set; }
}
}

28
BBWY.1688SDK/entity/ResponseStatus.cs

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client.entity
{
public class ResponseStatus
{
private String code;
public String Code
{
get { return code; }
set { code = value; }
}
private String message;
public String Message
{
get { return message; }
set { message = value; }
}
}
}

40
BBWY.1688SDK/entity/ResponseWrapper.cs

@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client.entity
{
public class ResponseWrapper
{
private String invokeStartTime;
public String InvokeStartTime
{
get { return invokeStartTime; }
set { invokeStartTime = value; }
}
private long invokeCostTime;
public long InvokeCostTime
{
get { return invokeCostTime; }
set { invokeCostTime = value; }
}
private ResponseStatus status;
internal ResponseStatus Status
{
get { return status; }
set { status = value; }
}
private Object result;
public Object Result
{
get { return result; }
set { result = value; }
}
}
}

88
BBWY.1688SDK/example/ExampleFacade.cs

@ -0,0 +1,88 @@
using com.alibaba.openapi.client;
using com.alibaba.openapi.client.entity;
using com.alibaba.openapi.client.policy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using com.alibaba.china.openapi.client.example.param.apiexample;
namespace com.alibaba.china.openapi.client.example
{
public class ExampleFacade
{
private ClientPolicy clientPolicy;
public ExampleFacade(ClientPolicy clientPolicy)
{
this.clientPolicy = clientPolicy;
}
private SyncAPIClient getAPIClient()
{
return new SyncAPIClient(clientPolicy);
}
public AuthorizationToken getToken(string code)
{
return getAPIClient().getToken(code);
}
public AuthorizationToken refreshToken(String refreshToken)
{
return getAPIClient().refreshToken(refreshToken);
}
public ExampleFamilyGetResult exampleFamilyGet(ExampleFamilyGetParam param) {
RequestPolicy reqPolicy = new RequestPolicy();
reqPolicy.HttpMethod="POST";
reqPolicy.NeedAuthorization=false;
reqPolicy.RequestSendTimestamp=false;
reqPolicy.UseHttps=false;
reqPolicy.UseSignture=false;
reqPolicy.AccessPrivateApi=false;
Request request = new Request ();
APIId apiId = new APIId();
apiId.Name = "example.family.get";
apiId.NamespaceValue = "api.example";
apiId.Version = 1;
request.ApiId = apiId;
request.RequestEntity=param;
return this.getAPIClient().send<ExampleFamilyGetResult>(request, reqPolicy);
}
public ExampleFamilyPostResult exampleFamilyPost(ExampleFamilyPostParam param, string accessToken) {
RequestPolicy reqPolicy = new RequestPolicy();
reqPolicy.HttpMethod="POST";
reqPolicy.NeedAuthorization=false;
reqPolicy.RequestSendTimestamp=false;
reqPolicy.UseHttps=false;
reqPolicy.UseSignture=true;
reqPolicy.AccessPrivateApi=false;
Request request = new Request ();
APIId apiId = new APIId();
apiId.Name = "example.family.post";
apiId.NamespaceValue = "api.example";
apiId.Version = 1;
request.ApiId = apiId;
request.RequestEntity=param;
request.AccessToken=accessToken;
return this.getAPIClient().send<ExampleFamilyPostResult>(request, reqPolicy);
}
}
}

160
BBWY.1688SDK/example/param/apiexample/ExampleCar.cs

@ -0,0 +1,160 @@
using com.alibaba.openapi.client.primitive;
using com.alibaba.openapi.client.util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
namespace com.alibaba.china.openapi.client.example.param.apiexample
{
[DataContract(Namespace = "com.alibaba.openapi.client")]
public class ExampleCar {
[DataMember(Order = 1)]
private string builtDate;
/**
* @return
*/
public DateTime? getBuiltDate() {
if (builtDate != null)
{
DateTime datetime = DateUtil.formatFromStr(builtDate);
return datetime;
}
return null;
}
/**
* *
* <pre></pre>
*
*/
public void setBuiltDate(DateTime builtDate) {
this.builtDate = DateUtil.format(builtDate);
}
[DataMember(Order = 2)]
private string boughtDate;
/**
* @return
*/
public DateTime? getBoughtDate() {
if (boughtDate != null)
{
DateTime datetime = DateUtil.formatFromStr(boughtDate);
return datetime;
}
return null;
}
/**
* *
* <pre></pre>
*
*/
public void setBoughtDate(DateTime boughtDate) {
this.boughtDate = DateUtil.format(boughtDate);
}
[DataMember(Order = 3)]
private string name;
/**
* @return
*/
public string getName() {
return name;
}
/**
* *
* <pre></pre>
*
*/
public void setName(string name) {
this.name = name;
}
[DataMember(Order = 4)]
private string builtArea;
/**
* @return
*/
public string getBuiltArea() {
return builtArea;
}
/**
* *
* <pre></pre>
*
*/
public void setBuiltArea(string builtArea) {
this.builtArea = builtArea;
}
[DataMember(Order = 5)]
private string carNumber;
/**
* @return
*/
public string getCarNumber() {
return carNumber;
}
/**
* *
* <pre></pre>
*
*/
public void setCarNumber(string carNumber) {
this.carNumber = carNumber;
}
[DataMember(Order = 6)]
private double? price;
/**
* @return
*/
public double? getPrice() {
return price;
}
/**
* *
* <pre></pre>
*
*/
public void setPrice(double price) {
this.price = price;
}
[DataMember(Order = 7)]
private int? seats;
/**
* @return
*/
public int? getSeats() {
return seats;
}
/**
* *
* <pre></pre>
*
*/
public void setSeats(int seats) {
this.seats = seats;
}
}
}

144
BBWY.1688SDK/example/param/apiexample/ExampleFamily.cs

@ -0,0 +1,144 @@
using com.alibaba.openapi.client.primitive;
using com.alibaba.openapi.client.util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
namespace com.alibaba.china.openapi.client.example.param.apiexample
{
[DataContract(Namespace = "com.alibaba.openapi.client")]
public class ExampleFamily
{
[DataMember(Order = 1)]
private int? familyNumber;
/**
* @return
*/
public int? getFamilyNumber()
{
return familyNumber;
}
/**
* *
* <pre></pre>
*
*/
public void setFamilyNumber(int familyNumber)
{
this.familyNumber = familyNumber;
}
[DataMember(Order = 2)]
private ExamplePerson father;
/**
* @return
*/
public ExamplePerson getFather()
{
return father;
}
/**
* *
* <pre></pre>
*
*/
public void setFather(ExamplePerson father)
{
this.father = father;
}
[DataMember(Order = 3)]
private ExamplePerson mother;
/**
* @return
*/
public ExamplePerson getMother()
{
return mother;
}
/**
* *
* <pre></pre>
*
*/
public void setMother(ExamplePerson mother)
{
this.mother = mother;
}
[DataMember(Order = 4)]
private ExamplePerson[] children;
/**
* @return
*/
public ExamplePerson[] getChildren()
{
return children;
}
/**
* *
* <pre></pre>
*
*/
public void setChildren(ExamplePerson[] children)
{
this.children = children;
}
[DataMember(Order = 5)]
private ExampleCar[] ownedCars;
/**
* @return
*/
public ExampleCar[] getOwnedCars()
{
return ownedCars;
}
/**
* *
* <pre></pre>
*
*/
public void setOwnedCars(ExampleCar[] ownedCars)
{
this.ownedCars = ownedCars;
}
[DataMember(Order = 6)]
private ExampleHouse myHouse;
/**
* @return
*/
public ExampleHouse getMyHouse()
{
return myHouse;
}
/**
* *
* <pre></pre>
*
*/
public void setMyHouse(ExampleHouse myHouse)
{
this.myHouse = myHouse;
}
}
}

41
BBWY.1688SDK/example/param/apiexample/ExampleFamilyGetParam.cs

@ -0,0 +1,41 @@
using com.alibaba.openapi.client.primitive;
using com.alibaba.openapi.client.util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using com.alibaba.openapi.client;
namespace com.alibaba.china.openapi.client.example.param.apiexample
{
[DataContract(Namespace = "com.alibaba.openapi.client")]
public class ExampleFamilyGetParam : GatewayAPIRequest
{
public ExampleFamilyGetParam()
{
this.ApiId = new APIId("api.example", "example.family.get",1);
}
[DataMember(Order = 1)]
private int? familyNumber;
/**
* @return 12family对象
*/
public int? getFamilyNumber() {
return familyNumber;
}
/**
* 12family对象 *
* <pre></pre>
*
*/
public void setFamilyNumber(int familyNumber) {
this.familyNumber = familyNumber;
}
}
}

37
BBWY.1688SDK/example/param/apiexample/ExampleFamilyGetResult.cs

@ -0,0 +1,37 @@
using com.alibaba.openapi.client.primitive;
using com.alibaba.openapi.client.util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using com.alibaba.openapi.client;
namespace com.alibaba.china.openapi.client.example.param.apiexample
{
[DataContract(Namespace = "com.alibaba.openapi.client")]
public class ExampleFamilyGetResult : GatewayAPIResponse
{
[DataMember(Order = 1)]
private ExampleFamily result;
/**
* @return
*/
public ExampleFamily getResult() {
return result;
}
/**
* *
*
*/
public void setResult(ExampleFamily result) {
this.result = result;
}
}
}

81
BBWY.1688SDK/example/param/apiexample/ExampleFamilyPostParam.cs

@ -0,0 +1,81 @@
using com.alibaba.openapi.client.primitive;
using com.alibaba.openapi.client.util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
namespace com.alibaba.china.openapi.client.example.param.apiexample
{
[DataContract(Namespace = "com.alibaba.openapi.client")]
public class ExampleFamilyPostParam
{
[DataMember(Order = 1)]
private ExampleFamily family;
/**
* @return Family对象信息
*/
public ExampleFamily getFamily()
{
return family;
}
/**
* Family对象信息 *
* <pre></pre>
*
*/
public void setFamily(ExampleFamily family)
{
this.family = family;
}
[DataMember(Order = 2)]
private string comments;
/**
* @return
*/
public string getComments()
{
return comments;
}
/**
* *
* <pre></pre>
*
*/
public void setComments(string comments)
{
this.comments = comments;
}
[DataMember(Order = 3)]
private byte[] houseImg;
/**
* @return
*/
public byte[] getHouseImg()
{
return houseImg;
}
/**
* *
* <pre></pre>
*
*/
public void setHouseImg(byte[] houseImg)
{
this.houseImg = houseImg;
}
}
}

56
BBWY.1688SDK/example/param/apiexample/ExampleFamilyPostResult.cs

@ -0,0 +1,56 @@
using com.alibaba.openapi.client.primitive;
using com.alibaba.openapi.client.util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
namespace com.alibaba.china.openapi.client.example.param.apiexample
{
[DataContract(Namespace = "com.alibaba.openapi.client")]
public class ExampleFamilyPostResult
{
[DataMember(Order = 1)]
private ExampleFamily result;
/**
* @return
*/
public ExampleFamily getResult() {
return result;
}
/**
* *
*
*/
public void setResult(ExampleFamily result) {
this.result = result;
}
[DataMember(Order = 2)]
private string resultDesc;
/**
* @return
*/
public string getResultDesc() {
return resultDesc;
}
/**
* *
*
*/
public void setResultDesc(string resultDesc) {
this.resultDesc = resultDesc;
}
}
}

102
BBWY.1688SDK/example/param/apiexample/ExampleHouse.cs

@ -0,0 +1,102 @@
using com.alibaba.openapi.client.primitive;
using com.alibaba.openapi.client.util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
namespace com.alibaba.china.openapi.client.example.param.apiexample
{
[DataContract(Namespace = "com.alibaba.openapi.client")]
public class ExampleHouse
{
[DataMember(Order = 1)]
private string location;
/**
* @return
*/
public string getLocation()
{
return location;
}
/**
* *
* <pre></pre>
*
*/
public void setLocation(string location)
{
this.location = location;
}
[DataMember(Order = 2)]
private int? areaSize;
/**
* @return
*/
public int? getAreaSize()
{
return areaSize;
}
/**
* *
* <pre></pre>
*
*/
public void setAreaSize(int areaSize)
{
this.areaSize = areaSize;
}
[DataMember(Order = 3)]
private bool? rent;
/**
* @return
*/
public bool? getRent()
{
return rent;
}
/**
* *
* <pre></pre>
*
*/
public void setRent(bool rent)
{
this.rent = rent;
}
[DataMember(Order = 4)]
private int? rooms;
/**
* @return
*/
public int? getRooms()
{
return rooms;
}
/**
* *
* <pre></pre>
*
*/
public void setRooms(int rooms)
{
this.rooms = rooms;
}
}
}

99
BBWY.1688SDK/example/param/apiexample/ExamplePerson.cs

@ -0,0 +1,99 @@
using com.alibaba.openapi.client.primitive;
using com.alibaba.openapi.client.util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
namespace com.alibaba.china.openapi.client.example.param.apiexample
{
[DataContract(Namespace = "com.alibaba.openapi.client")]
public class ExamplePerson
{
[DataMember(Order = 1)]
private string name;
/**
* @return
*/
public string getName() {
return name;
}
/**
* *
* <pre></pre>
*
*/
public void setName(string name) {
this.name = name;
}
[DataMember(Order = 2)]
private int? age;
/**
* @return
*/
public int? getAge() {
return age;
}
/**
* *
* <pre></pre>
*
*/
public void setAge(int age) {
this.age = age;
}
[DataMember(Order = 3)]
private string birthday;
/**
* @return
*/
public DateTime? getBirthday() {
if (birthday != null)
{
DateTime datetime = DateUtil.formatFromStr(birthday);
return datetime;
}
return null;
}
/**
* *
* <pre></pre>
*
*/
public void setBirthday(DateTime birthday) {
this.birthday = DateUtil.format(birthday);
}
[DataMember(Order = 4)]
private string mobileNumber;
/**
* @return
*/
public string getMobileNumber() {
return mobileNumber;
}
/**
* *
* <pre></pre>
*
*/
public void setMobileNumber(string mobileNumber) {
this.mobileNumber = mobileNumber;
}
}
}

58
BBWY.1688SDK/exception/OceanException.cs

@ -0,0 +1,58 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client.exception
{
public class OceanException : Exception
{
public OceanException(string mess)
: base(mess)
{
}
public OceanException()
{
}
private string error_code;
private string error_message;
private string exception;
public string getError_code()
{
return this.error_code;
}
public void setError_code(string error_code)
{
this.error_code = error_code;
}
public string getError_message()
{
return this.error_message;
}
public void setError_message(string error_message)
{
this.error_message = error_message;
}
public string getException()
{
return this.exception;
}
public void setException(String exception)
{
this.exception = exception;
}
}
}

243
BBWY.1688SDK/http/HttpClient.cs

@ -0,0 +1,243 @@
using BBWY.Common.Http;
using com.alibaba.openapi.client.entity;
using com.alibaba.openapi.client.policy;
using com.alibaba.openapi.client.serialize;
using com.alibaba.openapi.client.util;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Web;
namespace com.alibaba.openapi.client.http
{
public class HttpClient
{
private ClientPolicy clientPolicy;
private RestApiService restApiService;
private IDictionary<string, string> requestHeader;
public HttpClient(ClientPolicy clientPolicy)
{
this.clientPolicy = clientPolicy;
}
public HttpClient(ClientPolicy clientPolicy, RestApiService restApiService)
{
this.clientPolicy = clientPolicy;
this.restApiService = restApiService;
this.requestHeader = new Dictionary<string, string>()
{
{ "User-Agent","Ocean/NET-SDKClient"}
};
}
public JObject NewRequest(Request request, RequestPolicy requestPolicy)
{
StringBuilder path = createProtocolRequestPath(requestPolicy, request);
Dictionary<string, object> parameters = createParameterDictionary(requestPolicy, request);
signature(path.ToString(), parameters, requestPolicy, clientPolicy);
string paramString = createParameterStr(parameters);
Uri uri = new Uri(buildRequestUri(requestPolicy, request));
var result = restApiService.SendRequest($"{uri.Scheme}://{uri.Host}",
uri.LocalPath,
paramString,
requestHeader,
requestPolicy.HttpMethod.Equals("GET") ? HttpMethod.Get : HttpMethod.Post,
RestApiService.ContentType_Form);
if (result.StatusCode != HttpStatusCode.OK)
throw new Exception(result.Content.ToString());
return JObject.Parse(result.Content);
}
public T request<T>(Request request, RequestPolicy requestPolicy)
{
StringBuilder path = createProtocolRequestPath(requestPolicy, request);
Dictionary<String, Object> parameters = createParameterDictionary(requestPolicy, request);
StringBuilder queryBuilder = new StringBuilder();
signature(path.ToString(), parameters, requestPolicy, clientPolicy);
if ("GET".Equals(requestPolicy.HttpMethod))
{
String queryString = createParameterStr(parameters);
String uriStr = buildRequestUri(requestPolicy, request);
uriStr = uriStr + "?" + queryString;
Uri uri = new Uri(uriStr);
HttpWebRequest httpWebRequest = WebRequest.Create(uri) as HttpWebRequest;
httpWebRequest.Method = "GET";
httpWebRequest.KeepAlive = false;
httpWebRequest.AllowAutoRedirect = true;
httpWebRequest.ContentType = "application/x-www-form-urlencoded";
httpWebRequest.UserAgent = "Ocean/NET-SDKClient";
HttpWebResponse response = httpWebRequest.GetResponse() as HttpWebResponse;
Stream responseStream = response.GetResponseStream();
DeSerializer deSerializer = SerializerProvider.getInstance().getDeSerializer(requestPolicy.ResponseProtocol);
ResponseWrapper rw = deSerializer.deSerialize(responseStream, typeof(T), Encoding.UTF8.EncodingName);
return (T)rw.Result;
}
else
{
String postString = createParameterStr(parameters);
byte[] postData = Encoding.UTF8.GetBytes(postString);
String uriStr = buildRequestUri(requestPolicy, request);
Uri uri = new Uri(uriStr);
HttpWebRequest httpWebRequest = WebRequest.Create(uri) as HttpWebRequest;
httpWebRequest.Method = "POST";
httpWebRequest.KeepAlive = false;
httpWebRequest.AllowAutoRedirect = true;
httpWebRequest.ContentType = "application/x-www-form-urlencoded";
httpWebRequest.UserAgent = "Ocean/NET-SDKClient";
httpWebRequest.ContentLength = postData.Length;
System.IO.Stream outputStream = httpWebRequest.GetRequestStream();
outputStream.Write(postData, 0, postData.Length);
outputStream.Close();
try
{
HttpWebResponse response = httpWebRequest.GetResponse() as HttpWebResponse;
Stream responseStream = response.GetResponseStream();
DeSerializer deSerializer = SerializerProvider.getInstance().getDeSerializer(requestPolicy.ResponseProtocol);
ResponseWrapper rw = deSerializer.deSerialize(responseStream, typeof(T), Encoding.UTF8.EncodingName);
return (T)rw.Result;
}
catch (System.Net.WebException webException)
{
HttpWebResponse response = webException.Response as HttpWebResponse;
Stream responseStream = response.GetResponseStream();
DeSerializer deSerializer = SerializerProvider.getInstance().getDeSerializer(requestPolicy.ResponseProtocol);
Exception rw = deSerializer.buildException(responseStream, 500, Encoding.UTF8.EncodingName);
throw rw;
}
}
}
private String buildRequestUri(RequestPolicy requestPolicy, Request request)
{
String schema = "http";
int port = clientPolicy.HttpPort;
if (requestPolicy.UseHttps)
{
schema = "https";
port = clientPolicy.HttpsPort;
}
StringBuilder relativeBuilder = new StringBuilder(schema);
relativeBuilder.Append("://");
relativeBuilder.Append(clientPolicy.ServerHost);
if (port != 80 && port != 443)
{
relativeBuilder.Append(":");
relativeBuilder.Append(port);
}
if (requestPolicy.AccessPrivateApi)
{
relativeBuilder.Append("/api");
}
else
{
relativeBuilder.Append("/openapi");
}
relativeBuilder.Append("/");
relativeBuilder.Append(createProtocolRequestPath(requestPolicy, request));
return relativeBuilder.ToString();
}
private StringBuilder createProtocolRequestPath(RequestPolicy requestPolicy, Request request)
{
StringBuilder relativeBuilder = new StringBuilder();
relativeBuilder.Append(requestPolicy.RequestProtocol);
relativeBuilder.Append("/").Append(request.ApiId.Version);
relativeBuilder.Append("/").Append(request.ApiId.NamespaceValue);
relativeBuilder.Append("/").Append(request.ApiId.Name);
relativeBuilder.Append("/").Append(clientPolicy.AppKey);
return relativeBuilder;
}
private String createParameterStr(Dictionary<String, Object> parameters)
{
StringBuilder paramBuilder = new StringBuilder();
foreach (KeyValuePair<string, object> kvp in parameters)
{
String encodedValue = null;
if (kvp.Value != null)
{
String tempValue = kvp.Value.ToString();
byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(tempValue);
encodedValue = HttpUtility.UrlEncode(byteArray, 0, byteArray.Length);
}
paramBuilder.Append(kvp.Key).Append("=").Append(encodedValue);
paramBuilder.Append("&");
}
return paramBuilder.ToString();
}
private Dictionary<String, Object> createParameterDictionary(RequestPolicy requestPolicy, Request request)
{
Serializer serializer = SerializerProvider.getInstance().getSerializer(requestPolicy.RequestProtocol);
Dictionary<String, Object> parameters = serializer.serialize(request.RequestEntity);
if (!requestPolicy.RequestProtocol.Equals(requestPolicy.ResponseProtocol))
{
parameters.Add("_aop_responseFormat", requestPolicy.ResponseProtocol);
}
if (requestPolicy.RequestSendTimestamp)
{
parameters.Add("_aop_timestamp", DateUtil.currentTimeMillis());
}
parameters.Add("_aop_datePattern", DateUtil.getDatePattern());
foreach (KeyValuePair<string, object> kvp in request.AddtionalParams)
{
parameters.Add(kvp.Key, kvp.Value);
}
if (request.AccessToken != null)
{
parameters.Add("access_token", request.AccessToken);
}
return parameters;
}
private void signature(String path, Dictionary<String, Object> parameters, RequestPolicy requestPolicy, ClientPolicy clientPolicy)
{
if (!requestPolicy.UseSignture)
{
return;
}
if (clientPolicy.AppKey == null
|| clientPolicy.SecretKey == null)
{
return;
}
byte[] sign = SignatureUtil.hmacSha1(path, parameters, clientPolicy.SecretKey);
String signStr = SignatureUtil.toHex(sign);
if (signStr != null)
{
parameters.Add("_aop_signature", signStr);
}
}
private WebClient createWebClient()
{
WebClient client = new WebClient();
client.Headers.Add("user-agent", "Ocean/SDK Client");
return client;
}
}
}

70
BBWY.1688SDK/policy/ClientPolicy.cs

@ -0,0 +1,70 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client.policy
{
public class ClientPolicy
{
private string serverHost = "gw.open.1688.com";
public string ServerHost
{
get { return serverHost; }
set { serverHost = value; }
}
private int httpPort = 80;
public int HttpPort
{
get { return httpPort; }
set { httpPort = value; }
}
private int httpsPort = 443;
public int HttpsPort
{
get { return httpsPort; }
set { httpsPort = value; }
}
private string appKey;
public string AppKey
{
get { return appKey; }
set { appKey = value; }
}
private string secretKey;
public string SecretKey
{
get { return secretKey; }
set { secretKey = value; }
}
private int defaultTimeout = 5000;
public int DefaultTimeout
{
get { return defaultTimeout; }
set { defaultTimeout = value; }
}
private string defaultContentCharset = "UTF-8";
public string DefaultContentCharset
{
get { return defaultContentCharset; }
set { defaultContentCharset = value; }
}
private bool defaultUseHttps = true;
public bool DefaultUseHttps
{
get { return defaultUseHttps; }
set { defaultUseHttps = value; }
}
}
}

17
BBWY.1688SDK/policy/GrantType.cs

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client.policy
{
public class GrantType
{
public const string refresh_token="refresh_token";
/**
* json串的方式传递,_data_={"key":"value"}
*/
public const string get_token = "get_token";
}
}

26
BBWY.1688SDK/policy/Protocol.cs

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client.policy
{
public class Protocol
{
public const string param2 = "param2";
/**
* json串的方式传递,_data_={"key":"value"}
*/
public const string json2 = "json2";
/**
*
* xml的方式传递,_data_=&lt;test>data&lt;/test>
*/
public const string xml2 = "xml2";
public const string param = "param";
public const string json = "json";
public const string xml = "xml";
public const string http = "http";
}
}

113
BBWY.1688SDK/policy/RequestPolicy.cs

@ -0,0 +1,113 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client.policy
{
public class RequestPolicy
{
private bool requestSendTimestamp = false;
public bool RequestSendTimestamp
{
get { return requestSendTimestamp; }
set { requestSendTimestamp = value; }
}
private bool useHttps = false;
public bool UseHttps
{
get { return useHttps; }
set { useHttps = value; }
}
private string requestProtocol = Protocol.param2;
internal string RequestProtocol
{
get { return requestProtocol; }
set { requestProtocol = value; }
}
private string responseProtocol = Protocol.json2;
internal string ResponseProtocol
{
get { return responseProtocol; }
set { responseProtocol = value; }
}
private bool responseCompress = true;
public bool ResponseCompress
{
get { return responseCompress; }
set { responseCompress = value; }
}
private int requestCompressThreshold = -1;
public int RequestCompressThreshold
{
get { return requestCompressThreshold; }
set { requestCompressThreshold = value; }
}
private int timeout = 5000;
public int Timeout
{
get { return timeout; }
set { timeout = value; }
}
private string httpMethod = "POST";
public string HttpMethod
{
get { return httpMethod; }
set { httpMethod = value; }
}
private String queryStringCharset = "GB18030";
public String QueryStringCharset
{
get { return queryStringCharset; }
set { queryStringCharset = value; }
}
private String contentCharset = "UTF-8";
public String ContentCharset
{
get { return contentCharset; }
set { contentCharset = value; }
}
private bool useSignture = true;
public bool UseSignture
{
get { return useSignture; }
set { useSignture = value; }
}
private bool needAuthorization = false;
public bool NeedAuthorization
{
get { return needAuthorization; }
set { needAuthorization = value; }
}
private bool accessPrivateApi = false;
public bool AccessPrivateApi
{
get { return accessPrivateApi; }
set { accessPrivateApi = value; }
}
private int defaultApiVersion = 1;
public int DefaultApiVersion
{
get { return defaultApiVersion; }
set { defaultApiVersion = value; }
}
}
}

36
BBWY.1688SDK/primitive/NullableBool.cs

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client.primitive
{
public class NullableBool : NullablePrimitiveObject
{
public NullableBool(bool value)
{
this.value = value;
this.isNull = false;
}
bool value;
private Boolean isNull = true;
public Boolean IsNull
{
get { return isNull; }
}
public void setValue(bool value)
{
this.value = value;
this.isNull = false;
}
public bool getValue()
{
return this.value;
}
}
}

36
BBWY.1688SDK/primitive/NullableByte.cs

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client.primitive
{
public class NullableByte : NullablePrimitiveObject
{
public NullableByte(byte value)
{
this.value = value;
this.isNull = false;
}
byte value;
private Boolean isNull;
public Boolean IsNull
{
get { return isNull; }
}
public void setValue(byte value)
{
this.value = value;
this.isNull = false;
}
public byte getValue()
{
return this.value;
}
}
}

36
BBWY.1688SDK/primitive/NullableChar.cs

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client.primitive
{
public class NullableChar : NullablePrimitiveObject
{
public NullableChar(char value)
{
this.value = value;
this.isNull = false;
}
char value;
private Boolean isNull = true;
public Boolean IsNull
{
get { return isNull; }
}
public void setValue(char value)
{
this.value = value;
this.isNull = false;
}
public char getValue()
{
return this.value;
}
}
}

36
BBWY.1688SDK/primitive/NullableDateTime.cs

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client.primitive
{
public class NullableDateTime : NullablePrimitiveObject
{
public NullableDateTime(DateTime value)
{
this.value = value;
this.isNull = false;
}
DateTime value;
private Boolean isNull;
public Boolean IsNull
{
get { return isNull; }
}
public void setValue(DateTime value)
{
this.value = value;
this.isNull = false;
}
public DateTime getValue()
{
return this.value;
}
}
}

36
BBWY.1688SDK/primitive/NullableDouble.cs

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client.primitive
{
public class NullableDouble : NullablePrimitiveObject
{
public NullableDouble(double value)
{
this.value = value;
this.isNull = false;
}
double value;
private Boolean isNull;
public Boolean IsNull
{
get { return isNull; }
}
public void setValue(double value)
{
this.value = value;
this.isNull = false;
}
public double getValue()
{
return this.value;
}
}
}

36
BBWY.1688SDK/primitive/NullableFloat.cs

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client.primitive
{
public class NullableFloat : NullablePrimitiveObject
{
public NullableFloat(float value)
{
this.value = value;
this.isNull = false;
}
float value;
private Boolean isNull;
public Boolean IsNull
{
get { return isNull; }
}
public void setValue(float value)
{
this.value = value;
this.isNull = false;
}
public float getValue()
{
return this.value;
}
}
}

36
BBWY.1688SDK/primitive/NullableInt.cs

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client.primitive
{
public class NullableInt : NullablePrimitiveObject
{
public NullableInt(int value)
{
this.value = value;
this.isNull = false;
}
int value;
private Boolean isNull;
public Boolean IsNull
{
get { return isNull; }
}
public void setValue(int value)
{
this.value = value;
this.isNull = false;
}
public int getValue()
{
return this.value;
}
}
}

36
BBWY.1688SDK/primitive/NullableLong.cs

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client.primitive
{
public class NullableLong : NullablePrimitiveObject
{
public NullableLong(long value)
{
this.value = value;
this.isNull = false;
}
long value;
private Boolean isNull;
public Boolean IsNull
{
get { return isNull; }
}
public void setValue(long value)
{
this.value = value;
this.isNull = false;
}
public long getValue()
{
return this.value;
}
}
}

12
BBWY.1688SDK/primitive/NullablePrimitiveObject.cs

@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client.primitive
{
public class NullablePrimitiveObject
{
}
}

21
BBWY.1688SDK/serialize/DeSerializer.cs

@ -0,0 +1,21 @@
using com.alibaba.openapi.client.entity;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client.serialize
{
public interface DeSerializer
{
//返回该反序列化接口支持的数据协议.
String supportedContentType();
ResponseWrapper deSerialize(Stream istream, Type resultType, String charSet);
Exception buildException(Stream inputStream, int statusCode, String charSet);
}
}

56
BBWY.1688SDK/serialize/Json2Deserializer.cs

@ -0,0 +1,56 @@
using com.alibaba.openapi.client.entity;
using com.alibaba.openapi.client.exception;
using com.alibaba.openapi.client.policy;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client.serialize
{
public class Json2Deserializer : DeSerializer
{
//返回该反序列化接口支持的数据协议.
public String supportedContentType()
{
return Protocol.json2;
}
public ResponseWrapper deSerialize(Stream istream, Type resultType, String charSet)
{
StreamReader sr = new StreamReader(istream, Encoding.UTF8);
string strhtml = sr.ReadToEnd();
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(strhtml)))
{
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(resultType);
object result = jsonSerializer.ReadObject(ms);
ResponseWrapper responseWrapper = new ResponseWrapper();
responseWrapper.Result = result;
return responseWrapper;
}
}
public Exception buildException(Stream istream, int statusCode, String charSet)
{
//istream.Position = 0;
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(ErrorExceptionDesc));
object resultObj = jsonSerializer.ReadObject(istream);
ErrorExceptionDesc result = (ErrorExceptionDesc)resultObj;
String errorCodeStr = result.getError_code();
String errorMesage = result.getError_message();
OceanException oceanException = new OceanException(errorMesage);
oceanException.setError_code(errorCodeStr);
oceanException.setError_message(errorMesage);
return oceanException;
}
}
}

137
BBWY.1688SDK/serialize/Param2RequestSerializer.cs

@ -0,0 +1,137 @@
using com.alibaba.openapi.client.policy;
using com.alibaba.openapi.client.primitive;
using com.alibaba.openapi.client.util;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client.serialize
{
public class Param2RequestSerializer : Serializer
{
public String supportedContentType()
{
return Protocol.param2;
}
public Dictionary<String, Object> serialize(Object serializer)
{
//Dictionary<String, Object> result = serializeNest(serializer);
//return result;
return serializeParam(serializer);
}
private Dictionary<String, Object> serializeNest(Object serializer)
{
Dictionary<String, Object> result = new Dictionary<String, Object>();
if (serializer == null)
{
return result;
}
Type type = serializer.GetType();
IEnumerable<FieldInfo> fis = type.GetRuntimeFields();
TextInfo tInfo = Thread.CurrentThread.CurrentCulture.TextInfo;
foreach (FieldInfo fi in fis)
{
Type fieldType = fi.FieldType;
String piName = fi.Name;
String firstCharacter = piName.Substring(0, 1);
String upperFirstCharacter = firstCharacter.ToUpper(Thread.CurrentThread.CurrentCulture);
String tempName = upperFirstCharacter + piName.Substring(1);
if (!"ApiId".Equals(tempName))
{
MethodInfo mi = type.GetMethod("get" + tempName);
object value = mi.Invoke(serializer, null);
if (value != null)
{
object trueValue = null;
if (fieldType.IsAssignableFrom(typeof(bool?))
|| fieldType.IsAssignableFrom(typeof(byte?))
|| fieldType.IsAssignableFrom(typeof(char?))
|| fieldType.IsAssignableFrom(typeof(double?))
|| fieldType.IsAssignableFrom(typeof(float?))
|| fieldType.IsAssignableFrom(typeof(int?))
|| fieldType.IsAssignableFrom(typeof(long?)))
{
trueValue = value;
}
else if (fieldType.IsAssignableFrom(typeof(String)))
{
if (value.GetType().IsAssignableFrom(typeof(DateTime)))
{
DateTime dateTime = (DateTime)value;
trueValue = DateUtil.formatForOcean(dateTime);
}
else
{
trueValue = value;
}
}
else if (fieldType.IsAssignableFrom(typeof(DateTime?)))
{
DateTime dateTime = (DateTime)value;
trueValue = DateUtil.format(dateTime);
}
else if (fieldType.IsAssignableFrom(typeof(Byte[])) || fieldType.IsAssignableFrom(typeof(byte[])))
{
trueValue = Convert.ToBase64String((byte[])value);
}
else
{
DataContractJsonSerializer dataContractJsonSerializer = new DataContractJsonSerializer(fieldType);
MemoryStream stream = new MemoryStream();
dataContractJsonSerializer.WriteObject(stream, value);
byte[] dataBytes = new byte[stream.Length];
stream.Position = 0;
stream.Read(dataBytes, 0, (int)stream.Length);
string dataString = Encoding.UTF8.GetString(dataBytes);
trueValue = dataString;
}
result.Add(piName, trueValue);
}
}
}
return result;
}
private Dictionary<string, object> serializeParam(object param)
{
Dictionary<string, object> result = new Dictionary<string, object>();
Type type = param.GetType();
var properties = type.GetProperties();
foreach (var property in properties)
{
var value = property.GetValue(param);
var valueType = value.GetType();
if (valueType.IsAssignableFrom(typeof(string)) ||
valueType.IsAssignableFrom(typeof(bool?)) ||
valueType.IsAssignableFrom(typeof(byte?)) ||
valueType.IsAssignableFrom(typeof(char?)) ||
valueType.IsAssignableFrom(typeof(double?)) ||
valueType.IsAssignableFrom(typeof(float?)) ||
valueType.IsAssignableFrom(typeof(int?)) ||
valueType.IsAssignableFrom(typeof(long?)))
result.Add(property.Name, value);
else
{
result.Add(property.Name, JsonConvert.SerializeObject(value));
}
}
return result;
}
}
}

18
BBWY.1688SDK/serialize/Serializer.cs

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client.serialize
{
public interface Serializer
{
//返回该反序列化接口支持的数据协议.
String supportedContentType();
//序列化方法
Dictionary<String, Object> serialize(Object serializer);
}
}

60
BBWY.1688SDK/serialize/SerializerProvider.cs

@ -0,0 +1,60 @@
using com.alibaba.openapi.client.policy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client.serialize
{
public class SerializerProvider
{
private static SerializerProvider instance;
private static Object lockObject=new Object();
public static SerializerProvider getInstance()
{
if (instance == null)
{
lock (lockObject)
{
if (instance == null)
{
instance = new SerializerProvider();
instance.initial();
}
}
}
return instance;
}
private SerializerProvider()
{
}
private void initial()
{
serializerStore.Add(Protocol.param2, new Param2RequestSerializer());
deSerializerStore.Add(Protocol.param2, new Json2Deserializer());
deSerializerStore.Add(Protocol.json2, new Json2Deserializer());
}
private Dictionary<String, Serializer> serializerStore = new Dictionary<String, Serializer>();
public Serializer getSerializer(String contentType)
{
return serializerStore[contentType];
}
private Dictionary<String, DeSerializer> deSerializerStore = new Dictionary<String, DeSerializer>();
public DeSerializer getDeSerializer(String contentType)
{
return deSerializerStore[contentType];
}
}
}

66
BBWY.1688SDK/util/DateUtil.cs

@ -0,0 +1,66 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client.util
{
public class DateUtil
{
//这里定义两个日期格式,由于.Net平台的毫秒格式用fff表示,Ocean平台(Java)的毫秒格式用SSS表示。
private static string Date_Pattern = "yyyyMMddHHmmssfff";
private static string Date_PatternForOcean = "yyyyMMddHHmmssSSS";
public static String getDatePattern()
{
return Date_PatternForOcean;
}
public static String format(DateTime date)
{
return date.ToString(Date_Pattern);
}
public static String formatForOcean(DateTime date)
{
String value = date.ToString("yyyyMMddHHmmssfffzzz");
String newValue = value.Replace(":", "");
return newValue;
}
public static DateTime formatFromStr(String dateDesc)
{
if (dateDesc.Contains("+") || dateDesc.Contains("-"))
{
try
{
IFormatProvider culture = new CultureInfo("zh-CN", true);
DateTime datetime = DateTime.ParseExact(dateDesc, "yyyyMMddHHmmssfffzzz", culture);
return datetime;
}
catch (Exception x)
{
String message = x.Message;
}
}
IFormatProvider newculture = new CultureInfo("zh-CN", true);
DateTime newdatetime = DateTime.ParseExact(dateDesc, Date_Pattern, newculture);
return newdatetime;
}
public static long currentTimeMillis()
{
System.DateTime current = new DateTime();
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
double ms = (current - startTime).TotalMilliseconds;
long b = Convert.ToInt64(ms);
return b;
}
}
}

74
BBWY.1688SDK/util/SignatureUtil.cs

@ -0,0 +1,74 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace com.alibaba.openapi.client.util
{
public class SignatureUtil
{
public static byte[] hmacSha1(String path, Dictionary<String, Object> parameters, String signingKey)
{
List<String> lists = new List<String>();
foreach (KeyValuePair<string, object> kvp in parameters)
{
lists.Add(kvp.Key + kvp.Value);
}
lists.Sort(StringComparer.Ordinal);
StringBuilder sb = new StringBuilder();
sb.Append(path);
foreach (String param in lists)
{
sb.Append(param);
}
String contentToHmac = sb.ToString();
byte[] byteToHmac = System.Text.Encoding.UTF8.GetBytes(contentToHmac);
byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(signingKey);
HMACSHA1 hmac = new HMACSHA1(byteArray);
byte[] hashValue = hmac.ComputeHash(byteToHmac, 0, byteToHmac.Length);
return hashValue;
}
public static string toHex( byte[] bytes)
{
char[] c = new char[bytes.Length * 2];
byte b;
for (int bx = 0, cx = 0; bx < bytes.Length; ++bx, ++cx)
{
b = ((byte)(bytes[bx] >> 4));
c[cx] = (char)(b > 9 ? b + 0x37 + 0x20 : b + 0x30);
b = ((byte)(bytes[bx] & 0x0F));
c[++cx] = (char)(b > 9 ? b + 0x37 + 0x20 : b + 0x30);
}
return new string(c).ToUpper();
}
public static byte[] hexToBytes( string str)
{
if (str.Length == 0 || str.Length % 2 != 0)
return new byte[0];
byte[] buffer = new byte[str.Length / 2];
char c;
for (int bx = 0, sx = 0; bx < buffer.Length; ++bx, ++sx)
{
// Convert first half of byte
c = str[sx];
buffer[bx] = (byte)((c > '9' ? (c > 'Z' ? (c - 'a' + 10) : (c - 'A' + 10)) : (c - '0')) << 4);
// Convert second half of byte
c = str[++sx];
buffer[bx] |= (byte)(c > '9' ? (c > 'Z' ? (c - 'a' + 10) : (c - 'A' + 10)) : (c - '0'));
}
return buffer;
}
}
}

2
BBWY.Client/APIServices/OrderService.cs

@ -33,7 +33,7 @@ namespace BBWY.Client.APIServices
{ {
orderId, orderId,
startDate, startDate,
EndDate = endDate.Date.AddDays(1).AddSeconds(-1), endDate,
orderState, orderState,
pageIndex, pageIndex,
pageSize, pageSize,

79
BBWY.Client/APIServices/PurchaseOrderService.cs

@ -2,6 +2,7 @@
using BBWY.Common.Http; using BBWY.Common.Http;
using BBWY.Common.Models; using BBWY.Common.Models;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Net.Http; using System.Net.Http;
namespace BBWY.Client.APIServices namespace BBWY.Client.APIServices
@ -48,5 +49,83 @@ namespace BBWY.Client.APIServices
null, null,
HttpMethod.Delete); HttpMethod.Delete);
} }
/// <summary>
/// 预览订单
/// </summary>
/// <param name="consignee"></param>
/// <param name="purchaseSchemeProductSkuList"></param>
/// <returns></returns>
public ApiResponse<PreviewOrderResponse> PreviewPurchaseOrder(Consignee consignee, IList<PurchaseSchemeProductSku> purchaseSchemeProductSkuList, Platform purchasePlatform, PurchaseAccount purchaseAccount, PurchaseOrderMode purchaseOrderMode)
{
return SendRequest<PreviewOrderResponse>(globalContext.BBYWApiHost, "api/purchaseOrder/PreviewPurchaseOrder", new
{
purchaseOrderMode,
consignee,
CargoParamList = purchaseSchemeProductSkuList.Select(sku => new
{
ProductId = sku.PurchaseProductId,
SkuId = sku.PurchaseSkuId,
SpecId = sku.PurchaseSkuSpecId,
Quantity = sku.ItemTotal
}),
Platform = purchasePlatform,
AppKey = purchaseAccount.AppKey,
AppSecret = purchaseAccount.AppSecret,
AppToken = purchaseAccount.AppToken,
SaveResponseLog = true
}, null, HttpMethod.Post);
}
/// <summary>
/// 创建采购单
/// </summary>
/// <param name="consignee"></param>
/// <param name="purchaseSchemeProductSkuList"></param>
/// <param name="purchasePlatform"></param>
/// <param name="purchaseAccount"></param>
/// <param name="tradeMode"></param>
/// <param name="remark"></param>
/// <param name="orderId"></param>
/// <param name="shopId"></param>
/// <param name="buyerAccount"></param>
/// <param name="sellerAccount"></param>
/// <returns></returns>
public ApiResponse<object> FastCreateOrder(Consignee consignee,
IList<PurchaseSchemeProductSku> purchaseSchemeProductSkuList,
Platform purchasePlatform,
PurchaseAccount purchaseAccount,
PurchaseOrderMode purchaseOrderMode,
string tradeMode,
string remark,
string orderId,
long shopId,
string buyerAccount,
string sellerAccount)
{
return SendRequest<object>(globalContext.BBYWApiHost, "api/purchaseOrder/FastCreateOrder", new
{
purchaseOrderMode,
consignee,
CargoParamList = purchaseSchemeProductSkuList.Select(sku => new
{
ProductId = sku.PurchaseProductId,
SkuId = sku.PurchaseSkuId,
SpecId = sku.PurchaseSkuSpecId,
Quantity = sku.ItemTotal
}),
Platform = purchasePlatform,
AppKey = purchaseAccount.AppKey,
AppSecret = purchaseAccount.AppSecret,
AppToken = purchaseAccount.AppToken,
SaveResponseLog = true,
tradeMode,
remark,
orderId,
shopId,
buyerAccount,
sellerAccount
}, null, HttpMethod.Post);
}
} }
} }

1
BBWY.Client/App.xaml

@ -20,6 +20,7 @@
<ctr:MultiObjectConverter x:Key="mobjConverter"/> <ctr:MultiObjectConverter x:Key="mobjConverter"/>
<ctr:WidthConveter x:Key="widthConverter"/> <ctr:WidthConveter x:Key="widthConverter"/>
<ctr:InputNumberConverter x:Key="inputNumberConverter"/> <ctr:InputNumberConverter x:Key="inputNumberConverter"/>
<ctr:EnumToBooleanConverter x:Key="enumToBooleanConverter"/>
</ResourceDictionary> </ResourceDictionary>
</Application.Resources> </Application.Resources>
</Application> </Application>

21
BBWY.Client/Converters/EnumToBooleanConverter.cs

@ -0,0 +1,21 @@
using System;
using System.Globalization;
using System.Windows.Data;
namespace BBWY.Client.Converters
{
public class EnumToBooleanConverter : IValueConverter
{
/// <inheritdoc/>
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value == null ? false : value.Equals(parameter);
}
/// <inheritdoc/>
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value != null && value.Equals(true) ? parameter : Binding.DoNothing;
}
}
}

5
BBWY.Client/Models/APIModel/Response/Order/OrderResponse.cs

@ -86,6 +86,11 @@ namespace BBWY.Client.Models
/// </summary> /// </summary>
public string VenderRemark { get; set; } public string VenderRemark { get; set; }
/// <summary>
/// 采购备注
/// </summary>
public string PurchaseRemark { get; set; }
public StorageType? StorageType { get; set; } public StorageType? StorageType { get; set; }
/// <summary> /// <summary>

9
BBWY.Client/Models/APIModel/Response/PurchaseOrder/OnlinePurchase/OrderTradeTypeResponse.cs

@ -0,0 +1,9 @@
namespace BBWY.Client.Models
{
public class OrderTradeTypeResponse
{
public string Code { get; set; }
public string Name { get; set; }
}
}

25
BBWY.Client/Models/APIModel/Response/PurchaseOrder/OnlinePurchase/PreviewOrderResponse.cs

@ -0,0 +1,25 @@
namespace BBWY.Client.Models
{
public class PreviewOrderResponse
{
/// <summary>
/// 总额
/// </summary>
public decimal TotalAmount { get; set; }
/// <summary>
/// 货款总额
/// </summary>
public decimal ProductAmount { get; set; }
/// <summary>
/// 运费
/// </summary>
public decimal FreightAmount { get; set; }
/// <summary>
/// 交易方式
/// </summary>
public OrderTradeTypeResponse OrderTradeType { get; set; }
}
}

0
BBWY.Client/Models/APIModel/Response/PurchaseOrderResponse.cs → BBWY.Client/Models/APIModel/Response/PurchaseOrder/PurchaseOrderResponse.cs

22
BBWY.Client/Models/APIModel/Response/Shop/ShopResponse.cs

@ -1,4 +1,6 @@
namespace BBWY.Client.Models using System.Collections.Generic;
namespace BBWY.Client.Models
{ {
public class ShopResponse public class ShopResponse
{ {
@ -18,5 +20,23 @@
public string AppToken { get; set; } public string AppToken { get; set; }
public IList<PurchaseAccountResponse> PurchaseList { get; set; }
}
public class PurchaseAccountResponse
{
public long Id { get; set; }
public string AccountName { get; set; }
public long ShopId { get; set; }
public Platform PurchasePlatformId { get; set; }
public string AppKey { get; set; }
public string AppSecret { get; set; }
public string AppToken { get; set; }
} }
} }

9
BBWY.Client/Models/Enums.cs

@ -20,6 +20,15 @@
线 = 1 线 = 1
} }
/// <summary>
/// 采购单模式
/// </summary>
public enum PurchaseOrderMode
{
= 0,
= 1
}
/// <summary> /// <summary>
/// 仓储类型 /// 仓储类型
/// </summary> /// </summary>

8
BBWY.Client/Models/MappingProfile.cs

@ -19,9 +19,11 @@ namespace BBWY.Client.Models
.ForMember(t => t.Name, opt => opt.MapFrom(f => f.UserName)); .ForMember(t => t.Name, opt => opt.MapFrom(f => f.UserName));
CreateMap<ShopResponse, Shop>().ForMember(t => t.ShopId, opt => opt.MapFrom(f => f.ShopId)) CreateMap<ShopResponse, Shop>().ForMember(t => t.ShopId, opt => opt.MapFrom(f => f.ShopId))
.ForMember(t => t.Name, opt => opt.MapFrom(f => f.ShopName)) .ForMember(t => t.Name, opt => opt.MapFrom(f => f.ShopName))
.ForMember(t => t.VenderType, opt => opt.MapFrom(f => f.ShopType)) .ForMember(t => t.VenderType, opt => opt.MapFrom(f => f.ShopType))
.ForMember(t => t.Platform, opt => opt.MapFrom(f => f.PlatformId)); .ForMember(t => t.Platform, opt => opt.MapFrom(f => f.PlatformId))
.ForMember(t => t.PurchaseAccountList, opt => opt.MapFrom(f => f.PurchaseList));
CreateMap<PurchaseAccountResponse, PurchaseAccount>();
CreateMap<PurchaseOrderResponse, PurchaseOrder>(); CreateMap<PurchaseOrderResponse, PurchaseOrder>();
CreateMap<ToDayOrderAchievementResponse, ToDayOrderAchievement>(); CreateMap<ToDayOrderAchievementResponse, ToDayOrderAchievement>();

5
BBWY.Client/Models/Order/Order.cs

@ -93,7 +93,10 @@ namespace BBWY.Client.Models
/// </summary> /// </summary>
public string VenderRemark { get; set; } public string VenderRemark { get; set; }
/// <summary>
/// 采购备注
/// </summary>
public string PurchaseRemark { get; set; }
/// <summary> /// <summary>
/// 仓储类型 /// 仓储类型

19
BBWY.Client/Models/Order/RelationPurchaseOrderSku.cs

@ -5,6 +5,12 @@ namespace BBWY.Client.Models
{ {
public class RelationPurchaseOrderSku : NotifyObject public class RelationPurchaseOrderSku : NotifyObject
{ {
public RelationPurchaseOrderSku()
{
SingleSkuAmountStr = (0).ToString();
}
private string singleSkuAmountStr;
private decimal singleSkuAmount; private decimal singleSkuAmount;
private decimal skuAmount; private decimal skuAmount;
@ -18,6 +24,18 @@ namespace BBWY.Client.Models
public string Title { get; set; } public string Title { get; set; }
public string SingleSkuAmountStr
{
get => singleSkuAmountStr; set
{
if (Set(ref singleSkuAmountStr, value))
{
if (decimal.TryParse(value, out decimal d))
SingleSkuAmount = d;
}
}
}
public decimal SingleSkuAmount public decimal SingleSkuAmount
{ {
get => singleSkuAmount; get => singleSkuAmount;
@ -41,5 +59,6 @@ namespace BBWY.Client.Models
[JsonIgnore] [JsonIgnore]
public Action OnSkuAmountChanged { get; set; } public Action OnSkuAmountChanged { get; set; }
} }
} }

11
BBWY.Client/Models/Shop/Shop.cs

@ -1,4 +1,6 @@
namespace BBWY.Client.Models using System.Collections.Generic;
namespace BBWY.Client.Models
{ {
public class Shop : NotifyObject public class Shop : NotifyObject
{ {
@ -26,5 +28,12 @@
public string AppToken { get; set; } public string AppToken { get; set; }
public string Name { get => name; set { Set(ref name, value); } } public string Name { get => name; set { Set(ref name, value); } }
public IList<PurchaseAccount> PurchaseAccountList { get; set; }
}
public class PurchaseAccount : PurchaseAccountResponse
{
} }
} }

25
BBWY.Client/ViewModels/Order/ChoosePurchaseSchemeViewModel.cs

@ -5,6 +5,7 @@ using BBWY.Common.Models;
using GalaSoft.MvvmLight.Command; using GalaSoft.MvvmLight.Command;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows; using System.Windows;
using System.Windows.Input; using System.Windows.Input;
@ -21,6 +22,8 @@ namespace BBWY.Client.ViewModels
public string OrderId { get; set; } public string OrderId { get; set; }
public int ItemTotal { get; set; } public int ItemTotal { get; set; }
public Consignee Consignee { get; set; }
public IList<PurchaseScheme> PurchaseSchemeList { get; set; } public IList<PurchaseScheme> PurchaseSchemeList { get; set; }
@ -49,15 +52,17 @@ namespace BBWY.Client.ViewModels
{ {
this.ItemTotal = 0; this.ItemTotal = 0;
this.OrderId = this.SkuId = this.SkuName = string.Empty; this.OrderId = this.SkuId = this.SkuName = string.Empty;
this.Consignee = null;
PurchaseSchemeList.Clear(); PurchaseSchemeList.Clear();
} }
public void SetData(string orderId, string skuId, string skuName, int itemTotal) public void SetData(string orderId, string skuId, string skuName, int itemTotal, Consignee consignee)
{ {
this.OrderId = orderId; this.OrderId = orderId;
this.SkuId = skuId; this.SkuId = skuId;
this.SkuName = skuName; this.SkuName = skuName;
this.ItemTotal = itemTotal; this.ItemTotal = itemTotal;
this.Consignee = consignee;
} }
public void LoadPurchaseScheme(string skuId) public void LoadPurchaseScheme(string skuId)
@ -102,8 +107,22 @@ namespace BBWY.Client.ViewModels
public void PreviewPurchase(PurchaseScheme purchaseScheme) public void PreviewPurchase(PurchaseScheme purchaseScheme)
{ {
var p = new _1688Purchase(this.OrderId, this.ItemTotal, purchaseScheme); var count = globalContext.User.Shop.PurchaseAccountList == null ? 0 : globalContext.User.Shop.PurchaseAccountList.Count();
p.ShowDialog(); if (count > 1)
{
//选择采购账号
}
else if (count == 1)
{
GalaSoft.MvvmLight.Messaging.Messenger.Default.Send<object>(null, "ChoosePurchaseScheme_Close");
var p = new _1688Purchase(this.OrderId, this.ItemTotal, purchaseScheme, globalContext.User.Shop.PurchaseAccountList[0], this.Consignee);
p.ShowDialog();
}
else
{
MessageBox.Show("缺少采购账号", "提示");
return;
}
} }
} }
} }

39
BBWY.Client/ViewModels/Order/OrderListViewModel.cs

@ -101,23 +101,36 @@ namespace BBWY.Client.ViewModels
this.choosePurchaseSchemeViewModel = choosePurchaseSchemeViewModel; this.choosePurchaseSchemeViewModel = choosePurchaseSchemeViewModel;
OrderList = new ObservableCollection<Order>(); OrderList = new ObservableCollection<Order>();
EndDate = DateTime.Now; EndDate = DateTime.Now;
StartDate = DateTime.Now.Date.AddDays(-29); StartDate = DateTime.Now.Date.AddDays(-6);
ToDayOrderAchievement = new ToDayOrderAchievement(); ToDayOrderAchievement = new ToDayOrderAchievement();
SetOrderStateCommand = new RelayCommand<OrderState?>(SetOrderState); SetOrderStateCommand = new RelayCommand<OrderState?>(SetOrderState);
SearchOrderCommand = new RelayCommand(() => SearchOrderCommand = new RelayCommand(() =>
{ {
PageIndex = 1; PageIndex = 1;
Task.Factory.StartNew(() => LoadOrder(1)); Task.Factory.StartNew(() => LoadOrder(1)); //手动点击查询订单
Task.Factory.StartNew(() => LoadTodayAchievement(StartDate, EndDate)); Task.Factory.StartNew(() => LoadTodayAchievement(StartDate, EndDate));
}); });
CopyTextCommand = new RelayCommand<string>(s => Clipboard.SetText(s)); CopyTextCommand = new RelayCommand<string>(s =>
{
try
{
Clipboard.SetText(s);
}
catch (Exception ex)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(ex);
Console.ResetColor();
}
}
);
CopyOrderWaybillCommand = new RelayCommand<Order>(o => Clipboard.SetText(o.WaybillNo)); CopyOrderWaybillCommand = new RelayCommand<Order>(o => Clipboard.SetText(o.WaybillNo));
SetSearchDateCommand = new RelayCommand<int>(d => SetSearchDateCommand = new RelayCommand<int>(d =>
{ {
EndDate = d == 1 ? DateTime.Now.Date.AddDays(-1) : DateTime.Now; EndDate = d == 1 ? DateTime.Now.Date.AddDays(-1) : DateTime.Now;
StartDate = DateTime.Now.Date.AddDays(d * -1); StartDate = DateTime.Now.Date.AddDays(d * -1);
PageIndex = 1; PageIndex = 1;
Task.Factory.StartNew(() => LoadOrder(1)); Task.Factory.StartNew(() => LoadOrder(1)); //点击日期查询订单
Task.Factory.StartNew(() => LoadTodayAchievement(StartDate, EndDate)); Task.Factory.StartNew(() => LoadTodayAchievement(StartDate, EndDate));
}); });
OrderPageIndexChangedCommand = new RelayCommand<PageArgs>(p => OrderPageIndexChangedCommand = new RelayCommand<PageArgs>(p =>
@ -141,9 +154,14 @@ namespace BBWY.Client.ViewModels
SearchSku = String.Empty; SearchSku = String.Empty;
SearchWaybill = String.Empty; SearchWaybill = String.Empty;
EndDate = DateTime.Now; EndDate = DateTime.Now;
StartDate = DateTime.Now.Date.AddDays(-29); StartDate = DateTime.Now.Date.AddDays(-6);
PageIndex = 1; PageIndex = 1;
Task.Factory.StartNew(() => LoadOrder(1)); Task.Factory.StartNew(() => LoadOrder(1)); //选择状态查询订单
}
public void RefreshOrder()
{
Task.Factory.StartNew(() => LoadOrder(PageIndex));
} }
private void LoadOrder(int pageIndex) private void LoadOrder(int pageIndex)
@ -257,7 +275,7 @@ namespace BBWY.Client.ViewModels
} }
else if (chooseDFType.DFType == DFType.线) else if (chooseDFType.DFType == DFType.线)
{ {
choosePurchaseSchemeViewModel.SetData(order.Id, order.ItemList[0].Id, order.ItemList[0].Title, order.ItemList[0].ItemTotal); choosePurchaseSchemeViewModel.SetData(order.Id, order.ItemList[0].Id, order.ItemList[0].Title, order.ItemList[0].ItemTotal, order.Consignee);
var choosePurchaseScheme = new ChoosePurchaseScheme(); var choosePurchaseScheme = new ChoosePurchaseScheme();
choosePurchaseScheme.ShowDialog(); choosePurchaseScheme.ShowDialog();
} }
@ -282,7 +300,7 @@ namespace BBWY.Client.ViewModels
App.Current.Dispatcher.Invoke(() => MessageBox.Show(response.Msg, "关联采购订单")); App.Current.Dispatcher.Invoke(() => MessageBox.Show(response.Msg, "关联采购订单"));
return; return;
} }
LoadOrder(PageIndex); //手动计算成功刷新订单列表 LoadOrder(PageIndex); //关联订单刷新订单列表
}); });
} }
@ -316,7 +334,7 @@ namespace BBWY.Client.ViewModels
App.Current.Dispatcher.Invoke(() => MessageBox.Show(response.Msg, "设置刷单成本")); App.Current.Dispatcher.Invoke(() => MessageBox.Show(response.Msg, "设置刷单成本"));
return; return;
} }
LoadOrder(PageIndex); //手动计算成功刷新订单列表 LoadOrder(PageIndex); //设置刷单刷新订单列表
}); });
} }
@ -333,7 +351,8 @@ namespace BBWY.Client.ViewModels
SkuId = osku.Id, SkuId = osku.Id,
Quantity = osku.ItemTotal, Quantity = osku.ItemTotal,
Title = osku.Title, Title = osku.Title,
SingleSkuAmount = (order.OrderCostDetailList.FirstOrDefault(ocd => ocd.SkuId == osku.Id)?.SkuAmount / osku.ItemTotal) ?? 0 SingleSkuAmount = (order.OrderCostDetailList.FirstOrDefault(ocd => ocd.SkuId == osku.Id)?.SkuAmount / osku.ItemTotal) ?? 0,
SingleSkuAmountStr = ((order.OrderCostDetailList.FirstOrDefault(ocd => ocd.SkuId == osku.Id)?.SkuAmount / osku.ItemTotal) ?? 0).ToString()
}).ToList()); }).ToList());
relationPurchaseOrder.Closed += RelationPurchaseOrder_Closed; relationPurchaseOrder.Closed += RelationPurchaseOrder_Closed;
relationPurchaseOrder.ShowDialog(); relationPurchaseOrder.ShowDialog();

165
BBWY.Client/ViewModels/Purchase/1688PreviewPurchaseViewModel.cs

@ -1,6 +1,7 @@
using BBWY.Client.APIServices; using BBWY.Client.APIServices;
using BBWY.Client.Models; using BBWY.Client.Models;
using BBWY.Common.Trigger; using BBWY.Common.Trigger;
using GalaSoft.MvvmLight.Command;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -8,35 +9,92 @@ using System.Collections.ObjectModel;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
namespace BBWY.Client.ViewModels namespace BBWY.Client.ViewModels
{ {
public class _1688PreviewPurchaseViewModel : BaseVM public class _1688PreviewPurchaseViewModel : BaseVM
{ {
public ICommand FastCreateOrderCommand { get; set; }
public IList<PurchaseSchemeProductSku> PurchaseSchemeProductSkuList { get; set; } public IList<PurchaseSchemeProductSku> PurchaseSchemeProductSkuList { get; set; }
public PurchaseScheme PurchaseScheme { get; set; } public PurchaseScheme PurchaseScheme { get; set; }
public PurchaseAccount PurchaseAccount { get; set; }
public bool IsLoading { get => isLoading; set { Set(ref isLoading, value); } } public bool IsLoading { get => isLoading; set { Set(ref isLoading, value); } }
public decimal ProductAmount { get => productAmount; set { Set(ref productAmount, value); } }
public decimal FreightAmount { get => freightAmount; set { Set(ref freightAmount, value); } }
public decimal TotalAmount { get => totalAmount; set { Set(ref totalAmount, value); } }
public string ContactName { get => contactName; set { Set(ref contactName, value); } }
public string Address { get => address; set { Set(ref address, value); } }
public string Mobile { get => mobile; set { Set(ref mobile, value); } }
public string Province { get => province; set { Set(ref province, value); } }
public string City { get => city; set { Set(ref city, value); } }
public string County { get => county; set { Set(ref county, value); } }
public string Town { get => town; set { Set(ref town, value); } }
public string PrucahseRemark { get => prucahseRemark; set { Set(ref prucahseRemark, value); } }
public PurchaseOrderMode PurchaseOrderMode
{
get => purchaseOrderMode; set
{
if (Set(ref purchaseOrderMode, value))
OnDelayTriggerExecute(Guid.NewGuid().ToString());
}
}
private OrderListViewModel orderListViewModel;
private GlobalContext globalContext;
private string orderId; private string orderId;
private int skuItemCount; private int skuItemCount;
private bool isLoading; private bool isLoading;
private OneBoundAPIService oneBoundAPIService; private OneBoundAPIService oneBoundAPIService;
private PurchaseOrderService purchaseOrderService;
private DelayTrigger delayTrigger; private DelayTrigger delayTrigger;
public _1688PreviewPurchaseViewModel(OneBoundAPIService oneBoundAPIService) private decimal productAmount;
private decimal freightAmount;
private decimal totalAmount;
private string contactName;
private string address;
private string mobile;
private string province;
private string city;
private string county;
private string town;
private string prucahseRemark;
private PurchaseOrderMode purchaseOrderMode = PurchaseOrderMode.;
private string tradeMode;
public _1688PreviewPurchaseViewModel(OneBoundAPIService oneBoundAPIService, PurchaseOrderService purchaseOrderService, GlobalContext globalContext, OrderListViewModel orderListViewModel)
{ {
this.oneBoundAPIService = oneBoundAPIService; this.oneBoundAPIService = oneBoundAPIService;
this.purchaseOrderService = purchaseOrderService;
this.delayTrigger = new DelayTrigger(); this.delayTrigger = new DelayTrigger();
this.delayTrigger.OnExecute = OnDelayTriggerExecute; this.delayTrigger.OnExecute = OnDelayTriggerExecute;
PurchaseSchemeProductSkuList = new ObservableCollection<PurchaseSchemeProductSku>(); PurchaseSchemeProductSkuList = new ObservableCollection<PurchaseSchemeProductSku>();
FastCreateOrderCommand = new RelayCommand(FastCreateOrder);
this.globalContext = globalContext;
this.orderListViewModel = orderListViewModel;
//PurchaseOrderMode = PurchaseOrderMode.代发;
} }
public void SetData(string orderId, int skuItemCount, PurchaseScheme purchaseScheme) public void SetData(string orderId, int skuItemCount, PurchaseScheme purchaseScheme, PurchaseAccount purchaseAccount, Consignee consignee)
{ {
this.orderId = orderId; this.orderId = orderId;
this.skuItemCount = skuItemCount; this.skuItemCount = skuItemCount;
this.PurchaseScheme = purchaseScheme; this.PurchaseScheme = purchaseScheme;
this.PurchaseAccount = purchaseAccount;
this.ContactName = consignee.ContactName;
this.Address = consignee.Address;
this.Province = consignee.Province;
this.City = consignee.City;
this.County = consignee.County;
this.Town = consignee.Town;
//this.Mobile = consignee.Mobile;
} }
protected override void Load() protected override void Load()
@ -53,7 +111,14 @@ namespace BBWY.Client.ViewModels
Task.Factory.StartNew(() => Task.Factory.StartNew(() =>
{ {
WaitHandle.WaitAll(waitList.ToArray()); WaitHandle.WaitAll(waitList.ToArray());
IsLoading = false; //IsLoading = false;
if (PurchaseSchemeProductSkuList.Count() > 0)
OnDelayTriggerExecute(Guid.NewGuid().ToString());
else
{
IsLoading = false;
App.Current.Dispatcher.Invoke(() => MessageBox.Show("采购方案商品加载失败,请重新打开预览窗口", "提示"));
}
}); });
} }
@ -62,7 +127,11 @@ namespace BBWY.Client.ViewModels
PurchaseSchemeProductSkuList.Clear(); PurchaseSchemeProductSkuList.Clear();
PurchaseScheme = null; PurchaseScheme = null;
orderId = string.Empty; orderId = string.Empty;
tradeMode = string.Empty;
skuItemCount = 0; skuItemCount = 0;
ProductAmount = FreightAmount = TotalAmount = 0;
ContactName = Address = Mobile = Province = City = County = Town = PrucahseRemark = string.Empty;
} }
private void LoadPurchaseProduct(PurchaseSchemeProduct purchaseSchemeProduct, ManualResetEvent ewh) private void LoadPurchaseProduct(PurchaseSchemeProduct purchaseSchemeProduct, ManualResetEvent ewh)
@ -70,7 +139,7 @@ namespace BBWY.Client.ViewModels
var purchaseSchemeProductSkuList = LoadPurchaseProductCore(purchaseSchemeProduct.PurchaseProductId, out string errorMsg); var purchaseSchemeProductSkuList = LoadPurchaseProductCore(purchaseSchemeProduct.PurchaseProductId, out string errorMsg);
if (purchaseSchemeProductSkuList != null && purchaseSchemeProductSkuList.Count > 0) if (purchaseSchemeProductSkuList != null && purchaseSchemeProductSkuList.Count > 0)
{ {
App.Current.Dispatcher.BeginInvoke((Action)delegate App.Current.Dispatcher.Invoke(() =>
{ {
foreach (var purchaseSchemeProductSku in purchaseSchemeProductSkuList) foreach (var purchaseSchemeProductSku in purchaseSchemeProductSkuList)
{ {
@ -85,7 +154,6 @@ namespace BBWY.Client.ViewModels
} }
ewh.Set(); ewh.Set();
ewh.Dispose(); ewh.Dispose();
} }
private IList<PurchaseSchemeProductSku> LoadPurchaseProductCore(string purchseProductId, out string errorMsg) private IList<PurchaseSchemeProductSku> LoadPurchaseProductCore(string purchseProductId, out string errorMsg)
@ -98,6 +166,7 @@ namespace BBWY.Client.ViewModels
//记录日志 //记录日志
errorMsg = response.Msg; errorMsg = response.Msg;
Console.WriteLine(errorMsg);
return null; return null;
} }
var jobject = response.Data; var jobject = response.Data;
@ -153,7 +222,93 @@ namespace BBWY.Client.ViewModels
private void OnDelayTriggerExecute(string key) private void OnDelayTriggerExecute(string key)
{ {
if (string.IsNullOrEmpty(key))
return;
IsLoading = true;
Task.Factory.StartNew(() => purchaseOrderService.PreviewPurchaseOrder(new Consignee()
{
Address = Address,
City = City,
ContactName = ContactName,
County = County,
Mobile = Mobile,
Province = Province,
TelePhone = Mobile,
Town = Town
}, PurchaseSchemeProductSkuList, Platform., PurchaseAccount, PurchaseOrderMode))
.ContinueWith(t =>
{
IsLoading = false;
var r = t.Result;
if (!r.Success)
{
ProductAmount = FreightAmount = TotalAmount = 0;
tradeMode = string.Empty;
App.Current.Dispatcher.Invoke(() => MessageBox.Show(r.Msg, "预览订单报价"));
return;
}
ProductAmount = r.Data.ProductAmount;
FreightAmount = r.Data.FreightAmount;
TotalAmount = r.Data.TotalAmount;
tradeMode = r.Data.OrderTradeType?.Code;
});
}
private void FastCreateOrder()
{
if (TotalAmount == 0)
{
MessageBox.Show("总金额为0不能提交订单", "提示");
return;
}
if (string.IsNullOrEmpty(Mobile) ||
string.IsNullOrEmpty(Address) ||
string.IsNullOrEmpty(City) ||
string.IsNullOrEmpty(Province) ||
string.IsNullOrEmpty(County) ||
string.IsNullOrEmpty(Town) ||
string.IsNullOrEmpty(ContactName))
{
MessageBox.Show("收货人信息不全", "下单");
return;
}
IsLoading = true;
Task.Factory.StartNew(() => purchaseOrderService.FastCreateOrder(new Consignee()
{
Address = Address,
City = City,
ContactName = ContactName,
County = County,
Mobile = Mobile,
Province = Province,
TelePhone = Mobile,
Town = Town
}, PurchaseSchemeProductSkuList,
Platform.,
PurchaseAccount,
PurchaseOrderMode,
tradeMode,
PrucahseRemark,
orderId,
globalContext.User.Shop.ShopId,
PurchaseAccount.AccountName,
PurchaseScheme.PurchaserName)).ContinueWith(t =>
{
IsLoading = false;
var r = t.Result;
if (!r.Success)
{
App.Current.Dispatcher.Invoke(() => MessageBox.Show(r.Msg, "下单"));
return;
}
//刷新订单列表
orderListViewModel.RefreshOrder();
//关闭当前窗口
GalaSoft.MvvmLight.Messaging.Messenger.Default.Send<object>(null, "OnlinePurchase_Close");
});
} }
} }
} }

7
BBWY.Client/ViewModels/Ware/BindingPurchaseProductViewModel.cs

@ -98,8 +98,8 @@ namespace BBWY.Client.ViewModels
var waitList = new List<EventWaitHandle>(); var waitList = new List<EventWaitHandle>();
foreach (var sku in ProductSkuList) foreach (var sku in ProductSkuList)
{ {
//当前SKU下当前采购商的采购方案 //当前SKU下当前采购商的采购方案
var apiScheme = purchaseSchemeList.FirstOrDefault(s => s.SkuId == sku.Id && s.PurchaserId == PurchaserId); var apiScheme = purchaseSchemeList.FirstOrDefault(s => s.SkuId == sku.Id && s.PurchaserId == PurchaserId);
if (apiScheme == null) if (apiScheme == null)
continue; continue;
@ -246,6 +246,7 @@ namespace BBWY.Client.ViewModels
productSku.SelectedPurchaseScheme.PurchaseSchemeProductList.Add(new PurchaseSchemeProduct() productSku.SelectedPurchaseScheme.PurchaseSchemeProductList.Add(new PurchaseSchemeProduct()
{ {
Id = DateTime.Now.ToFileTime(),
IsEditing = true, IsEditing = true,
ProductId = productSku.ProductId, ProductId = productSku.ProductId,
SkuId = productSku.Id SkuId = productSku.Id
@ -280,7 +281,7 @@ namespace BBWY.Client.ViewModels
} }
var sku = ProductSkuList.FirstOrDefault(s => s.Id == purchaseSchemeProduct.SkuId); var sku = ProductSkuList.FirstOrDefault(s => s.Id == purchaseSchemeProduct.SkuId);
var purchaseUrl = match.Groups[1].Value; var purchaseUrl = match.Groups[1].Value;
if (sku.SelectedPurchaseScheme.PurchaseSchemeProductList.Any(p => p.PurchaseUrl == purchaseUrl)) if (sku.SelectedPurchaseScheme.PurchaseSchemeProductList.Any(p => p.Id != purchaseSchemeProduct.Id && p.PurchaseUrl == purchaseUrl))
{ {
MessageBox.Show("商品链接重复"); MessageBox.Show("商品链接重复");
return; return;

13
BBWY.Client/Views/Order/ChoosePurchaseScheme.xaml.cs

@ -1,4 +1,5 @@
using BBWY.Controls; using BBWY.Controls;
using GalaSoft.MvvmLight.Messaging;
namespace BBWY.Client.Views.Order namespace BBWY.Client.Views.Order
{ {
@ -10,6 +11,18 @@ namespace BBWY.Client.Views.Order
public ChoosePurchaseScheme() public ChoosePurchaseScheme()
{ {
InitializeComponent(); InitializeComponent();
this.Loaded += ChoosePurchaseScheme_Loaded;
this.Unloaded += ChoosePurchaseScheme_Unloaded;
}
private void ChoosePurchaseScheme_Unloaded(object sender, System.Windows.RoutedEventArgs e)
{
Messenger.Default.Unregister(this);
}
private void ChoosePurchaseScheme_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
Messenger.Default.Register<object>(this, "ChoosePurchaseScheme_Close", (x) => this.Close());
} }
} }
} }

2
BBWY.Client/Views/Order/OrderList.xaml

@ -476,7 +476,7 @@
<StackPanel Grid.Column="3" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0,0,0,10"> <StackPanel Grid.Column="3" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0,0,0,10">
<TextBlock> <TextBlock>
<Run Text="实金额"/> <Run Text="实金额"/>
<Run Text="{Binding OrderPayment}"/> <Run Text="{Binding OrderPayment}"/>
</TextBlock> </TextBlock>

2
BBWY.Client/Views/Order/RelationPurchaseOrder.xaml

@ -123,7 +123,7 @@
TextWrapping="Wrap"/> TextWrapping="Wrap"/>
</StackPanel> </StackPanel>
<c:BTextBox Grid.Column="1" Margin="5,0" <c:BTextBox Grid.Column="1" Margin="5,0"
Text="{Binding SingleSkuAmount,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,Converter={StaticResource inputNumberConverter}}"/> Text="{Binding SingleSkuAmountStr,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
<TextBlock Text="{Binding Quantity}" Grid.Column="2" Style="{StaticResource middleTextBlock}"/> <TextBlock Text="{Binding Quantity}" Grid.Column="2" Style="{StaticResource middleTextBlock}"/>

43
BBWY.Client/Views/Purchase/1688Purchase.xaml

@ -4,6 +4,7 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:BBWY.Client.Views.Purchase" xmlns:local="clr-namespace:BBWY.Client.Views.Purchase"
xmlns:cmodel="clr-namespace:BBWY.Client.Models"
xmlns:c="clr-namespace:BBWY.Controls;assembly=BBWY.Controls" xmlns:c="clr-namespace:BBWY.Controls;assembly=BBWY.Controls"
xmlns:b="http://schemas.microsoft.com/xaml/behaviors" xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
mc:Ignorable="d" mc:Ignorable="d"
@ -28,6 +29,9 @@
<RowDefinition Height="100"/> <RowDefinition Height="100"/>
<RowDefinition Height="40"/> <RowDefinition Height="40"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<c:RoundWaitProgress Play="{Binding IsLoading}" Panel.ZIndex="999" Grid.RowSpan="5"/>
<Border BorderThickness="0,0,0,1" BorderBrush="{StaticResource MainMenu.BorderBrush}" <Border BorderThickness="0,0,0,1" BorderBrush="{StaticResource MainMenu.BorderBrush}"
Background="{StaticResource Border.Background}"> Background="{StaticResource Border.Background}">
<TextBlock Text="提交订单" HorizontalAlignment="Center" VerticalAlignment="Center"/> <TextBlock Text="提交订单" HorizontalAlignment="Center" VerticalAlignment="Center"/>
@ -77,7 +81,7 @@
<ColumnDefinition Width="0.8*"/> <ColumnDefinition Width="0.8*"/>
<ColumnDefinition Width="0.2*"/> <ColumnDefinition Width="0.2*"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<c:BTextBox Text="留言信息" <c:BTextBox Text="{Binding PrucahseRemark,Mode=OneWayToSource,UpdateSourceTrigger=PropertyChanged}"
WaterRemark="留言信息" WaterRemark="留言信息"
Height="60" Height="60"
VerticalContentAlignment="Top" VerticalContentAlignment="Top"
@ -85,26 +89,49 @@
TextWrapping="Wrap"/> TextWrapping="Wrap"/>
<TextBlock Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"> <TextBlock Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center">
<Run Text="货品总运费"/> <Run Text="货品总运费"/>
<Run Text="132.3" Foreground="#EC808D"/> <Run Text="{Binding ProductAmount,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}" Foreground="#EC808D"/>
<Run Text="元"/> <Run Text="元"/>
<LineBreak/> <LineBreak/>
<Run Text="运费共计"/> <Run Text="运费共计"/>
<Run Text="20" Foreground="#EC808D"/> <Run Text="{Binding FreightAmount,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}" Foreground="#EC808D"/>
<Run Text="元"/> <Run Text="元"/>
</TextBlock> </TextBlock>
</Grid> </Grid>
<StackPanel HorizontalAlignment="Stretch" VerticalAlignment="Center" Grid.Row="3" Margin="5,0"> <StackPanel HorizontalAlignment="Stretch" VerticalAlignment="Center" Grid.Row="3" Margin="5,0">
<c:BTextBox Text="收货人" WaterRemark="收货人"/> <c:BTextBox Text="{Binding ContactName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" WaterRemark="收货人"/>
<c:BTextBox Text="福建泉州鲤城区浮桥街龙景华庭B栋1008" Margin="0,2.5" WaterRemark="地址"/> <Grid>
<c:BTextBox Text="18996038927" WaterRemark="电话"/> <Grid.ColumnDefinitions>
<ColumnDefinition Width="80"/>
<ColumnDefinition Width="80"/>
<ColumnDefinition Width="80"/>
<ColumnDefinition Width="80"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<c:BTextBox Text="{Binding Province,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" WaterRemark="省" BorderThickness="1,1,0,1"/>
<c:BTextBox Text="{Binding City,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" WaterRemark="市" Grid.Column="1" BorderThickness="1,1,0,1"/>
<c:BTextBox Text="{Binding County,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" WaterRemark="区/县" Grid.Column="2" BorderThickness="1,1,0,1"/>
<c:BTextBox Text="{Binding Town,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" WaterRemark="镇" Grid.Column="3" BorderThickness="1,1,0,1"/>
<c:BTextBox Text="{Binding Address,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Margin="0,2.5" WaterRemark="街道地址" Grid.Column="4"/>
</Grid>
<c:BTextBox Text="{Binding Mobile,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" WaterRemark="电话"/>
</StackPanel> </StackPanel>
<TextBlock Grid.Row="4" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="5,0,0,0" FontSize="16"> <TextBlock Grid.Row="4" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="5,0,0,0" FontSize="16">
<Run Text="应付总额(含运费)"/> <Run Text="应付总额(含运费)"/>
<Run Text="163.3" Foreground="#EC808D"/> <Run Text="{Binding TotalAmount,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}" Foreground="#EC808D"/>
<Run Text="元"/> <Run Text="元"/>
</TextBlock> </TextBlock>
<c:BButton Content="提交订单" Grid.Row="4" Width="80" HorizontalAlignment="Right" Margin="0,0,5,0"/> <StackPanel Orientation="Horizontal" Grid.Row="4" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0,0,100,0">
<RadioButton Content="批发" Padding="0" VerticalContentAlignment="Center"
GroupName="OrderMode"
IsChecked="{Binding PurchaseOrderMode,Converter={StaticResource enumToBooleanConverter},ConverterParameter={x:Static cmodel:PurchaseOrderMode.批发}}"/>
<RadioButton Content="分销" Padding="0" VerticalContentAlignment="Center" Margin="5,0,0,0"
GroupName="OrderMode"
IsChecked="{Binding PurchaseOrderMode,Converter={StaticResource enumToBooleanConverter},ConverterParameter={x:Static cmodel:PurchaseOrderMode.代发}}"/>
</StackPanel>
<c:BButton Content="提交订单" Grid.Row="4" Width="80" HorizontalAlignment="Right" Margin="0,0,5,0"
Command="{Binding FastCreateOrderCommand}"/>
</Grid> </Grid>
</c:BWindow> </c:BWindow>

17
BBWY.Client/Views/Purchase/1688Purchase.xaml.cs

@ -1,6 +1,7 @@
using BBWY.Client.Models; using BBWY.Client.Models;
using BBWY.Client.ViewModels; using BBWY.Client.ViewModels;
using BBWY.Controls; using BBWY.Controls;
using GalaSoft.MvvmLight.Messaging;
namespace BBWY.Client.Views.Purchase namespace BBWY.Client.Views.Purchase
{ {
@ -9,10 +10,22 @@ namespace BBWY.Client.Views.Purchase
/// </summary> /// </summary>
public partial class _1688Purchase : BWindow public partial class _1688Purchase : BWindow
{ {
public _1688Purchase(string orderId, int skuItemCount, PurchaseScheme purchaseScheme) public _1688Purchase(string orderId, int skuItemCount, PurchaseScheme purchaseScheme, PurchaseAccount purchaseAccount, Consignee consignee)
{ {
InitializeComponent(); InitializeComponent();
(this.DataContext as _1688PreviewPurchaseViewModel).SetData(orderId, skuItemCount, purchaseScheme); (this.DataContext as _1688PreviewPurchaseViewModel).SetData(orderId, skuItemCount, purchaseScheme, purchaseAccount, consignee);
this.Loaded += _1688Purchase_Loaded;
this.Unloaded += _1688Purchase_Unloaded;
}
private void _1688Purchase_Unloaded(object sender, System.Windows.RoutedEventArgs e)
{
Messenger.Default.Unregister(this);
}
private void _1688Purchase_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
Messenger.Default.Register<object>(this, "OnlinePurchase_Close", (x) => this.Dispatcher.Invoke(() => this.Close()));
} }
} }
} }

10
BBWY.Server.API/Controllers/OrderController.cs

@ -88,6 +88,16 @@ namespace BBWY.Server.API.Controllers
orderBusiness.OutStock(outStockRequest); orderBusiness.OutStock(outStockRequest);
} }
/// <summary>
/// 指定时间范围的订单同步
/// </summary>
/// <param name="syncOrderByDateRequest"></param>
[HttpPost]
public void SyncOrderByDate([FromBody] SyncOrderByDateRequest syncOrderByDateRequest)
{
orderBusiness.SyncOrderByDate(syncOrderByDateRequest);
}
/// <summary> /// <summary>
/// 订单同步 /// 订单同步
/// </summary> /// </summary>

13
BBWY.Server.API/Controllers/PlatformSDKController.cs

@ -115,9 +115,20 @@ namespace BBWY.Server.API.Controllers
/// </summary> /// </summary>
/// <param name="outStockRequest"></param> /// <param name="outStockRequest"></param>
[HttpPost] [HttpPost]
public void OutStock(OutStockRequest outStockRequest) public void OutStock([FromBody]OutStockRequest outStockRequest)
{ {
platformSDKBusinessList.FirstOrDefault(p => p.Platform == outStockRequest.Platform).OutStock(outStockRequest); platformSDKBusinessList.FirstOrDefault(p => p.Platform == outStockRequest.Platform).OutStock(outStockRequest);
} }
/// <summary>
/// 订单预览
/// </summary>
/// <param name="previewOrderReuqest"></param>
/// <returns></returns>
[HttpPost]
public PreviewOrderResponse PreviewOrder([FromBody]PreviewOrderReuqest previewOrderReuqest)
{
return platformSDKBusinessList.FirstOrDefault(p => p.Platform == previewOrderReuqest.Platform).PreviewOrder(previewOrderReuqest);
}
} }
} }

26
BBWY.Server.API/Controllers/PurchaseOrderController.cs

@ -2,7 +2,9 @@
using BBWY.Server.Model.Dto; using BBWY.Server.Model.Dto;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
namespace BBWY.Server.API.Controllers namespace BBWY.Server.API.Controllers
{ {
@ -10,7 +12,8 @@ namespace BBWY.Server.API.Controllers
{ {
private PurchaseOrderBusiness purchaseOrderBusiness; private PurchaseOrderBusiness purchaseOrderBusiness;
public PurchaseOrderController(PurchaseOrderBusiness purchaseOrderBusiness, IHttpContextAccessor httpContextAccessor) : base(httpContextAccessor) public PurchaseOrderController(PurchaseOrderBusiness purchaseOrderBusiness,
IHttpContextAccessor httpContextAccessor) : base(httpContextAccessor)
{ {
this.purchaseOrderBusiness = purchaseOrderBusiness; this.purchaseOrderBusiness = purchaseOrderBusiness;
} }
@ -38,5 +41,26 @@ namespace BBWY.Server.API.Controllers
{ {
purchaseOrderBusiness.DeletePurchaseOrder(id); purchaseOrderBusiness.DeletePurchaseOrder(id);
} }
/// <summary>
/// 订单预览
/// </summary>
/// <param name="previewOrderReuqest"></param>
/// <returns></returns>
[HttpPost]
public PreviewOrderResponse PreviewPurchaseOrder([FromBody] PreviewOrderReuqest previewOrderReuqest)
{
return purchaseOrderBusiness.PreviewPurchaseOrder(previewOrderReuqest);
}
/// <summary>
/// 创建在线采购单
/// </summary>
/// <param name="createOnlinePurchaseOrderRequest"></param>
[HttpPost]
public void FastCreateOrder([FromBody]CreateOnlinePurchaseOrderRequest createOnlinePurchaseOrderRequest)
{
purchaseOrderBusiness.FastCreateOrder(createOnlinePurchaseOrderRequest);
}
} }
} }

1
BBWY.Server.API/Startup.cs

@ -67,6 +67,7 @@ namespace BBWY.Server.API
}); });
services.BatchRegisterServices(new Assembly[] { Assembly.Load("BBWY.Server.Business") }, typeof(IDenpendency)); services.BatchRegisterServices(new Assembly[] { Assembly.Load("BBWY.Server.Business") }, typeof(IDenpendency));
services.AddSingleton<PlatformSDKBusiness, JDBusiness>(); services.AddSingleton<PlatformSDKBusiness, JDBusiness>();
services.AddSingleton<PlatformSDKBusiness, _1688Business>();
//var stores = Configuration.GetSection("Stores").Get<IList<Store>>(); //var stores = Configuration.GetSection("Stores").Get<IList<Store>>();

7
BBWY.Server.Business/BBWY.Server.Business.csproj

@ -5,6 +5,12 @@
<GenerateDocumentationFile>True</GenerateDocumentationFile> <GenerateDocumentationFile>True</GenerateDocumentationFile>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<Compile Remove="新文件夹\**" />
<EmbeddedResource Remove="新文件夹\**" />
<None Remove="新文件夹\**" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="FreeSql" Version="2.6.100" /> <PackageReference Include="FreeSql" Version="2.6.100" />
<PackageReference Include="FreeSql.Provider.MySql" Version="2.6.100" /> <PackageReference Include="FreeSql.Provider.MySql" Version="2.6.100" />
@ -15,6 +21,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\BBWY.1688SDK\BBWY.1688SDK.csproj" />
<ProjectReference Include="..\BBWY.Common\BBWY.Common.csproj" /> <ProjectReference Include="..\BBWY.Common\BBWY.Common.csproj" />
<ProjectReference Include="..\BBWY.JDSDK\BBWY.JDSDK.csproj" /> <ProjectReference Include="..\BBWY.JDSDK\BBWY.JDSDK.csproj" />
<ProjectReference Include="..\BBWY.Server.Model\BBWY.Server.Model.csproj" /> <ProjectReference Include="..\BBWY.Server.Model\BBWY.Server.Model.csproj" />

79
BBWY.Server.Business/Order/OrderBusiness.cs

@ -15,6 +15,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Net.Http; using System.Net.Http;
using System.Threading.Tasks;
using Yitter.IdGenerator; using Yitter.IdGenerator;
namespace BBWY.Server.Business namespace BBWY.Server.Business
@ -26,12 +27,14 @@ namespace BBWY.Server.Business
private IDictionary<Enums.Platform, Action<JArray, long, string, string, string, string>> syncOrderMethodDic; private IDictionary<Enums.Platform, Action<JArray, long, string, string, string, string>> syncOrderMethodDic;
private IIdGenerator idGenerator; private IIdGenerator idGenerator;
private IDictionary<string, string> mdsApiHeader; private IDictionary<string, string> mdsApiHeader;
private TaskSchedulerManager taskSchedulerManager;
public OrderBusiness(RestApiService restApiService, IConfiguration configuration, ILogger logger, IFreeSql fsql, IIdGenerator idGenerator, IOptions<GlobalConfig> options) : base(restApiService, options) public OrderBusiness(RestApiService restApiService, IConfiguration configuration, ILogger logger, IFreeSql fsql, IIdGenerator idGenerator, IOptions<GlobalConfig> options, TaskSchedulerManager taskSchedulerManager) : base(restApiService, options)
{ {
this.logger = logger; this.logger = logger;
this.fsql = fsql; this.fsql = fsql;
this.idGenerator = idGenerator; this.idGenerator = idGenerator;
this.taskSchedulerManager = taskSchedulerManager;
syncOrderMethodDic = new Dictionary<Enums.Platform, Action<JArray, long, string, string, string, string>>() syncOrderMethodDic = new Dictionary<Enums.Platform, Action<JArray, long, string, string, string, string>>()
{ {
{ Enums.Platform., SyncJDOrder } { Enums.Platform., SyncJDOrder }
@ -45,6 +48,8 @@ namespace BBWY.Server.Business
{ {
if (searchOrderRequest.OrderState == Enums.OrderState.) if (searchOrderRequest.OrderState == Enums.OrderState.)
searchOrderRequest.ExcludeCanceled = false; searchOrderRequest.ExcludeCanceled = false;
if (searchOrderRequest.EndDate != null)
searchOrderRequest.EndDate = searchOrderRequest.EndDate.Value.Date.AddDays(1).AddSeconds(-1);
var select = fsql.Select<Order, OrderConsignee, OrderCost, OrderDropShipping>().LeftJoin((o, ocs, oct, ods) => o.Id == ocs.OrderId) var select = fsql.Select<Order, OrderConsignee, OrderCost, OrderDropShipping>().LeftJoin((o, ocs, oct, ods) => o.Id == ocs.OrderId)
.LeftJoin((o, ocs, oct, ods) => o.Id == oct.OrderId) .LeftJoin((o, ocs, oct, ods) => o.Id == oct.OrderId)
@ -100,6 +105,7 @@ namespace BBWY.Server.Business
StoreId = o.StoreId, StoreId = o.StoreId,
StoreOrder = o.StoreOrder, StoreOrder = o.StoreOrder,
VenderRemark = o.VenderRemark, VenderRemark = o.VenderRemark,
PurchaseRemark = o.PurchaseRemark,
WaybillNo = o.WaybillNo, WaybillNo = o.WaybillNo,
Flag = o.Flag, Flag = o.Flag,
SDType = o.SDType, SDType = o.SDType,
@ -650,7 +656,15 @@ namespace BBWY.Server.Business
.ExecuteAffrows(); .ExecuteAffrows();
} }
public void SyncOrder(long shopId, string orderId) /// <summary>
/// 同步订单
/// </summary>
/// <param name="shopId"></param>
/// <param name="orderId"></param>
/// <param name="startTime">默认3小时前</param>
/// <param name="endTime">默认当前时间</param>
/// <exception cref="Exception"></exception>
public void SyncOrder(long shopId, string orderId, DateTime? startTime = null, DateTime? endTime = null)
{ {
#region 获取店铺信息; #region 获取店铺信息;
var shopResult = restApiService.SendRequest(globalConfig.MdsApi, "/TaskList/Shop/GetShopsByShopId", $"shopId={shopId}", mdsApiHeader, HttpMethod.Get, enableRandomTimeStamp: true); var shopResult = restApiService.SendRequest(globalConfig.MdsApi, "/TaskList/Shop/GetShopsByShopId", $"shopId={shopId}", mdsApiHeader, HttpMethod.Get, enableRandomTimeStamp: true);
@ -681,8 +695,8 @@ namespace BBWY.Server.Business
var relayAPIHost = GetPlatformRelayAPIHost((Enums.Platform)platformId); var relayAPIHost = GetPlatformRelayAPIHost((Enums.Platform)platformId);
var orderListApiResult = restApiService.SendRequest(relayAPIHost, "api/PlatformSDK/GetOrderList", new SearchPlatformOrderRequest() var orderListApiResult = restApiService.SendRequest(relayAPIHost, "api/PlatformSDK/GetOrderList", new SearchPlatformOrderRequest()
{ {
StartDate = DateTime.Now.AddHours(-3), StartDate = startTime ?? DateTime.Now.AddHours(-3),
EndDate = DateTime.Now, EndDate = endTime ?? DateTime.Now,
AppKey = appKey, AppKey = appKey,
AppSecret = appSecret, AppSecret = appSecret,
AppToken = appToken, AppToken = appToken,
@ -712,6 +726,62 @@ namespace BBWY.Server.Business
} }
} }
public void SyncOrderByDate(SyncOrderByDateRequest syncOrderByDateRequest)
{
if (fsql.Select<OrderSyncTask>().Where(ost => ost.ShopId == syncOrderByDateRequest.ShopId && ost.State == Enums.OrderSyncState.Running).Any())
throw new BusinessException("存在未结束的同步任务,请稍后同步");
syncOrderByDateRequest.EndTime = syncOrderByDateRequest.EndTime.Date.AddDays(1).AddSeconds(-1);
if ((syncOrderByDateRequest.EndTime - syncOrderByDateRequest.StartTime).Days > 7)
throw new BusinessException("同步任务时差最长7天");
var orderSyncTask = new OrderSyncTask()
{
Id = idGenerator.NewLong(),
ShopId = syncOrderByDateRequest.ShopId,
State = Enums.OrderSyncState.Running,
SyncStartTime = syncOrderByDateRequest.StartTime,
SyncEndTime = syncOrderByDateRequest.EndTime
};
fsql.Insert(orderSyncTask).ExecuteAffrows();
Task.Factory.StartNew(() =>
{
var currentStartTime = syncOrderByDateRequest.StartTime;
var currentEndTime = currentStartTime.AddHours(3);
var keeploop = true;
while (keeploop)
{
try
{
SyncOrder(syncOrderByDateRequest.ShopId, String.Empty, currentStartTime, currentEndTime);
}
catch (Exception ex) { }
finally
{
var lessHour = (syncOrderByDateRequest.EndTime - currentEndTime).TotalHours;
if (lessHour > 3)
{
currentStartTime = currentStartTime.AddHours(3);
currentEndTime = currentEndTime.AddHours(3);
}
else if (lessHour > 0 && lessHour < 3)
{
currentStartTime = currentEndTime;
currentEndTime = syncOrderByDateRequest.EndTime;
}
else if (lessHour <= 0)
{
keeploop = false;
}
}
}
try
{
fsql.Update<OrderSyncTask>(orderSyncTask.Id).Set(ost => ost.State, Enums.OrderSyncState.End).ExecuteAffrows();
}
catch (Exception ex) { }
}, System.Threading.CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncOrderTaskScheduler);
}
private void SyncJDOrder(JArray orderTokenJArray, long shopId, string relayAPIHost, string appKey, string appSecret, string appToken) private void SyncJDOrder(JArray orderTokenJArray, long shopId, string relayAPIHost, string appKey, string appSecret, string appToken)
{ {
var orderTokenList = orderTokenJArray.Where(o => o.Value<decimal>("orderTotalPrice") != 0); var orderTokenList = orderTokenJArray.Where(o => o.Value<decimal>("orderTotalPrice") != 0);
@ -737,7 +807,6 @@ namespace BBWY.Server.Business
dbOrderCostDetailList = fsql.Select<OrderCostDetail>().Where(ocd => interfaceCanceledOrderIdList.Contains(ocd.OrderId)).ToList(); dbOrderCostDetailList = fsql.Select<OrderCostDetail>().Where(ocd => interfaceCanceledOrderIdList.Contains(ocd.OrderId)).ToList();
} }
var orderSkuIds = new List<string>(); var orderSkuIds = new List<string>();
foreach (var orderJToken in orderTokenList) foreach (var orderJToken in orderTokenList)
{ {

18
BBWY.Server.Business/PlatformSDK/JDBusiness.cs

@ -19,8 +19,6 @@ namespace BBWY.Server.Business
{ {
public override Enums.Platform Platform => Enums.Platform.; public override Enums.Platform Platform => Enums.Platform.;
private ILogger logger;
private readonly string searchFields = "orderId,venderId,orderType,payType,orderTotalPrice,orderSellerPrice,orderPayment,freightPrice,orderState,orderStateRemark,orderRemark,orderStartTime,orderEndTime,modified,consigneeInfo,itemInfoList,couponDetailList,taxFee,venderRemark,pin,waybill,storeOrder,storeId,sellerDiscount"; private readonly string searchFields = "orderId,venderId,orderType,payType,orderTotalPrice,orderSellerPrice,orderPayment,freightPrice,orderState,orderStateRemark,orderRemark,orderStartTime,orderEndTime,modified,consigneeInfo,itemInfoList,couponDetailList,taxFee,venderRemark,pin,waybill,storeOrder,storeId,sellerDiscount";
private readonly IDictionary<string, string> flagDictionary = new Dictionary<string, string>() private readonly IDictionary<string, string> flagDictionary = new Dictionary<string, string>()
@ -34,7 +32,7 @@ namespace BBWY.Server.Business
}; };
public JDBusiness(IMemoryCache memoryCache, ILogger logger) : base(memoryCache) { this.logger = logger; } public JDBusiness(IMemoryCache memoryCache, ILogger logger) : base(memoryCache, logger) { }
private IJdClient GetJdClient(string appKey, string appSecret) private IJdClient GetJdClient(string appKey, string appSecret)
{ {
@ -161,6 +159,7 @@ namespace BBWY.Server.Business
public override IList<JToken> GetOrderList(SearchPlatformOrderRequest searchOrderRequest) public override IList<JToken> GetOrderList(SearchPlatformOrderRequest searchOrderRequest)
{ {
//logger.Info($"searchOrderRequest ${JsonConvert.SerializeObject(searchOrderRequest)}");
if (searchOrderRequest.StartDate == null || searchOrderRequest.EndDate == null) if (searchOrderRequest.StartDate == null || searchOrderRequest.EndDate == null)
throw new BusinessException("缺少开始/结束日期"); throw new BusinessException("缺少开始/结束日期");
if ((searchOrderRequest.EndDate.Value - searchOrderRequest.StartDate.Value).TotalDays > 30) if ((searchOrderRequest.EndDate.Value - searchOrderRequest.StartDate.Value).TotalDays > 30)
@ -179,7 +178,7 @@ namespace BBWY.Server.Business
if (searchOrderRequest.StartDate != null) if (searchOrderRequest.StartDate != null)
fbpReq.startDate = searchOrderRequest.StartDate.Value.ToString("yyyy-MM-dd HH:mm:ss"); fbpReq.startDate = searchOrderRequest.StartDate.Value.ToString("yyyy-MM-dd HH:mm:ss");
if (searchOrderRequest.EndDate != null) if (searchOrderRequest.EndDate != null)
fbpReq.endDate = searchOrderRequest.EndDate.Value.Date.AddDays(1).AddSeconds(-1).ToString("yyyy-MM-dd HH:mm:ss"); fbpReq.endDate = searchOrderRequest.EndDate.Value.Date.ToString("yyyy-MM-dd HH:mm:ss");
if (string.IsNullOrEmpty(searchOrderRequest.OrderState)) if (string.IsNullOrEmpty(searchOrderRequest.OrderState))
{ {
fbpReq.orderState = "DengDaiDaYin,DengDaiChuKu,DengDaiDaBao,DengDaiFaHuo,ZiTiTuZhong,ShangMenTiHuo,ZiTiTuiHuo,DengDaiQueRenShouHuo,PeiSongTuiHuo,HuoDaoFuKuanQueRen,WanCheng,DengDaiFenQiFuKuan,ServiceFinished,SuoDing,DengDaiTuiKuan,DengDaiKeHuHuiFu,TRADE_CANCELED,LOCKED"; fbpReq.orderState = "DengDaiDaYin,DengDaiChuKu,DengDaiDaBao,DengDaiFaHuo,ZiTiTuZhong,ShangMenTiHuo,ZiTiTuiHuo,DengDaiQueRenShouHuo,PeiSongTuiHuo,HuoDaoFuKuanQueRen,WanCheng,DengDaiFenQiFuKuan,ServiceFinished,SuoDing,DengDaiTuiKuan,DengDaiKeHuHuiFu,TRADE_CANCELED,LOCKED";
@ -212,7 +211,7 @@ namespace BBWY.Server.Business
if (searchOrderRequest.StartDate != null) if (searchOrderRequest.StartDate != null)
sopReq.startDate = searchOrderRequest.StartDate.Value.ToString("yyyy-MM-dd HH:mm:ss"); sopReq.startDate = searchOrderRequest.StartDate.Value.ToString("yyyy-MM-dd HH:mm:ss");
if (searchOrderRequest.EndDate != null) if (searchOrderRequest.EndDate != null)
sopReq.endDate = searchOrderRequest.EndDate.Value.Date.AddDays(1).AddSeconds(-1).ToString("yyyy-MM-dd HH:mm:ss"); sopReq.endDate = searchOrderRequest.EndDate.Value.Date.ToString("yyyy-MM-dd HH:mm:ss");
if (string.IsNullOrEmpty(searchOrderRequest.OrderState)) if (string.IsNullOrEmpty(searchOrderRequest.OrderState))
{ {
//WAIT_SELLER_STOCK_OUT,WAIT_GOODS_RECEIVE_CONFIRM,WAIT_SELLER_DELIVER,PAUSE,FINISHED_L,TRADE_CANCELED,LOCKED //WAIT_SELLER_STOCK_OUT,WAIT_GOODS_RECEIVE_CONFIRM,WAIT_SELLER_DELIVER,PAUSE,FINISHED_L,TRADE_CANCELED,LOCKED
@ -229,6 +228,8 @@ namespace BBWY.Server.Business
//sopReq.dateType = ""; //sopReq.dateType = "";
var sopResponse = jdClient.Execute(sopReq, searchOrderRequest.AppToken, DateTime.Now.ToLocalTime()); var sopResponse = jdClient.Execute(sopReq, searchOrderRequest.AppToken, DateTime.Now.ToLocalTime());
//logger.Info($"sopResponse is null ${sopResponse == null}");
if (searchOrderRequest.SaveResponseLog) if (searchOrderRequest.SaveResponseLog)
logger.Info($"sopResponse\r\n{JsonConvert.SerializeObject(sopResponse)}"); logger.Info($"sopResponse\r\n{JsonConvert.SerializeObject(sopResponse)}");
if (sopResponse.IsError) if (sopResponse.IsError)
@ -347,6 +348,7 @@ namespace BBWY.Server.Business
var decryptContactName = tdeClient.DecryptString(orderInfo["consigneeInfo"].Value<string>("fullname")); var decryptContactName = tdeClient.DecryptString(orderInfo["consigneeInfo"].Value<string>("fullname"));
var decryptAddress = tdeClient.DecryptString(orderInfo["consigneeInfo"].Value<string>("fullAddress")); var decryptAddress = tdeClient.DecryptString(orderInfo["consigneeInfo"].Value<string>("fullAddress"));
/*
PopOrderGetmobilelistRequest decryptMobileReq = new PopOrderGetmobilelistRequest(); PopOrderGetmobilelistRequest decryptMobileReq = new PopOrderGetmobilelistRequest();
decryptMobileReq.appName = "订单管家"; decryptMobileReq.appName = "订单管家";
decryptMobileReq.orderId = decryptConsigneeRequest.OrderId; decryptMobileReq.orderId = decryptConsigneeRequest.OrderId;
@ -367,13 +369,13 @@ namespace BBWY.Server.Business
var decryptMobile = decryptMobileResponse.Json["jingdong_pop_order_getmobilelist_responce"]["result"]["data"][decryptConsigneeRequest.OrderId].Value<string>("consMobilePhone"); var decryptMobile = decryptMobileResponse.Json["jingdong_pop_order_getmobilelist_responce"]["result"]["data"][decryptConsigneeRequest.OrderId].Value<string>("consMobilePhone");
var decryptTelePhone = decryptMobileResponse.Json["jingdong_pop_order_getmobilelist_responce"]["result"]["data"][decryptConsigneeRequest.OrderId].Value<string>("customerPhone"); var decryptTelePhone = decryptMobileResponse.Json["jingdong_pop_order_getmobilelist_responce"]["result"]["data"][decryptConsigneeRequest.OrderId].Value<string>("customerPhone");
*/
return new ConsigneeSimpleResponse() return new ConsigneeSimpleResponse()
{ {
Address = decryptAddress, Address = decryptAddress,
ContactName = decryptContactName, ContactName = decryptContactName,
Mobile = decryptMobile, //Mobile = decryptMobile,
TelePhone = decryptTelePhone //TelePhone = decryptTelePhone
}; };
} }

7
BBWY.Server.Business/PlatformSDK/PDDBusiness.cs

@ -1,4 +1,6 @@
using Microsoft.Extensions.Caching.Memory; using BBWY.Server.Model;
using Microsoft.Extensions.Caching.Memory;
using NLog;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
@ -7,7 +9,8 @@ namespace BBWY.Server.Business
{ {
public class PDDBusiness : PlatformSDKBusiness public class PDDBusiness : PlatformSDKBusiness
{ {
public PDDBusiness(IMemoryCache memoryCache) : base(memoryCache) public override Enums.Platform Platform => Enums.Platform.;
public PDDBusiness(IMemoryCache memoryCache, ILogger logger) : base(memoryCache, logger)
{ {
} }
} }

20
BBWY.Server.Business/PlatformSDK/PlatformSDKBusiness.cs

@ -2,6 +2,7 @@
using BBWY.Server.Model.Dto; using BBWY.Server.Model.Dto;
using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Caching.Memory;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using NLog;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -11,16 +12,20 @@ namespace BBWY.Server.Business
{ {
protected IMemoryCache memoryCache; protected IMemoryCache memoryCache;
protected TimeSpan expirationTimeSpan = TimeSpan.FromMinutes(60); protected TimeSpan expirationTimeSpan;
/// <summary> /// <summary>
/// 产品平台 /// 产品平台
/// </summary> /// </summary>
public virtual Enums.Platform Platform { get; } public virtual Enums.Platform Platform { get; }
public PlatformSDKBusiness(IMemoryCache memoryCache) protected ILogger logger;
public PlatformSDKBusiness(IMemoryCache memoryCache, ILogger logger)
{ {
this.memoryCache = memoryCache; this.memoryCache = memoryCache;
this.logger = logger;
this.expirationTimeSpan = TimeSpan.FromMinutes(60);
} }
public virtual ProductListResponse GetProductList(SearchProductRequest searchProductRequest) public virtual ProductListResponse GetProductList(SearchProductRequest searchProductRequest)
@ -67,5 +72,16 @@ namespace BBWY.Server.Business
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
public virtual PreviewOrderResponse PreviewOrder(PreviewOrderReuqest previewOrderReuqest)
{
throw new NotImplementedException();
}
public virtual CreateOnlinePurchaseOrderResponse FastCreateOrder(CreateOnlinePurchaseOrderRequest createOnlinePurchaseOrderRequest)
{
throw new NotImplementedException();
}
} }
} }

7
BBWY.Server.Business/PlatformSDK/TaoBaoBusiness.cs

@ -1,5 +1,6 @@
using BBWY.Server.Model; using BBWY.Server.Model;
using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Caching.Memory;
using NLog;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
@ -8,10 +9,10 @@ namespace BBWY.Server.Business
{ {
public class TaoBaoBusiness : PlatformSDKBusiness public class TaoBaoBusiness : PlatformSDKBusiness
{ {
public override Enums.Platform Platform => Enums.Platform.; public TaoBaoBusiness(IMemoryCache memoryCache, ILogger logger) : base(memoryCache, logger)
public TaoBaoBusiness(IMemoryCache memoryCache) : base(memoryCache)
{ {
} }
public override Enums.Platform Platform => Enums.Platform.;
} }
} }

212
BBWY.Server.Business/PlatformSDK/_1688Business.cs

@ -0,0 +1,212 @@
using BBWY._1688SDK.entity.OrderPreview;
using BBWY.Common.Http;
using BBWY.Common.Models;
using BBWY.Server.Model;
using BBWY.Server.Model.Db;
using BBWY.Server.Model.Dto;
using com.alibaba.openapi.client;
using com.alibaba.openapi.client.policy;
using Microsoft.Extensions.Caching.Memory;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NLog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BBWY.Server.Business
{
public class _1688Business : PlatformSDKBusiness
{
public override Enums.Platform Platform => Enums.Platform.;
private RestApiService restApiService;
private _1688TradeTypeCompare _1688TradeTypeCompare;
public _1688Business(IMemoryCache memoryCache, ILogger logger, RestApiService restApiService) : base(memoryCache, logger)
{
this.restApiService = restApiService;
_1688TradeTypeCompare = new _1688TradeTypeCompare();
}
private SyncAPIClient GetSyncAPIClient(string appKey, string appSecret)
{
if (!memoryCache.TryGetValue(appKey, out SyncAPIClient syncAPIClient))
{
syncAPIClient = new SyncAPIClient(appKey, appSecret, restApiService);
memoryCache.Set(appKey, syncAPIClient, expirationTimeSpan);
}
return syncAPIClient;
}
public override PreviewOrderResponse PreviewOrder(PreviewOrderReuqest previewOrderReuqest)
{
var client = GetSyncAPIClient(previewOrderReuqest.AppKey, previewOrderReuqest.AppSecret);
RequestPolicy reqPolicy = new RequestPolicy();
reqPolicy.HttpMethod = "POST";
reqPolicy.NeedAuthorization = false;
reqPolicy.RequestSendTimestamp = false;
reqPolicy.UseHttps = false;
reqPolicy.UseSignture = true;
reqPolicy.AccessPrivateApi = false;
Request request = new Request();
APIId apiId = new APIId();
apiId.Name = "alibaba.createOrder.preview";
apiId.NamespaceValue = "com.alibaba.trade";
apiId.Version = 1;
request.ApiId = apiId;
var param = new CreateOrderPreview()
{
addressParam = new AddressParam()
{
fullName = previewOrderReuqest.Consignee.ContactName,
mobile = previewOrderReuqest.Consignee.Mobile,
phone = previewOrderReuqest.Consignee.TelePhone,
postCode = "000000",
address = previewOrderReuqest.Consignee.Address,
provinceText = previewOrderReuqest.Consignee.Province,
cityText = previewOrderReuqest.Consignee.City,
areaText = previewOrderReuqest.Consignee.County,
townText = previewOrderReuqest.Consignee.Town
},
cargoParamList = new List<CargoParam>(),
flow = previewOrderReuqest.PurchaseOrderMode == Enums.PurchaseOrderMode. ? "general" : "saleproxy"
};
foreach (var cargo in previewOrderReuqest.CargoParamList)
{
param.cargoParamList.Add(new CargoParam()
{
offerId = long.Parse(cargo.ProductId),
specId = cargo.SpecId,
quantity = cargo.Quantity
});
}
request.RequestEntity = param;
if (!string.IsNullOrEmpty(previewOrderReuqest.AppToken))
request.AccessToken = previewOrderReuqest.AppToken;
var result = client.NewRequest(request, reqPolicy);
if (result.Value<bool>("success") != true)
throw new BusinessException(result.Value<string>("errorMsg")) { Code = 0 };
var orderPreviewResuslt = (JArray)result["orderPreviewResuslt"];
List<JToken> intersectTradeModeList = new List<JToken>();
foreach (var orderPreviewJToken in orderPreviewResuslt)
{
if (orderPreviewJToken["tradeModelList"] == null)
throw new BusinessException("当前交易不可通过API下单,请使用1688网页交易 [交易模式列表为空]");
var tradeModeJArray = ((JArray)orderPreviewJToken["tradeModelList"]).Where(tradeJToken => tradeJToken.Value<bool>("opSupport"));
if (tradeModeJArray.Count() == 0)
throw new BusinessException("当前交易不可通过API下单,请使用1688网页交易 [没有支持开放平台下单的交易模式]");
if (intersectTradeModeList.Count() == 0)
intersectTradeModeList.AddRange(tradeModeJArray);
else
intersectTradeModeList = intersectTradeModeList.Intersect(tradeModeJArray, _1688TradeTypeCompare).ToList();
}
if (intersectTradeModeList.Count() == 0)
throw new BusinessException("当前交易不可通过API下单,请使用1688网页交易 [多个拆单之间没有相同的交易模式]");
return new PreviewOrderResponse()
{
FreightAmount = orderPreviewResuslt.Sum(jt => jt.Value<decimal>("sumCarriage")) / 100M,
ProductAmount = orderPreviewResuslt.Sum(jt => jt.Value<decimal>("sumPaymentNoCarriage")) / 100M,
TotalAmount = orderPreviewResuslt.Sum(jt => jt.Value<decimal>("sumPayment")) / 100M,
OrderTradeType = new OrderTradeTypeResponse()
{
Code = intersectTradeModeList.First().Value<string>("tradeType"),
Name = intersectTradeModeList.First().Value<string>("name"),
}
};
}
public override CreateOnlinePurchaseOrderResponse FastCreateOrder(CreateOnlinePurchaseOrderRequest createOnlinePurchaseOrderRequest)
{
var client = GetSyncAPIClient(createOnlinePurchaseOrderRequest.AppKey, createOnlinePurchaseOrderRequest.AppSecret);
RequestPolicy reqPolicy = new RequestPolicy();
reqPolicy.HttpMethod = "POST";
reqPolicy.NeedAuthorization = false;
reqPolicy.RequestSendTimestamp = false;
reqPolicy.UseHttps = false;
reqPolicy.UseSignture = true;
reqPolicy.AccessPrivateApi = false;
Request request = new Request();
APIId apiId = new APIId();
apiId.Name = "alibaba.trade.fastCreateOrder";
apiId.NamespaceValue = "com.alibaba.trade";
apiId.Version = 1;
request.ApiId = apiId;
var param = new
{
flow = createOnlinePurchaseOrderRequest.PurchaseOrderMode == Enums.PurchaseOrderMode. ? "general" : "saleproxy",
message = createOnlinePurchaseOrderRequest.Remark,
addressParam = new
{
fullName = createOnlinePurchaseOrderRequest.Consignee.ContactName,
mobile = createOnlinePurchaseOrderRequest.Consignee.Mobile,
phone = createOnlinePurchaseOrderRequest.Consignee.Mobile,
cityText = createOnlinePurchaseOrderRequest.Consignee.City,
provinceText = createOnlinePurchaseOrderRequest.Consignee.Province,
areaText = createOnlinePurchaseOrderRequest.Consignee.County,
townText = createOnlinePurchaseOrderRequest.Consignee.Town,
address = createOnlinePurchaseOrderRequest.Consignee.Address
},
cargoParamList = createOnlinePurchaseOrderRequest.CargoParamList.Select(cargo => new
{
offerId = long.Parse(cargo.ProductId),
specId = cargo.SpecId,
quantity = cargo.Quantity
}),
tradeType = createOnlinePurchaseOrderRequest.TradeMode
};
request.RequestEntity = param;
if (!string.IsNullOrEmpty(createOnlinePurchaseOrderRequest.AppToken))
request.AccessToken = createOnlinePurchaseOrderRequest.AppToken;
var result = client.NewRequest(request, reqPolicy);
if (result.Value<bool>("success") != true)
throw new BusinessException(result.Value<string>("errorMsg")) { Code = 0 };
var totalSuccessAmount = result["result"].Value<long>("totalSuccessAmount") / 100M; //采购单总金额,单位分
var purchaseOrderId = result["result"].Value<string>("orderId"); //采购单号
var postFee = result["result"].Value<long>("postFee") / 100M; //采购单运费,单位分
var purchaseAmount = totalSuccessAmount - postFee; //采购成本
var failedOfferJArray = result["failedOfferList"] != null ? (JArray)result["failedOfferList"] : null;
if (failedOfferJArray != null)
{
StringBuilder failOrderStringBuilder = new StringBuilder();
foreach (var failedOfferJToken in failedOfferJArray)
failOrderStringBuilder.AppendLine(failedOfferJToken.ToString());
var ex = new Exception(failOrderStringBuilder.ToString());
logger.Error(ex, $"下单部分商品失败 采购单Id{purchaseOrderId} 请求参数{JsonConvert.SerializeObject(createOnlinePurchaseOrderRequest)}");
}
return new CreateOnlinePurchaseOrderResponse()
{
TotalAmount = totalSuccessAmount,
ProductAmount = purchaseAmount,
FreightAmount = postFee,
PurchaseOrderId = purchaseOrderId,
FailProductMessageList = failedOfferJArray == null ? null : failedOfferJArray.Select(failedOfferJToken => failedOfferJToken.ToString()).ToList()
};
}
}
public class _1688TradeTypeCompare : IEqualityComparer<JToken>
{
public bool Equals(JToken x, JToken y)
{
return x.Value<string>("tradeType").Equals(y.Value<string>("tradeType"));
}
public int GetHashCode(JToken obj)
{
return obj.GetHashCode();
}
}
}

132
BBWY.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs

@ -2,15 +2,21 @@
using BBWY.Common.Models; using BBWY.Common.Models;
using BBWY.Server.Model.Db; using BBWY.Server.Model.Db;
using BBWY.Server.Model.Dto; using BBWY.Server.Model.Dto;
using FreeSql;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using Yitter.IdGenerator; using Yitter.IdGenerator;
namespace BBWY.Server.Business namespace BBWY.Server.Business
{ {
public class PurchaseOrderBusiness : BaseBusiness, IDenpendency public class PurchaseOrderBusiness : BaseBusiness, IDenpendency
{ {
public PurchaseOrderBusiness(IFreeSql fsql, NLog.ILogger logger, IIdGenerator idGenerator) : base(fsql, logger, idGenerator) { } private IEnumerable<PlatformSDKBusiness> platformSDKBusinessList;
public PurchaseOrderBusiness(IFreeSql fsql, NLog.ILogger logger, IIdGenerator idGenerator, IEnumerable<PlatformSDKBusiness> platformSDKBusinessList) : base(fsql, logger, idGenerator)
{
this.platformSDKBusinessList = platformSDKBusinessList;
}
public void AddPurchaseOrder(AddPurchaseOrderRequest addPurchaseOrderRequest) public void AddPurchaseOrder(AddPurchaseOrderRequest addPurchaseOrderRequest)
{ {
@ -57,5 +63,129 @@ namespace BBWY.Server.Business
{ {
fsql.Delete<PurchaseOrder>(id).ExecuteAffrows(); fsql.Delete<PurchaseOrder>(id).ExecuteAffrows();
} }
public PreviewOrderResponse PreviewPurchaseOrder(PreviewOrderReuqest previewOrderReuqest)
{
if (previewOrderReuqest.Platform != Model.Enums.Platform.)
throw new NotImplementedException();
return platformSDKBusinessList.FirstOrDefault(p => p.Platform == previewOrderReuqest.Platform).PreviewOrder(previewOrderReuqest);
}
public void FastCreateOrder(CreateOnlinePurchaseOrderRequest createOnlinePurchaseOrderRequest)
{
if (createOnlinePurchaseOrderRequest.Platform != Model.Enums.Platform.)
throw new NotImplementedException();
var dbOrder = fsql.Select<Order>(createOnlinePurchaseOrderRequest.OrderId).ToOne();
if (dbOrder == null)
throw new BusinessException("订单不存在");
if (dbOrder.OrderState != Model.Enums.OrderState.)
throw new BusinessException("只能为等待采购的订单进行采购");
var orderSku = fsql.Select<OrderSku>().Where(osku => osku.OrderId == createOnlinePurchaseOrderRequest.OrderId).ToOne();
if (orderSku == null)
throw new BusinessException("订单Sku不存在");
var createOrderResponse = platformSDKBusinessList.FirstOrDefault(p => p.Platform == createOnlinePurchaseOrderRequest.Platform)
.FastCreateOrder(createOnlinePurchaseOrderRequest);
IInsert<PurchaseOrder> insertPurchaseOrder = null;
IInsert<OrderCostDetail> insertOrderCostDetail = null;
IInsert<OrderCost> insertOrderCost = null;
IInsert<OrderDropShipping> insertOrderDropShipping = null;
#region 采购单
var purchaseOrder = new PurchaseOrder()
{
Id = idGenerator.NewLong(),
CreateTime = DateTime.Now,
ProductId = orderSku.ProductId,
SkuId = orderSku.SkuId,
PurchaseMethod = Model.Enums.PurchaseMethod.线,
PurchaseOrderId = createOrderResponse.PurchaseOrderId,
PurchasePlatform = createOnlinePurchaseOrderRequest.Platform,
PurchaseQuantity = orderSku.ItemTotal.Value,
RemainingQuantity = 0,
ShopId = createOnlinePurchaseOrderRequest.ShopId,
SingleConsumableAmount = 0,
SingleDeliveryFreight = 0,
SingleFirstFreight = 0,
SingleStorageAmount = 0,
SingleOperationAmount = 0,
SingleSkuAmount = createOrderResponse.ProductAmount / orderSku.ItemTotal.Value,
SingleFreight = createOrderResponse.FreightAmount / orderSku.ItemTotal.Value,
StorageType = Model.Enums.StorageType.
};
insertPurchaseOrder = fsql.Insert(purchaseOrder);
#endregion
#region 成本明细
var orderCostDetail = new OrderCostDetail()
{
Id = idGenerator.NewLong(),
ConsumableAmount = 0,
CreateTime = DateTime.Now,
DeductionQuantity = orderSku.ItemTotal.Value,
DeliveryExpressFreight = 0,
FirstFreight = 0,
OperationAmount = 0,
OrderId = createOnlinePurchaseOrderRequest.OrderId,
ProductId = orderSku.ProductId,
PurchaseFreight = createOrderResponse.FreightAmount,
PurchaseOrderPKId = purchaseOrder.Id,
SkuAmount = createOrderResponse.ProductAmount,
SkuId = orderSku.SkuId,
StorageAmount = 0,
UnitCost = purchaseOrder.UnitCost,
TotalCost = createOrderResponse.TotalAmount //purchaseOrder.UnitCost * orderSku.ItemTotal.Value
};
insertOrderCostDetail = fsql.Insert(orderCostDetail);
#endregion
#region 订单成本
var orderCost = new OrderCost()
{
OrderId = orderSku.OrderId,
CreateTime = DateTime.Now,
DeliveryExpressFreight = 0,
IsManualEdited = false,
PlatformCommissionRatio = 0.05M,
PreferentialAmount = dbOrder.PreferentialAmount,
SDCommissionAmount = 0,
PurchaseAmount = createOrderResponse.TotalAmount
};
orderCost.PlatformCommissionAmount = dbOrder.OrderSellerPrice * orderCost.PlatformCommissionRatio;
orderCost.Profit = dbOrder.OrderSellerPrice +
dbOrder.FreightPrice -
orderCost.PurchaseAmount -
orderCost.DeliveryExpressFreight -
orderCost.PlatformCommissionAmount;
insertOrderCost = fsql.Insert(orderCost);
#endregion
#region 采购信息
var orderDropShipping = new OrderDropShipping()
{
OrderId = createOnlinePurchaseOrderRequest.OrderId,
BuyerAccount = createOnlinePurchaseOrderRequest.BuyerAccount,
SellerAccount = createOnlinePurchaseOrderRequest.SellerAccount,
CreateTime = DateTime.Now,
DeliveryFreight = 0,
PurchaseAmount = createOrderResponse.TotalAmount,
PurchaseOrderId = createOrderResponse.PurchaseOrderId,
PurchasePlatform = createOnlinePurchaseOrderRequest.Platform
};
insertOrderDropShipping = fsql.Insert(orderDropShipping);
#endregion
fsql.Transaction(() =>
{
insertPurchaseOrder.ExecuteAffrows();
insertOrderCostDetail.ExecuteAffrows();
insertOrderCost.ExecuteAffrows();
insertOrderDropShipping.ExecuteAffrows();
fsql.Update<Order>(createOnlinePurchaseOrderRequest.OrderId).Set(o => o.OrderState, Model.Enums.OrderState.)
.Set(o => o.StorageType, Model.Enums.StorageType.)
.ExecuteAffrows();
});
}
} }
} }

9
BBWY.Server.Business/PurchaseScheme/PurchaseSchemeBusiness.cs

@ -29,6 +29,15 @@ namespace BBWY.Server.Business
{ {
if (batchCURDSchemeRequest.EditPurchaseSchemeList.Count == 0 && batchCURDSchemeRequest.AddPurchaseSchemeList.Count == 0) if (batchCURDSchemeRequest.EditPurchaseSchemeList.Count == 0 && batchCURDSchemeRequest.AddPurchaseSchemeList.Count == 0)
throw new BusinessException("非法参数"); throw new BusinessException("非法参数");
if (batchCURDSchemeRequest.AddPurchaseSchemeList.Any(p => string.IsNullOrEmpty(p.PurchaserId) ||
string.IsNullOrEmpty(p.PurchaserName) ||
string.IsNullOrEmpty(p.PurchaserLocation)))
throw new BusinessException("新增方案中有采购商Id/Name/Location为空");
if (batchCURDSchemeRequest.AddPurchaseSchemeList.Any(p => string.IsNullOrEmpty(p.PurchaserId) ||
string.IsNullOrEmpty(p.PurchaserName) ||
string.IsNullOrEmpty(p.PurchaserLocation)))
throw new BusinessException("编辑方案中有采购商Id/Name/Location为空");
List<PurchaseScheme> addPurchaseSchemeList = null; List<PurchaseScheme> addPurchaseSchemeList = null;
List<PurchaseSchemeProduct> addPurchaseSchemeProductList = new List<PurchaseSchemeProduct>(); List<PurchaseSchemeProduct> addPurchaseSchemeProductList = new List<PurchaseSchemeProduct>();

4
BBWY.Server.Business/Statistics/StatisticsBusiness.cs

@ -19,13 +19,13 @@ namespace BBWY.Server.Business
public OrderAchievementResponse GetOrderAchievementStatistics(OrderAchievementRequest request) public OrderAchievementResponse GetOrderAchievementStatistics(OrderAchievementRequest request)
{ {
request.EndTime = request.EndTime.Date.AddDays(1); request.EndTime = request.EndTime.Date.AddDays(1).AddSeconds(-1);
var response = fsql.Select<Order, OrderCost>().LeftJoin((o, oc) => o.Id == oc.OrderId) var response = fsql.Select<Order, OrderCost>().LeftJoin((o, oc) => o.Id == oc.OrderId)
.Where((o, oc) => o.ShopId == request.ShopId && .Where((o, oc) => o.ShopId == request.ShopId &&
o.OrderState != null && o.OrderState != null &&
!invalidOrderStateList.Contains(o.OrderState.Value) && !invalidOrderStateList.Contains(o.OrderState.Value) &&
o.StartTime >= request.StartTime && o.StartTime >= request.StartTime &&
o.StartTime < request.EndTime) o.StartTime <= request.EndTime)
.ToAggregate((o, oc) => new OrderAchievementResponse() .ToAggregate((o, oc) => new OrderAchievementResponse()
{ {
OrderCount = o.Count(), OrderCount = o.Count(),

2
BBWY.Server.Business/Vender/VenderBusiness.cs

@ -20,7 +20,7 @@ namespace BBWY.Server.Business
public VenderResponse GetVenderInfo(PlatformRequest platformRequest) public VenderResponse GetVenderInfo(PlatformRequest platformRequest)
{ {
var relayAPIHost = GetPlatformRelayAPIHost(platformRequest.Platform); var relayAPIHost = GetPlatformRelayAPIHost(platformRequest.Platform);
var sendResult = restApiService.SendRequest(relayAPIHost, "api/PlatformSDK/GetVenderInfo", platformRequest, null, System.Net.Http.HttpMethod.Post); var sendResult = restApiService.SendRequest(relayAPIHost, "api/PlatformSDK/GetVenderInfo", platformRequest, null, HttpMethod.Post);
if (sendResult.StatusCode != System.Net.HttpStatusCode.OK) if (sendResult.StatusCode != System.Net.HttpStatusCode.OK)
throw new BusinessException(sendResult.Content) { Code = (int)sendResult.StatusCode }; throw new BusinessException(sendResult.Content) { Code = (int)sendResult.StatusCode };
var response = JsonConvert.DeserializeObject<ApiResponse<VenderResponse>>(sendResult.Content); var response = JsonConvert.DeserializeObject<ApiResponse<VenderResponse>>(sendResult.Content);

3
BBWY.Server.Model/Db/Order/Order.cs

@ -116,6 +116,9 @@ namespace BBWY.Server.Model.Db
public string VenderRemark { get; set; } public string VenderRemark { get; set; }
public string PurchaseRemark { get; set; }
/// <summary> /// <summary>
/// 仓库Id /// 仓库Id
/// </summary> /// </summary>

6
BBWY.Server.Model/Db/Order/OrderDropShipping.cs

@ -17,7 +17,7 @@ namespace BBWY.Server.Model.Db
/// <summary> /// <summary>
/// 买家账号 /// 买家账号
/// </summary> /// </summary>
[Column(StringLength = 50)] [Column(StringLength = 200)]
public string BuyerAccount { get; set; } public string BuyerAccount { get; set; }
[Column(DbType = "datetime")] [Column(DbType = "datetime")]
@ -38,7 +38,7 @@ namespace BBWY.Server.Model.Db
/// <summary> /// <summary>
/// 采购单号 /// 采购单号
/// </summary> /// </summary>
[Column(StringLength = 50)] [Column(StringLength = 200)]
public string PurchaseOrderId { get; set; } public string PurchaseOrderId { get; set; }
/// <summary> /// <summary>
@ -50,7 +50,7 @@ namespace BBWY.Server.Model.Db
/// <summary> /// <summary>
/// 卖家账号 /// 卖家账号
/// </summary> /// </summary>
[Column(StringLength = 50)] [Column(StringLength = 200)]
public string SellerAccount { get; set; } public string SellerAccount { get; set; }
} }

28
BBWY.Server.Model/Db/Order/OrderSyncTask.cs

@ -0,0 +1,28 @@
using FreeSql.DataAnnotations;
using System;
namespace BBWY.Server.Model.Db
{
[Table(Name = "ordersynctask", DisableSyncStructure = true)]
public partial class OrderSyncTask
{
[Column(DbType = "bigint(1)", IsPrimary = true)]
public long Id { get; set; }
[Column(DbType = "bigint(1)")]
public long ShopId { get; set; }
[Column(DbType = "int(1)", MapType = typeof(int))]
public Enums.OrderSyncState State { get; set; }
[Column(DbType = "datetime")]
public DateTime SyncEndTime { get; set; }
[Column(DbType = "datetime")]
public DateTime SyncStartTime { get; set; }
}
}

3
BBWY.Server.Model/Db/PurchaseOrder/PurchaseOrder.cs

@ -29,6 +29,9 @@ namespace BBWY.Server.Model.Db
//[Column(DbType = "decimal(20,2)")] //[Column(DbType = "decimal(20,2)")]
//public decimal Freight { get; set; } = 0.00M; //public decimal Freight { get; set; } = 0.00M;
/// <summary>
/// 产品Id
/// </summary>
[Column(StringLength = 50)] [Column(StringLength = 50)]
public string ProductId { get; set; } public string ProductId { get; set; }

13
BBWY.Server.Model/Dto/Request/Order/SyncOrderByDateRequest.cs

@ -0,0 +1,13 @@
using System;
namespace BBWY.Server.Model.Dto
{
public class SyncOrderByDateRequest
{
public long ShopId { get; set; }
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
}
}

14
BBWY.Server.Model/Dto/Request/PurchaseOrder/OnlinePurchase/CargoParamRequest.cs

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace BBWY.Server.Model.Dto
{
public class CargoParamRequest
{
public string ProductId { get; set; }
public string SkuId { get; set; }
public string SpecId { get; set; }
public int Quantity { get; set; }
}
}

43
BBWY.Server.Model/Dto/Request/PurchaseOrder/OnlinePurchase/ConsigneeRequest.cs

@ -0,0 +1,43 @@
namespace BBWY.Server.Model.Dto
{
public class ConsigneeRequest
{
/// <summary>
/// 联系人名称
/// </summary>
public string ContactName { get; set; }
/// <summary>
/// 座机
/// </summary>
public string TelePhone { get; set; }
/// <summary>
/// 手机
/// </summary>
public string Mobile { get; set; }
public string Address { get; set; }
/// <summary>
/// 省
/// </summary>
public string Province { get; set; }
/// <summary>
/// 市
/// </summary>
public string City { get; set; }
/// <summary>
/// 县
/// </summary>
public string County { get; set; }
/// <summary>
/// 镇
/// </summary>
public string Town { get; set; }
}
}

32
BBWY.Server.Model/Dto/Request/PurchaseOrder/OnlinePurchase/CreateOnlinePurchaseOrderRequest.cs

@ -0,0 +1,32 @@
namespace BBWY.Server.Model.Dto
{
public class CreateOnlinePurchaseOrderRequest : PreviewOrderReuqest
{
/// <summary>
/// 下单模式
/// </summary>
public string TradeMode { get; set; }
/// <summary>
/// 采购单留言
/// </summary>
public string Remark { get; set; }
/// <summary>
/// 店铺订单Id
/// </summary>
public string OrderId { get; set; }
/// <summary>
/// 店铺Id
/// </summary>
public long ShopId { get; set; }
/// <summary>
/// 买家账号
/// </summary>
public string BuyerAccount { get; set; }
public string SellerAccount { get; set; }
}
}

17
BBWY.Server.Model/Dto/Request/PurchaseOrder/OnlinePurchase/PreviewOrderReuqest.cs

@ -0,0 +1,17 @@
using System.Collections.Generic;
namespace BBWY.Server.Model.Dto
{
public class PreviewOrderReuqest: PlatformRequest
{
/// <summary>
/// 订单模式
/// <para>1688 general大市场订单 saleproxy分销订单</para>
/// </summary>
public Enums.PurchaseOrderMode PurchaseOrderMode { get; set; }
public ConsigneeRequest Consignee { get; set; }
public IList<CargoParamRequest> CargoParamList { get; set; }
}
}

5
BBWY.Server.Model/Dto/Response/Order/OrderResponse.cs

@ -92,6 +92,11 @@ namespace BBWY.Server.Model.Dto
/// </summary> /// </summary>
public string VenderRemark { get; set; } public string VenderRemark { get; set; }
/// <summary>
/// 采购备注
/// </summary>
public string PurchaseRemark { get; set; }
public Enums.StorageType? StorageType { get; set; } public Enums.StorageType? StorageType { get; set; }
/// <summary> /// <summary>

30
BBWY.Server.Model/Dto/Response/PurchaseOrder/OnlinePurchase/CreateOnlinePurchaseOrderResponse.cs

@ -0,0 +1,30 @@
using System.Collections.Generic;
namespace BBWY.Server.Model.Dto
{
public class CreateOnlinePurchaseOrderResponse
{
public string PurchaseOrderId { get; set; }
/// <summary>
/// 订单总额
/// </summary>
public decimal TotalAmount { get; set; }
/// <summary>
/// 货款总额
/// </summary>
public decimal ProductAmount { get; set; }
/// <summary>
/// 运费总额
/// </summary>
public decimal FreightAmount { get; set; }
/// <summary>
/// 下单失败的商品信息
/// </summary>
public IList<string> FailProductMessageList { get; set; }
}
}

9
BBWY.Server.Model/Dto/Response/PurchaseOrder/OnlinePurchase/OrderTradeTypeResponse.cs

@ -0,0 +1,9 @@
namespace BBWY.Server.Model.Dto
{
public class OrderTradeTypeResponse
{
public string Code { get; set; }
public string Name { get; set; }
}
}

25
BBWY.Server.Model/Dto/Response/PurchaseOrder/OnlinePurchase/PreviewOrderResponse.cs

@ -0,0 +1,25 @@
namespace BBWY.Server.Model.Dto
{
public class PreviewOrderResponse
{
/// <summary>
/// 总额
/// </summary>
public decimal TotalAmount { get; set; }
/// <summary>
/// 货款总额
/// </summary>
public decimal ProductAmount { get; set; }
/// <summary>
/// 运费
/// </summary>
public decimal FreightAmount { get; set; }
/// <summary>
/// 支持的交易方式
/// </summary>
public OrderTradeTypeResponse OrderTradeType { get; set; }
}
}

18
BBWY.Server.Model/Enums.cs

@ -22,6 +22,15 @@
线 = 1 线 = 1
} }
/// <summary>
/// 采购单模式
/// </summary>
public enum PurchaseOrderMode
{
= 0,
= 1
}
/// <summary> /// <summary>
/// 仓储类型 /// 仓储类型
/// </summary> /// </summary>
@ -83,5 +92,14 @@
= 1, = 1,
= 2 = 2
} }
/// <summary>
/// 订单同步任务状态
/// </summary>
public enum OrderSyncState
{
Running = 0,
End = 1
}
} }
} }

11
BBWY.sln

@ -1,7 +1,7 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17 # Visual Studio Version 16
VisualStudioVersion = 17.0.31808.319 VisualStudioVersion = 16.0.30225.117
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BBWY.Client", "BBWY.Client\BBWY.Client.csproj", "{04DAF636-2630-45BB-BEFA-264EC273E920}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BBWY.Client", "BBWY.Client\BBWY.Client.csproj", "{04DAF636-2630-45BB-BEFA-264EC273E920}"
EndProject EndProject
@ -30,6 +30,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
.editorconfig = .editorconfig .editorconfig = .editorconfig
EndProjectSection EndProjectSection
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BBWY.1688SDK", "BBWY.1688SDK\BBWY.1688SDK.csproj", "{1A7EB438-5DEF-4940-8CB2-C58141C75524}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@ -68,6 +70,10 @@ Global
{2DC24A1B-EFE0-4F9D-8A9A-A6B530696E17}.Debug|Any CPU.Build.0 = Debug|Any CPU {2DC24A1B-EFE0-4F9D-8A9A-A6B530696E17}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2DC24A1B-EFE0-4F9D-8A9A-A6B530696E17}.Release|Any CPU.ActiveCfg = Release|Any CPU {2DC24A1B-EFE0-4F9D-8A9A-A6B530696E17}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2DC24A1B-EFE0-4F9D-8A9A-A6B530696E17}.Release|Any CPU.Build.0 = Release|Any CPU {2DC24A1B-EFE0-4F9D-8A9A-A6B530696E17}.Release|Any CPU.Build.0 = Release|Any CPU
{1A7EB438-5DEF-4940-8CB2-C58141C75524}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1A7EB438-5DEF-4940-8CB2-C58141C75524}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1A7EB438-5DEF-4940-8CB2-C58141C75524}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1A7EB438-5DEF-4940-8CB2-C58141C75524}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
@ -80,6 +86,7 @@ Global
{5FC60547-0934-4AAD-921B-F4DA03C9F47D} = {B545F3FA-E6A7-4CB1-B92D-801C66357CF5} {5FC60547-0934-4AAD-921B-F4DA03C9F47D} = {B545F3FA-E6A7-4CB1-B92D-801C66357CF5}
{E38A95F5-05E6-4856-811C-30D7A1B77C68} = {B545F3FA-E6A7-4CB1-B92D-801C66357CF5} {E38A95F5-05E6-4856-811C-30D7A1B77C68} = {B545F3FA-E6A7-4CB1-B92D-801C66357CF5}
{2DC24A1B-EFE0-4F9D-8A9A-A6B530696E17} = {B131026A-2025-4A74-ABF1-644059FADF78} {2DC24A1B-EFE0-4F9D-8A9A-A6B530696E17} = {B131026A-2025-4A74-ABF1-644059FADF78}
{1A7EB438-5DEF-4940-8CB2-C58141C75524} = {B131026A-2025-4A74-ABF1-644059FADF78}
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {CC045257-4D86-45FD-A1F0-2715C024F1B5} SolutionGuid = {CC045257-4D86-45FD-A1F0-2715C024F1B5}

Loading…
Cancel
Save