using JSMachine.WMS.App.Dto; using JSMachine.WMS.App.Dto.Enum; using JSMachine.WMS.App.IService; using JSMachine.WMS.Application.Dto; using JSMachine.WMS.Application.IService; using JSMachine.WMS.Business.StockIn.IService; using JSMachine.WMS.Business.StockOut.IService; using JSMachine.WMS.Domain.Entity; using JSMachine.WMS.Domain.Entity.Enums; using JSMachine.WMS.Infrastructure; using JSMachine.WMS.Infrastructure.Helper; using JSMachine.WMS.RPC.ErpRPC.Dto.In.XRBusinessResult; using JSMachine.WMS.RPC.ErpRPC.Dto.Out; using JSMachine.WMS.RPC.ErpRPC.Dto.Out.XRBusinessResult; using JSMachine.WMS.RPC.ErpRPC.IService; using JSMachine.WMS.WebHost.Models; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using NPOI.SS.Formula.Functions; namespace JSMachine.WMS.WebHost.Controllers { [Route("api/[controller]/[action]")] public class ErpController : ControllerBase { private IStockInService _stockInByPdaService; private IStockOutService _stockOutService; private IERPTaskService _erpTaskService; private IStorageRackService _storageRackService; private IPaperStorageService _paperStorageService; private IOperationLogService _operationLogService; public ErpController( IStockInService stockInByPdaService, IStockOutService stockOutService, IERPTaskService erpTaskService, IStorageRackService storageRackService, IPaperStorageService paperStorageService, IOperationLogService operationLogService ) { _stockInByPdaService = stockInByPdaService; _stockOutService = stockOutService; _erpTaskService = erpTaskService; _storageRackService = storageRackService; _paperStorageService = paperStorageService; _operationLogService = operationLogService; } [HttpGet] public async Task>> GetLatestErpTasks(TaskTypeEnum taskType) { List erpTasks = await _erpTaskService .GetListByExpression(p => p.LastModifiedTime >= DateTime.Now.Date && p.TaskType == taskType ); erpTasks = erpTasks?.OrderByDescending(p => p.CreationTime).ToList(); return new ApiResult> { ResultCode = "200", Data = erpTasks }; } /// /// 条件查询erp任务 /// /// /// /// /// [HttpPost] public async Task>> GetErpTasks([FromBody]ErpTaskQueryParam erpTaskQueryParam) { List erpTasks = await _erpTaskService.GetListByExpression(p => p.CreationTime >= erpTaskQueryParam.StartTime && p.CreationTime <= erpTaskQueryParam.EndTime && (erpTaskQueryParam.TaskType == 0 ? true : p.TaskType == erpTaskQueryParam.TaskType), "CreationTime", SqlSugar.OrderByType.Desc); return new ApiResult> { ResultCode = "200", Data = erpTasks }; } /// /// 合格证号是否已存在 /// /// /// [HttpPost] public async Task> IsBarCodeExist(string barCode, TaskTypeEnum taskType) { bool exist = false; if (taskType == TaskTypeEnum.PdaIn) { exist = await _erpTaskService.Exist(p => p.BarCode == barCode && (p.TaskStatus == TaskStatusEnum.Initial || p.TaskStatus == TaskStatusEnum.InExecution || p.TaskStatus == TaskStatusEnum.Completed) && p.TaskType == TaskTypeEnum.PdaIn ); } else if (taskType == TaskTypeEnum.TailIn) { exist = await _erpTaskService.Exist(p => p.CreationTime >= DateTime.Now.AddHours(-1) && p.BarCode == barCode && (p.TaskStatus == TaskStatusEnum.Initial || p.TaskStatus == TaskStatusEnum.InExecution || p.TaskStatus == TaskStatusEnum.Completed) && p.TaskType == TaskTypeEnum.TailIn ); } return new ApiResult { ResultCode = "200", Data = exist }; } /// /// 从erp获取物料信息 /// /// [HttpPost] public async Task> GetMaterialInfoFromErp(string barCode) { XRResultDto erpResult = await _paperStorageService.GetMateriaInfo(barCode); StorageRackDto storageRack = new(); if (erpResult != null && erpResult.data != null) { storageRack.BarCode = erpResult.data.BarCode; storageRack.OrderNo = erpResult.data.OrderNo; storageRack.MateriaName = erpResult.data.MateriaName; storageRack.MateriaType = erpResult.data.MateriaType; storageRack.MateriaNum = int.Parse(erpResult.data.MateriaNum); storageRack.MateriaBatch = erpResult.data.MateriaBatch; storageRack.MateriaCode = erpResult.data.MateriaCode; } return new ApiResult { ResultCode = "200", Data = storageRack }; } /// /// 更新单个任务状态 /// /// /// [HttpPost] public async Task> UpdateTaskStatus(Guid id, TaskStatusEnum taskStatus) { LogHelper.Info($"收到pda更新erp任务请求,任务id {id} 更新后的状态 {taskStatus}"); ERPTaskDto erpTask = await _erpTaskService.GetSingalByExpression(p => p.Id == id); if (erpTask.TaskStatus != TaskStatusEnum.Initial) { LogHelper.Warn($"任务 {id} 当前状态已不是待下发状态,无法取消"); return new ApiResult { Data = false, ResultCode = "500", ErrorMsg = "所选择的任务当前已不是待下发状态,无法取消" }; } erpTask.TaskStatus = taskStatus; bool bRet = await _erpTaskService.EditSingal(erpTask); return new ApiResult { Data = bRet, ResultCode = bRet ? "200" : "500" }; } /// /// 任务操作 /// /// /// /// [HttpPost] public async Task> OperateTask(Guid id, TaskStatusEnum taskStatus) { LogHelper.Info($"收到网站更新erp任务请求,任务id {id} 更新后的状态 {taskStatus}"); HttpContext.Request.Headers.TryGetValue("UserId", out var userIdValues); _ = _operationLogService.Add(new OperationLogDto { OperationSource = OperationSource.WEB, OperationType = OperationType.UpdateErpTask, NewObject = string.Format("ErpTaskId:{0},TaskStatus:{1}", id, taskStatus.GetDescription()), UserId = userIdValues }); ERPTaskDto erpTask = await _erpTaskService.GetSingalByExpression(p => p.Id == id); if(erpTask==null) { return new ApiResult { Data=false, ResultCode="500", ErrorMsg="任务不存在,请刷新后再次重试" }; } erpTask.LastModifiedTime=DateTime.Now; erpTask.TaskStatus = taskStatus; bool bRet = await _erpTaskService.EditSingalWithSpecificCols(erpTask,[nameof(ERPTaskDto.LastModifiedTime),nameof(ERPTaskDto.TaskStatus)]); return new ApiResult { Data = bRet, ResultCode = bRet ? "200" : "500" }; } /// /// 暂停所有待执行的任务 /// /// [HttpGet] public async Task> StopAll(TaskTypeEnum taskType) { LogHelper.Info("收到PDA暂停所有任务请求"); List erpTasks = await _erpTaskService.GetListByExpression(p => p.CreationTime > DateTime.Now.Date && p.TaskStatus == TaskStatusEnum.Initial && p.TaskType == taskType); if (erpTasks.IsNullOrEmpty()) { return new ApiResult { ResultCode = "200", Data = true }; } erpTasks.ForEach(p => p.TaskStatus = TaskStatusEnum.Paused); bool bRet = await _erpTaskService.EditBatch(erpTasks); return new ApiResult { Data = bRet, ResultCode = bRet ? "200" : "500" }; } /// /// 恢复所有暂停的任务 /// /// [HttpGet] public async Task> ResumeAll(TaskTypeEnum taskType) { LogHelper.Info("收到PDA恢复所有任务请求"); List erpTasks = await _erpTaskService.GetListByExpression(p => p.CreationTime > DateTime.Now.Date && p.TaskStatus == TaskStatusEnum.Paused && p.TaskType == taskType); if (erpTasks.IsNullOrEmpty()) { return new ApiResult { ResultCode = "200", Data = true }; } erpTasks.ForEach(p => p.TaskStatus = TaskStatusEnum.Initial); bool bRet = await _erpTaskService.EditBatch(erpTasks); return new ApiResult { Data = bRet, ResultCode = bRet ? "200" : "500" }; } } }