using Mapster; using Masuit.Tools; using SqlSugar; using System.ComponentModel.DataAnnotations; using System.Linq.Expressions; using WIDESEA_Common; using WIDESEA_Core.BaseRepository; using WIDESEA_DTO.Basic; using WIDESEA_IOrderRepository; using WIDESEA_OrderRepository; namespace WIDESEA_StorageBasicService; public class BoxingInfoService : ServiceBase, IBoxingInfoService { private readonly IUnitOfWorkManage _unitOfWorkManage; private readonly ILocationStatusChangeRecordRepository _locationStatusChangeRecordRepository; private readonly IDt_InboundOrderRepository _inboundOrderRepository; public BoxingInfoService(IBoxingInfoRepository BaseDal,IUnitOfWorkManage unitOfWorkManage, ILocationStatusChangeRecordRepository locationStatusChangeRecordRepository, IDt_InboundOrderRepository inboundOrderRepository) : base(BaseDal) { _unitOfWorkManage = unitOfWorkManage; _locationStatusChangeRecordRepository = locationStatusChangeRecordRepository; _inboundOrderRepository = inboundOrderRepository; } public override PageGridData GetPageData(PageDataOptions options) { string wheres = ValidatePageOptions(options); //获取排序字段 Dictionary orderbyDic = GetPageDataSort(options, TProperties); List orderByModels = new List(); foreach (var item in orderbyDic) { OrderByModel orderByModel = new() { FieldName = item.Key, OrderByType = item.Value }; orderByModels.Add(orderByModel); } int totalCount = 0; List searchParametersList = new List(); if (!string.IsNullOrEmpty(options.Wheres)) { try { searchParametersList = options.Wheres.DeserializeObject>(); options.Filter = searchParametersList; } catch { } } var data = BaseDal.Db.Queryable() .Includes(x => x.BoxingInfoDetails) .WhereIF(!wheres.IsNullOrEmpty(), wheres) .OrderBy(orderByModels) .ToPageList(options.Page, options.Rows, ref totalCount); new PageGridData(totalCount, data); return new PageGridData(totalCount, data); } #region 组盘 public async Task AddGroupPlateAsync(GroupPlate groupPlate) { WebResponseContent content = new WebResponseContent(); try { if (groupPlate == null || groupPlate.groups.IsNullOrEmpty() || groupPlate.palletCode.IsNullOrEmpty()) { return content.Error("参数错误"); } var info = await BaseDal.QueryFirstAsync(x => x.PalletCode == groupPlate.palletCode); if (!info.IsNullOrEmpty()) { content.Error("该托盘已存在组盘"); } else { List details = new List(); foreach (var item in groupPlate.groups) { var InboundOrder = _inboundOrderRepository.QueryFirst(x => x.OrderNo == item.orderNo); if (InboundOrder != null) { var x = details.Where(x => x.MaterielCode == InboundOrder.MaterialNo && x.Warehouse == InboundOrder.WarehouseName && x.DrawingNumber == InboundOrder.ProductDrawingNumber && x.DemandClassification == InboundOrder.DemandClassification).FirstOrDefault(); if (x != null) { details.Remove(x); x.MaterielCode = InboundOrder.MaterialNo; x.MaterielName = InboundOrder.MaterialName; x.DemandClassification = InboundOrder.DemandClassification; x.Warehouse = InboundOrder.WarehouseName; x.OrderNo = InboundOrder.UpperOrderNo; x.Unit = InboundOrder.Unit; x.Specs = InboundOrder.Specs; x.Weight = InboundOrder.Weight; x.Quantity = x.Quantity + item.quantity; x.DrawingNumber = InboundOrder.ProductDrawingNumber; x.Date = InboundOrder.Datetime; details.Add(x); } else { DtBoxingInfoDetail detail = new DtBoxingInfoDetail() { MaterielCode = InboundOrder.MaterialNo, MaterielName = InboundOrder.MaterialName, DemandClassification = InboundOrder.DemandClassification, Warehouse = InboundOrder.WarehouseName, OrderNo = InboundOrder.UpperOrderNo, Unit = InboundOrder.Unit, Specs = InboundOrder.Specs, Weight = InboundOrder.Weight, Quantity = item.quantity, DrawingNumber = InboundOrder.ProductDrawingNumber, Date = InboundOrder.Datetime, }; details.Add(detail); } } else { return content.Error("未找到入库单据信息"); } } DtBoxingInfo boxing = new DtBoxingInfo() { PalletCode = groupPlate.palletCode, StockStatus = (int)StockStateEmun.组盘暂存, BoxingInfoDetails = details }; await BaseDal.AddDataNavAsync(boxing); content.OK("组盘成功"); } return content; } catch (Exception ex) { return content.Error(ex.Message); } } #endregion #region 解盘 public async Task DeleteGroupPlateAsync(GroupPlate groupPlate) { WebResponseContent content = new WebResponseContent(); try { if (groupPlate == null || groupPlate.palletCode.IsNullOrEmpty()) { return content.Error("参数错误"); } var boxingInfo = await BaseDal.QueryFirstNavAsync(x => x.PalletCode == groupPlate.palletCode && x.StockStatus == (int)StockStateEmun.组盘暂存); if (!boxingInfo.IsNullOrEmpty()) { boxingInfo.StockStatus = (int)StockStateEmun.组盘撤销; DtBoxingInfo_Hty stockhty = boxingInfo.Adapt(); stockhty.ModifyDate = DateTime.Now; await _unitOfWorkManage.UseTranAsync(async () => { await BaseDal.Db.DeleteNav(x => x.Id == boxingInfo.Id) .Include(x => x.BoxingInfoDetails) .ExecuteCommandAsync(); await AddStockHtyAsync(stockhty); }); content.OK("解盘成功"); } else { content.Error("未找到组盘数据"); } return content; } catch (Exception ex) { return content.Error(ex.Message); } } private async Task AddStockHtyAsync(DtBoxingInfo_Hty stockhty) { var isStockAdd = await SqlSugarHelper.DbWMS.InsertNav(stockhty).IncludesAllFirstLayer().ExecuteCommandAsync(); if (!isStockAdd) { throw new Exception("库存历史信息添加失败"); } } /// /// 批量删除 /// /// /// public override WebResponseContent DeleteData(object[] keys) { try { List stockInfos = new List(); List locationInfos = new List(); foreach (var item in keys) { var stock = BaseDal.QueryFirstNavAsync(x => x.Id == item.ObjToInt()).Result; var stockHty = stock.Adapt(); stockInfos.Add(stockHty); var location = SqlSugarHelper.DbWMS.Queryable().FirstAsync(x => x.LocationCode == stock.LocationCode).Result; var lastStatus = location.LocationStatus; location.LocationStatus = (int)LocationEnum.Free; locationInfos.Add(location); _locationStatusChangeRecordRepository.AddLocationStatusChangeRecord(location, lastStatus, (int)StatusChangeTypeEnum.ManualOperation, 0); } //var hty = BaseDal.Db.InsertNav(stockInfos) // .Include(x => x.StockInfoDetails) // .ExecuteCommand(); var isStockAdd = SqlSugarHelper.DbWMS.InsertNav(stockInfos).IncludesAllFirstLayer().ExecuteCommandAsync(); var locationd = SqlSugarHelper.DbWMS.Updateable(locationInfos).ExecuteCommandHasChange(); return base.DeleteData(keys); } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } #endregion }