using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using JNPF.Common.Core.Manager; using JNPF.Common.Extension; using JNPF.Common.Security; using JNPF.FriendlyException; using JNPF.Systems.Interfaces.System; using Mapster; using Microsoft.AspNetCore.Mvc; using NPOI.SS.Formula; using SqlSugar; using Tnb.BasicData.Entities; using Tnb.WarehouseMgr.Entities; using Tnb.WarehouseMgr.Entities.Consts; using Tnb.WarehouseMgr.Entities.Dto; using Tnb.WarehouseMgr.Entities.Enums; using Tnb.WarehouseMgr.Interfaces; namespace Tnb.WarehouseMgr { /// /// 齐套分拣服务类 /// public class WmsSetSortingService : BaseWareHouseService { private readonly ISqlSugarClient _db; private readonly IWareHouseService _wareHouseService; private readonly IBillRullService _billRullService; private readonly IUserManager _userManager; public WmsSetSortingService(ISqlSugarRepository repository, IWareHouseService wareHouseService, IUserManager userManager, IBillRullService billRullService) { _db = repository.AsSugarClient(); _wareHouseService = wareHouseService; _billRullService = billRullService; _userManager = userManager; } /// /// 齐套分拣(新增状态) /// /// [HttpPost] public async Task PackSortingByAdd() { var setSortings = await _db.Queryable() .Where(a => a.status == WmsWareHouseConst.BILLSTATUS_ADD_ID).OrderBy(a => a.seq) .ToListAsync(); var items = await _db.Queryable().Where(it => it.status == WmsWareHouseConst.BILLSTATUS_ON_ID).ToListAsync(); var onFlag = items?.Count > 0; if (setSortings?.Count > 0 && !onFlag) { var singleSorting = setSortings[^setSortings.Count]; var setSortingDList = await _db.Queryable().Where(it => it.bill_id == singleSorting.id).ToListAsync(); if (setSortingDList?.Count > 0) { List carryMats = new(); List carryCodes = new(); List carryIds = new(); foreach (var os in setSortingDList) { var carryCodesPart = await _db.Queryable().InnerJoin((a, b) => a.id == b.carry_id) .Where((a, b) => b.material_id == os.material_id && a.is_lock == 0 && !string.IsNullOrEmpty(a.location_id) && a.status == (int)EnumCarryStatus.占用) .WhereIF(!string.IsNullOrEmpty(os.code_batch), (a, b) => b.code_batch == os.code_batch) .Select() .ToListAsync(); if (carryCodesPart?.Count > 0) { carryCodes.AddRange(carryCodesPart); var codeQty = carryCodes.Sum(x => x.codeqty); if (codeQty < os.pr_qty) { throw new AppFriendlyException($"需要出库[{os.pr_qty}],实际库存{codeQty},数量不足", 500); } var partCarryMats = carryCodesPart.Adapt>(); partCarryMats.ForEach(x => { x.need_qty = (int)os.pr_qty; x.real_qty = codeQty; }); carryMats.AddRange(partCarryMats); } } if (carryMats.Count > 0) { carryMats.ForEach(x => x.id = SnowflakeIdHelper.NextId()); carryMats = carryMats.OrderBy(o => o.create_time).GroupBy(g => new { g.carry_id, g.material_id, g.code_batch }) .Select(x => { WmsCarryMat? carryMat = x.FirstOrDefault()!; carryMat.real_qty = x.Sum(d => d.real_qty); return carryMat; }) .ToList(); await _db.Insertable(carryMats).ExecuteCommandAsync(); var dic = carryMats.DistinctBy(x => x.carry_id).ToDictionary(x => x.carry_id, x => x.real_qty); var allOutIds = new List(); var sortingOutIds = new List(); foreach (var pair in dic) { var codes = carryCodes.FindAll(x => x.carry_id == pair.Key); if (codes?.Count > 0) { if (pair.Value == codes.Sum(d => d.codeqty)) { allOutIds.Add(pair.Key); } else { sortingOutIds.Add(pair.Key); } } } carryIds = allOutIds.Concat(sortingOutIds).ToList(); await _db.Updateable().SetColumns(it => new WmsCarryH { out_status = ((int)EnumOutStatus.全部出).ToString() }).Where(it => allOutIds.Contains(it.id)).ExecuteCommandAsync(); //天益项目不需要 //await _db.Updateable().SetColumns(it => new WmsCarryH { out_status = ((int)EnumOutStatus.分拣出).ToString() }).Where(it => sortingOutIds.Contains(it.id)).ExecuteCommandAsync(); } var carrys = await _db.Queryable().Where(it => carryIds.Contains(it.id)).ToListAsync(); if (carrys?.Count > 0) { List preTasks = new(); List locIds = new(); foreach (var carry in carrys) { WmsPointH sPoint = await _db.Queryable().FirstAsync(it => it.location_id == carry.location_id); WmsPointH ePoint = null!; ePoint = await _db.Queryable().FirstAsync(it => it.location_id == input.data[nameof(WmsPointH.location_id)].ToString()); if (sPoint != null && ePoint != null) { var points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id); locIds.AddRange(points.Select(x => x.location_id).ToList()!); //根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序) if (points?.Count > 0) { if (points.Count <= 2) throw new AppFriendlyException("该路径不存在", 500); var curPreTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it => { var sPoint = it.FirstOrDefault(); var ePoint = it.LastOrDefault(); WmsPretaskH preTask = new(); preTask.org_id = _userManager.User.OrganizeId; preTask.startlocation_id = sPoint?.location_id!; preTask.startlocation_code = sPoint?.location_code!; preTask.endlocation_id = ePoint?.location_id!; preTask.endlocation_code = ePoint?.location_code!; preTask.start_floor = sPoint?.floor.ToString(); preTask.end_floor = ePoint?.floor.ToString(); preTask.bill_code = _billRullService.GetBillNumber(WmsWareHouseConst.WMS_PRETASK_H_ENCODE).GetAwaiter().GetResult(); preTask.status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID; preTask.biz_type = WmsWareHouseConst.BIZTYPE_WMSOUTSTOCK_ID; preTask.task_type = WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID; preTask.carry_id = carry.id; preTask.carry_code = carry.carry_code; preTask.area_id = sPoint?.area_id!; preTask.area_code = it.Key; preTask.require_id = input.data["ReturnIdentity"].ToString(); preTask.require_code = input.data[nameof(preTask.bill_code)]?.ToString()!; preTask.create_id = _userManager.UserId; preTask.create_time = DateTime.Now; return preTask; }).ToList(); if (loc.is_sign == 0) { curPreTasks[^1].is_sign = 0; // 修改最后一个元素的是否签收值 } preTasks.AddRange(curPreTasks); } } } var isOk = await _wareHouseService.GenPreTask(preTasks, null); GenPreTaskUpInput genPreTaskAfterUpInput = new(); genPreTaskAfterUpInput.CarryIds = preTasks.Select(x => x.carry_id).ToList(); genPreTaskAfterUpInput.LocationIds = new HashSet(locIds).ToList(); await _wareHouseService.GenInStockTaskHandleAfter(genPreTaskAfterUpInput, it => new WmsCarryH { is_lock = 1 }, it => new BasLocation { is_lock = 1 }); } } #region MyRegion //foreach (var ss in setSortings) //{ // var carry = await _db.Queryable().SingleAsync(it => it.id == ss.carry_id); // if (carry != null) // { // WmsPointH sPoint = await _db.Queryable().FirstAsync(it => it.location_id == carry.location_id); // WmsPointH ePoint = await _db.Queryable().FirstAsync(it => it.location_id == ss.location_id); // if (sPoint != null && ePoint != null) // { // var points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id); // if (points?.Count > 0) // { // if (points.Count <= 2) throw new AppFriendlyException("该路径不存在", 500); // var preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it => // { // var sPoint = it.FirstOrDefault(); // var ePoint = it.LastOrDefault(); // WmsPretaskH preTask = new(); // preTask.org_id = _userManager.User.OrganizeId; // preTask.startlocation_id = sPoint?.location_id; // preTask.startlocation_code = sPoint?.location_code; // preTask.endlocation_id = ePoint?.location_id; // preTask.endlocation_code = ePoint?.location_code; // preTask.start_floor = sPoint?.floor.ToString(); // preTask.end_floor = ePoint?.floor.ToString(); // preTask.bill_code = _billRullService.GetBillNumber(WmsWareHouseConst.WMS_PRETASK_H_ENCODE).GetAwaiter().GetResult(); // preTask.status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID; // preTask.biz_type = ss.biz_type; // preTask.task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID; // preTask.carry_id = ss.carry_id; // preTask.carry_code = ss.carry_code; // preTask.area_id = sPoint?.area_id; // preTask.area_code = it.Key; // preTask.require_id = ss.id; // preTask.require_code = ss.bill_code; // preTask.create_id = _userManager.UserId; // preTask.create_time = DateTime.Now; // return preTask; // }).ToList(); // await _wareHouseService.GenPreTask(preTasks, null!); // var subCarrys = await _db.Queryable().Where(it => it.carry_id == ss.carry_id).ToListAsync(); // var carryIds = subCarrys.Select(x => x.carry_id).Concat(new[] { ss.carry_id }).Distinct().ToList(); // GenPreTaskUpInput genPreTaskInput = new() { CarryIds = carryIds, LocationIds = new List { carry.location_id, ss.location_id } }; // await _wareHouseService.GenInStockTaskHandleAfter(genPreTaskInput, it => new WmsCarryH { is_lock = 1, carry_status = ((int)EnumCarryStatus.齐套分拣).ToString() }, it => new BasLocation { is_lock = 1 }); // ss.status = WmsWareHouseConst.BILLSTATUS_ON_ID; // await _db.Updateable(ss).UpdateColumns(it => it.status).ExecuteCommandAsync(); // onFlag = true; // } // } // } //} #endregion } } } }