using Furion.DatabaseAccessor; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using Mapster; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Yitter.IdGenerator; using Admin.NET.Core; namespace Admin.NET.Application { /// /// 入库管理服务 /// [ApiDescriptionSettings("自己的业务", Name = "BindEntrance", Order = 100)] [Route("api/[Controller]")] public class BindEntranceService : IDynamicApiController, ITransient { private readonly IRepository _wmsAreaRep; private readonly IRepository _wmsPlaceRep; private readonly IRepository _wmsTaskRep; private readonly IRepository _wmsContainerRep; private readonly IRepository _wmsContainerPlaceRep; private readonly IRepository _wmsMaterialRep; private readonly IRepository _wmsMaterialStockRep; private readonly IRepository _wmsMaterialContainerRep; /// /// 构造函数 /// public BindEntranceService( IRepository wmsAreaRep, IRepository wmsPlaceRep, IRepository wmsTaskRep, IRepository wmsContainerRep, IRepository wmsContainerPlaceRep, IRepository wmsMaterialRep, IRepository wmsMaterialStockRep, IRepository wmsMaterialContainerRep) { this._wmsAreaRep = wmsAreaRep; this._wmsPlaceRep = wmsPlaceRep; this._wmsTaskRep = wmsTaskRep; this._wmsContainerRep = wmsContainerRep; this._wmsContainerPlaceRep = wmsContainerPlaceRep; this._wmsMaterialRep = wmsMaterialRep; this._wmsMaterialStockRep = wmsMaterialStockRep; this._wmsMaterialContainerRep = wmsMaterialContainerRep; } /// /// 托盘查询组盘物料 /// /// /// [HttpGet("getcontainer")] [UnifyResult(typeof(BindEntranceOutput))] public async Task GetContainer([FromQuery] BindEntranceInput input) { var bindEntranceOutputModel = new BindEntranceOutput(); var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(n => n.ContainerCode == input.ContainerCode && n.ContainerStatus != ContainerStatus.JINYONG); if (wmsContainer == null) { var newWmsContainer = new WmsContainerDto(); newWmsContainer.ContainerCode = input.ContainerCode; newWmsContainer.ContainerStatus = ContainerStatus.KOUXIAN; newWmsContainer.ContainerType = ContainerType.SULIAO; bindEntranceOutputModel.ContainerCode = input.ContainerCode; bindEntranceOutputModel.WmsContainer = newWmsContainer; if (wmsContainer != null) { var isWmsTask = await _wmsTaskRep.AnyAsync(p => p.ContainerCode == wmsContainer.ContainerCode && p.TaskStatus != TaskStatusEnum.WANCHENG); if (isWmsTask) return XnRestfulResultProvider.RESTfulMesaage("周转箱号存在未完成任务!"); bindEntranceOutputModel.WmsContainer = wmsContainer.Adapt(); bindEntranceOutputModel.ContainerCode = wmsContainer.ContainerCode; // 周转箱号组盘状态 if (wmsContainer.ContainerStatus == ContainerStatus.ZUPANG) { bindEntranceOutputModel.WmsMaterials = await _wmsMaterialContainerRep .Where(p => p.ContainerCode == wmsContainer.ContainerCode && p.BindStatus == CommonStatus.ENABLE).ProjectToType().ToListAsync(); return XnRestfulResultProvider.RESTfulResult(bindEntranceOutputModel); } // 周转箱号库位状态 if (wmsContainer.ContainerStatus == ContainerStatus.KUWEI) { // 查询周转箱号与库位关系 var wmsContainerPlace = await _wmsContainerPlaceRep.FirstOrDefaultAsync(u => u.ContainerId == wmsContainer.Id && u.ContainerCode == wmsContainer.ContainerCode); if (wmsContainerPlace != null) bindEntranceOutputModel.PlaceCode = wmsContainerPlace.PlaceCode; return XnRestfulResultProvider.RESTfulResult(bindEntranceOutputModel); } } } return XnRestfulResultProvider.RESTfulResult(bindEntranceOutputModel); } /// /// 扫码获取物料 /// /// [HttpGet("GetMaterial")] [UnifyResult(typeof(MaterialOutput))] public async Task GetMaterial([FromQuery] GetMaterialInput input) { var material = new MaterialOutput(); material.MaterialName = "胶合板"; material.MaterialNo = "JHB20110101"; material.MaterialId = 43214325321513; material.MaterialBatch = "DIYIPICI001"; material.MaterialType = MaterialType.BAOZHUANGCAILIAO; material.InspectionMethod = MaterialInspection.MIANJIAN; material.MaterialSpec = ""; material.MaterialDensity = ""; material.MaterialUnit = ""; material.LesWorkshopSection = LesWorkshopSection.CNC; return XnRestfulResultProvider.RESTfulResult(material); } /// /// 组盘 /// /// [HttpPost("AutoWare")] public async Task AutoWare(WarehousingInput input) { // 根据托盘号查询托盘号信息是否已存在 var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(u => u.ContainerCode == input.ContainerCode); if (wmsContainer == null) { // 不存在则添加托盘号信息 wmsContainer = new WmsContainer { ContainerCode = input.ContainerCode, ContainerType = ContainerType.SULIAO, ContainerStatus = ContainerStatus.KOUXIAN, AssetNo = "N/A", ErpNo = "N/A" }; await _wmsContainerRep.InsertNowAsync(wmsContainer); } // 查询是否任务已存在 var isExit = await _wmsTaskRep.AnyAsync(p => p.ContainerCode == wmsContainer.ContainerCode && p.TaskStatus != TaskStatusEnum.WANCHENG); if (isExit) throw Oops.Oh("托盘号存在未完成任务中!"); // 查询已组盘信息 var wmsMaterialContainerList = await _wmsMaterialContainerRep .Where(p => p.ContainerCode == wmsContainer.ContainerCode && p.BindStatus == CommonStatus.ENABLE).ToListAsync(); await _wmsMaterialContainerRep.DeleteAsync(wmsMaterialContainerList); var orderNo = "N/A"; if (input.WmsMaterials.Count > 0) { wmsContainer.ContainerStatus = ContainerStatus.ZUPANG; orderNo = YitIdHelper.NextId().ToString(); await _wmsContainerRep.UpdateAsync(wmsContainer); } // 创建新组盘记录 foreach (var item in input.WmsMaterials) { //创建组盘记录 var bindentranceModel = new WmsMaterialContainer(); bindentranceModel.ContainerId = wmsContainer.Id; bindentranceModel.ContainerCode = wmsContainer.ContainerCode; bindentranceModel.MaterialNo = item.MaterialNo; bindentranceModel.MaterialId = 478183507525701; bindentranceModel.MaterialBatch = item.MaterialBatch; bindentranceModel.BindQuantity = 1; bindentranceModel.BindStatus = CommonStatus.ENABLE; bindentranceModel.OrderNo = orderNo; bindentranceModel.MaterialName = item.MaterialName; bindentranceModel.MaterialDensity = "N/A"; await _wmsMaterialContainerRep.InsertNowAsync(bindentranceModel); } } /// /// 自动入库 /// /// /// [HttpPost("automaticWarehousing")] [UnitOfWork] public async Task AutomaticWarehousing(WarehousingInput input) { // 查询混合料库区信息 var wmsArea = await _wmsAreaRep.FirstOrDefaultAsync(u => u.AreaName.Contains("绝缘立库")); // 根据料箱号查询周转箱号信息是否已存在 var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(u => u.ContainerCode == input.ContainerCode); if (wmsContainer == null) { // 不存在则添加周转箱号信息 wmsContainer = new WmsContainer { ContainerCode = input.ContainerCode, ContainerType = ContainerType.JINSHU, ContainerStatus = ContainerStatus.KOUXIAN, AssetNo = "N/A", ErpNo = "N/A" }; await _wmsContainerRep.InsertNowAsync(wmsContainer); } else { // 更新周转箱号状态为“库位” wmsContainer.ContainerStatus = ContainerStatus.KOUXIAN; await _wmsContainerRep.UpdateAsync(wmsContainer); } // 查询周转箱号是否已存在任务 var isWmsTask = await _wmsTaskRep.AnyAsync(p => p.ContainerCode == wmsContainer.ContainerCode && p.TaskStatus != TaskStatusEnum.WANCHENG); if (isWmsTask) throw Oops.Oh("周转箱号存在未完成任务中!"); // 删除已组盘信息 var oldWmsMaterialContainerList = await _wmsMaterialContainerRep .Where(p => p.ContainerCode == wmsContainer.ContainerCode && p.BindStatus == CommonStatus.ENABLE).ToListAsync(); foreach (var item in oldWmsMaterialContainerList) { await _wmsMaterialContainerRep.DeleteAsync(item); } // 组盘单据 默认空料箱单据 var source = ""; //定义入库来源 var orderNo = "N/A"; if (input.WmsMaterials.Count > 0) { wmsContainer.ContainerStatus = ContainerStatus.ZUPANG; orderNo = YitIdHelper.NextId().ToString(); await _wmsContainerRep.UpdateAsync(wmsContainer); source = "物料"; } else { source = "空托"; } // 查询物料Id var wmsMaterial = await _wmsMaterialRep.FirstOrDefaultAsync(u => u.MaterialNo == "N/A" && u.MaterialName == "N/A" && u.MaterialBatch == "N/A"); // 创建新组盘记录 foreach (var item in input.WmsMaterials) { var wmsMaterialContainer = item.Adapt(); wmsMaterialContainer.OrderNo = orderNo; wmsMaterialContainer.ContainerId = wmsContainer.Id; wmsMaterialContainer.ContainerCode = wmsContainer.ContainerCode; wmsMaterialContainer.MaterialId = wmsMaterial.Id; wmsMaterialContainer.BindStatus = CommonStatus.ENABLE; await _wmsMaterialContainerRep.InsertNowAsync(wmsMaterialContainer); } //if (input.Source == RuKuSourceEnum.KONGTUO) //else if (input.Source == RuKuSourceEnum.WULIAO) //创建巷道分配 var wmsPlace = await _wmsPlaceRep.Where(u => u.PlaceStatus == PlaceStatus.KONGXIAN).ToListAsync(); var one = wmsPlace.Where(s => s.Aisle==1).ToList().Count; var two = wmsPlace.Where(s => s.Aisle == 2).ToList().Count; var three = wmsPlace.Where(s => s.Aisle == 3).ToList().Count; var Aisle = 0; if (one >= two && one >= three) { Aisle = 1; } else if (two >= one && two >= three) { Aisle = 2; } else { Aisle = 3; } string taskNo = "RUKU"+ DateTime.Today.ToString("yyyyMMdd"); var wmsTaskModel = await _wmsTaskRep.DetachedEntities.FirstOrDefaultAsync(u => EF.Functions.Like(u.TaskNo, $"%{taskNo}%")); if (wmsTaskModel == null) { taskNo = taskNo + "0001"; } else { //获取流水号最大的数据 var maxSerialNumber = await _wmsTaskRep.MaxAsync(t => t.TaskNo); taskNo = Comm.GenerateNewInvoiceNumber(maxSerialNumber, 1); } // 创建任务 var takmodel = new WmsTask() { TaskNo = taskNo,//YitIdHelper.NextId().ToString(), TaskModel = TaskModel.QUANZIDONG, TaskType = TaskType.RUKU, TaskLevel = 1, Aisle = Aisle, TaskStatus = TaskStatusEnum.WEIZHIXING, ContainerCode = wmsContainer.ContainerCode, SourcePlace = "入库口", ToPlace = "", AreaName = wmsArea != null ? wmsArea.AreaName : "", OrderNo = orderNo, Description = source, //入库来源 TaskDodeviceStatus = TaskDodeviceStatusEnum.WZX, IsRead = true }; await _wmsTaskRep.InsertAsync(takmodel); } /// /// 人工入库 /// /// /// [HttpPost("manualWarehousing")] [UnitOfWork] public async Task ManualWarehousing(WarehousingInput input) { // 查询混合料库区信息 var wmsArea = await _wmsAreaRep.FirstOrDefaultAsync(u => u.AreaName.Contains("绝缘立库")); // 根据料箱号查询周转箱号信息是否已存在 var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(u => u.ContainerCode == input.ContainerCode); if (wmsContainer == null) { // 不存在则添加周转箱号信息 wmsContainer = new WmsContainer { ContainerCode = input.ContainerCode, ContainerType = ContainerType.JINSHU, ContainerStatus = ContainerStatus.KUWEI, AssetNo = "N/A", ErpNo = "N/A" }; await _wmsContainerRep.InsertNowAsync(wmsContainer); } else { // 更新周转箱号状态为“库位” wmsContainer.ContainerStatus = ContainerStatus.KUWEI; await _wmsContainerRep.UpdateAsync(wmsContainer); } // 查询周转箱号是否已存在任务 var isWmsTask = await _wmsTaskRep.AnyAsync(p => p.ContainerCode == wmsContainer.ContainerCode && p.TaskStatus != TaskStatusEnum.WANCHENG); if (isWmsTask) throw Oops.Oh("周转箱号存在未完成任务中!"); // 删除已组盘信息 var oldWmsMaterialContainerList = await _wmsMaterialContainerRep .Where(p => p.ContainerCode == wmsContainer.ContainerCode && p.BindStatus == CommonStatus.ENABLE).ToListAsync(); foreach (var item in oldWmsMaterialContainerList) { await _wmsMaterialContainerRep.DeleteAsync(item); } // 查询库位信息 随机分配库位 var wmsPlace = new WmsPlace(); if (string.IsNullOrEmpty(input.PlaceCode)) wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(u => u.AreaId == wmsArea.Id && u.Islock == YesOrNot.N && u.PlaceStatus == PlaceStatus.KONGXIAN); else wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(u => u.AreaId == wmsArea.Id && u.PlaceCode == input.PlaceCode); if (wmsPlace == null) throw Oops.Oh("库位不存在!"); if (wmsPlace.Islock == YesOrNot.Y) throw Oops.Oh("库位被锁定!"); if (wmsPlace.PlaceStatus != PlaceStatus.KONGXIAN) throw Oops.Oh("库位已存货!"); // 更新库位状态为“存货” wmsPlace.PlaceStatus = PlaceStatus.CUNHUO; // 组盘单据 默认空料箱单据 var orderNo = "N/A"; var source = ""; //定义入库来源 if (input.WmsMaterials.Count > 0) { orderNo = YitIdHelper.NextId().ToString(); source = "物料"; } else { wmsPlace.EmptyContainer = YesOrNot.Y; //是否空托 source = "空托"; } // 查询物料Id var wmsMaterial = await _wmsMaterialRep.FirstOrDefaultAsync(u => u.MaterialNo == "N/A" && u.MaterialName == "N/A" && u.MaterialBatch == "N/A"); // 创建新组盘记录 foreach (var item in input.WmsMaterials) { var wmsMaterialContainer = item.Adapt(); wmsMaterialContainer.OrderNo = orderNo; wmsMaterialContainer.ContainerId = wmsContainer.Id; wmsMaterialContainer.ContainerCode = wmsContainer.ContainerCode; wmsMaterialContainer.MaterialId = wmsMaterial.Id; wmsMaterialContainer.BindStatus = CommonStatus.ENABLE; await _wmsMaterialContainerRep.InsertNowAsync(wmsMaterialContainer); } string taskNo = "RUKU" + DateTime.Today.ToString("yyyyMMdd"); var wmsTaskModel = await _wmsTaskRep.DetachedEntities.FirstOrDefaultAsync(u => EF.Functions.Like(u.TaskNo, $"%{taskNo}%")); if (wmsTaskModel == null) { taskNo = taskNo + "0001"; } else { //获取流水号最大的数据 var maxSerialNumber = await _wmsTaskRep.MaxAsync(t => t.TaskNo); taskNo = Comm.GenerateNewInvoiceNumber(maxSerialNumber, 1); } // 创建任务 var takmodel = new WmsTask() { TaskNo = taskNo,//YitIdHelper.NextId().ToString(), TaskModel = TaskModel.SHOUDONG, TaskType = TaskType.RUKU, TaskLevel = 1, Aisle = wmsPlace.Aisle, TaskStatus = TaskStatusEnum.WANCHENG, ContainerCode = wmsContainer.ContainerCode, SourcePlace = "入库口", ToPlace = wmsPlace.PlaceCode, AreaName = wmsArea != null ? wmsArea.AreaName : "", OrderNo = orderNo, Description = source, //入库来源 TaskDodeviceStatus = TaskDodeviceStatusEnum.W, UpdatedTime = DateTime.Now, }; await _wmsTaskRep.InsertAsync(takmodel); // 创建托盘号库位关系表 var wmsContainerPlaceModel = new WmsContainerPlace() { PlaceId = wmsPlace.Id, PlaceCode = wmsPlace.PlaceCode, ContainerId = wmsContainer.Id, ContainerCode = wmsContainer.ContainerCode, ContainerPlaceStatus = CommonStatus.ENABLE }; await _wmsContainerPlaceRep.InsertAsync(wmsContainerPlaceModel); // 更新库存 var wmsMaterialContainerList = await _wmsMaterialContainerRep.DetachedEntities .Where(p => p.OrderNo == orderNo && p.BindStatus == CommonStatus.ENABLE).ProjectToType().ToListAsync(); foreach (var item in wmsMaterialContainerList) { var wmsMaterialStock = await _wmsMaterialStockRep.FirstOrDefaultAsync(p => p.ContainerCode == wmsContainer.ContainerCode && p.MaterialBatch == item.MaterialBatch ); if (wmsMaterialStock != null) { wmsMaterialStock.Source = RuKuSourceEnum.WULIAO; wmsMaterialStock.AreaId = wmsPlace.AreaId; wmsMaterialStock.PlaceCode = wmsPlace.PlaceCode; wmsMaterialStock.StockNumber += item.BindQuantity; await _wmsMaterialStockRep.UpdateAsync(wmsMaterialStock); } else { wmsMaterialStock = new WmsMaterialStock() { InspectionMethod = MaterialInspection.MIANJIAN, UnitType = UnitType.ZHONGLIANG, UnitNo = UnitNoType.T, MaterialNo = item.MaterialNo, MaterialType = MaterialType.CHENGPING, MaterialName = item.MaterialName, MaterialSpec = item.MaterialSpec, MaterialBatch = item.MaterialBatch, MaterialDensity = item.MaterialDensity, StockNumber = 1, PlaceCode = wmsPlace.PlaceCode, ContainerId = wmsContainer.Id, ContainerCode = wmsContainer.ContainerCode, AreaId = wmsPlace.AreaId, Source = RuKuSourceEnum.WULIAO }; await _wmsMaterialStockRep.InsertAsync(wmsMaterialStock); } } // 空料箱入库 if (orderNo == "N/A") { var wmsMaterialStock = new WmsMaterialStock() { InspectionMethod = MaterialInspection.MIANJIAN, UnitType = UnitType.ZHONGLIANG, UnitNo = UnitNoType.T, MaterialNo = "N/A", MaterialType = MaterialType.KONGTUO, MaterialName = "N/A", MaterialSpec = "N/A", MaterialBatch = "N/A", MaterialDensity = "N/A", StockNumber = 0, PlaceCode = wmsPlace.PlaceCode, ContainerId = wmsContainer.Id, ContainerCode = wmsContainer.ContainerCode, AreaId = wmsPlace.AreaId, Source = RuKuSourceEnum.KONGTUO }; await _wmsMaterialStockRep.InsertAsync(wmsMaterialStock); } } } }