using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; using JNPF.Common.Core.Manager; using JNPF.Common.Dtos.VisualDev; using JNPF.Common.Extension; using JNPF.FriendlyException; using JNPF.VisualDev; using JNPF.VisualDev.Entitys; using JNPF.VisualDev.Interfaces; using Mapster; using OBS.Internal; using SqlSugar; using Tnb.BasicData.Entities; using Tnb.WarehouseMgr.Entities; using Tnb.WarehouseMgr.Entities.Consts; using Tnb.WarehouseMgr.Entities.Enums; using Tnb.WarehouseMgr.Interfaces; namespace Tnb.WarehouseMgr { /// /// 盘点任务 /// [OverideVisualDev(ModuleConsts.MODULE_WMSCHECKTASK_ID)] public class WmsCheckTaskService : BaseWareHouseService { private readonly ISqlSugarClient _db; private readonly IWareHouseService _warehouseService; private readonly IUserManager _userManager; private readonly IVisualDevService _visualDevService; private readonly IRunService _runService; public WmsCheckTaskService( ISqlSugarRepository repository, IWareHouseService wareHouseService, IVisualDevService visualDevService, IRunService runService, IUserManager userManager) { _db = repository.AsSugarClient(); _warehouseService = wareHouseService; _visualDevService = visualDevService; _runService = runService; _userManager = userManager; OverideFuncs.CreateAsync = Create; } private async Task Create(VisualDevModelDataCrInput input) { if (input == null) throw new ArgumentNullException(nameof(input)); try { await _db.Ado.BeginTranAsync(); if (input.data?.Count > 0) { var checkType = input.data[nameof(WmsCheckstockH.checkstock_type)]?.ToString(); if (!checkType.IsNullOrEmpty()) { var billStatus = new List { WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID, WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID, }; var filter = Expressionable.Create() .And((a, b) => b.wh_id == input.data[nameof(WmsCheckstockH.warehouse_id)].ToString()) .And((a, b) => b.is_type == ((int)EnumLocationType.存储库位).ToString()) .And((a, b) => !billStatus.Contains(a.status)) .ToExpression(); var queryTasks = new List>>(); queryTasks.Add(Task.Run(() => FetchDisTasks((a, b) => a.startlocation_id == b.id, filter))); queryTasks.Add(Task.Run(() => FetchDisTasks((a, b) => a.endlocation_id == b.id, filter))); var disTasks = await Task.WhenAll(queryTasks); if (disTasks?.Length > 0) { throw new AppFriendlyException("该仓库还有未完成的任务,不允许盘点!", 500); } VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(ModuleConsts.MODULE_WMSCHECKTASK_ID, true); await _runService.Create(templateEntity, input); List carryCodes = new(); List details = new(); switch (checkType.ToEnum()) { case EnumCheckType.全库盘点: carryCodes = await _db.Queryable().InnerJoin((a, b) => a.id == b.location_id) .Where(a => a.wh_id == input.data[nameof(WmsCheckstockH.warehouse_id)].ToString() && a.is_type == ((int)EnumLocationType.存储库位).ToString()) .Select() .ToListAsync(); carryCodes ??= Enumerable.Empty().ToList(); var checkStockDs = carryCodes.Adapt>(); var prQtyDic = checkStockDs.GroupBy(g => new { g.carry_id, g.material_id, g.code_batch }).ToDictionary(x => x.Key, x => x.Sum(d => d.codeqty)); foreach (var (k, v) in prQtyDic) { WmsCheckstockD? checkstockD = checkStockDs?.Find(x => string.Equals(k, $"{x.carry_id}{x.material_id}{x.code_batch}")); if (checkstockD != null) { checkstockD.pr_qty = v; details.Add(checkstockD); } } details.ForEach(x => { x.create_id = _userManager.UserId; x.create_time = DateTime.Now; }); await _db.Insertable(details).ExecuteCommandAsync(); break; case EnumCheckType.物料盘点: break; case EnumCheckType.批次盘点: break; } //生成预任务信息 if (details.Count > 0 && carryCodes.Count > 0) { var locTypes = new[] { ((int)EnumLocationType.出库库位).ToString(), ((int)EnumLocationType.出入库位).ToString() }; var endLocs = _db.Queryable().Where(it=>it.wh_id == input.data[nameof(WmsCheckstockH.warehouse_id)].ToString() && locTypes.Contains(it.is_type)).ToListAsync(); var curDetails = details.DistinctBy(x => x.carry_id).ToList(); var curCarryCodes = carryCodes.FindAll(x => curDetails.Select(d => d.carry_id).Contains(x.carry_id)); if (curCarryCodes.Count > 0) { foreach (var item in curCarryCodes) { } } } } } await _db.Ado.CommitTranAsync(); } catch (Exception) { await _db.Ado.RollbackTranAsync(); throw; } return Task.FromResult(1); } private Task> FetchDisTasks(Expression> joinExp, Expression> whereExp) { return _db.Queryable().InnerJoin(joinExp).Where(whereExp).Select().ToListAsync(); } } }