using Furion.DatabaseAccessor;
using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Furion.Extensions;
using iWare.Wms.Core;
using iWare.Wms.Core.Enum;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace iWare.Wms.Application.Service.Wmsjob.AgvTask
{
///
/// AGV访问接口
///
[ApiDescriptionSettings("仓库作业", Name = "AgvCallback", Order = 100)]
[Route("api/agv/[Controller]")]
public class AgvCallbackService : IDynamicApiController, ITransient
{
private readonly IRepository _wareTask;
private readonly IRepository _wareTaskSub;
private readonly IRepository _wareDeviceWarning;
private readonly IRepository _wareTaskBak;
private readonly IRepository _wareTaskSubBak;
public AgvCallbackService(
IRepository wareTask,
IRepository wareTaskSub,
IRepository wareDeviceWarning,
IRepository wareTaskBak,
IRepository wareTaskSubBak
)
{
_wareTask = wareTask;
_wareDeviceWarning = wareDeviceWarning;
_wareTaskSub = wareTaskSub;
_wareTaskBak = wareTaskBak;
_wareTaskSubBak = wareTaskSubBak;
}
///
/// 分页查询任务管理
///
///
///
[HttpPost("agvCallback")]
[AllowAnonymous]
public async Task Method([FromBody] AgvCallbackInput input)
{
AgvCommonResponseDto agvCommonResponseDto = new AgvCommonResponseDto()
{
code = "0",
message = "成功",
reqCode = input.reqCode
};
List wareTasks = new List();
List wareTaskBaks = new List();
var taskSub = await _wareTaskSub.Where(u => u.AgvTaskCode == input.taskCode).FirstOrDefaultAsync();
if (taskSub == null)
{
if (input.method == "end")
{
var taskSubbak = await _wareTaskSubBak.DetachedEntities.Where(u => u.AgvTaskCode == input.taskCode).FirstOrDefaultAsync();
if (taskSubbak != null)
{
var taskbak = await _wareTaskBak.Where(u => u.Id == taskSubbak.TaskId).FirstOrDefaultAsync();
if (taskbak != null)
{
taskbak.FinishedTime = DateTimeOffset.Now;
wareTaskBaks.Add(taskbak);
}
}
}
return agvCommonResponseDto;
}
switch (input.method)
{
case "start":
taskSub.TaskState = (int)SubTaskStateEnum.执行中;
taskSub.AgvCode = input.robotCode;
taskSub.AgvTaskCode = input.taskCode;
var task = await _wareTask.Where(u => u.Id == taskSub.TaskId).FirstOrDefaultAsync();
if (task != null)
{
task.AgvCode = input.robotCode;
wareTasks.Add(task);
}
break;
case "outbin":
taskSub.TaskState = (int)SubTaskStateEnum.离开储位;
var task1 = await _wareTask.Where(u => u.Id == taskSub.TaskId).FirstOrDefaultAsync();
if (task1 != null)
{
task1.AgvCode = input.robotCode;
wareTasks.Add(task1);
}
break;
case "applyIn":
taskSub.TaskState = (int)SubTaskStateEnum.请求进;
var task2 = await _wareTask.Where(u => u.Id == taskSub.TaskId).FirstOrDefaultAsync();
if (task2 != null)
{
task2.AgvCode = input.robotCode;
wareTasks.Add(task2);
}
break;
case "arrived":
taskSub.TaskState = (int)SubTaskStateEnum.进到位;
break;
case "applyOut":
taskSub.TaskState = (int)SubTaskStateEnum.请求出;
break;
case "出到位":
taskSub.TaskState = (int)SubTaskStateEnum.出到位;
break;
case "release":
taskSub.TaskState = (int)SubTaskStateEnum.离开;
break;
case "end":
taskSub.TaskState = (int)SubTaskStateEnum.已完成;
var isExist = _wareTaskSub.Any(u => u.TaskId == taskSub.TaskId && u.TaskState != (int)SubTaskStateEnum.已完成 && u.Id != taskSub.Id);
if (!isExist)
{
var maintask = _wareTask.Where(u => u.Id == taskSub.TaskId).FirstOrDefault();
if (maintask != null)
{
maintask.TaskState = TaskStateEnum.已完成;
wareTasks.Add(maintask);
}
}
break;
case "cancel":
taskSub.TaskState = (int)SubTaskStateEnum.已取消;
break;
}
using (var tran = await _wareTaskSub.Database.BeginTransactionAsync())
{
try
{
await _wareTaskSub.UpdateAsync(taskSub);
if (wareTasks != null && wareTasks.Count != 0)
{
await _wareTask.UpdateAsync(wareTasks);
}
if (wareTaskBaks != null && wareTaskBaks.Count > 0)
{
await _wareTaskBak.UpdateAsync(wareTaskBaks);
}
await tran.CommitAsync();
}
catch
{
await tran.RollbackAsync();
}
}
return agvCommonResponseDto;
}
///
/// 分页查询任务管理
///
///
///
[HttpPost("agvCallbackService/warnCallback")]
[AllowAnonymous]
public async Task WarnMethod([FromBody] AgvWarnCallbackDto input)
{
AgvCommonResponseDto agvCommonResponseDto = new AgvCommonResponseDto()
{
code = "0",
message = "成功",
reqCode = input.reqCode
};
List update = new List();
List insert = new List();
//查询当前所有AGV报警
var warnlist = await _wareDeviceWarning.Where(u => u.DeviceCode == "1099" && u.Status == 0).ToListAsync();
var strlist = input.data.Select(u => u.warnContent).ToList();
var strlist2 = warnlist.Select(u => u.WarningContent).ToList();
var nowDate = DateTime.Now;
var msg = "";
foreach (var item in warnlist)
{
if (!strlist.Contains(item.WarningContent))//不包含,结束报警
{
item.UpdatedTime = nowDate;
item.UpdatedUserName = "WMS";
item.Status = 1; //状态(0:新建 1:已处理)
item.StatusName = "已处理";
item.CloseContent = "WMS关闭";
item.FinishTime = nowDate;
item.OperationRemark = "关闭报警";
GetTimeDiffer(item.CreatedTime.ConvertToDateTime(), nowDate, ref msg);
item.DurationTime = msg;
update.Add(item);
}
else//包含,更新报警时间
{
item.UpdatedTime = nowDate;
update.Add(item);
}
}
foreach (var item in input.data)
{
if (!strlist2.Contains(item.warnContent))
{
WareDeviceWarning request = new WareDeviceWarning();
request.DeviceCode = "1099";
request.DeviceName = "AGV";
request.DeviceType = 3;
request.DeviceTypeName = "AGV";
request.WarningDbAddress = item.robotCode;
request.WarningCode = item.taskCode;
request.WarningContent = item.warnContent;
request.WarningTime = item.beginTime;
//状态(0:新建 1:已处理)
request.Status = 0;
request.StatusName = "新建";
request.UpdatedTime = nowDate;
request.CreatedTime = nowDate;
request.CreatedUserName = "WMS";
request.OperationRemark = "添加";
insert.Add(request);
}
}
using (var tran = await _wareTaskSub.Database.BeginTransactionAsync())
{
try
{
if (update != null && update.Count != 0)
{
await _wareDeviceWarning.UpdateAsync(update);
}
if (insert != null && insert.Count > 0)
{
await _wareDeviceWarning.InsertAsync(insert);
}
await tran.CommitAsync();
}
catch
{
await tran.RollbackAsync();
}
}
return agvCommonResponseDto;
}
[NonAction]
public static int GetTimeDiffer(DateTime? startTime, DateTime? endTime, ref string msg)
{
if (startTime == null || endTime == null)
{
return 0;
}
TimeSpan ts = ((DateTime)endTime - (DateTime)startTime);
msg = "";
if (ts.Days != 0)
{
msg += ts.Days + "天";
}
if (ts.Hours != 0)
{
msg += ts.Hours + "小时";
}
if (ts.Minutes != 0)
{
msg += ts.Minutes + "分钟";
}
if (ts.Seconds != 0)
{
msg += ts.Seconds + "秒";
}
return (int)ts.TotalSeconds;
}
}
}