using AngleSharp.Dom;
|
using log4net.Core;
|
using Mapster;
|
using System.Threading.Tasks;
|
using WIDESEA_Common;
|
using WIDESEA_Core;
|
using WIDESEA_Core.Enums;
|
using WIDESEA_DTO;
|
using WIDESEA_Model.Models;
|
|
namespace WIDESEA_StorageBasicService;
|
|
public class LocationInfoService : ServiceBase<DtLocationInfo, ILocationInfoRepository>, ILocationInfoService
|
{
|
private readonly LogFactory LogFactory = new LogFactory();
|
private readonly IUnitOfWorkManage _unitOfWorkManage;
|
private readonly IDt_TaskRepository _taskRepository;
|
private readonly IDt_TaskService _taskService;
|
private readonly IStockInfoRepository _stockInfoRepository;
|
private readonly IStockInfoDetailRepository _stockInfoDetailRepository;
|
private readonly IDt_WareAreaInfoRepository _wareAreaInfoRepository;
|
private readonly IPointStackerRelationRepository _pointStackerRelationRepository;
|
private readonly ITaskExecuteDetailRepository _taskExecuteDetailRepository;
|
private readonly ILocationStatusChangeRecordRepository _locationStatusChangeRecordRepository;
|
private readonly IMapper _mapper;
|
|
public LocationInfoService(ILocationInfoRepository BaseDal,
|
IUnitOfWorkManage unitOfWorkManage,
|
IDt_TaskRepository taskRepository,
|
IStockInfoRepository stockInfoRepository,
|
IDt_WareAreaInfoRepository wareAreaInfoRepository,
|
IPointStackerRelationRepository pointStackerRelationRepository,
|
ITaskExecuteDetailRepository taskExecuteDetailRepository,
|
ILocationStatusChangeRecordRepository locationStatusChangeRecordRepository,
|
IStockInfoDetailRepository stockInfoDetailRepository,
|
IMapper mapper,
|
IDt_TaskService taskService) : base(BaseDal)
|
{
|
_unitOfWorkManage = unitOfWorkManage;
|
_taskRepository = taskRepository;
|
_stockInfoRepository = stockInfoRepository;
|
_wareAreaInfoRepository = wareAreaInfoRepository;
|
_pointStackerRelationRepository = pointStackerRelationRepository;
|
_taskExecuteDetailRepository = taskExecuteDetailRepository;
|
_locationStatusChangeRecordRepository = locationStatusChangeRecordRepository;
|
_stockInfoDetailRepository = stockInfoDetailRepository;
|
_mapper = mapper;
|
_taskService = taskService;
|
}
|
|
public override WebResponseContent UpdateData(SaveModel saveModel)
|
{
|
int id = saveModel.MainData["id"].ObjToInt();
|
int status = saveModel.MainData["locationStatus"].ObjToInt();
|
var location = BaseDal.QueryFirst(x => x.Id == id);
|
|
LocationChangeRecordDto changeRecordDto = new LocationChangeRecordDto()
|
{
|
AfterStatus = status,
|
BeforeStatus = location.LocationStatus,
|
TaskNum = 0,
|
LocationId = id,
|
LocationCode = location.LocationCode,
|
ChangeType = (int)StatusChangeTypeEnum.ManualOperation
|
};
|
|
_locationStatusChangeRecordRepository.AddStatusChangeRecord(changeRecordDto);
|
|
return base.UpdateData(saveModel);
|
}
|
#region 初始化库位
|
public async Task<WebResponseContent> initializeLocation(int locationID)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
DtLocationInfo? location = BaseDal.QueryData(x => x.Id == locationID).FirstOrDefault();
|
int LastStatus = location.LocationStatus;
|
if (location == null)
|
{
|
return content.Error("未找到货位信息!");
|
}
|
DtStockInfo stock = _stockInfoRepository.QueryFirst(x => x.LocationId == location.Id);
|
if(stock == null)
|
{
|
location.LocationStatus= (int)LocationEnum.Free;
|
BaseDal.UpdateData(location);
|
}
|
else
|
{
|
_unitOfWorkManage.BeginTran();
|
DtStockInfo_Hty stockInfo_Hty = stock.Adapt<DtStockInfo_Hty>();
|
stockInfo_Hty.ModifyDate = DateTime.Now;
|
await DeleteStockInfoAsync(stock.Id);
|
List<DtStockInfoDetail> detail = _stockInfoDetailRepository.QueryData(x => x.StockId == stock.Id).ToList();
|
if (detail != null && detail.Count() > 0)
|
{
|
List<DtStockInfoDetail_Hty> details = detail.Adapt<List<DtStockInfoDetail_Hty>>();
|
await DeleteStockInfoDetailsAsync(detail);
|
AddStockInfoDetailHty(details);
|
}
|
await AddStockInfoHtyAsync(stockInfo_Hty);
|
|
|
location.LocationStatus = (int)LocationEnum.Free;
|
BaseDal.UpdateData(location);
|
|
_locationStatusChangeRecordRepository.AddLocationStatusChangeRecord(location, LastStatus, (int)StatusChangeTypeEnum.ManualOperation, 0);
|
_unitOfWorkManage.CommitTran();
|
}
|
return content.OK();
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
return content.Error(ex.Message);
|
}
|
}
|
public WebResponseContent CreateLocation()
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
var locationList = new List<DtLocationInfo>();
|
for (int i = 45; i < 49; i++)
|
{
|
for (int j = 1; j < 9; j++)
|
{
|
for (int k = 1; k < 6; k++)
|
{
|
locationList.Add(new DtLocationInfo
|
{
|
LocationCode = i.ToString() + j.ToString().PadLeft(2, '0') + k.ToString().PadLeft(2, '0'),
|
LocationName = ConvertToFormattedString(i, j, k),
|
Row = i,
|
Column = j,
|
Layer = k,
|
LocationStatus = LocationEnum.Free.ObjToInt(),
|
EnalbeStatus = 1,
|
});
|
|
|
}
|
}
|
|
}
|
var x = BaseDal.AddData(locationList);
|
return content.OK(data: x);
|
}
|
catch (Exception ex)
|
{
|
return content.Error(ex.Message);
|
}
|
}
|
#endregion
|
|
#region 启用禁用货位
|
|
public WebResponseContent LocationEnable(SaveModel saveModel)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
List<DtLocationInfo> locations = new List<DtLocationInfo>();
|
int enable = Convert.ToBoolean(saveModel.Extra) ? 0 : 4;
|
for (int i = 0; i < saveModel.DelKeys.Count; i++)
|
{
|
DtLocationInfo location = BaseDal.QueryData(x => x.Id == int.Parse(saveModel.DelKeys[i].ToString())).FirstOrDefault();
|
location.LocationStatus = enable;
|
locations.Add(location);
|
}
|
BaseDal.UpdateData(locations);
|
content = WebResponseContent.Instance.OK();
|
}
|
catch (Exception ex)
|
{
|
content = WebResponseContent.Instance.Error(ex.Message);
|
}
|
finally
|
{
|
//日志记录
|
}
|
return content;
|
}
|
|
#endregion 启用禁用货位
|
|
#region 内部方法
|
|
#region 创建初始货位方法
|
|
public static string ConvertToFormattedString(int line, int column, int layer)
|
{
|
// 将每个部分转换为目标格式
|
string lineString = ConvertNumberToChineseString(line);
|
string columnString = ConvertNumberToChineseString(column);
|
string layerString = ConvertNumberToChineseString(layer);
|
|
// 格式化输出
|
return $"{lineString}行{columnString}列{layerString}层";
|
}
|
|
public static string ConvertNumberToChineseString(int number)
|
{
|
string[] chineseNumbers = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十" };
|
|
if (number <= 10)
|
{
|
return chineseNumbers[number];
|
}
|
|
// 处理大于10的数字
|
string result = string.Empty;
|
if (number / 10 > 1)
|
{
|
result += chineseNumbers[number / 10] + "十";
|
}
|
else
|
{
|
result += "十";
|
}
|
|
if (number % 10 > 0)
|
{
|
result += chineseNumbers[number % 10];
|
}
|
|
return result;
|
}
|
|
#endregion 创建初始货位方法
|
|
#region 库存移入历史
|
private async Task DeleteStockInfoAsync(int stockId)
|
{
|
var isStockUpdated = await _stockInfoRepository.DeleteDataByIdAsync(stockId);
|
if (!isStockUpdated)
|
{
|
throw new Exception("库存信息更新失败");
|
}
|
}
|
|
private async Task AddStockInfoHtyAsync(DtStockInfo_Hty dtStock)
|
{
|
var isStockAdd = await SqlSugarHelper.DbWMS.InsertNav(dtStock).IncludesAllFirstLayer().ExecuteCommandAsync();
|
if (!isStockAdd)
|
{
|
throw new Exception("库存历史信息添加失败");
|
}
|
}
|
|
private async Task DeleteStockInfoDetailsAsync(IEnumerable<DtStockInfoDetail> details)
|
{
|
var ids = details.Select(x => (object)x.Id).ToArray();
|
var isStockDetailUpdated = await _stockInfoDetailRepository.DeleteDataByIdsAsync(ids);
|
if (!isStockDetailUpdated)
|
{
|
throw new Exception("库存详情信息更新失败");
|
}
|
}
|
private void AddStockInfoDetailHty(List<DtStockInfoDetail_Hty> details)
|
{
|
|
var isStockAdd = SqlSugarHelper.DbWMS.Insertable(details).ExecuteCommand();
|
if (isStockAdd==0)
|
{
|
throw new Exception("库存明细历史信息添加失败");
|
}
|
}
|
|
#endregion
|
|
#endregion 内部方法
|
}
|