using Dm.filter;
|
using Microsoft.Extensions.Logging;
|
using Newtonsoft.Json;
|
using Org.BouncyCastle.Asn1.Ocsp;
|
using SqlSugar;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Net;
|
using System.Net.Http;
|
using System.Security.Policy;
|
using System.Text;
|
using System.Threading.Tasks;
|
using WIDESEA_Common.OrderEnum;
|
using WIDESEA_Common.StockEnum;
|
using WIDESEA_Core;
|
using WIDESEA_Core.BaseRepository;
|
using WIDESEA_Core.Helper;
|
using WIDESEA_DTO.Allocate;
|
using WIDESEA_DTO.Basic;
|
using WIDESEA_DTO.Inbound;
|
using WIDESEA_DTO.Outbound;
|
using WIDESEA_IBasicService;
|
using WIDESEA_IOutboundService;
|
using WIDESEA_Model.Models;
|
|
namespace WIDESEA_BasicService
|
{
|
public class InvokeMESService : IInvokeMESService
|
{
|
private readonly IHttpClientFactory _httpClientFactory;
|
private readonly ILogger<InvokeMESService> _logger;
|
private string UserName = "12312";
|
private string Password = "1";
|
|
private readonly IRepository<Dt_FeedbackToMes> _feedbacktomesRepository;
|
private readonly IRepository<Dt_StockInfoDetail> _stockInfoDetailRepository;
|
private readonly IRepository<Dt_StockInfo> _stockInfoRepository;
|
private readonly IRepository<Dt_InboundOrder> _inboundOrderRepository;
|
private readonly IMaterialUnitService _materialUnitService;
|
private readonly IOutboundOrderService _outboundOrderService;
|
private readonly IOutboundOrderDetailService _outboundOrderDetailService;
|
private readonly IOutStockLockInfoService _outStockLockInfoService;
|
public InvokeMESService(IHttpClientFactory httpClientFactory, ILogger<InvokeMESService> logger, IRepository<Dt_FeedbackToMes> feedbacktomesRepository, IRepository<Dt_StockInfoDetail> stockInfoDetailRepository, IRepository<Dt_StockInfo> stockInfoRepository, IRepository<Dt_InboundOrder> inboundOrderRepository, IOutboundOrderService outboundOrderService, IOutboundOrderDetailService outboundOrderDetailService, IOutStockLockInfoService outStockLockInfoService, IMaterialUnitService materialUnitService)
|
{
|
_httpClientFactory = httpClientFactory;
|
_logger = logger;
|
_feedbacktomesRepository = feedbacktomesRepository;
|
_stockInfoDetailRepository = stockInfoDetailRepository;
|
_stockInfoRepository = stockInfoRepository;
|
_inboundOrderRepository = inboundOrderRepository;
|
_outboundOrderService = outboundOrderService;
|
_outboundOrderDetailService = outboundOrderDetailService;
|
_outStockLockInfoService = outStockLockInfoService;
|
_materialUnitService = materialUnitService;
|
}
|
|
/// <summary>
|
/// 入库反馈
|
/// </summary>
|
/// <param name="model"></param>
|
/// <returns></returns>
|
/// <exception cref="HttpRequestException"></exception>
|
public async Task<ResponseModel> FeedbackInbound(FeedbackInboundRequestModel model)
|
{
|
string json = JsonConvert.SerializeObject(model, new JsonSerializerSettings
|
{
|
ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
|
});
|
var content = new StringContent(json, Encoding.UTF8, "application/json");
|
var _client = _httpClientFactory.CreateClient("MESUrl");
|
_client.DefaultRequestHeaders.Clear();
|
_client.DefaultRequestHeaders.Add("Accept", "application/json");
|
_logger.LogInformation("InvokeMESService FeedbackInbound : " + json);
|
var response = await _client.PostAsync("AldMaterialWarehousing/MaterialWarehousing", content);
|
string body = await response.Content.ReadAsStringAsync();
|
_logger.LogInformation("InvokeMESService FeedbackInbound body: " + body);
|
if (!response.IsSuccessStatusCode)
|
{
|
|
throw new HttpRequestException(body);
|
}
|
|
return JsonConvert.DeserializeObject<ResponseModel>(body);
|
}
|
|
/// <summary>
|
/// 出库反馈
|
/// </summary>
|
/// <param name="model"></param>
|
/// <returns></returns>
|
/// <exception cref="HttpRequestException"></exception>
|
public async Task<ResponseModel> FeedbackOutbound(FeedbackOutboundRequestModel model)
|
{
|
string json = JsonConvert.SerializeObject(model, new JsonSerializerSettings
|
{
|
ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
|
});
|
var content = new StringContent(json, Encoding.UTF8, "application/json");
|
var _client = _httpClientFactory.CreateClient("MESUrl");
|
_client.DefaultRequestHeaders.Clear();
|
_client.DefaultRequestHeaders.Add("Accept", "application/json");
|
|
_logger.LogInformation("InvokeMESService FeedbackOutbound : " + json);
|
|
var response = await _client.PostAsync("AldMaterialOutbound/MaterialOutbound", content);
|
string body = await response.Content.ReadAsStringAsync();
|
|
if (!response.IsSuccessStatusCode)
|
{
|
|
throw new HttpRequestException(body);
|
}
|
|
|
return JsonConvert.DeserializeObject<ResponseModel>(body);
|
}
|
|
public async Task<ResponseModel> FeedbackAllocate(AllocateDto model)
|
{
|
_logger.LogInformation($"InvokeMESService FeedbackAllocate 序列化前: {JsonConvert.SerializeObject(model)}");
|
string json = JsonConvert.SerializeObject(model, new JsonSerializerSettings
|
{
|
ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver(),
|
NullValueHandling = NullValueHandling.Include
|
});
|
var content = new StringContent(json, Encoding.UTF8, "application/json");
|
var _client = _httpClientFactory.CreateClient("MESUrl");
|
_client.DefaultRequestHeaders.Clear();
|
_client.DefaultRequestHeaders.Add("Accept", "application/json");
|
_logger.LogInformation("InvokeMESService FeedbackAllocate : " + json);
|
var response = await _client.PostAsync("AldAllocationOperation/AllocationOperation", content);
|
string body = await response.Content.ReadAsStringAsync();
|
_logger.LogInformation("InvokeMESService FeedbackAllocate body: " + body);
|
if (!response.IsSuccessStatusCode)
|
{
|
|
throw new HttpRequestException(body);
|
}
|
|
return JsonConvert.DeserializeObject<ResponseModel>(body);
|
}
|
|
public async Task<ResponseModel> NewMaterielToMes(MaterielToMesDTO model)
|
{
|
string json = JsonConvert.SerializeObject(model, new JsonSerializerSettings
|
{
|
ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
|
});
|
|
|
//string userDataEncoded = Uri.EscapeDataString(json);
|
////string baseUrl = "http://mestest.ald.com//OrBitWCFServiceR15/orbitwebapi.ashx?";
|
//string userTicket = await GetToken(UserName, Password);
|
//string api = "WMS_BarcodeInformation";
|
|
|
var client = _httpClientFactory.CreateClient("MESUrl");
|
// 拼接 URL 参数
|
// string url = $"{client.BaseAddress}UserTicket={userTicket}&API={api}&UserData={userDataEncoded}";
|
|
|
client.DefaultRequestHeaders.Clear();
|
|
client.DefaultRequestHeaders.Add("Accept", "application/json");
|
|
|
var content = new StringContent(json, Encoding.UTF8, "application/json");
|
|
_logger.LogInformation("InvokeMESService NewMaterielToMes : " + json);
|
|
using var response = await client.PostAsync("AldBarcodeInformation/BarcodeInformation", content);
|
var responseText = await response.Content.ReadAsStringAsync();
|
_logger.LogInformation("InvokeMESService NewMaterielToMes body: " + responseText);
|
if (!response.IsSuccessStatusCode)
|
{
|
throw new HttpRequestException(responseText);
|
}
|
|
return JsonConvert.DeserializeObject<ResponseModel>(responseText);
|
}
|
|
public async Task<string> GetToken(String username, string password)
|
{
|
|
var clientHandler = new HttpClientHandler
|
{
|
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate,
|
};
|
//var client = new HttpClient(clientHandler);
|
var client = _httpClientFactory.CreateClient("MESUrl");
|
client.DefaultRequestHeaders.Clear();
|
|
|
|
var request = new HttpRequestMessage
|
{
|
Method = HttpMethod.Post,
|
RequestUri = new Uri($"{client.BaseAddress}UserName={username}&UserPassword={password}"),
|
Headers ={
|
{ "Accept", "*/*" },
|
{ "User-Agent", "PostmanRuntime-ApipostRuntime/1.1.0" },
|
{ "Connection", "keep-alive" },
|
},
|
Content = new MultipartFormDataContent
|
{
|
},
|
};
|
using (var response = await client.SendAsync(request))
|
{
|
response.EnsureSuccessStatusCode();
|
var body = await response.Content.ReadAsStringAsync();
|
if (!response.IsSuccessStatusCode)
|
{
|
|
throw new HttpRequestException(body);
|
}
|
|
return body;
|
}
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="orderNos"></param>
|
/// <param name="inout">入库传1 出库传2</param>
|
/// <returns></returns>
|
public async Task<WebResponseContent> BatchOrderFeedbackToMes(List<string> orderNos, int inout)
|
{
|
if (inout == 1)
|
{
|
foreach (var orderNo in orderNos)
|
{
|
try
|
{
|
var stockinfos = _stockInfoRepository.Db.Queryable<Dt_StockInfo>("info").Where(info => info.StockStatus == 6)
|
.Where(it => SqlFunc.Subqueryable<Dt_StockInfoDetail>().Where(s => s.StockId == it.Id && s.OrderNo == orderNo).Any())
|
.ToList();
|
var feeds = _feedbacktomesRepository.Db.Queryable<Dt_FeedbackToMes>().Where(x => x.OrderNo == orderNo && x.ReportStatus == 1).Select(o => o.PalletCode).ToList();
|
var unreports = stockinfos.Where(x => !feeds.Contains(x.PalletCode)).ToList();
|
if (unreports != null && !unreports.Any())
|
{
|
return WebResponseContent.Instance.Error("没有需要回传的数据");
|
}
|
foreach (var item in unreports)
|
{
|
var lists = _stockInfoDetailRepository.Db.Queryable<Dt_StockInfoDetail>().Where(x => x.StockId == item.Id).ToList();
|
if (lists.Any())
|
{
|
var inboundOrder = _inboundOrderRepository.Db.Queryable<Dt_InboundOrder>().First(x => x.InboundOrderNo == lists.FirstOrDefault().OrderNo);
|
if (inboundOrder != null)
|
{
|
if (inboundOrder.OrderType == (int)InOrderTypeEnum.AllocatInbound)//调拨入库
|
{
|
var allocate = SqlSugarHelper.DbWMS.Queryable<Dt_AllocateOrder>().Where(x => x.OrderNo == inboundOrder.InboundOrderNo).First();
|
var allocatefeedmodel = new AllocateDto
|
{
|
ReqCode = Guid.NewGuid().ToString(),
|
ReqTime = DateTime.Now.ToString(),
|
BusinessType = "2",
|
FactoryArea = inboundOrder.FactoryArea,
|
OperationType = 1,
|
Operator = inboundOrder.Operator,
|
OrderNo = inboundOrder.UpperOrderNo,
|
fromWarehouse = allocate?.FromWarehouse ?? "",
|
toWarehouse = allocate?.ToWarehouse ?? "",
|
Details = new List<AllocateDtoDetail>()
|
|
};
|
|
var groupedData = lists.GroupBy(item => new { item.MaterielCode, item.SupplyCode, item.BatchNo, item.InboundOrderRowNo, item.BarcodeUnit, item.WarehouseCode })
|
.Select(group => new AllocateDtoDetail
|
{
|
MaterialCode = group.Key.MaterielCode,
|
LineNo = group.Key.InboundOrderRowNo,
|
WarehouseCode = group.Key.WarehouseCode,
|
Qty = group.Sum(x => x.BarcodeQty),
|
// warehouseCode= "1072",
|
Unit = group.Key.BarcodeUnit,
|
Barcodes = group.Select(row => new BarcodeInfo
|
{
|
Barcode = row.Barcode,
|
Qty = row.BarcodeQty,
|
BatchNo = row.BatchNo,
|
SupplyCode = row.SupplyCode,
|
Unit = row.Unit
|
}).ToList()
|
}).ToList();
|
allocatefeedmodel.Details = groupedData;
|
|
var result = await FeedbackAllocate(allocatefeedmodel);
|
if (result != null && result.code == 200)
|
{
|
_feedbacktomesRepository.Db.Insertable(new Dt_FeedbackToMes { OrderNo = orderNo, PalletCode = item.PalletCode, ReportStatus = 1 }).ExecuteCommand();
|
}
|
}
|
else
|
{
|
var feedmodel = new FeedbackInboundRequestModel
|
{
|
reqCode = Guid.NewGuid().ToString(),
|
reqTime = DateTime.Now.ToString(),
|
business_type = inboundOrder.BusinessType,
|
factoryArea = inboundOrder.FactoryArea,
|
operationType = 1,
|
Operator = inboundOrder.Operator,
|
orderNo = inboundOrder.UpperOrderNo,
|
status = inboundOrder.OrderStatus,
|
details = new List<FeedbackInboundDetailsModel>()
|
|
};
|
|
var groupedData = lists.GroupBy(item => new { item.MaterielCode, item.SupplyCode, item.BatchNo, item.InboundOrderRowNo, item.BarcodeUnit, item.WarehouseCode })
|
.Select(group => new FeedbackInboundDetailsModel
|
{
|
materialCode = group.Key.MaterielCode,
|
supplyCode = group.Key.SupplyCode,
|
batchNo = group.Key.BatchNo,
|
lineNo = group.Key.InboundOrderRowNo,
|
qty = group.Sum(x => x.BarcodeQty),
|
// warehouseCode = group.Key.WarehouseCode=="0"?"1072": group.Key.WarehouseCode,
|
warehouseCode = group.Key.WarehouseCode,
|
unit = group.Key.BarcodeUnit,
|
barcodes = group.Select(row => new FeedbackBarcodesModel
|
{
|
barcode = row.Barcode,
|
qty = row.BarcodeQty
|
}).ToList()
|
}).ToList();
|
feedmodel.details = groupedData;
|
var result = await FeedbackInbound(feedmodel);
|
if (result != null && result.code == 200)
|
{
|
_feedbacktomesRepository.Db.Insertable(new Dt_FeedbackToMes { OrderNo = orderNo, PalletCode = item.PalletCode, ReportStatus = 1 }).ExecuteCommand();
|
}
|
}
|
}
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
_logger.LogInformation("InvokeMESService BatchOrderFeedbackToMes 回写MES失败: " + ex.Message);
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
|
}
|
}
|
else if (inout == 2)
|
{
|
foreach (var orderNo in orderNos)
|
{
|
var outboundOrder = await _outboundOrderService.Db.Queryable<Dt_OutboundOrder>().FirstAsync(x => x.OrderNo == orderNo);
|
if (outboundOrder != null && outboundOrder.IsBatch == 0)
|
{
|
await HandleOutboundOrderToMESCompletion(outboundOrder, orderNo);
|
}
|
else if (outboundOrder != null && outboundOrder.IsBatch == 1)
|
{
|
await HandleOutboundOrderBatchToMESCompletion(outboundOrder, orderNo);
|
}
|
}
|
|
}
|
return WebResponseContent.Instance.OK();
|
}
|
private async Task HandleOutboundOrderBatchToMESCompletion(Dt_OutboundOrder outboundOrder, string orderNo)
|
{
|
|
try
|
{
|
if (outboundOrder.ReturnToMESStatus == 1)
|
{
|
return;
|
}
|
var orderDetails = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
|
.LeftJoin<Dt_OutboundOrder>((o, item) => o.OrderId == item.Id)
|
.Where((o, item) => item.OrderNo == orderNo && item.ReturnToMESStatus != 1)
|
.Select((o, item) => o)
|
.ToListAsync();
|
|
var detailids = new List<int>();
|
var allCompleted = true;
|
foreach (var detail in orderDetails.Where(x => x.ReturnToMESStatus == 0).ToList())
|
{
|
if (detail.OverOutQuantity >= detail.NeedOutQuantity)
|
{
|
detailids.Add(detail.Id);
|
}
|
else
|
{
|
allCompleted = false;
|
}
|
}
|
if (orderDetails.Any(x => x.ReturnToMESStatus == 2))
|
{
|
allCompleted = false;
|
}
|
|
int newStatus = allCompleted ? (int)OutOrderStatusEnum.出库完成 : (int)OutOrderStatusEnum.出库中;
|
|
if (outboundOrder.OrderStatus != newStatus)
|
{
|
await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
|
.SetColumns(x => x.OrderStatus == newStatus)
|
.Where(x => x.OrderNo == orderNo)
|
.ExecuteCommandAsync();
|
|
}
|
var documentno = UniqueValueGenerator.Generate();
|
var feedmodel = new FeedbackOutboundRequestModel
|
{
|
reqCode = Guid.NewGuid().ToString(),
|
reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
|
business_type = outboundOrder.BusinessType,
|
factoryArea = outboundOrder.FactoryArea,
|
operationType = 1,
|
Operator = outboundOrder.Operator,
|
orderNo = outboundOrder.UpperOrderNo,
|
documentsNO = documentno,
|
status = outboundOrder.OrderStatus,
|
details = new List<FeedbackOutboundDetailsModel>()
|
};
|
|
|
foreach (var detail in orderDetails.Where(x => detailids.Contains(x.Id)).ToList())
|
{
|
// 获取该明细对应的条码信息(从锁定记录)
|
var detailLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
|
.Where(x => x.OrderNo == orderNo && detailids.Contains(x.OrderDetailId) &&
|
x.Status == (int)OutLockStockStatusEnum.拣选完成)
|
.ToListAsync();
|
var detailModel = new FeedbackOutboundDetailsModel
|
{
|
materialCode = detail.MaterielCode,
|
lineNo = detail.lineNo, // 注意:这里可能需要调整字段名
|
warehouseCode = detail.WarehouseCode,
|
qty = detail.BarcodeQty, // 使用订单明细的已出库数量
|
currentDeliveryQty = detail.BarcodeQty,
|
unit = detail.BarcodeUnit,
|
barcodes = new List<WIDESEA_DTO.Outbound.BarcodesModel> ()
|
};
|
|
if (detailLocks.Any(x => x.BarcodeUnit != x.Unit))
|
{
|
foreach (var item in detailLocks)
|
{
|
var barmodel = new WIDESEA_DTO.Outbound.BarcodesModel
|
{
|
barcode = item.CurrentBarcode,
|
supplyCode = item.SupplyCode,
|
batchNo = item.BatchNo,
|
unit = item.BarcodeUnit,
|
qty = item.BarcodeQty // 条码级别的数量仍用锁定记录
|
};
|
if (item.BarcodeUnit != item.Unit)
|
{
|
var issueoStockResult = await _materialUnitService.ConvertAsync(item.MaterielCode, item.BarcodeQty, item.Unit,item.BarcodeUnit);
|
barmodel.unit = issueoStockResult.Unit;
|
barmodel.qty = issueoStockResult.Quantity;
|
}
|
detailModel.qty = barmodel.qty;
|
detailModel.currentDeliveryQty = barmodel.qty;
|
detailModel.barcodes.Add(barmodel);
|
}
|
}
|
feedmodel.details.Add(detailModel);
|
}
|
|
var result = await FeedbackOutbound(feedmodel);
|
if (result != null && result.code == 200)
|
{
|
|
await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
|
.SetColumns(it => new Dt_OutboundOrderDetail
|
{
|
ReturnToMESStatus = 1,
|
documentsNO = documentno,
|
})
|
.Where(x => detailids.Contains(x.Id))
|
.ExecuteCommandAsync();
|
|
if (allCompleted && newStatus == (int)OutOrderStatusEnum.出库完成)
|
{
|
await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
|
.SetColumns(x => x.ReturnToMESStatus == 1)
|
.Where(x => x.OrderNo == orderNo)
|
.ExecuteCommandAsync();
|
}
|
else
|
{
|
var dborderDetails = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
|
.LeftJoin<Dt_OutboundOrder>((o, item) => o.OrderId == item.Id)
|
.Where((o, item) => item.OrderNo == orderNo && item.ReturnToMESStatus != 1)
|
.Select((o, item) => o)
|
.ToListAsync();
|
var secallCompleted = true;
|
foreach (var detail in orderDetails.Where(x => x.ReturnToMESStatus == 0).ToList())
|
{
|
if (detail.OverOutQuantity < detail.NeedOutQuantity)
|
{
|
secallCompleted = false;
|
}
|
}
|
if (secallCompleted)
|
{
|
await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
|
.SetColumns(it => new Dt_OutboundOrder
|
{
|
ReturnToMESStatus = 1,
|
OrderStatus = OutOrderStatusEnum.出库完成.ObjToInt(),
|
})
|
.Where(x => x.OrderNo == orderNo)
|
.ExecuteCommandAsync();
|
}
|
}
|
}
|
else
|
{
|
await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
|
.SetColumns(it => new Dt_OutboundOrderDetail
|
{
|
ReturnToMESStatus = 2,
|
documentsNO = documentno,
|
})
|
.Where(x => detailids.Contains(x.Id))
|
.ExecuteCommandAsync();
|
}
|
|
}
|
catch (Exception ex)
|
{
|
_logger.LogError($"CheckAndUpdateOrderStatus失败 - OrderNo: {orderNo}, Error: {ex.Message}");
|
}
|
}
|
|
|
private async Task HandleOutboundOrderToMESCompletion(Dt_OutboundOrder outboundOrder, string orderNo)
|
{
|
|
try
|
{
|
if (outboundOrder.ReturnToMESStatus == 1)
|
{
|
return;
|
}
|
var orderDetails = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
|
.LeftJoin<Dt_OutboundOrder>((o, item) => o.OrderId == item.Id)
|
.Where((o, item) => item.OrderNo == orderNo)
|
.Select((o, item) => o)
|
.ToListAsync();
|
|
bool allCompleted = true;
|
foreach (var detail in orderDetails)
|
{
|
if (detail.OverOutQuantity < detail.NeedOutQuantity)
|
{
|
allCompleted = false;
|
break;
|
}
|
}
|
|
int newStatus = allCompleted ? (int)OutOrderStatusEnum.出库完成 : (int)OutOrderStatusEnum.出库中;
|
|
if (outboundOrder.OrderStatus != newStatus)
|
{
|
await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
|
.SetColumns(x => x.OrderStatus == newStatus)
|
.Where(x => x.OrderNo == orderNo)
|
.ExecuteCommandAsync();
|
|
}
|
//只有正常分拣完成时才向MES反馈
|
if (allCompleted && newStatus == (int)OutOrderStatusEnum.出库完成)
|
{
|
var feedmodel = new FeedbackOutboundRequestModel
|
{
|
reqCode = Guid.NewGuid().ToString(),
|
reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
|
business_type = outboundOrder.BusinessType,
|
factoryArea = outboundOrder.FactoryArea,
|
operationType = 1,
|
Operator = outboundOrder.Operator,
|
orderNo = outboundOrder.UpperOrderNo,
|
documentsNO = outboundOrder.OrderNo,
|
status = outboundOrder.OrderStatus,
|
details = new List<FeedbackOutboundDetailsModel>()
|
};
|
|
|
foreach (var detail in orderDetails)
|
{
|
// 获取该明细对应的条码信息(从锁定记录)
|
var detailLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
|
.Where(x => x.OrderNo == orderNo &&
|
x.OrderDetailId == detail.Id &&
|
x.Status == (int)OutLockStockStatusEnum.拣选完成)
|
.ToListAsync();
|
|
var detailModel = new FeedbackOutboundDetailsModel
|
{
|
materialCode = detail.MaterielCode,
|
lineNo = detail.lineNo, // 注意:这里可能需要调整字段名
|
warehouseCode = detail.WarehouseCode,
|
qty = detail.BarcodeQty,
|
currentDeliveryQty = detail.BarcodeQty,
|
unit = detail.BarcodeUnit,
|
barcodes = detailLocks.Select(lockInfo => new WIDESEA_DTO.Outbound.BarcodesModel
|
{
|
barcode = lockInfo.CurrentBarcode,
|
supplyCode = lockInfo.SupplyCode,
|
batchNo = lockInfo.BatchNo,
|
unit = lockInfo.BarcodeUnit,
|
qty = lockInfo.BarcodeQty // 条码级别的数量仍用锁定记录
|
}).ToList()
|
};
|
|
feedmodel.details.Add(detailModel);
|
}
|
|
var result = await FeedbackOutbound(feedmodel);
|
if (result != null && result.code == 200)
|
{
|
await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
|
.SetColumns(x => x.ReturnToMESStatus == 1)
|
.Where(x => x.OrderId == outboundOrder.Id)
|
.ExecuteCommandAsync();
|
|
await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
|
.SetColumns(x => x.ReturnToMESStatus == 1)
|
.Where(x => x.OrderNo == orderNo)
|
.ExecuteCommandAsync();
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
_logger.LogError($"CheckAndUpdateOrderStatus失败 - OrderNo: {orderNo}, Error: {ex.Message}");
|
}
|
|
}
|
|
}
|
|
public static class UniqueValueGenerator
|
{
|
// 原子计数器(线程安全,每次递增1,避免同一Ticks重复)
|
private static long _counter = 0;
|
|
/// <summary>
|
/// 生成唯一值(支持高并发)
|
/// </summary>
|
/// <returns>格式:yyyyMMdd + Ticks + 3位计数器(如2025112563867890123001)</returns>
|
public static string Generate()
|
{
|
var now = DateTime.Now;
|
string datePart = now.ToString("yyyyMMdd");
|
long ticksPart = now.Ticks;
|
|
// 原子递增计数器(取模1000,确保计数器仅3位,控制长度)
|
long counterPart = Interlocked.Increment(ref _counter) % 1000;
|
|
// 拼接:计数器补0为3位(避免位数不一致)
|
return $"{datePart}{ticksPart}{counterPart:D3}";
|
}
|
}
|
}
|