/*
*所有关于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);
}
///
/// 获取空托盘出库的任务列表,给前端的PDA展示
///
///
public static WebResponseContent GetEmptyPalletTaskList()
{
WebResponseContent content = new WebResponseContent();
try
{
List taskList = Dt_taskinfoRepository.Instance.Find(x => x.task_type == TaskType.TaskType_Empty_Pallet_Outbound.ToString());
List> data = new List>();
for (int i = 0; i < taskList.Count(); i++)
{
Dictionary dic = new Dictionary();
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;
}
///
/// 取消某一条未开始的任务
///
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();
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;
}
///
/// 完成某一条任务
///
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;
}
///
/// 取消测量,直接回库
///
///
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;
}
}
}