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, 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 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.Lock; BaseDal.UpdateData(location); } else { _unitOfWorkManage.BeginTran(); DtStockInfo_Hty stockInfo_Hty = stock.Adapt(); stockInfo_Hty.ModifyDate = DateTime.Now; await DeleteStockInfoAsync(stock.Id); List detail = _stockInfoDetailRepository.QueryData(x => x.StockId == stock.Id).ToList(); if (detail != null && detail.Count() > 0) { List details = detail.Adapt>(); await DeleteStockInfoDetailsAsync(detail); AddStockInfoDetailHty(details); } await AddStockInfoHtyAsync(stockInfo_Hty); location.LocationStatus = (int)LocationEnum.Lock; 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(); 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 locations = new List(); 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 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 details) { var isStockAdd = SqlSugarHelper.DbWMS.Insertable(details).ExecuteCommand(); if (isStockAdd==0) { throw new Exception("库存明细历史信息添加失败"); } } #endregion #endregion 内部方法 }