using AutoMapper; using JSMachine.WMS.App.Dto; using JSMachine.WMS.App.Dto.Enum; using JSMachine.WMS.App.IService; using JSMachine.WMS.App.ServiceImpl; using JSMachine.WMS.Application.Dto; using JSMachine.WMS.Application.IService; using JSMachine.WMS.Business.StockIn.IService; using JSMachine.WMS.Business.StockIn.ServiceImpl.Strategy; using JSMachine.WMS.Business.StockOut.IService; using JSMachine.WMS.Domain.Entity; using JSMachine.WMS.Domain.Entity.Enums; using JSMachine.WMS.Infrastructure.Helper; using JSMachine.WMS.RPC.ErpRPC.Dto.In.XRBusinessResult; using JSMachine.WMS.RPC.ErpRPC.Dto.Out; using JSMachine.WMS.WebHost.Models; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using Org.BouncyCastle.Utilities.IO.Pem; using SqlSugar; using System.Linq.Expressions; namespace JSMachine.WMS.WebHost.Controllers { [Route("api/[controller]/[action]")] public class WarehouseController : ControllerBase { private IStorageRackService _storageRackService; private IStockOutService _stockOutService; private IERPTaskService _erpTaskService; private IAGVTaskService _agvTaskService; private IOperationLogService _operationLogService; private IMapper _mapper; public WarehouseController( IStorageRackService storageRackService, IStockOutService stockOutService, IERPTaskService erpTaskService, IAGVTaskService agvTaskService, IOperationLogService operationLogService, IMapper mapper ) { _storageRackService = storageRackService; _stockOutService = stockOutService; _erpTaskService = erpTaskService; _agvTaskService = agvTaskService; _operationLogService = operationLogService; _mapper = mapper; } #region 库位维护 [HttpPost] public async Task> UpdateWarehouseStatus(Guid id, bool isLocked) { //_ = _operationLogService.Add(new OperationLogDto //{ // OperationSource = OperationSource.WEB, // OperationType = OperationType.UpdateStorageRack, // NewObject = $"StorageRackId:{id},IsLocked:{isLocked}", // UserId= //}); bool bRet = await _storageRackService.UpdateLockStatus(id, isLocked); return new ApiResult { ResultCode = "200", Data = bRet }; } [HttpPost] public async Task> UpdateWarehouseDisableStatus(Guid id, bool isDisabled) { HttpContext.Request.Headers.TryGetValue("UserId", out var userIdValues); _ = _operationLogService.Add(new OperationLogDto { OperationSource = OperationSource.WEB, OperationType = OperationType.UpdateStorageRack, NewObject = $"StorageRackId:{id},IsDisabled:{isDisabled}", UserId = userIdValues }); bool bRet = await _storageRackService.UpdateDisableStatus(id, isDisabled); return new ApiResult { ResultCode = "200", Data = bRet }; } #endregion [HttpPost] public async Task>> GetStorageRackLst(FloorEnum floor) { List storageRack = new(); if (floor == 0) { storageRack = await _storageRackService.GetAll(); } else { storageRack = await _storageRackService.GetListByExpression(p => p.Floor == floor); } return new ApiResult>() { ResultCode = "200", Data = storageRack }; } [HttpPost] public async Task>> GetWareHouseAreaInfo(FloorEnum floor) { List storageRacks = await _storageRackService.GetListByExpression(p => p.Floor == floor); if (storageRacks.IsNullOrEmpty()) return new ApiResult>(); storageRacks = storageRacks.OrderBy(p => p.ReservoirAreaColumnId).ThenBy(p => p.NumSort).ToList(); List wareHouseAreaInfos = new(); var stockAreaGroups = storageRacks.GroupBy(p => p.ReservoirAreaId); foreach (var areaGroup in stockAreaGroups) { var stockColGroup = areaGroup.GroupBy(p => p.ReservoirAreaColumnId); WareHouseAreaInfo wareHouseAreaInfo = new() { AreaId = (int)areaGroup.Key.Value, AreaName = areaGroup.First().StorageRackName, }; List Columns = new(); foreach (var colGroup in stockColGroup) { WareHouseColumnInfo wareHouseColumnInfo = new() { ColId = (int)colGroup.Key, StorageRacks = colGroup.ToList() }; Columns.Add(wareHouseColumnInfo); } wareHouseAreaInfo.Columns = Columns; wareHouseAreaInfos.Add(wareHouseAreaInfo); } return new ApiResult> { ResultCode = "200", Data = wareHouseAreaInfos }; } /// /// 根据库位查询物料信息 /// /// /// [HttpPost] public async Task> QueryMaterialInfo(string wareHouse) { StorageRackDto storageRack = await _storageRackService.GetSingalByExpression(p => p.StorageRackNo == wareHouse); return new ApiResult { ResultCode = "200", Data = storageRack }; } [HttpPost] public async Task> Update([FromBody] StorageRackDto storageRack) { HttpContext.Request.Headers.TryGetValue("UserId", out Microsoft.Extensions.Primitives.StringValues userIdValues); _ = _operationLogService.Add(new OperationLogDto { OperationSource = string.IsNullOrEmpty(userIdValues) ? OperationSource.PDA : OperationSource.WEB, OperationType = OperationType.UpdateStorageRack, NewObject = JsonConvert.SerializeObject(storageRack), UserId = userIdValues }); bool bRet = await _storageRackService.EditSingal(storageRack); return new ApiResult { ResultCode = bRet ? "200" : "500", Data = bRet }; } /// /// 查询入库物料已上传erp的数量 /// /// /// [HttpPost] public async Task> QueryUploadErpNum(string barCode) { ERPTaskDto erpTask = await _erpTaskService.GetSingalByExpression(p => p.BarCode == barCode && p.TaskType == TaskTypeEnum.PdaIn && p.TaskStatus == TaskStatusEnum.Completed); return new ApiResult { ResultCode = "200", Data = erpTask == null ? 0 : erpTask.AlreadyUploadNum }; } /// /// 获取今日入库明细 /// /// [HttpGet] public async Task>> GetStockinDetailToday(string elvatorStockinNo) { List erpTasksToday = await _erpTaskService.GetListByExpression(p => p.CreationTime > DateTime.Now.Date && (p.TaskType == TaskTypeEnum.PdaIn || p.TaskType == TaskTypeEnum.TailIn)); if (erpTasksToday.IsNullOrEmpty()) { return new ApiResult> { Data = [], ResultCode = "200" }; } List agvTasks = await _agvTaskService.GetListByExpression(p => erpTasksToday.Select(x => x.Id).Contains(p.ErpTaskId)); if(agvTasks.IsNullOrEmpty()) { return new ApiResult> { Data = [], ResultCode = "200" }; } List storageRacks=await _storageRackService.GetAll(); if(storageRacks.IsNullOrEmpty()) return new ApiResult> { Data = [], ResultCode = "200" }; var agvTaskGroup = agvTasks.GroupBy(p=>p.ErpTaskId); List stockInDetails = new(); foreach (var group in agvTaskGroup) { List agvTaskThisGroup = group.ToList(); List endPositionThisGroup = storageRacks .Where(p => agvTaskThisGroup.Select(x => x.EndPositionCode).Contains(p.StorageRackNo)) .ToList(); StorageRackDto storagerack = endPositionThisGroup.FirstOrDefault(p=>p.Transport==TransportEnum.NormalArea); if(storagerack==null) continue; if (string.IsNullOrEmpty(elvatorStockinNo)) { StockInDetail stockInDetail = _mapper.Map( erpTasksToday.First(p => p.Id == agvTaskThisGroup.First().ErpTaskId)); stockInDetail.StoragePosition = storagerack.StorageRackNo; stockInDetails.Add(stockInDetail); } else { AGVTaskDto agvTask = agvTaskThisGroup.FirstOrDefault(p=>p.StartPositionCode== elvatorStockinNo); if(agvTask==null) continue; StockInDetail stockInDetail = _mapper.Map( erpTasksToday.First(p => p.Id == agvTaskThisGroup.First().ErpTaskId)); stockInDetail.StoragePosition = storagerack.StorageRackNo; stockInDetails.Add(stockInDetail); } } stockInDetails = stockInDetails.OrderBy(p=>p.StoragePosition).ToList(); return new ApiResult> { Data = stockInDetails, ResultCode = "200" }; } #region 搬运物料 /// /// 物料搬运,起点库位验证 /// /// /// [HttpPost] public async Task> CheckCarryStartRankNo(string startRankNo) { return await _stockOutService.CheckCarryStartRankNo(startRankNo); } /// /// 物料搬运,起点库位验证 /// /// /// [HttpPost] public async Task> CheckCarryEndRankNo(string endRankNo) { return await _stockOutService.CheckCarryEndRankNo(endRankNo); } /// /// 搬运物料 /// /// /// [HttpPost] public async Task> CarryMaterial([FromBody] CarryInParam carryInParam) { LogHelper.Info($"收到PDA搬运物料请求,提交信息\n {JsonConvert.SerializeObject(carryInParam)}"); HttpContext.Request.Headers.TryGetValue("UserId", out var userIdValues); _ = _operationLogService.Add(new OperationLogDto { OperationSource = OperationSource.PDA, OperationType = OperationType.Carry, NewObject = JsonConvert.SerializeObject(carryInParam), UserId = userIdValues }); return await _stockOutService.CarryMaterialInfo(carryInParam); } #endregion #region 出库码头维护 /// /// 清空出库码头 /// /// /// [HttpPost] public async Task> ClearWharf(TransportEnum transport) { if (!(transport == TransportEnum.NorthArea || transport == TransportEnum.SouthArea || transport == TransportEnum.MiddleOutArea)) { return new ApiResult { ResultCode = "500", Data = false, ErrorMsg = "码头编号错误" }; } LogHelper.Info($"收到pda清空出库码头请求,码头类型 {transport.ToString()}"); List storageRacks = await _storageRackService.GetListByExpression(p => p.Transport == transport); storageRacks?.ForEach(p => { p.IsLock = false; p.BarCode = null; }); await _storageRackService.EditBatch(storageRacks); return new ApiResult { ResultCode = "200", Data = true }; } /// /// 解锁南区码头 /// /// /// [HttpPost] public async Task> UnlockSourthStorageRack() { LogHelper.Info($"收到PDA解锁南区码头库位请求"); var bRet = new ApiResult() { ResultCode = "500", ErrorMsg = "解锁南区码头失败" }; var dataList = await _storageRackService.GetListByExpression(p => p.Transport == TransportEnum.SouthArea); if (dataList != null && dataList.Count > 0) { foreach (var data in dataList) { data.IsLock = false; } var result = await _storageRackService.EditBatch(dataList); if (result) { bRet.ResultCode = "200"; } else { bRet.ErrorMsg = "解锁南区码头:数据库操作失败"; } } return bRet; } /// /// 解锁北区码头 /// /// /// [HttpPost] public async Task> UnlockNorthAreaStorageRack() { LogHelper.Info($"收到PDA解锁北区码头库位请求"); var bRet = new ApiResult() { ResultCode = "500", ErrorMsg = "解锁北区码头失败" }; var dataList = await _storageRackService.GetListByExpression(p => p.Transport == TransportEnum.NorthArea); if (dataList != null && dataList.Count > 0) { foreach (var data in dataList) { data.IsLock = false; } var result = await _storageRackService.EditBatch(dataList); if (result) { bRet.ResultCode = "200"; } else { bRet.ErrorMsg = "解锁北区码头:数据库操作失败"; } } return bRet; } #endregion #region 物料查询 [HttpPost] public async Task>> GetMaterialInfo([FromBody] MaterialQueryParam materialQueryParam) { Expression> express = materialQueryParam.BuildExpress(); List storageRacks = await _storageRackService.GetListByExpression(express); storageRacks = storageRacks?.OrderBy(p=>p.Floor).ThenBy(p=>p.AreaNumSort).ThenBy(p=>p.ReservoirAreaColumnId).ThenBy(p=>p.NumSort).ToList(); return new ApiResult>() { ResultCode = "200", Data = storageRacks }; } #endregion } }