You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

835 lines
34 KiB
C#

2 months ago
using NetLibrary.Log;
using NetLibrary.OnlineTrade;
using Newtonsoft.Json.Linq;
using NPOI.HSSF.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Remoting.Metadata.W3cXsd2001;
using System.Security.Cryptography;
using System.Text;
using System.Web;
using System.Web.Script.Serialization;
namespace TradeManageNew
{
public class Temu
{
//public string IP = "http://50.196.110.198:8081"; //美国跳转服务器ip地址
public string IP = "http://50.196.110.198:8099"; //美国跳转服务器ip地址
public string AccessToken { get; set; }
public string AppKey { get; set; }
public string AppSecret { get; set; }
public int shopid { get; set; }
JavaScriptSerializer JsonConvert = null;
public Temu()
{
JsonConvert = new JavaScriptSerializer();
}
public List<OrderModel> GetOrders(DateTime sdate,DateTime edate, out string errorMessage)
{
var orderModels = new List<OrderModel>();
try
{
if (string.IsNullOrEmpty(AccessToken) || string.IsNullOrEmpty(AppKey) || string.IsNullOrEmpty(AppSecret))
{
errorMessage = "店铺未授权";
return null;
}
var nowPage = 1;
int totalPage = 1;
string error = "";
while (nowPage<=totalPage)
{
var orders = GetOrderList(sdate, edate, nowPage, out totalPage,out error);
if (orders == null)
break;
foreach (var order in orders)
{
ErrorFollow.TraceWrite("自动导入TEMU订单循环model", "店铺名称:" + shopid, JsonConvert.Serialize(order));
//if (order.parentOrderMap.parentOrderSn != "576662364844036518" )
//{
// continue;
//}
//只同步待发货和已发货状态订单
if (order.parentOrderMap.parentOrderStatus==2 || order.parentOrderMap.parentOrderStatus == 4)
{
var receive = GetOrderReceiveInfo(order.parentOrderMap.parentOrderSn);
var orderM = ToOrderModel(order, receive);
if (orderM!=null)
{
orderModels.Add(orderM);
var shipTracks = new List<TemuOrderShipTrackCode>();
var temuShips=new List<TemuShipmentODT>();
//获取订单的发货面单信息
foreach (var item in order.orderList)
{
var shipments = GetOrderShipmentInfo(order.parentOrderMap.parentOrderSn, item.orderSn);
if (shipments != null && item.productList!=null)
{
foreach(var shipment in shipments)
{
var temuShip = new TemuShipmentODT()
{
ParentOrderSn = order.parentOrderMap.parentOrderSn,
TrackCode = shipment.trackingNumber,
Quantity = shipment.quantity,
SKU = item.productList.First().extCode
};
temuShips.Add(temuShip);
//var detail = DataNew.GetGoodsInfoDetailBySku(item.productList.First().extCode);
//var sku = detail != null ? shipment.quantity + "x" + detail.SKU1 : "";
//var _temuTrack = shipTracks.Where(r => r.ParentOrderSn == order.parentOrderMap.parentOrderSn && r.TrackCode == shipment.trackingNumber).FirstOrDefault();
//if (_temuTrack != null)
//{
// _temuTrack.SKU = string.IsNullOrEmpty(_temuTrack.SKU) ? sku : (_temuTrack.SKU + "+" + sku);
//}
//else
//{
// var temuTrack = new TemuOrderShipTrackCode()
// {
// ParentOrderSn = order.parentOrderMap.parentOrderSn,
// //OrderSn = item.orderSn,
// TrackCode = shipment.trackingNumber,
// SKU = detail != null ? shipment.quantity + "x" + detail.SKU1 : "",
// Weight = (detail != null && detail.Weight.HasValue) ? (detail.Weight.Value * shipment.quantity).ToString("0.00") : "",
// Long = (detail != null && detail.Long.HasValue) ? detail.Long.Value.ToString("0.00") : "",
// Width = (detail != null && detail.Width.HasValue) ? detail.Width.Value.ToString("0.00") : "",
// Height = (detail != null && detail.Height.HasValue) ? detail.Height.Value.ToString("0.00") : "",
// };
// shipTracks.Add(temuTrack);
//}
}
}
}
if (temuShips != null)
{
var _GBtemuShips = temuShips.GroupBy(r => new { r.ParentOrderSn, r.TrackCode, r.SKU }).Select(g => new { ParentOrderSn = g.Key.ParentOrderSn, TrackCode = g.Key.TrackCode, SKU = g.Key.SKU, Quantity = g.Sum(r => r.Quantity) }).ToList();
foreach(var _gb in _GBtemuShips)
{
var strack = shipTracks.Where(r => r.ParentOrderSn == _gb.ParentOrderSn && r.TrackCode == _gb.TrackCode).FirstOrDefault();
if (strack != null)
{
strack.SKU = string.IsNullOrEmpty(strack.SKU) ? (_gb.Quantity + "x" + _gb.SKU) : (strack.SKU + "+" + (_gb.Quantity + "x" + _gb.SKU));
}
else
{
var sku = "";
var detail = DataNew.GetGoodsInfoDetailBySku(_gb.SKU);
if (detail == null)
{
continue;
}
if (detail.GoodsId == 5527) //组合商品对应的SKU需要以SKU14为准
{
if (string.IsNullOrEmpty(detail.SKU14))
{
continue;
}
var skuarr = detail.SKU14.Split(',');
foreach (var _sku in skuarr)
{
sku += _gb.Quantity.ToString() + "x" + _sku + "+";
}
sku = sku.TrimEnd('+');
}
else
{
sku = detail != null ? _gb.Quantity + "x" + detail.SKU1 : "";
}
strack = new TemuOrderShipTrackCode
{
ParentOrderSn = _gb.ParentOrderSn,
TrackCode = _gb.TrackCode,
SKU = sku,
Weight = (detail != null && detail.Weight.HasValue) ? (detail.Weight.Value * _gb.Quantity.Value).ToString("0.00") : "",
Long = (detail != null && detail.Long.HasValue) ? detail.Long.Value.ToString("0.00") : "",
Width = (detail != null && detail.Width.HasValue) ? detail.Width.Value.ToString("0.00") : "",
Height = (detail != null && detail.Height.HasValue) ? detail.Height.Value.ToString("0.00") : "",
};
shipTracks.Add(strack);
}
}
}
if (shipTracks != null)
{
foreach(var shipTrack in shipTracks)
{
DataNew.SaveTemuOrderShipTrackCode(shipTrack);
}
}
}
}
}
nowPage++;
}
errorMessage = error;
}
catch (Exception ex)
{
errorMessage = ex.Message;
}
ErrorFollow.TraceWrite("自动导入TEMU订单结束返回APImodel", "店铺名称:" + shopid, JsonConvert.Serialize(orderModels));
return orderModels;
}
/// <summary>
/// 获取订单列表
/// </summary>
/// <param name="sdate"></param>
/// <param name="edate"></param>
/// <param name="pageNum"></param>
/// <param name="totalPage"></param>
/// <param name="error"></param>
/// <returns></returns>
public List<TemuOrderPageItems> GetOrderList(DateTime sdate, DateTime edate, int pageNum, out int totalPage, out string error)
{
var rdatas = new List<TemuOrderPageItems>();
try
{
var sdateStamp = (long)(sdate.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
var edateStamp = (long)(edate.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
long timeStamp = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
string[] fulfillmentTypeList = new string[] { "fulfillBySeller", "fulfillByCooperativeWarehouse" };
StringBuilder jsonFulfillmentTypes = new StringBuilder("[");
bool isFirst = true;
foreach (var item in fulfillmentTypeList)
{
if (!isFirst)
{
jsonFulfillmentTypes.Append(",");
}
jsonFulfillmentTypes.Append("\"").Append(item).Append("\"");
isFirst = false;
}
jsonFulfillmentTypes.Append("]");
string result = jsonFulfillmentTypes.ToString();
//int regionId = 211;
var apiType = "bg.order.list.get";
//var bodyStrArr = new string[] { "access_token" + AccessToken, "app_key" + AppKey, "createAfter" + sdateStamp, "createBefore" + edateStamp, "data_typeJSON", "fulfillmentTypeList" + result, "pageNumber" + pageNum.ToString(), "pageSize100", "parentOrderStatus0", "regionId211", "timestamp" + timeStamp, "type" + apiType };
var bodyStrArr = new string[] { "access_token" + AccessToken, "app_key" + AppKey, "createAfter" + sdateStamp, "createBefore" + edateStamp, "data_typeJSON", "pageNumber" + pageNum.ToString(), "pageSize100", "parentOrderStatus0", "timestamp" + timeStamp, "type" + apiType };
var bodyStr = AppSecret + string.Join("", bodyStrArr) + AppSecret;//参数按字母顺序排序
var sign = EncryptionHelp.GetMD5(bodyStr);
var body = new
{
access_token = AccessToken,
app_key = AppKey,
createAfter = sdateStamp,
createBefore = edateStamp,
data_type = "JSON",
//fulfillmentTypeList = fulfillmentTypeList,
pageNumber = pageNum,
pageSize = 100,
parentOrderStatus = 0,
//regionId = regionId,
timestamp = timeStamp,
type = apiType,
sign = sign.ToUpper()
};
var json = JsonConvert.Serialize(body);
var path = EncryptionHelp.EncryptString(json, "ThisIsShopifyKey12365498");
var path2 = HttpUtility.UrlEncode(path);
var url = IP + "/api/TemuHelp/GetTemuShopOrderList?bodyStr=" + path2;
//using (HttpClient client = new HttpClient())
//{
// HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url);
// var response = client.SendAsync(request);
// string responseContent = response.Result.Content.ReadAsStringAsync().GetAwaiter().GetResult();
// if (string.IsNullOrEmpty(responseContent) || responseContent == "Fail")
// {
// totalPage = 0;
// error = "接口返回失败";
// return null;
// }
// else
// {
// var rModel = JsonConvert.Deserialize<TemuOrdersReturn>(responseContent);
// if (rModel != null && rModel.result != null && rModel.result.result != null)
// {
// var result2 = rModel.result.result;
// error = "";
// rdatas = result2.pageItems;
// totalPage = result2.totalItemNum % 100 > 0 ? (result2.totalItemNum / 100 + 1) : (result2.totalItemNum / 100);
// }
// else
// {
// totalPage = 0;
// error = "接口未返回数据";
// return null;
// }
// }
//}
using (WebClient client = new WebClient())
{
client.Encoding = Encoding.UTF8; // 指定下载内容编码方式为 UTF-8
string responseContent = client.DownloadString(url);
ErrorFollow.TraceWrite("自动导入TEMU订单返回结果", "店铺名称:" + shopid, responseContent);
if (string.IsNullOrEmpty(responseContent) || responseContent == "Fail")
{
totalPage = 0;
error = "接口返回失败";
return null;
}
else
{
var rModel = JsonConvert.Deserialize<TemuOrdersReturn>(responseContent);
if (rModel != null && rModel.result != null && rModel.result.result != null)
{
var result2 = rModel.result.result;
error = "";
rdatas = result2.pageItems;
totalPage = result2.totalItemNum % 100 > 0 ? (result2.totalItemNum / 100 + 1) : (result2.totalItemNum / 100);
}
else
{
totalPage = 0;
error = "接口未返回数据";
return null;
}
}
}
}
catch (Exception ex)
{
error = ex.Message;
totalPage = 0;
}
return rdatas;
}
/// <summary>
/// 获取订单收货地址
/// </summary>
/// <param name="orderno"></param>
/// <returns></returns>
public ReceiveResult GetOrderReceiveInfo(string orderno)
{
var rdata = new ReceiveResult();
try
{
//var timeStamp = DateTimeOffset.Now.ToUnixTimeSeconds();
long timeStamp = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
var apiType = "bg.order.shippinginfo.get";
var bodyStrArr = new string[] { "access_token" + AccessToken, "app_key" + AppKey, "data_typeJSON", "parentOrderSn" + orderno, "timestamp" + timeStamp, "type" + apiType };
var bodyStr = AppSecret + string.Join("", bodyStrArr) + AppSecret;
var sign = EncryptionHelp.GetMD5(bodyStr);
var body = new
{
access_token = AccessToken,
app_key = AppKey,
data_type = "JSON",
parentOrderSn = orderno,
timestamp = timeStamp,
type = apiType,
sign = sign.ToUpper(),
};
var json = JsonConvert.Serialize(body);
var path = EncryptionHelp.EncryptString(json, "ThisIsShopifyKey12365498");
var path2 = HttpUtility.UrlEncode(path);
var url = IP + "/api/TemuHelp/getTemuShopOrderReceiveInfo?bodyStr=" + path2;
//using (HttpClient client = new HttpClient())
//{
// HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url);
// var response = client.SendAsync(request);
// string responseContent = response.Result.Content.ReadAsStringAsync().GetAwaiter().GetResult();
// if (string.IsNullOrEmpty(responseContent) || responseContent == "Fail")
// {
// return null;
// }
// else
// {
// var rModel = JsonConvert.Deserialize<TemuReceiveReturn>(responseContent);
// if (rModel != null && rModel.result != null && rModel.result.result != null)
// {
// ReceiveResult result = rModel.result.result;
// rdata = result;
// }
// else
// {
// return null;
// }
// }
//}
using (WebClient client = new WebClient())
{
client.Encoding = Encoding.UTF8; // 指定下载内容编码方式为 UTF-8
string responseContent = client.DownloadString(url);
if (string.IsNullOrEmpty(responseContent) || responseContent == "Fail")
{
return null;
}
else
{
var rModel = JsonConvert.Deserialize<TemuReceiveReturn>(responseContent);
if (rModel != null && rModel.result != null && rModel.result.result != null)
{
ReceiveResult result = rModel.result.result;
rdata = result;
}
else
{
return null;
}
}
}
}
catch (Exception ex)
{
}
return rdata;
}
/// <summary>
/// 获取订单发货信息
/// </summary>
/// <param name="orderno"></param>
/// <returns></returns>
public List<ShipmentInfoDTOItem> GetOrderShipmentInfo(string parentOrderSn, string orderSn)
{
var rdata = new List<ShipmentInfoDTOItem>();
if(parentOrderSn== "PO-211-19061389486712336")
{
}
try
{
long timeStamp = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
var apiType = "bg.logistics.shipment.get";
var bodyStrArr = new string[] { "access_token" + AccessToken, "app_key" + AppKey, "data_typeJSON", "orderSn" + orderSn, "parentOrderSn" + parentOrderSn, "timestamp" + timeStamp, "type" + apiType };
var bodyStr = AppSecret + string.Join("", bodyStrArr) + AppSecret;
var sign = EncryptionHelp.GetMD5(bodyStr);
var body = new
{
access_token = AccessToken,
app_key = AppKey,
data_type = "JSON",
orderSn= orderSn,
parentOrderSn = parentOrderSn,
timestamp = timeStamp,
type = apiType,
sign = sign.ToUpper(),
};
var json = JsonConvert.Serialize(body);
var path = EncryptionHelp.EncryptString(json, "ThisIsShopifyKey12365498");
var path2 = HttpUtility.UrlEncode(path);
var url = IP + "/api/TemuHelp/getTemuShopOrderShipmentInfo?bodyStr=" + path2;
//using (HttpClient client = new HttpClient())
//{
// HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url);
// var response = client.SendAsync(request);
// string responseContent = response.Result.Content.ReadAsStringAsync().GetAwaiter().GetResult();
using (WebClient client = new WebClient())
{
client.Encoding = Encoding.UTF8; // 指定下载内容编码方式为 UTF-8
string responseContent = client.DownloadString(url);
if (string.IsNullOrEmpty(responseContent) || responseContent == "Fail")
{
return null;
}
else
{
var rModel = JsonConvert.Deserialize<TemuShipmentReturn>(responseContent);
if (rModel != null && rModel.result != null && rModel.result.result != null)
{
ShipmentInfoResult2 result = rModel.result.result;
if (result.shipmentInfoDTO != null)
rdata = result.shipmentInfoDTO;
else
rdata = null;
}
else
{
return null;
}
}
}
}
catch (Exception ex)
{
}
return rdata;
}
public OrderModel ToOrderModel(TemuOrderPageItems topi, ReceiveResult rer)
{
try
{
OrderModel model = new OrderModel();
model.PlatOrderCode = topi.parentOrderMap.parentOrderSn;
model.OrderCode = topi.parentOrderMap.parentOrderSn;
model.OrderDate = GetDateTimeFromTimeStamp(topi.parentOrderMap.parentOrderTime.Value);
model.OrderState = 1;
if (rer != null)
{
model.BuyerName = rer.receiptName;
model.BuyerCountry = rer.regionName1;
model.BuyerProvince = rer.regionName2;
model.BuyerCity = rer.regionName3;
model.BuyerAddr = string.IsNullOrEmpty(rer.addressLineAll) ? (rer.addressLine1 + rer.addressLine2) : rer.addressLineAll;
model.BuyerPhone = rer.mobile;
model.BuyerZip = rer.postCode;
}
model.PayDate = model.OrderDate.Value;
model.OutOrderDate = GetDateTimeFromTimeStamp(topi.parentOrderMap.expectShipLatestTime.Value);
model.ListModel = new List<OrderDetailModel>();
decimal totalPrice = 0;
//删除
DataNew.DeleteTemuShopOrderGoodsDetailByParentOrderSn(topi.parentOrderMap.parentOrderSn);
if (topi.orderList!=null)
{
foreach (var item2 in topi.orderList)
{
OrderDetailModel model2 = new OrderDetailModel();
model2.TypeDesc = item2.spec;
model2.GoodsNum = item2.quantity;
model2.OrderItemId = item2.productList != null ? item2.productList.First().productId : "";//SPUID
if (shopid == 94)//没有主体的店铺没有SPUIDSKUID做为唯一
{
model2.OrderItemId = item2.skuId;
}
model2.GoodsName = item2.goodsId + "," + item2.skuId;//goodsId,skuId
model2.GoodsSKU = item2.productList != null ? item2.productList.First().extCode : "";
model2.PostInfo = item2.orderSn;
model.ListModel.Add(model2);
if (!string.IsNullOrEmpty(model2.OrderItemId))
{
var temuPrice = DataNew.GetTemuShopGoodPriceOne(shopid, model2.OrderItemId);
if (temuPrice != null)
totalPrice = totalPrice + (temuPrice.SalePrice.HasValue ? temuPrice.SalePrice.Value * item2.quantity : 0);
}
var temuOGD = new TemuShopOrderGoodsDetail()
{
Shopid = shopid,
ParentOrderSn = topi.parentOrderMap.parentOrderSn,
OrderSn = item2.orderSn,
OrderStatus = item2.orderStatus,
GoodsId = item2.goodsId,
SKUId = item2.skuId,
ThumbUrl = item2.thumbUrl,
Quantity = item2.quantity,
GoodsName = item2.goodsName,
ProductList = item2.productList == null ? "" : JsonConvert.Serialize(item2.productList)
};
DataNew.SaveTemuShopOrderGoodsDetail(temuOGD);
}
}
model.TotalPrice = totalPrice;
model.MoneyCode = "USD";
return model;
}
catch (Exception ex)
{
ErrorFollow.TraceWrite(ex.TargetSite.Name, ex.StackTrace, ex.Message);
return null;
}
}
public DateTime GetDateTimeFromTimeStamp(long st)
{
DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
long lTime = long.Parse(st + "0000000");
TimeSpan toNow = new TimeSpan(lTime);
return dtStart.Add(toNow);
}
#region 订单列表model
public class TemuOrdersReturn
{
public bool success { get; set; }
public string requestId { get; set; }
public int errorCode { get; set; }
public string errorMsg { get; set; }
public TemuOrderResult1 result { get; set; }
}
public class TemuOrderResult1
{
public bool success { get; set; }
public int errorCode { get; set; }
public long serverTime { get; set; }
public string errorMsg { get; set; }
public TemuOrderResult2 result { get; set; }
}
public class TemuOrderResult2
{
public int totalItemNum { get; set; }
public List<TemuOrderPageItems> pageItems { get; set; }
}
public class TemuOrderPageItems
{
public ParentOrderMap parentOrderMap { get; set; }
public List<TemuOrderModel> orderList { get; set; }
}
public class ParentOrderMap
{
public int regionId { get; set; }
public string parentOrderSn { get; set; }
public long? parentShippingTime { get; set; }
public int? siteId { get; set; }
public long? expectShipLatestTime { get; set; }
public int? parentOrderStatus { get; set; }
public long? parentOrderTime { get; set; }
}
public class TemuOrderModel
{
public int quantity { get; set; }
public string orderSn { get; set; }
public string goodsId { get;set; }
public int orderStatus { get; set; }
public string thumbUrl { get;set; }
public string goodsName { get;set; }
public string skuId { get; set; }
public string spec { get; set; }
public List<TemuOrderProduct> productList { get; set; }
}
public class TemuOrderProduct
{
public string productSkuId { get; set; }
public int soldFactor { get; set; }
public string extCode { get; set; }
public string productId { get; set; }
}
#endregion
#region 订单收货地址model
public class TemuReceiveReturn
{
public TemuReceiveResult1 result { get; set; }
}
public class TemuReceiveResult1
{
public bool success { get; set; }
public int errorCode { get; set; }
public long serverTime { get; set; }
public string errorMsg { get; set; }
public ReceiveResult result { get; set; }
}
public class ReceiveResult
{
public string receiptName { get; set; }
public string mobile { get; set; }
public string regionName1 { get; set; }
public string regionName2 { get; set; }
public string regionName3 { get; set;}
public string addressLine1 { get; set; }
public string addressLine2 { get; set;}
public string postCode { get; set; }
public string addressLineAll { get; set; }
}
#endregion
#region 订单发货信息model
//public class TemuShipmentReturn
//{
// public TemuShipmentResult1 result { get; set; }
//}
//public class TemuShipmentResult1
//{
// public bool success { get; set; }
// public int errorCode { get; set; }
// public long serverTime { get; set; }
// public string errorMsg { get; set; }
// public ShipmentResult result { get; set; }
//}
//public class ShipmentResult
//{
// public List<DeliveryInfoMap> shipmentInfoDTO { get; set; }
//}
//public class DeliveryInfoMap
//{
// public string carrierId { get; set; }
// public string carrierName { get; set; }
// public string trackingNumber { get; set; }
// public string skuId { get; set; }
// public string quantity { get; set; }
//}
//如果好用,请收藏地址,帮忙分享。
public class ShipmentInfoDTOItem
{
/// <summary>
///
/// </summary>
public int quantity { get; set; }
/// <summary>
///
/// </summary>
public string carrierName { get; set; }
/// <summary>
///
/// </summary>
public string carrierId { get; set; }
/// <summary>
///
/// </summary>
public string trackingNumber { get; set; }
/// <summary>
///
/// </summary>
public string skuId { get; set; }
}
public class ShipmentInfoResult2
{
/// <summary>
///
/// </summary>
public List<ShipmentInfoDTOItem> shipmentInfoDTO { get; set; }
}
public class ShipmentInfoResult1
{
/// <summary>
///
/// </summary>
public ShipmentInfoResult2 result { get; set; }
/// <summary>
///
/// </summary>
public string success { get; set; }
/// <summary>
///
/// </summary>
public string errorCode { get; set; }
/// <summary>
///
/// </summary>
public long serverTime { get; set; }
/// <summary>
///
/// </summary>
public string errorMsg { get; set; }
}
public class TemuShipmentReturn
{
/// <summary>
///
/// </summary>
public ShipmentInfoResult1 result { get; set; }
/// <summary>
///
/// </summary>
public string success { get; set; }
/// <summary>
///
/// </summary>
public string requestId { get; set; }
/// <summary>
///
/// </summary>
public string errorCode { get; set; }
/// <summary>
///
/// </summary>
public string errorMsg { get; set; }
}
#endregion
}
}