From 0705cb6170a9ba77ba48bbb6dcebb9cf3d73cbea Mon Sep 17 00:00:00 2001
From: wangxinhui <wangxinhui@hnkhzn.com>
Date: 星期二, 14 十月 2025 02:12:25 +0800
Subject: [PATCH] Merge branch 'master' of http://115.159.85.185:8098/r/MeiRuiAn/HuaiAn
---
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs | 477 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 438 insertions(+), 39 deletions(-)
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs"
index 0a53824..623df73 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs"
@@ -1,12 +1,16 @@
锘縰sing AutoMapper;
using MailKit.Search;
+using Newtonsoft.Json;
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
using SqlSugar;
using System;
+using System.Collections;
using System.Collections.Generic;
using System.Linq;
+using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
+using WIDESEA_Common.StockEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Enums;
@@ -19,6 +23,7 @@
using WIDESEA_IStockRepository;
using WIDESEA_IStockService;
using WIDESEA_Model.Models;
+using WIDESEA_StockRepository;
namespace WIDESEA_StockService
{
@@ -37,6 +42,12 @@
_outboundRepository = outboundRepository;
}
+ /// <summary>
+ /// 鏌ヨ璁㈠崟绔嬪簱搴撳瓨瑙嗗浘
+ /// </summary>
+ /// <param name="orderId"></param>
+ /// <param name="materielCode"></param>
+ /// <returns></returns>
public List<StockSelectViewDTO> GetStockSelectViews(int orderId, string materielCode)
{
try
@@ -47,7 +58,7 @@
throw new Exception($"鏈壘鍒板嚭搴撳崟淇℃伅");
}
- List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(outboundOrder.WarehouseId);
+ List<string> locationCodes = _basicRepository.LocationInfoRepository.PPGetCanOutLocationCodes(outboundOrder.WarehouseId);
return BaseDal.QueryTabs<Dt_StockInfo, Dt_StockInfoDetail, StockSelectViewDTO>((a, b) => a.Id == b.StockId, (a, b) => new StockSelectViewDTO
{
@@ -71,7 +82,144 @@
}
}
+ /// <summary>
+ /// 鏌ヨ璁㈠崟骞冲簱搴撳瓨瑙嗗浘
+ /// </summary>
+ /// <param name="orderId"></param>
+ /// <param name="materielCode"></param>
+ /// <returns></returns>
+ public List<StockSelectViewDTO> GetPKStockSelectViews(int orderId, string materielCode)
+ {
+ try
+ {
+ Dt_OutboundOrder outboundOrder = _outboundRepository.OutboundOrderRepository.QueryFirst(x => x.Id == orderId);
+ if (outboundOrder == null)
+ {
+ throw new Exception($"鏈壘鍒板嚭搴撳崟淇℃伅");
+ }
+ return BaseDal.QueryTabs<Dt_StockInfo, Dt_StockInfoDetail, StockSelectViewDTO>((a, b) => a.Id == b.StockId && a.WarehouseId == outboundOrder.WarehouseId, (a, b) => new StockSelectViewDTO
+ {
+ LocationCode = a.LocationCode,
+ MaterielCode = b.MaterielCode,
+ MaterielName = b.MaterielName,
+ PalletCode = a.PalletCode,
+ UseableQuantity = b.StockQuantity - b.OutboundQuantity
+ }, a => a.LocationCode == "骞冲簱浣�", b => b.StockQuantity > b.OutboundQuantity && b.MaterielCode == materielCode, x => true).GroupBy(x => x.PalletCode).Select(x => new StockSelectViewDTO
+ {
+ LocationCode = x.FirstOrDefault()?.LocationCode ?? "",
+ MaterielCode = x.FirstOrDefault()?.MaterielCode ?? "",
+ MaterielName = x.FirstOrDefault()?.MaterielName ?? "",
+ PalletCode = x.Key,
+ UseableQuantity = x.Sum(x => x.UseableQuantity)
+ }).ToList();
+ }
+ catch (Exception ex)
+ {
+ return null;
+ }
+ }
+ /// <summary>
+ /// 鏌ヨ璁㈠崟PP绔嬪簱搴撳瓨瑙嗗浘
+ /// </summary>
+ /// <param name="orderId"></param>
+ /// <param name="materielCode"></param>
+ /// <returns></returns>
+ public List<PPStockSelectViewDTO> PPGetStockSelectViews(int orderId, string materielCode)
+ {
+ try
+ {
+ Dt_MesPPCutOutboundOrder mesPPCutOutboundOrder = _outboundRepository.MesPPCutOutboundOrderRepository.QueryFirst(x => x.Id == orderId);
+ if (mesPPCutOutboundOrder == null)
+ {
+ throw new Exception($"鏈壘鍒板嚭搴撳崟淇℃伅");
+ }
+ List<string> locationCodes = _basicRepository.LocationInfoRepository.PPGetCanOutLocationCodes(mesPPCutOutboundOrder.WarehouseId);
+ return BaseDal.QueryTabs<Dt_StockInfo, Dt_StockInfoDetail, PPStockSelectViewDTO>((a, b) => a.Id == b.StockId, (a, b) => new PPStockSelectViewDTO
+ {
+ LocationCode = a.LocationCode,
+ MaterielCode = b.MaterielCode,
+ MaterielName = b.MaterielName,
+ PalletCode = a.PalletCode,
+ Unit = b.Unit,
+ CutedWidth = b.CutedWidth,
+ UseableQuantity = b.StockQuantity - b.OutboundQuantity
+ }, a => locationCodes.Contains(a.LocationCode), b => b.StockQuantity > b.OutboundQuantity && b.MaterielCode == materielCode, x => true).GroupBy(x => x.PalletCode).Select(x => new PPStockSelectViewDTO
+ {
+ LocationCode = x.FirstOrDefault()?.LocationCode ?? "",
+ MaterielCode = x.FirstOrDefault()?.MaterielCode ?? "",
+ MaterielName = x.FirstOrDefault()?.MaterielName ?? "",
+ Unit = x.FirstOrDefault()?.Unit ?? "",
+ CutedWidth = x.Sum(x => x.CutedWidth),
+ PalletCode = x.Key,
+ UseableQuantity = x.Sum(x => x.UseableQuantity)
+ }).ToList();
+ }
+ catch (Exception ex)
+ {
+
+ return null;
+ }
+ }
+
+ /// <summary>
+ /// 鏌ヨ璁㈠崟PP骞冲簱搴撳瓨瑙嗗浘
+ /// </summary>
+ /// <param name="orderId"></param>
+ /// <param name="materielCode"></param>
+ /// <returns></returns>
+ public List<PPStockSelectViewDTO> PPGetPKStockSelectViews(int orderId, string materielCode)
+ {
+ try
+ {
+ Dt_MesPPCutOutboundOrder outboundOrder = _outboundRepository.MesPPCutOutboundOrderRepository.QueryFirst(x => x.Id == orderId);
+ if (outboundOrder == null)
+ {
+ throw new Exception($"鏈壘鍒板嚭搴撳崟淇℃伅");
+ }
+ return BaseDal.QueryTabs<Dt_StockInfo, Dt_StockInfoDetail, PPStockSelectViewDTO>((a, b) => a.Id == b.StockId && a.WarehouseId == outboundOrder.WarehouseId, (a, b) => new PPStockSelectViewDTO
+ {
+ LocationCode = a.LocationCode,
+ MaterielCode = b.MaterielCode,
+ MaterielName = b.MaterielName,
+ PalletCode = a.PalletCode,
+ Unit = b.Unit,
+ CutedWidth = b.CutedWidth,
+ UseableQuantity = b.StockQuantity - b.OutboundQuantity
+ }, a => a.LocationCode.Contains("AGV_PP"), b => b.StockQuantity > b.OutboundQuantity && b.MaterielCode == materielCode, x => true).GroupBy(x => x.PalletCode).Select(x => new PPStockSelectViewDTO
+ {
+ LocationCode = x.FirstOrDefault()?.LocationCode ?? "",
+ MaterielCode = x.FirstOrDefault()?.MaterielCode ?? "",
+ MaterielName = x.FirstOrDefault()?.MaterielName ?? "",
+ Unit = x.FirstOrDefault()?.Unit ?? "",
+ CutedWidth = x.Sum(x => x.CutedWidth),
+ PalletCode = x.Key,
+ UseableQuantity = x.Sum(x => x.UseableQuantity)
+ }).ToList();
+ }
+ catch (Exception ex)
+ {
+ return null;
+ }
+ }
+
+
+
+ public WebResponseContent StockQueryData(SaveModel saveModel)
+ {
+ try
+ {
+ var barcode = saveModel.MainData["barcode"].ToString();
+ var warehouseId = saveModel.MainData["warehouseId"].ObjToInt();
+ Dt_StockInfo stockInfo = BaseDal.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == barcode && x.WarehouseId == warehouseId).Includes(x => x.Details).First();
+ if (stockInfo == null) throw new Exception("鏈壘鍒版墭鐩樹俊鎭�");
+ return WebResponseContent.Instance.OK(data: stockInfo);
+ }
+ catch (Exception ex)
+ {
+ return WebResponseContent.Instance.Error(ex.Message);
+ }
+ }
/// <summary>
///
/// </summary>
@@ -84,18 +232,26 @@
{
List<Dt_StockInfo> outStocks = new List<Dt_StockInfo>();
float stockTotalQuantity = stockInfos.Select(x => x.Details.Sum(v => v.StockQuantity - v.OutboundQuantity)).Sum(x => x);
- stockInfos = stockInfos.OrderBy(x => x.Id).ToList();
+ //stockInfos = stockInfos.OrderBy(x => x.Id).ToList();
if (stockTotalQuantity >= needQuantity)//搴撳瓨澶�
{
int index = 0;
while (needQuantity > 0)
{
Dt_StockInfo stockInfo = stockInfos[index];
- float useableStockQuantity = stockInfo.Details.Where(x => x.MaterielCode == materielCode).Sum(x => x.StockQuantity - x.OutboundQuantity);
- if (useableStockQuantity < needQuantity)
+ // 璁$畻鍙敤搴撳瓨鏃惰浆鎹负decimal
+ decimal useableStockQuantity = stockInfo.Details
+ .Where(x => x.MaterielCode == materielCode)
+ .Sum(x => (decimal)x.StockQuantity - (decimal)x.OutboundQuantity);
+
+ // 灏唍eedQuantity杞崲涓篸ecimal杩涜姣旇緝
+ if (useableStockQuantity < (decimal)needQuantity && useableStockQuantity > 0)
{
- stockInfo.Details.ForEach(x => x.OutboundQuantity = x.StockQuantity);
- needQuantity -= useableStockQuantity;
+ stockInfo.Details.ForEach(x =>
+ x.OutboundQuantity = x.StockQuantity);
+
+ // 浣跨敤decimal杩涜璁$畻鍚庡啀杞洖float
+ needQuantity = (float)((decimal)needQuantity - useableStockQuantity);
}
else
{
@@ -103,14 +259,20 @@
{
if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == materielCode)
{
- if (x.StockQuantity - x.OutboundQuantity >= needQuantity)
+ // 灏嗙浉鍏冲�艰浆鎹负decimal杩涜绮剧‘璁$畻
+ decimal currentStock = (decimal)x.StockQuantity;
+ decimal currentOutbound = (decimal)x.OutboundQuantity;
+ decimal currentNeed = (decimal)needQuantity;
+ decimal available = currentStock - currentOutbound;
+
+ if (available >= currentNeed)
{
- x.OutboundQuantity += needQuantity;
+ x.OutboundQuantity = (float)(currentOutbound + currentNeed);
needQuantity = 0;
}
else
{
- needQuantity -= (x.StockQuantity - x.OutboundQuantity);
+ needQuantity = (float)(currentNeed - available);
x.OutboundQuantity = x.StockQuantity;
}
}
@@ -119,39 +281,11 @@
outStocks.Add(stockInfo);
index++;
}
+
}
else
{
- for (int i = 0; i < stockInfos.Count; i++)
- {
- Dt_StockInfo stockInfo = stockInfos[i];
- float useableStockQuantity = stockInfo.Details.Where(x => x.MaterielCode == materielCode).Sum(x => x.StockQuantity - x.OutboundQuantity);
- if (useableStockQuantity < needQuantity)
- {
- stockInfo.Details.ForEach(x => x.OutboundQuantity = x.StockQuantity);
- needQuantity -= useableStockQuantity;
- }
- else
- {
- stockInfo.Details.ForEach(x =>
- {
- if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == materielCode)
- {
- if (x.StockQuantity - x.OutboundQuantity >= needQuantity)
- {
- x.OutboundQuantity += needQuantity;
- needQuantity = 0;
- }
- else
- {
- needQuantity -= (x.StockQuantity - x.OutboundQuantity);
- x.OutboundQuantity = x.StockQuantity;
- }
- }
- });
- }
- outStocks.Add(stockInfo);
- }
+ throw new Exception("搴撳瓨涓嶈冻");
}
residueQuantity = needQuantity;
return outStocks;
@@ -163,5 +297,270 @@
return BaseDal.GetStockInfos(materielCode, batchNo, locationCodes);
}
+
+ public List<Dt_StockInfo> GetUseableStocks(string materielCode, string batchNo, string palletcode, int warehoseId)
+ {
+ Dt_StockInfo stockInfo = BaseDal.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == palletcode && x.WarehouseId == warehoseId).Includes(x => x.Details).First();
+
+ List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(stockInfo.LocationCode);
+
+ return BaseDal.GetStockInfos(materielCode, batchNo, locationCodes);
+ }
+
+ public WebResponseContent UpdateExpirationlabel()
+ {
+ try
+ {
+ var today = DateTime.Today;
+ int batchSize = 1000;
+ int totalUpdated = 0;
+ int skipCount = 0;
+
+ // 鍙煡璇㈤渶瑕佺殑瀛楁锛屽噺灏戞暟鎹紶杈撳拰鍐呭瓨鍗犵敤
+ var query = BaseDal.Db.Queryable<Dt_StockInfoDetail>()
+ .InnerJoin<Dt_StockInfo>((detail, master) => detail.StockId == master.Id)
+ .Select((detail, master) => new
+ {
+ MasterId = master.Id,
+ master.WarehouseId,
+ detail.EffectiveDate,
+ CurrentExpirationlabel = master.Expirationlabel
+ });
+
+ while (true)
+ {
+ var batchData = query.Skip(skipCount).Take(batchSize).ToList();
+ if (!batchData.Any()) break;
+ var groupedData = batchData.GroupBy(item => item.MasterId)
+ .Select(g => new
+ {
+ MasterId = g.Key,
+ WarehouseId = g.First().WarehouseId,
+ // 鍙栨渶鏃╃殑鏈夋晥鏃ユ湡
+ EarliestEffectiveDate = g.Min(item =>
+ {
+ DateTime.TryParse(item.EffectiveDate, out DateTime date);
+ return date;
+ }),
+ CurrentExpirationlabel = g.First().CurrentExpirationlabel
+ })
+ .ToList();
+
+ var updateDic = new Dictionary<long, int>();
+
+ foreach (var group in groupedData)
+ {
+ DateTime effectiveDate = group.EarliestEffectiveDate;
+ if (effectiveDate == default(DateTime)) // 澶勭悊瑙f瀽澶辫触鐨勬儏鍐�
+ {
+ Console.WriteLine($"涓昏〃ID {group.MasterId} 涓嬫棤鏈夋晥鏃ユ湡锛岃烦杩�");
+ continue;
+ }
+
+ int newLabel;
+ if (effectiveDate < today)
+ {
+ newLabel = ExpirationlabelEnum.杩囨湡.ObjToInt();
+ }
+ else if (group.WarehouseId == 3)
+ {
+ int daysDiff = (effectiveDate - today).Days;
+ newLabel = daysDiff < 60
+ ? ExpirationlabelEnum.涓存湡棰勮.ObjToInt()
+ : ExpirationlabelEnum.鏈复鏈�.ObjToInt();
+ }
+ else
+ {
+ int daysDiff = (effectiveDate - today).Days;
+ newLabel = daysDiff < 30
+ ? ExpirationlabelEnum.涓存湡棰勮.ObjToInt()
+ : ExpirationlabelEnum.鏈复鏈�.ObjToInt();
+ }
+
+ if (newLabel != group.CurrentExpirationlabel && !updateDic.ContainsKey(group.MasterId))
+ {
+ updateDic[group.MasterId] = newLabel;
+ }
+ }
+
+ if (updateDic.Any())
+ {
+ var updateBuilder = BaseDal.Db.Updateable<Dt_StockInfo>();
+ var idsToUpdate = updateDic.Keys.ToList();
+ int updateValue = updateDic.First().Value;
+ updateBuilder.SetColumns(m => m.Expirationlabel == updateValue)
+ .Where(m => idsToUpdate.Contains(m.Id));
+
+ int batchUpdated = updateBuilder.ExecuteCommand();
+ totalUpdated += batchUpdated;
+
+ Console.WriteLine($"鎵规鏇存柊锛歿batchUpdated} 鏉★紝绱鏇存柊锛歿totalUpdated} 鏉★紝鏇存柊鏉′欢锛歿JsonConvert.SerializeObject(idsToUpdate)}");
+ }
+
+ skipCount += batchSize;
+ }
+
+ return WebResponseContent.Instance.OK($"鏇存柊鎴愬姛锛屽叡鏇存柊 {totalUpdated} 鏉¤褰�");
+ }
+ catch (Exception ex)
+ {
+ return WebResponseContent.Instance.Error("鏇存柊澶辫触锛岃鑱旂郴绠$悊鍛�");
+ }
+ }
+ /// <summary>
+ /// 閽夐拤鏈哄櫒浜烘秷鎭帹閫佹祴璇�
+ /// </summary>
+ /// <returns></returns>
+ public async Task T0DingTalkText(string webhookUrl, string secret)
+ {
+ try
+ {
+ if (webhookUrl == null || secret == null)
+ {
+ webhookUrl = "https://oapi.dingtalk.com/robot/send?access_token=fbc3aaf4133ea650d8116fb86b3ebfd0c5e0d46775966ce87893a41886bdf9dc";
+ secret = "SECf221842b26356f22ccac84c4e60714e5287408ee8332a8f63503791382c3f5fb";
+ }
+ var warehouseIdToName = new Dictionary<int, string>
+ {
+ { 2, "娌瑰ⅷ浠�" },
+ { 3, "鏉挎潗浠�" },
+ { 4, "PP浠�" },
+ { 6, "娴嬭瘯鏋朵粨" },
+ { 11, "骞茶啘浠�" },
+ { 12, "闃荤剨浠�" }
+ };
+
+ var currentTime = DateTime.Now;
+ var ninetyDaysAgo = currentTime.AddDays(-90);
+
+ var expirationLabel3Stocks = BaseDal.Db.Queryable<Dt_StockInfo>()
+ .Where(s => s.Expirationlabel == 3 && s.WarehouseId != 5)
+ .ToList();
+
+ var over90DaysStocks = BaseDal.Db.Queryable<Dt_StockInfo>()
+ .Where(s => s.ModifyDate <= ninetyDaysAgo && s.Expirationlabel != 3 && s.WarehouseId != 5)
+ .ToList();
+
+ if (!expirationLabel3Stocks.Any() && !over90DaysStocks.Any())
+ {
+ return;
+ }
+
+ var expirationLabel3StockIds = expirationLabel3Stocks.Select(s => s.Id).ToList();
+ var over90DaysStockIds = over90DaysStocks.Select(s => s.Id).ToList();
+ var expirationLabel3Details = expirationLabel3StockIds.Any()
+ ? BaseDal.Db.Queryable<Dt_StockInfoDetail>()
+ .Where(d => expirationLabel3StockIds.Contains(d.StockId))
+ .ToList()
+ : new List<Dt_StockInfoDetail>();
+
+ var over90DaysDetails = over90DaysStockIds.Any()
+ ? BaseDal.Db.Queryable<Dt_StockInfoDetail>()
+ .Where(d => over90DaysStockIds.Contains(d.StockId))
+ .ToList()
+ : new List<Dt_StockInfoDetail>();
+
+ var stockIdToWarehouseId = expirationLabel3Stocks
+ .Concat(over90DaysStocks)
+ .ToDictionary(s => s.Id, s => s.WarehouseId);
+
+ var expirationLabel3Groups = expirationLabel3Details
+ .GroupBy(d => stockIdToWarehouseId[d.StockId])
+ .ToDictionary(g => g.Key, g => g.Select(d => new
+ {
+ d.MaterielCode,
+ d.BatchNo
+ }).ToList());
+
+ var over90DaysGroups = over90DaysDetails
+ .GroupBy(d => stockIdToWarehouseId[d.StockId])
+ .ToDictionary(g => g.Key, g => g.Select(d => new
+ {
+ d.MaterielCode,
+ d.BatchNo
+ }).ToList());
+
+ var allWarehouseIds = expirationLabel3Groups.Keys
+ .Union(over90DaysGroups.Keys)
+ .ToList();
+
+ using (HttpClient httpClient = new HttpClient())
+ {
+ foreach (var warehouseId in allWarehouseIds)
+ {
+ // 9.1 澶勭悊浠撳簱鍚嶇О鏄剧ず锛氫紭鍏堢敤鏄犲皠鍚嶇О锛屾棤鏄犲皠鏃舵樉绀哄師濮婭D
+ var warehouseName = warehouseIdToName.TryGetValue(warehouseId, out var name)
+ ? name
+ : $"浠撳簱{warehouseId}";
+
+ var messageParts = new List<string>
+ {
+ $"銆恵warehouseName}銆戠墿鏂欐彁閱�"
+ };
+
+ // 娣诲姞杩囨湡鐗╂枡淇℃伅
+ if (expirationLabel3Groups.TryGetValue(warehouseId, out var label3Materials) && label3Materials.Any())
+ {
+ var label3Details = label3Materials
+ .Select(m => $"鈥� 鐗╂枡缂栫爜锛歿m.MaterielCode} | 鎵规鍙凤細{m.BatchNo}")
+ .Aggregate((current, next) => $"{current}\n{next}");
+ messageParts.Add($"涓�銆佽繃鏈熺墿鏂橽n{label3Details}");
+ }
+
+ // 娣诲姞瓒呰繃90澶╂湭浣跨敤鐗╂枡淇℃伅
+ if (over90DaysGroups.TryGetValue(warehouseId, out var over90Materials) && over90Materials.Any())
+ {
+ var over90Details = over90Materials
+ .Select(m => $"鈥� 鐗╂枡缂栫爜锛歿m.MaterielCode} | 鎵规鍙凤細{m.BatchNo}")
+ .Aggregate((current, next) => $"{current}\n{next}");
+ messageParts.Add($"浜屻�佽秴杩�90澶╂湭浣跨敤鐗╂枡\n{over90Details}");
+ }
+
+ var messageContent = string.Join("\n\n", messageParts);
+
+ var timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();
+ var sign = GenerateSign(timestamp, secret);
+
+ var url = $"{webhookUrl.Split('?')[0]}?access_token={new Uri(webhookUrl).Query.Split('=')[1]}×tamp={timestamp}&sign={sign}";
+
+ // 鏋勫缓璇锋眰浣擄紙绗﹀悎閽夐拤text绫诲瀷娑堟伅鏍煎紡锛�
+ var requestBody = new
+ {
+ msgtype = "text",
+ text = new { content = messageContent }
+ };
+ var jsonBody = JsonConvert.SerializeObject(requestBody);
+ var content = new StringContent(jsonBody, Encoding.UTF8, "application/json");
+
+ var response = await httpClient.PostAsync(url, content);
+ if (!response.IsSuccessStatusCode)
+ {
+ var errorContent = await response.Content.ReadAsStringAsync();
+ throw new Exception($"銆恵warehouseName}銆戞秷鎭彂閫佸け璐ワ紝鐘舵�佺爜锛歿response.StatusCode}锛岄敊璇俊鎭細{errorContent}");
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ throw new Exception($"閽夐拤娑堟伅鎺ㄩ�佹暣浣撳け璐ワ紝閿欒璇︽儏锛歿ex.Message}", ex);
+ }
+ }
+
+
+ /// <summary>
+ /// 鐢熸垚鍔犵绛惧悕
+ /// </summary>
+ /// <param name="timestamp">鏃堕棿鎴�</param>
+ /// <returns>绛惧悕</returns>
+ private string GenerateSign(long timestamp,string secret)
+ {
+ var stringToSign = $"{timestamp}\n{secret}";
+ using (var hmacsha256 = new System.Security.Cryptography.HMACSHA256(Encoding.UTF8.GetBytes(secret)))
+ {
+ var hashBytes = hmacsha256.ComputeHash(Encoding.UTF8.GetBytes(stringToSign));
+ return Convert.ToBase64String(hashBytes).Replace("+", "%2B").Replace("/", "%2F");
+ }
+ }
}
}
--
Gitblit v1.9.3