/*
|
*所有关于Dt_taskinfo类的业务代码应在此处编写
|
*可使用repository.调用常用方法,获取EF/Dapper等信息
|
*如果需要事务请使用repository.DbContextBeginTransaction
|
*也可使用DBServerProvider.手动获取数据库相关信息
|
*用户信息、权限、角色等使用UserContext.Current操作
|
*Dt_taskinfoService对增、删、改查、导入、导出、审核业务代码扩展参照ServiceFunFilter
|
*/
|
|
using WIDESEA.Core.BaseProvider;
|
using WIDESEA.Core.Extensions.AutofacManager;
|
using WIDESEA.Entity.DomainModels;
|
using System.Linq;
|
using WIDESEA.Core.Utilities;
|
using System.Linq.Expressions;
|
using WIDESEA.Core.Extensions;
|
using Microsoft.EntityFrameworkCore;
|
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.AspNetCore.Http;
|
using WIDESEA.Services.IRepositories;
|
using System;
|
using WIDESEA.Common;
|
using System.Collections.Generic;
|
using WIDESEA.Services.Repositories;
|
using WIDESEA.Common.CustomModels;
|
using WIDESEA.Common.Modbus;
|
using Newtonsoft.Json;
|
using WIDESEA.Core.EFDbContext;
|
using WIDESEA.Common.EquipEnum;
|
using SqlSugar;
|
using WIDESEA_Services;
|
using WIDESEA.Core.ManageUser;
|
using Microsoft.Extensions.Caching.Memory;
|
using HttpContext = WIDESEA.Core.Utilities.HttpContext;
|
using WIDESEA.Core.Services;
|
|
namespace WIDESEA.Services.Services
|
{
|
public partial class Dt_taskinfoService
|
{
|
private readonly IHttpContextAccessor _httpContextAccessor;
|
private readonly IDt_taskinfoRepository _repository;//访问数据库
|
|
[ActivatorUtilitiesConstructor]
|
public Dt_taskinfoService(
|
IDt_taskinfoRepository dbRepository,
|
IHttpContextAccessor httpContextAccessor
|
)
|
: base(dbRepository)
|
{
|
_httpContextAccessor = httpContextAccessor;
|
_repository = dbRepository;
|
//多租户会用到这init代码,其他情况可以不用
|
//base.Init(dbRepository);
|
}
|
|
|
|
|
|
/// <summary>
|
/// 获取空托盘出库的任务列表,给前端的PDA展示
|
/// </summary>
|
/// <returns></returns>
|
public static WebResponseContent GetEmptyPalletTaskList()
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
List<Dt_taskinfo> taskList = Dt_taskinfoRepository.Instance.Find(x => x.task_type == TaskType.TaskType_Empty_Pallet_Outbound.ToString());
|
|
List<Dictionary<string, string>> data = new List<Dictionary<string, string>>();
|
for (int i = 0; i < taskList.Count(); i++)
|
{
|
Dictionary<string, string> dic = new Dictionary<string, string>();
|
dic.Add("barcode", taskList[i].task_barcode);
|
dic.Add("locationId", taskList[i].task_fromlocationid);
|
if (taskList[i].task_state == TaskState.TaskState_Create.ToString())
|
dic.Add("state", "等待执行");
|
else
|
dic.Add("state", "执行中");
|
data.Add(dic);
|
}
|
content.OK(data: data);
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
|
return content;
|
}
|
|
|
/// <summary>
|
/// 取消某一条未开始的任务
|
/// </summary>
|
public static WebResponseContent CancelATask(SaveModel saveModel)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
string barcode = saveModel.MainData["barcode"].ToString();
|
if (barcode == null)
|
throw new Exception("取消任务的托盘号不能为空");
|
|
Dt_taskinfo taskinfo = Dt_taskinfoRepository.Instance.FindFirst(x => x.task_barcode == barcode);
|
if (taskinfo == null)
|
throw new Exception($"没有找到托盘号:【{barcode}】对应的任务");
|
|
if (taskinfo.task_state != TaskState.TaskState_Create.ToString())
|
throw new Exception($"托盘号:【{barcode}】对应的任务已经开始执行,无法取消");
|
|
content = Dt_taskinfoRepository.Instance.DbContextBeginTransaction(() =>
|
{
|
Dt_locationinfo locationinfo = null;
|
if (taskinfo.task_type.Contains(TaskType.TaskType_Empty_Pallet_Inbound.ToString()) ||
|
taskinfo.task_type.Contains(TaskType.TaskType_Box_Pallet_Inbound.ToString()))
|
{
|
locationinfo = Dt_locationinfoRepository.Instance.FindFirst(x => x.location_id == taskinfo.task_tolocationid);
|
locationinfo.location_state = LocationState.LocationState_Empty.ToString();
|
}
|
else
|
{
|
locationinfo = Dt_locationinfoRepository.Instance.FindFirst(x => x.location_id == taskinfo.task_fromlocationid);
|
if (locationinfo.location_state.Contains(LocationState.LocationState_ErrorCheckOutbound.ToString()))
|
locationinfo.location_state = LocationState.LocationState_Error.ToString();
|
else
|
locationinfo.location_state = LocationState.LocationState_Stored.ToString();
|
}
|
Dt_locationinfoRepository.Instance.Update(locationinfo, x => x.location_state, true);
|
|
if (taskinfo.task_type.Contains(TaskType.TaskType_Box_Pallet_Inbound.ToString()))
|
{
|
Dt_boxing_head boxHead = Dt_boxing_headRepository.Instance.FindFirst(r => r.boxhead_barcode == taskinfo.task_barcode);
|
if (null != boxHead)
|
{
|
Dt_boxing_detail boxDetail = Dt_boxing_detailRepository.Instance.FindFirst(r => r.boxdtl_headid == boxHead.boxhead_id.ToString());
|
if (null != boxDetail)
|
Dt_boxing_detailRepository.Instance.Delete(boxDetail, true);
|
Dt_boxing_headRepository.Instance.Delete(boxHead, true);
|
}
|
}
|
|
Dt_taskinfoRepository.Instance.Delete(taskinfo, true);
|
if (taskinfo.task_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString())
|
{
|
content.OK();
|
}
|
else
|
{
|
SaveModel sm = new SaveModel();
|
sm.MainData = new Dictionary<string, object>();
|
sm.MainData.Add("barcode", barcode);
|
content = WCSApi.CancelTaskToWCS(sm);
|
if (!content.Status)
|
throw new Exception($"取消WCS中的任务出错,原因:{content.Message}");
|
}
|
return content;
|
});
|
}
|
catch (Exception ex)
|
{
|
content.Error("取消任务失败:" + ex.Message);
|
}
|
finally
|
{
|
Logger.AddLog(Core.Enums.LoggerType.Add, saveModel, content, content);
|
}
|
|
return content;
|
}
|
|
|
/// <summary>
|
/// 完成某一条任务
|
/// </summary>
|
public static WebResponseContent CompletedTask(SaveModel saveModel)
|
{
|
WebResponseContent content = new WebResponseContent();
|
string barcode = string.Empty;
|
try
|
{
|
barcode = saveModel.MainData["barcode"].ToString();
|
content = CommonFunction.TaskFinishedAction(saveModel);
|
if (content.Status)
|
content.OK($"手动完成任务成功,操作人:{UserContext.Current.UserTrueName},托盘号:{barcode}");
|
else
|
content.Error($"手动完成任务失败,操作人:{UserContext.Current.UserTrueName},托盘号:{barcode},错误信息:{content.Message}");
|
}
|
catch (Exception ex)
|
{
|
content.Error($"手动完成任务失败,操作人:{UserContext.Current.UserTrueName},托盘号:{barcode},错误信息:{ex.Message}");
|
}
|
Logger.AddLog(Core.Enums.LoggerType.Add, saveModel, content, content);
|
return content;
|
}
|
|
|
/// <summary>
|
/// 取消测量,直接回库
|
/// </summary>
|
/// <returns></returns>
|
public static WebResponseContent CancelAMeasureTask(SaveModel saveModel)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
string barcode = saveModel.MainData["barcode"].ToString();
|
Dt_taskinfo taskInfo = Dt_taskinfoRepository.Instance.FindFirst(x =>
|
x.task_barcode == barcode &&
|
x.task_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString());
|
if (taskInfo == null)
|
{
|
throw new Exception($"::Error::=> 没有找到【{barcode}】对应的测量任务");
|
}
|
|
taskInfo = Dt_taskinfoRepository.Instance.FindFirst(x =>
|
x.task_barcode == barcode &&
|
x.task_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString() &&
|
(x.task_state == TaskState.TaskState_Measure_Out_Line_Finished.ToString() ||
|
x.task_state == TaskState.TaskState_Measureing.ToString()));
|
if (taskInfo == null)
|
{
|
throw new Exception($"::Warning::=> 托盘号【{barcode}】对应的测量任务目前未到达机械手抓取工位,请等待");
|
}
|
|
|
content = Dt_taskinfoRepository.Instance.DbContextBeginTransaction(() =>
|
{
|
|
try
|
{
|
//更改WCS的任务状态和类型,变为测量回库
|
content = WCSApi.CancelAMeasureTask(saveModel);
|
if (content.Status)
|
{
|
//更改WMS的任务状态和类型
|
taskInfo.task_state = TaskState.TaskState_Measure_Back_Line_Wait_Executing.ToString();
|
taskInfo.task_type = TaskType.TaskType_Box_Pallet_Measure_Back.ToString();
|
Dt_taskinfoRepository.Instance.Update(taskInfo, true);
|
|
Dt_locationinfo locationinfo = Dt_locationinfoRepository.Instance.FindFirst(x => x.location_id == taskInfo.task_fromlocationid);
|
if (locationinfo != null)
|
{
|
locationinfo.location_state = LocationState.LocationState_Measureing.ToString();
|
Dt_locationinfoRepository.Instance.Update(locationinfo);
|
}
|
}
|
else
|
{
|
content.Error(content.Message);
|
return content;
|
}
|
|
content.OK();
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
|
return content;
|
});
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
|
return content;
|
}
|
}
|
|
}
|