|
using AngleSharp.Dom;
|
using COSXML.Network;
|
using Elastic.Clients.Elasticsearch.Tasks;
|
using Furion.DatabaseAccessor;
|
using Microsoft.AspNetCore.SignalR;
|
using WCS.Application.Entity;
|
using WCS.Application.Service.WcsTask.Dto;
|
|
namespace WCS.Application;
|
|
/// <summary>
|
/// 任务表服务
|
/// </summary>
|
[ApiDescriptionSettings(ApplicationConst.GroupName, Order = 100)]
|
public class WcsTaskService : IDynamicApiController, ITransient
|
{
|
private readonly SqlSugarRepository<WcsTask> _wcsTaskRep;
|
private readonly IHubContext<TaskLogHub, ITaskLogHub> _taskLogHubContext;
|
private readonly SqlSugarRepository<WcsCheckTask> _wcsCheckTaskRep;
|
private readonly SqlSugarRepository<WcsMateialPzInfo> _wcsMateialPzInfoRep;
|
|
public WcsTaskService(SqlSugarRepository<WcsTask> wcsTaskRep, IHubContext<TaskLogHub, ITaskLogHub> taskLogHubContext, SqlSugarRepository<WcsCheckTask> wcsCheckTaskRep, SqlSugarRepository<WcsMateialPzInfo> wcsMateialPzInfoRep)
|
{
|
_wcsTaskRep = wcsTaskRep;
|
_taskLogHubContext = taskLogHubContext;
|
_wcsCheckTaskRep = wcsCheckTaskRep;
|
_wcsMateialPzInfoRep = wcsMateialPzInfoRep;
|
}
|
|
/// <summary>
|
/// 分页查询任务表
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost]
|
[ApiDescriptionSettings(Name = "Page")]
|
[DisplayName("分页查询任务表")]
|
public async Task<SqlSugarPagedList<WcsTaskOutput>> Page(PageWcsTaskInput input)
|
{
|
input.SearchKey = input.SearchKey?.Trim();
|
var query = _wcsTaskRep.AsQueryable()
|
.WhereIF(!string.IsNullOrEmpty(input.SearchKey), u =>
|
u.TaskNo.Contains(input.SearchKey)
|
)
|
.WhereIF(!string.IsNullOrWhiteSpace(input.TaskNo), u => u.TaskNo.Contains(input.TaskNo.Trim()))
|
.WhereIF(input.TaskType.HasValue, u => u.TaskType == input.TaskType)
|
.WhereIF(input.Status.HasValue, u => u.Status == input.Status)
|
.WhereIF(!string.IsNullOrWhiteSpace(input.PalletNo), u => u.PalletNo.Contains(input.PalletNo.Trim()))
|
.WhereIF(!string.IsNullOrWhiteSpace(input.Origin), u => u.Origin.Contains(input.Origin.Trim()))
|
.Select<WcsTaskOutput>();
|
return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize);
|
}
|
|
/// <summary>
|
/// 增加任务表
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost]
|
[ApiDescriptionSettings(Name = "Add")]
|
[DisplayName("增加任务表")]
|
public async Task<long> Add(AddWcsTaskInput input)
|
{
|
if(await _wcsTaskRep.AsQueryable().AnyAsync(s => s.TaskNo == input.TaskNo))
|
{
|
throw Oops.Bah("任务号重复");
|
}
|
if (input.UnstackingMode == UnstackingModeEnum.Machine)
|
{
|
if (string.IsNullOrEmpty(input.SkuNo) || string.IsNullOrEmpty(input.SkuName))
|
{
|
throw Oops.Bah("机器人拣货,物料和批次信息不能为空");
|
}
|
}
|
var entity = input.Adapt<WcsTask>();
|
entity.Origin = "WCS";
|
|
#region 分配拆垛工位
|
//分拣任务信息
|
List<TaskPortDto> taskPortList = await _wcsCheckTaskRep.Context.Queryable<WcsCheckTask>().Where(w => w.RoboatType == PLCTypeEnum.StackingRobot).Select<TaskPortDto>().ToListAsync();
|
if (taskPortList.Count<=0)
|
{
|
throw Oops.Bah("拆垛工位异常");
|
}
|
var taskList = await _wcsTaskRep.Context.Queryable<WcsTask>().Where(w => w.Status == 0 && w.IsBind == 0 && w.TaskType == TaskTypeEnum.Out).ToListAsync();
|
foreach (var item in taskPortList)
|
{
|
item.PortCount= taskList.Where(w=>w.StationNum==item.Port).Count();
|
}
|
var portInfo = taskPortList.OrderBy(o => o.PortCount).ThenBy(o => o.LineNO).First();
|
//拆垛工位号
|
entity.StationNum = portInfo.Port;
|
#endregion
|
|
await _wcsTaskRep.InsertAsync(entity);
|
|
return entity.Id;
|
}
|
|
/// <summary>
|
/// 删除任务表
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost]
|
[ApiDescriptionSettings(Name = "Delete")]
|
[DisplayName("删除任务表")]
|
public async Task Delete(DeleteWcsTaskInput input)
|
{
|
var entity = await _wcsTaskRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
|
await _wcsTaskRep.FakeDeleteAsync(entity); //假删除
|
//await _wcsTaskRep.DeleteAsync(entity); //真删除
|
}
|
|
/// <summary>
|
/// 更新任务表
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost]
|
[ApiDescriptionSettings(Name = "Update")]
|
[DisplayName("更新任务表")]
|
public async Task Update(UpdateWcsTaskInput input)
|
{
|
var entity = input.Adapt<WcsTask>();
|
await _wcsTaskRep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
|
}
|
|
/// <summary>
|
/// 获取任务表
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpGet]
|
[ApiDescriptionSettings(Name = "Detail")]
|
[DisplayName("获取任务表")]
|
public async Task<WcsTask> Detail([FromQuery] QueryByIdWcsTaskInput input)
|
{
|
return await _wcsTaskRep.GetFirstAsync(u => u.Id == input.Id);
|
}
|
|
/// <summary>
|
/// 获取任务表列表
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpGet]
|
[ApiDescriptionSettings(Name = "List")]
|
[DisplayName("获取任务表列表")]
|
public async Task<List<WcsTaskOutput>> List([FromQuery] PageWcsTaskInput input)
|
{
|
return await _wcsTaskRep.AsQueryable().Select<WcsTaskOutput>().ToListAsync();
|
}
|
|
/// <summary>
|
/// 完成/取消任务表
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost]
|
[ApiDescriptionSettings(Name = "Finsh")]
|
[DisplayName("完成/取消任务表")]
|
[UnitOfWork]
|
public async Task Finsh(UpdateWcsTaskInput input)
|
{
|
if (input.Status == TaskStatusEnum.Complete || input.Status == TaskStatusEnum.Cancell)
|
{
|
var modTask = await _wcsTaskRep.GetByIdAsync(input.Id);
|
if (modTask.Status > TaskStatusEnum.Doing)
|
throw Oops.Oh("任务状态异常");
|
if (input.Status == TaskStatusEnum.Complete)
|
{
|
modTask.IsSuccess = TaskSuccessEnum.Success;
|
modTask.FinishDate = DateTime.Now;//完成时间
|
}
|
else
|
{
|
modTask.IsSuccess = TaskSuccessEnum.Fail;
|
modTask.CancelDate = DateTime.Now;//取消时间
|
}
|
modTask.Status = input.Status;
|
await _wcsTaskRep.Context.Updateable(modTask).UpdateColumns(s => new { s.Status, s.IsSuccess, s.FinishDate, s.CancelDate, s.UpdateTime, s.UpdateUserId, s.UpdateUserName }).ExecuteCommandAsync();
|
//写入任务明细表
|
WcsTaskMonitor modTaskMonitor = new WcsTaskMonitor()
|
{
|
TaskNo = modTask.TaskNo,
|
PlcId = 0,
|
PlcName = "",
|
Status = TaskStatusEnum.Complete,
|
StartLocat = modTask.StartLocate,
|
EndLocat = modTask.EndLocate,
|
InteractiveMsg = input.Status == TaskStatusEnum.Complete ? "任务已手动完成" : "任务已手动取消",
|
PalletNo = modTask.PalletNo
|
};
|
await _wcsTaskRep.Context.Insertable(modTaskMonitor).ExecuteCommandAsync();
|
//await _taskLogHubContext.Clients.All.PublicTask(modTask.Adapt<WcsTaskOutput>());
|
//await _taskLogHubContext.Clients.All.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
|
|
#region
|
//分拣任务信息
|
var checkTaskList = _wcsCheckTaskRep.Context.Queryable<WcsCheckTask>().Where(w => w.TaskNo == modTask.TaskNo && w.Status == "1").ToList();
|
foreach (var item in checkTaskList)
|
{
|
item.OrderNo = "";
|
item.TaskNo = "";
|
item.LotNo = "";
|
item.SkuNo = "";
|
item.SkuName = "";
|
item.BoxType = "";
|
item.Qty = 0;
|
item.PZNo = "";
|
item.Status = "0";//未绑定
|
}
|
//更新分拣任务
|
await _wcsCheckTaskRep.AsUpdateable(checkTaskList).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
|
#endregion
|
}
|
else
|
{
|
throw Oops.Oh("任务状态异常");
|
}
|
}
|
|
public async Task UploadTask(UpdateWcsTaskInput input)
|
{
|
var modTask = await _wcsTaskRep.GetByIdAsync(input.Id);
|
if (modTask.Status != TaskStatusEnum.Complete)
|
{
|
throw Oops.Oh("任务状态异常");
|
}
|
if (modTask.Origin != "WMS")
|
{
|
throw Oops.Oh("该任务来源不是WMS");
|
}
|
// 反馈WMS
|
//var requestMode = new TaskRequest()
|
//{
|
// TaskNo = modTask.TaskNo,
|
// PalletNo = modTask.PalletNo,
|
// TaskType = (TaskTypeEnum)modTask.TaskType,//TaskTypeEnum.In,
|
// TaskStatus = TaskStatusEnum.Complete
|
//};
|
//HttpService httpService = new HttpService();
|
//var modResponseTask = httpService.RequestTask(requestMode).Result;
|
//if (modResponseTask.StatusCode == "0")
|
//{
|
// modcTaskMonitor.InteractiveMsg = "任务完成,返回给WMS任务完成";
|
//}
|
}
|
}
|