using Mapster; using Masuit.Tools; using SqlSugar; using System.ComponentModel.DataAnnotations; using System.Linq.Expressions; using WIDESEA_Core.BaseRepository; using WIDESEA_DTO.Basic; using WIDESEA_IOrderRepository; namespace WIDESEA_StorageBasicService; public class BoxingInfoService : ServiceBase, IBoxingInfoService { private readonly IDt_InboundOrderRepository _inboundOrderRepository; private readonly IUnitOfWorkManage _unitOfWorkManage; public BoxingInfoService(IBoxingInfoRepository BaseDal, IDt_InboundOrderRepository inboundOrderRepository, IUnitOfWorkManage unitOfWorkManage) : base(BaseDal) { _inboundOrderRepository = inboundOrderRepository; _unitOfWorkManage = unitOfWorkManage; } 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); } public async Task AddBoxingInfoAsync(AddBoxingDto boxingInfo) { WebResponseContent content = new WebResponseContent(); try { if(boxingInfo == null || boxingInfo.OrderNos.IsNullOrEmpty() || boxingInfo.palletCode.IsNullOrEmpty()) { return content.Error("参数错误"); } var info = await BaseDal.QueryFirstAsync(x => x.PalletCode == boxingInfo.palletCode); if (!info.IsNullOrEmpty()) { content.Error("该托盘已存在组盘"); } else { List details = new List(); foreach (var item in boxingInfo.OrderNos) { var InboundOrder = _inboundOrderRepository.QueryFirst(x => x.PrintCode == item); 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.OrderNo; x.Unit = InboundOrder.Unit; x.Specs = InboundOrder.Specs; x.Weight = InboundOrder.Weight; x.Quantity = x.Quantity + InboundOrder.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.OrderNo, Unit = InboundOrder.Unit, Specs = InboundOrder.Specs, Weight = InboundOrder.Weight, Quantity = InboundOrder.Quantity, DrawingNumber = InboundOrder.ProductDrawingNumber, Date = InboundOrder.Datetime, }; details.Add(detail); } } else { return content.Error("未找到入库单据信息"); } } DtBoxingInfo boxing = new DtBoxingInfo() { PalletCode=boxingInfo.palletCode, BoxingInfoDetails= details }; await BaseDal.AddDataNavAsync(boxing); content.OK("组盘成功"); } return content; } catch (Exception ex) { return content.Error(ex.Message); } } public async Task DeleteBoxingInfoAsync(AddBoxingDto boxingInfo) { WebResponseContent content = new WebResponseContent(); try { if (boxingInfo == null || boxingInfo.palletCode.IsNullOrEmpty()) { return content.Error("参数错误"); } var boxing = await BaseDal.QueryFirstNavAsync(x => x.PalletCode == boxingInfo.palletCode); if (!boxing.IsNullOrEmpty()) { DtBoxingInfo_Hty boxingInfo_Hty = boxing.Adapt(); boxingInfo_Hty.ModifyDate = DateTime.Now; await _unitOfWorkManage.UseTranAsync(async () => { await BaseDal.Db.DeleteNav(x => x.Id == boxing.Id) .Include(x => x.BoxingInfoDetails) .ExecuteCommandAsync(); await AddBoxingHtyAsync(boxingInfo_Hty); }); content.OK("解盘成功"); } else { content.Error("未找到组盘数据"); } return content; } catch (Exception ex) { return content.Error(ex.Message); } } private async Task AddBoxingHtyAsync(DtBoxingInfo_Hty boxingInfo) { var isStockAdd = await SqlSugarHelper.DbWMS.InsertNav(boxingInfo).IncludesAllFirstLayer().ExecuteCommandAsync(); if (!isStockAdd) { throw new Exception("组盘历史信息添加失败"); } } // 验证模型 public static List ValidateModel(object model) { // 创建一个验证结果列表 var validationResults = new List(); // 创建一个验证上下文 var validationContext = new ValidationContext(model, serviceProvider: null, items: null); // 使用验证器尝试验证模型,并将验证结果添加到验证结果列表中 Validator.TryValidateObject(model, validationContext, validationResults, validateAllProperties: true); // 返回验证结果列表 return validationResults; } }