using Serilog;
using System.Text.Json;
using System.Text.Encodings.Web;
using System.Text.Unicode;
using WIDESEA_Common.Constants;
using WIDESEA_Common.StockEnum;
using WIDESEA_Common.TaskEnum;
using WIDESEA_Core;
using WIDESEA_DTO.GradingMachine;
using WIDESEA_DTO.Task;
using WIDESEA_Model.Models;
namespace WIDESEA_TaskInfoService
{
public partial class TaskService
{
///
/// JSON序列化选项(中文不转义)
///
private static readonly JsonSerializerOptions _jsonOptions = new()
{
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
};
#region 分容柜接口
///
/// 堆垛机取放货完成后物流通知化成分容柜完成信号
///
public async Task InOrOutCompletedAsync(GradingMachineInputDto input)
{
var log = Log.ForContext("SourceContext", "分容柜完成信号");
log.Information("[InOrOutCompleted] 请求参数: {Request}", JsonSerializer.Serialize(input, _jsonOptions));
WebResponseContent content = new WebResponseContent();
if (string.IsNullOrWhiteSpace(input.LocationCode))
{
var errResult = content.Error($"货位编号不能为空");
log.Warning("[InOrOutCompleted] 响应: {Response}", JsonSerializer.Serialize(errResult, _jsonOptions));
return errResult;
}
try
{
var stockInfo = await _stockInfoService.GetStockInfoAsync(3, input.LocationCode);
int locationStatus;
if (stockInfo == null)
{
var errResult = content.Error("WMS未找到库存信息");
log.Warning("[InOrOutCompleted] 响应: {Response}", JsonSerializer.Serialize(errResult, _jsonOptions));
return errResult;
}
locationStatus = MapLocationStatus(stockInfo.StockStatus);
int MapLocationStatus(int stockStatus) => stockStatus switch
{
(int)StockStatusEmun.入库完成 => 10,
(int)StockStatusEmun.空托盘库存 => 11,
_ => 0
};
OutputDto outPutDto = new OutputDto()
{
LocationCode = input.LocationCode,
PalletCode = stockInfo.PalletCode,
IsNormalProcedure = 1,
LocationStatus = locationStatus
};
var result = content.OK(data: outPutDto);
log.Information("[InOrOutCompleted] 响应: {Response}", JsonSerializer.Serialize(result, _jsonOptions));
return result;
}
catch (Exception ex)
{
content.Error(ex.Message);
log.Error(ex, "[InOrOutCompleted] 异常");
}
return content;
}
///
/// 化成分容柜定时向物流更新分容柜状态信息
///
///
///
public async Task SendLocationStatusAsync(GradingMachineInputDto input)
{
var log = Log.ForContext("SourceContext", "分容柜状态更新");
log.Information("[SendLocationStatus] 请求参数: {Request}", JsonSerializer.Serialize(input, _jsonOptions));
WebResponseContent content = new WebResponseContent();
if (string.IsNullOrWhiteSpace(input.LocationCode))
{
var errResult = content.Error($"货位编号不能为空");
log.Warning("[SendLocationStatus] 响应: {Response}", JsonSerializer.Serialize(errResult, _jsonOptions));
return errResult;
}
try
{
var result = await _locationInfoService.Db.Updateable()
.SetColumns(s => new Dt_LocationInfo
{
EnableStatus = input.LocationStatus == 1 ? 0 : 3,
}).Where(s => s.LocationCode == input.LocationCode && s.RoadwayNo == TaskAddressConstants.GRADING_RoadWayNo).ExecuteCommandAsync() > 0;
if (result)
{
content.OK("更新成功");
}
else
{
content.Error("更新失败");
}
log.Information("[SendLocationStatus] 响应: {Response}", JsonSerializer.Serialize(content, _jsonOptions));
}
catch (Exception ex)
{
content.Error(ex.Message);
log.Error(ex, "[SendLocationStatus] 异常");
}
return content;
}
///
/// 分容柜工作完成后调用此接口通知物流出库
///
///
///
public async Task RequestOutboundAsync(GradingMachineInputDto input)
{
var log = Log.ForContext("SourceContext", "分容柜出库请求");
log.Information("[RequestOutbound] 请求参数: {Request}", JsonSerializer.Serialize(input, _jsonOptions));
WebResponseContent content = new WebResponseContent();
if (string.IsNullOrWhiteSpace(input.LocationCode) || string.IsNullOrWhiteSpace(input.PalletCode))
{
var errResult = content.Error($"托盘号或者货位编号不能为空");
log.Warning("[RequestOutbound] 响应: {Response}", JsonSerializer.Serialize(errResult, _jsonOptions));
return errResult;
}
try
{
var stock = await _stockInfoService.GetStockInfoAsync(input.PalletCode, input.LocationCode);
if (stock == null)
{
var errResult = content.Error("未找到对应的托盘");
log.Warning("[RequestOutbound] 响应: {Response}", JsonSerializer.Serialize(errResult, _jsonOptions));
return errResult;
}
var taskList = new Dt_Task
{
WarehouseId = stock.WarehouseId,
PalletCode = stock.PalletCode,
PalletType = stock.PalletType,
SourceAddress = stock.LocationCode,
CurrentAddress = stock.LocationCode,
NextAddress = TaskAddressConstants.GRADING_OUTBOUND_ADDRESS,
TargetAddress = TaskAddressConstants.GRADING_OUTBOUND_ADDRESS,
Roadway = stock.LocationDetails.RoadwayNo,
TaskType = TaskOutboundTypeEnum.Outbound.GetHashCode(),
TaskStatus = TaskOutStatusEnum.OutNew.GetHashCode(),
Grade = 1,
TaskNum = await BaseDal.GetTaskNo(),
Creater = "system",
};
return await _unitOfWorkManage.BeginTranAsync(async () =>
{
var result = await BaseDal.AddDataAsync(taskList) > 0;
var wmstaskDto = result ? _mapper.Map(taskList) : null;
var wmsTaskDtos = new List { wmstaskDto };
var httpResponse = _httpClientHelper.Post("http://localhost:9292/api/Task/ReceiveTask", JsonSerializer.Serialize(wmsTaskDtos)).Data;
if (result && httpResponse != null)
{
var okResult = content.OK("出库请求成功");
log.Information("[RequestOutbound] 响应: {Response}", JsonSerializer.Serialize(okResult, _jsonOptions));
return okResult;
}
else
{
var errResult = content.Error("出库请求失败");
log.Warning("[RequestOutbound] 响应: {Response}", JsonSerializer.Serialize(errResult, _jsonOptions));
return errResult;
}
});
}
catch (Exception ex)
{
content.Error(ex.Message);
log.Error(ex, "[RequestOutbound] 异常");
}
return content;
}
///
/// 入库完成分容调用获取托盘上每个通道电芯
///
///
///
public async Task GetPalletCodeCellAsync(GradingMachineInputDto input)
{
var log = Log.ForContext("SourceContext", "分容柜电芯查询");
log.Information("[GetPalletCodeCell] 请求参数: {Request}", JsonSerializer.Serialize(input, _jsonOptions));
WebResponseContent content = new WebResponseContent();
if (string.IsNullOrWhiteSpace(input.PalletCode) || string.IsNullOrWhiteSpace(input.LocationCode))
{
var errResult = content.Error($"托盘号或者货位编号不能为空");
log.Warning("[GetPalletCodeCell] 响应: {Response}", JsonSerializer.Serialize(errResult, _jsonOptions));
return errResult;
}
try
{
var stockInfo = await _stockInfoService.GetStockInfoAsync(input.PalletCode, input.LocationCode);
if (stockInfo == null)
{
var errResult = content.Error("未找到对应的托盘");
log.Warning("[GetPalletCodeCell] 响应: {Response}", JsonSerializer.Serialize(errResult, _jsonOptions));
return errResult;
}
var outPutDtos = new
{
input.LocationCode,
input.PalletCode,
IsNormalProcedure = 1,
stockInfo.LocationDetails.LocationStatus,
Data = stockInfo.Details.Select(x => new CellCodeData
{
CellCode = x.SerialNumber,
Channel = x.InboundOrderRowNo.ToString()
}).ToList()
};
var result = content.OK(data: outPutDtos);
log.Information("[GetPalletCodeCell] 响应: {Response}", JsonSerializer.Serialize(result, _jsonOptions));
return result;
}
catch (Exception ex)
{
log.Error(ex, "[GetPalletCodeCell] 异常");
return content.Error(ex.Message);
}
}
#endregion 分容柜接口
}
}