using Admin.NET.Application.Common.FindEmptyLocationFactory;
|
using Admin.NET.Application.Common;
|
using Furion;
|
using Furion.DatabaseAccessor;
|
using Furion.DatabaseAccessor.Extensions;
|
using Furion.DependencyInjection;
|
using Furion.DynamicApiController;
|
using Furion.FriendlyException;
|
using iWare.Wms.Core;
|
using iWare.Wms.Core.Enum;
|
using Mapster;
|
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.EntityFrameworkCore;
|
using System.Linq.Dynamic.Core;
|
using System.Transactions;
|
using Microsoft.CodeAnalysis;
|
using System.Threading.Tasks;
|
|
namespace iWare.Wms.Application
|
{
|
/// <summary>
|
/// 任务管理
|
/// </summary>
|
[ApiDescriptionSettings("仓库作业", Name = "WmsTask", Order = 100)]
|
[Route("api/[Controller]")]
|
public class WmsTaskService : IWmsTaskService, IDynamicApiController, ITransient
|
{
|
private readonly IRepository<WmsContainer, MasterDbContextLocator> _wmsContainerRep;
|
private readonly IRepository<WmsMaterial, MasterDbContextLocator> _wmsMaterialRep;
|
private readonly IRepository<WmsMaterialContainer, MasterDbContextLocator> _wmsMaterialContainerRep;
|
private readonly IRepository<WmsArea, MasterDbContextLocator> _wmsAreaRep;
|
private readonly IRepository<WmsPlace, MasterDbContextLocator> _wmsPlaceRep;
|
private readonly IRepository<WmsTask, MasterDbContextLocator> _wmsTaskRep;
|
private readonly IRepository<WmsMaterialStock, MasterDbContextLocator> _wmsMaterialStockRep;
|
private readonly IRepository<WareContainerVsMaterial, MasterDbContextLocator> _wmsContainerPlaceRep;
|
private readonly IRepository<SysUser, MasterDbContextLocator> _sysUser;
|
private readonly IRepository<WareSite, MasterDbContextLocator> _wareSite;
|
private readonly IRepository<WareTask, MasterDbContextLocator> _wareTask;
|
private readonly IRepository<WareTaskSub, MasterDbContextLocator> _wareTaskSub;
|
private readonly IRepository<WareTaskBak, MasterDbContextLocator> _wareTaskBak;
|
private readonly IRepository<WareTaskSubBak, MasterDbContextLocator> _wareTaskSubBak;
|
private readonly IRepository<v_empty_location, MasterDbContextLocator> _v_EmptyLocationRep;
|
private readonly IRepository<v_ware_inventory_by_container, MasterDbContextLocator> _inventoryByContainer;
|
private readonly IRepository<WmsContainerType, MasterDbContextLocator> _wmsContainerType;
|
private readonly IRepository<WareLocationVsContainer, MasterDbContextLocator> _wareLocationVsContainer;
|
private readonly IRepository<WmsPart, MasterDbContextLocator> _wmsPart;
|
|
public WmsTaskService(
|
IRepository<WmsContainer, MasterDbContextLocator> wmsContainerRep,
|
IRepository<WmsMaterial, MasterDbContextLocator> wmsMaterialRep,
|
IRepository<WmsMaterialContainer, MasterDbContextLocator> wmsMaterialContainerRep,
|
IRepository<WmsArea, MasterDbContextLocator> wmsAreaRep,
|
IRepository<WmsPlace, MasterDbContextLocator> wmsPlaceRep,
|
IRepository<WmsTask, MasterDbContextLocator> wmsTaskRep,
|
IRepository<WmsMaterialStock, MasterDbContextLocator> wmsMaterialStockRep,
|
IRepository<WareContainerVsMaterial, MasterDbContextLocator> wmsContainerPlaceRep,
|
IRepository<SysUser, MasterDbContextLocator> sysUser,
|
IRepository<WareSite, MasterDbContextLocator> wareSite,
|
IRepository<WareTask, MasterDbContextLocator> wareTask,
|
IRepository<WareTaskSub, MasterDbContextLocator> wareTaskSub,
|
IRepository<WareTaskBak, MasterDbContextLocator> wareTaskBak,
|
IRepository<WareTaskSubBak, MasterDbContextLocator> wareTaskSubBak,
|
IRepository<v_empty_location, MasterDbContextLocator> v_EmptyLocationRep,
|
IRepository<v_ware_inventory_by_container, MasterDbContextLocator> v_ware_inventory_by_container,
|
IRepository<WmsContainerType, MasterDbContextLocator> wmsContainerType,
|
IRepository<WareLocationVsContainer, MasterDbContextLocator> wareLocationVsContainer,
|
IRepository<WmsPart, MasterDbContextLocator> wmsPart
|
)
|
{
|
_wmsContainerRep = wmsContainerRep;
|
_wmsMaterialRep = wmsMaterialRep;
|
_wmsMaterialContainerRep = wmsMaterialContainerRep;
|
_wmsAreaRep = wmsAreaRep;
|
_wmsPlaceRep = wmsPlaceRep;
|
_wmsTaskRep = wmsTaskRep;
|
_wmsMaterialStockRep = wmsMaterialStockRep;
|
_wmsContainerPlaceRep = wmsContainerPlaceRep;
|
_sysUser = sysUser;
|
_wareSite = wareSite;
|
_wareTask = wareTask;
|
_wareTaskSub = wareTaskSub;
|
_wareTaskBak = wareTaskBak;
|
_wareTaskSubBak = wareTaskSubBak;
|
_v_EmptyLocationRep = v_EmptyLocationRep;
|
_inventoryByContainer = v_ware_inventory_by_container;
|
_wmsContainerType = wmsContainerType;
|
_wareLocationVsContainer = wareLocationVsContainer;
|
_wmsPart = wmsPart;
|
}
|
|
/// <summary>
|
/// 分页查询任务管理
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpGet("page")]
|
public async Task<PageResult<WmsTaskOutput>> Page([FromQuery] WmsTaskSearch input)
|
{
|
//var wmsTasks = await _wmsTaskRep.DetachedEntities
|
// .Where(!string.IsNullOrEmpty(input.Taskno), u => EF.Functions.Like(u.TaskNo, $"%{input.Taskno.Trim()}%"))
|
// .Where(input.Taskmodel != null, u => u.TaskModel == input.Taskmodel)
|
// .Where(input.Tasktype != null, u => u.TaskType == input.Tasktype)
|
// .Where(input.Taskstatus != null, u => u.TaskStatus == input.Taskstatus)
|
// .Where(!string.IsNullOrEmpty(input.ContainerCode), u => EF.Functions.Like(u.ContainerCode, $"%{input.ContainerCode.Trim()}%"))
|
// .Where(!string.IsNullOrEmpty(input.Sourceplace), u => EF.Functions.Like(u.SourcePlace, $"%{input.Sourceplace.Trim()}%"))
|
// .Where(!string.IsNullOrEmpty(input.Toplace), u => EF.Functions.Like(u.ToPlace, $"%{input.Toplace.Trim()}%"))
|
// .Where(input.Aisle != null, u => u.Aisle == input.Aisle)
|
// .Where(!string.IsNullOrEmpty(input.AreaName), u => u.AreaName == input.AreaName)
|
// .OrderBy(PageInputOrder.OrderBuilder<WmsTaskSearch>(input))
|
// .ProjectToType<WmsTaskOutput>()
|
// .ToADPagedListAsync(input.PageNo, input.PageSize);
|
var wmsTasks = await _wareTask.DetachedEntities
|
.Where(!string.IsNullOrEmpty(input.TaskNo), u => EF.Functions.Like(u.TaskNo, $"%{input.TaskNo.Trim()}%"))
|
.Where(input.TaskCategory != null, u => u.TaskCategory == input.TaskCategory)
|
.Where(input.TaskState != null, u => u.TaskState == input.TaskState)
|
.Where(!string.IsNullOrEmpty(input.ContainerCode), u => EF.Functions.Like(u.ContainerCode, $"%{input.ContainerCode.Trim()}%"))
|
.OrderBy(PageInputOrder.OrderBuilder<WmsTaskSearch>(input))
|
.ProjectToType<WmsTaskOutput>()
|
.ToADPagedListAsync(input.PageNo, input.PageSize);
|
|
return wmsTasks;
|
}
|
|
/// <summary>
|
/// 查看详情
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpGet("detail")]
|
public async Task<List<WareTaskSub>> ManualWare([FromQuery] WmsTaskDetailSearch input)
|
{
|
return await _wareTaskSub.Where(n => n.TaskId == input.Id).ToListAsync();
|
}
|
|
|
/// <summary>
|
/// 强制完成
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpGet("FinishWare")]
|
public async Task FinishWare([FromQuery] UpdateFinishTaskDto input)
|
{
|
var taskModel = await _wareTask.FirstOrDefaultAsync(p => p.Id == input.Id);
|
if (taskModel == null)
|
{
|
throw Oops.Oh("查询异常");
|
}
|
taskModel.TaskState = TaskStateEnum.已完成;
|
|
using (var tran = await _wareTask.Database.BeginTransactionAsync())
|
{
|
try
|
{
|
await _wareTask.UpdateAsync(taskModel);
|
await tran.CommitAsync();
|
}
|
catch
|
{
|
await tran.RollbackAsync();
|
}
|
}
|
}
|
|
/// <summary>
|
/// 更改优先级别
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpGet("UpdateTasklevel")]
|
[UnifyResult(typeof(object))]
|
public async Task<object> UpdateTasklevel([FromQuery] UpdateTasklevelDto input)
|
{
|
var taskModel = await _wareTask.FirstOrDefaultAsync(p => p.Id == input.Id);
|
if (taskModel.TaskState != TaskStateEnum.未执行) throw Oops.Oh("只有未执行的任务能进行更改优先级别!");
|
taskModel.TaskPriority = input.TaskPriority;
|
await _wareTask.UpdateAsync(taskModel);
|
return XnRestfulResultProvider.RESTfulResult();
|
}
|
|
|
/// <summary>
|
/// 删除任务
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpGet("DeleteTask")]
|
public async Task DeleteTask([FromQuery] DeleteTaskDto input)
|
{
|
var taskModel = await _wareTask.FirstOrDefaultAsync(p => p.Id == input.Id);
|
if (taskModel == null)
|
{
|
throw Oops.Oh("查询失败");
|
}
|
var taskbak = taskModel.Adapt<WareTaskBak>();
|
|
var taskSub = await _wareTaskSub.Where(u => u.TaskId == taskModel.Id).ToListAsync();
|
var tasksubbak = taskSub.Adapt<List<WareTaskSubBak>>();
|
|
List<WareContainerVsMaterial> upcvm = new List<WareContainerVsMaterial>();
|
List<WmsContainer> upc = new List<WmsContainer>();
|
if (taskModel.TaskCategory == TaskCategoryEnum.入库任务)
|
{
|
//更新组盘表
|
var cvm = await _wmsContainerPlaceRep.Where(u => u.WareContainerCode == taskModel.ContainerCode).FirstOrDefaultAsync();
|
if (cvm != null)
|
{
|
cvm.IsLocked = false;
|
cvm.StockStatus = StockStatusEnum.新建;
|
upcvm.Add(cvm);
|
}
|
}
|
else
|
{
|
//更新组盘表
|
var cvm = await _wmsContainerPlaceRep.Where(u => u.WareContainerCode == taskModel.ContainerCode).FirstOrDefaultAsync();
|
if (cvm != null)
|
{
|
cvm.IsLocked = false;
|
cvm.StockStatus = StockStatusEnum.在库;
|
upcvm.Add(cvm);
|
}
|
if (taskModel.MoveFlag == 1)
|
{
|
var cvmMove = await _wmsContainerPlaceRep.Where(u => u.WareContainerCode == taskModel.MoveContainerCode).FirstOrDefaultAsync();
|
if (cvmMove != null)
|
{
|
cvmMove.IsLocked = false;
|
cvmMove.StockStatus = StockStatusEnum.在库;
|
upcvm.Add(cvmMove);
|
}
|
var lvc = await _wareLocationVsContainer.DetachedEntities.Where(u => u.WareContainerCode == taskModel.ContainerCode).FirstOrDefaultAsync();
|
var lvcMove = await _wareLocationVsContainer.DetachedEntities.Where(u => u.WareContainerCode == taskModel.MoveContainerCode).FirstOrDefaultAsync();
|
var container = await _wmsContainerRep.Where(u => u.ContainerCode == taskModel.ContainerCode).FirstOrDefaultAsync();
|
var containerMove = await _wmsContainerRep.Where(u => u.ContainerCode == taskModel.MoveContainerCode).FirstOrDefaultAsync();
|
if (lvc != null && container != null)
|
{
|
container.RealLocationCode = lvc.WareLocationCode;
|
upc.Add(container);
|
}
|
if (lvcMove != null && containerMove != null)
|
{
|
containerMove.RealLocationCode = lvcMove.WareLocationCode;
|
upc.Add(containerMove);
|
}
|
}
|
}
|
|
using (var tran = await _wareTask.Database.BeginTransactionAsync())
|
{
|
try
|
{
|
await _wareTask.DeleteAsync(taskModel);
|
if (upcvm != null && upcvm.Count > 0)
|
{
|
await _wmsContainerPlaceRep.UpdateAsync(upcvm);
|
}
|
if (taskSub != null && taskSub.Count > 0)
|
{
|
await _wareTaskSub.DeleteAsync(taskSub);
|
}
|
if (taskbak != null)
|
{
|
await _wareTaskBak.InsertAsync(taskbak);
|
}
|
if (tasksubbak != null && tasksubbak.Count > 0)
|
{
|
await _wareTaskSubBak.InsertAsync(tasksubbak);
|
}
|
if (upc != null && upc.Count > 0)
|
{
|
await _wmsContainerRep.UpdateAsync(upc);
|
}
|
await tran.CommitAsync();
|
}
|
catch
|
{
|
await tran.RollbackAsync();
|
}
|
}
|
|
//var taskModel = await _wmsTaskRep.FirstOrDefaultAsync(p => p.Id == input.Id);
|
//if (taskModel.TaskStatus != Core.Enum.TaskStatus.WEIZHIXING) throw Oops.Oh("只有未执行的任务才能进行删除!");
|
|
////库位信息
|
//if (taskModel.TaskType == Core.Enum.TaskType.RUKU)
|
//{
|
// var placeModel = await _wmsPlaceRep.FirstOrDefaultAsync(p => p.PlaceCode == taskModel.ToPlace);
|
// if (placeModel == null) throw Oops.Oh("库位不存在!");
|
// if (placeModel.PlaceStatus != Core.Enum.PlaceStatus.DAIRU) throw Oops.Oh("库位异常货!");
|
// placeModel.PlaceStatus = Core.Enum.PlaceStatus.KONGXIAN;
|
// await _wmsPlaceRep.UpdateAsync(placeModel);
|
//}
|
//else
|
//{
|
// var placeModel = await _wmsPlaceRep.FirstOrDefaultAsync(p => p.PlaceCode == taskModel.SourcePlace);
|
// if (placeModel == null) throw Oops.Oh("库位不存在!");
|
// if (placeModel.PlaceStatus != Core.Enum.PlaceStatus.DAICHU) throw Oops.Oh("库位异常货!");
|
// placeModel.PlaceStatus = Core.Enum.PlaceStatus.CUNHUO;
|
// await _wmsPlaceRep.UpdateAsync(placeModel);
|
|
// var materialContainerOld = await _wmsMaterialContainerRep.Where(p => p.ContainerCode == taskModel.ContainerCode && p.BindStatus == CommonStatus.DISABLE).ToListAsync();
|
// foreach (var item in materialContainerOld)
|
// {
|
// item.BindStatus = CommonStatus.ENABLE;
|
// await _wmsMaterialContainerRep.UpdateAsync(item);
|
// }
|
// var materialContainer = await _wmsMaterialContainerRep.Where(p => p.OrderNo == taskModel.OrderNo).ToListAsync();
|
// foreach (var item in materialContainer)
|
// {
|
// await _wmsMaterialContainerRep.DeleteNowAsync(item);
|
// }
|
//}
|
//await _wmsTaskRep.DeleteNowAsync(taskModel);
|
|
|
}
|
|
/// <summary>
|
/// AGV前置任务创建
|
/// </summary>
|
/// <returns></returns>
|
[HttpPost("fronttaskcreate")]
|
[DisableOpLog]
|
public async Task<string> FrontTaskCreate([FromBody] WMSAgvTAskInput input)
|
{
|
if (string.IsNullOrEmpty(input.WareContainerCode))
|
{
|
throw Oops.Oh("小车号不能为空");
|
}
|
|
if (string.IsNullOrEmpty(input.WareLocationCode))
|
{
|
//throw Oops.Oh("目标库位不能为空");
|
//如果库位是空的,重新找一下库位
|
FindEmptyLocationServiceHandle handle = null;
|
handle = FindEmptyLocationServiceFactory.GetHandle(MeterialType.物料, _v_EmptyLocationRep,
|
_wmsPlaceRep,
|
_wareTask,
|
_wmsContainerPlaceRep,
|
_wmsContainerRep,
|
_wmsContainerType,
|
_inventoryByContainer,
|
input.WareContainerCode,
|
"");
|
var emtpyLocation = handle.MainFindEmptyLocation();
|
if (emtpyLocation == null)
|
{
|
throw Oops.Oh("目前没有空库位存放!");
|
}
|
input.WareLocationCode = emtpyLocation.PlaceCode;
|
}
|
else
|
{
|
var place = await _wmsPlaceRep.DetachedEntities.Where(u => u.PlaceCode == input.WareLocationCode).FirstOrDefaultAsync();
|
if (place == null)
|
{
|
throw Oops.Oh("目标库位不能是" + input.WareLocationCode);
|
}
|
if (place.Islock == YesOrNot.Y)
|
{
|
throw Oops.Oh("目标库位被锁定" + input.WareLocationCode);
|
}
|
|
var lvc = await _wareLocationVsContainer.DetachedEntities.Where(u => u.WareLocationCode == input.WareLocationCode).FirstOrDefaultAsync();
|
if (lvc != null)//目标有货
|
{
|
if (lvc.IsEmptyContainer == true)
|
{
|
throw Oops.Oh("配置的目标库位需要移库,请稍等");
|
}
|
else
|
{
|
throw Oops.Oh("目标库位有货,请处理");
|
}
|
}
|
//else//目标无货
|
//{
|
// if (place.DeepcellNo == (int)DeepcellNoEnum.近伸)
|
// {
|
// //近伸无货看远伸
|
// var nearplace = await _wmsPlaceRep.Where(u => u.UnionCode == place.UnionCode && u.DeepcellNo == (int)DeepcellNoEnum.远伸).FirstOrDefaultAsync();
|
|
// if (nearplace == null)//无远伸
|
// {
|
// //throw Oops.Oh("目标库位不能是" + input.WareLocationCode);
|
// input.WareLocationCode = place.PlaceCode;
|
// }
|
// else
|
// {
|
// var lvctemp = await _wareLocationVsContainer.DetachedEntities.Where(u => u.WareLocationCode == input.WareLocationCode).FirstOrDefaultAsync();
|
// if (lvctemp != null)//远伸有货就不改
|
// {
|
// if (lvctemp.IsEmptyContainer == true)
|
// {
|
// throw Oops.Oh("配置的目标库位需要移库,请稍后下发");
|
// }
|
// input.WareLocationCode = place.PlaceCode;
|
// }
|
// else//远伸无货就修改
|
// {
|
// input.WareLocationCode = nearplace.PlaceCode;
|
// }
|
// }
|
// }
|
// else
|
// {
|
// //远伸无货也不改
|
// input.WareLocationCode = place.PlaceCode;
|
// }
|
//}
|
|
input.WareLocationCode = place.PlaceCode;
|
}
|
////获取登录用户
|
//var contextUser = App.User;
|
//var userName = contextUser.Claims.Single(x => x.Type == "Account").Value;
|
////获取登录用户所属线别
|
//var lineType = await _sysUser.DetachedEntities.Where(u => u.Account == userName).Select(u => u.LineType).FirstOrDefaultAsync();
|
|
//if (lineType == null)
|
//{
|
// lineType = input.LineType;
|
//}
|
|
//if (lineType == null)
|
//{
|
// throw Oops.Oh("该登录用户没有配置线别");
|
//}
|
|
//验证目标库位是否有货
|
|
//通过零件号查找线别
|
var lineType = await _wmsPart.DetachedEntities.Where(u => u.PartCode == input.PartCode).Select(u => u.LineType).FirstOrDefaultAsync();
|
|
var site = await _wareSite.Where(u => u.LineType == lineType).FirstOrDefaultAsync();
|
if (site == null)
|
{
|
throw Oops.Oh($"线别{lineType}没有配置站台信息");
|
}
|
|
var isExist = await _wareTask.AnyAsync(u => /*u.FromLocationCode == site.Code*/u.ContainerCode == input.WareContainerCode);
|
if (isExist)
|
{
|
throw Oops.Oh($"小车{input.WareContainerCode}存在未处理的任务");
|
}
|
var cvm = await _wmsContainerPlaceRep.Where(u => u.WareContainerCode == input.WareContainerCode).FirstOrDefaultAsync();
|
if (cvm == null)
|
{
|
throw Oops.Oh($"小车{input.WareContainerCode}没有组盘");
|
}
|
if (cvm.StockStatus != StockStatusEnum.新建 && cvm.StockStatus != StockStatusEnum.出库中)
|
{
|
throw Oops.Oh($"小车{input.WareContainerCode}库存状态不对");
|
}
|
cvm.StockStatus = StockStatusEnum.入库中;
|
|
var container = await _wmsContainerRep.Where(u => u.ContainerCode == input.WareContainerCode).FirstOrDefaultAsync();
|
container.RealLocationCode = input.WareLocationCode;
|
|
WareTask wareTask = new WareTask()
|
{
|
//OrderNo = orderno,
|
TaskNo = Yitter.IdGenerator.YitIdHelper.NextId().ToString(),
|
TaskCategory = TaskCategoryEnum.入库任务,
|
TaskDescribe = "",
|
TaskPriority = 1,
|
TaskState = (int)TaskStateEnum.未执行,
|
ContainerCode = input.WareContainerCode,
|
//TaskType = (int)TaskTypeEnum.前置输送线任务,
|
FromLocationCode = site.Code,
|
ToLocationCode = input.WareLocationCode,
|
PartCode = input.PartCode
|
//ToLocationCode = "102",
|
//ContainerCode = input.containercode,
|
|
};
|
|
using (var tran = await _wareTask.Database.BeginTransactionAsync())
|
{
|
try
|
{
|
await _wareTask.InsertAsync(wareTask);
|
await _wmsContainerPlaceRep.UpdateAsync(cvm);
|
await _wmsContainerRep.UpdateAsync(container);
|
await tran.CommitAsync();
|
}
|
catch (Exception ex)
|
{
|
await tran.RollbackAsync();
|
throw Oops.Oh(ex.Message);
|
}
|
}
|
return "";
|
}
|
|
/// <summary>
|
/// AGV前置任务创建,新方法
|
/// </summary>
|
/// <returns></returns>
|
[HttpPost("newfronttaskcreate")]
|
[DisableOpLog]
|
[AllowAnonymous]
|
public async Task<string> FrontTaskCreateNew([FromBody] WMSAgvTAskInput input)
|
{
|
if (input.LineType == null)
|
{
|
throw Oops.Oh("用户没有配置线别");
|
}
|
|
var site = await _wareSite.Where(u => u.LineType == input.LineType).FirstOrDefaultAsync();
|
if (site == null)
|
{
|
throw Oops.Oh($"线别{input.LineType}没有配置站台信息");
|
}
|
|
//验证该线别是否有任务
|
var isExist = await _wareTask.DetachedEntities.AnyAsync(u => u.FromLocationCode == site.Code && u.CreatedTime > DateTimeOffset.Now.AddSeconds(-60));
|
if (isExist)
|
{
|
throw Oops.Oh("60秒内不允许重复下发任务");
|
}
|
|
WareTask wareTask = new WareTask()
|
{
|
//OrderNo = orderno,
|
TaskNo = Yitter.IdGenerator.YitIdHelper.NextId().ToString(),
|
TaskCategory = TaskCategoryEnum.入库任务,
|
TaskDescribe = "",
|
TaskPriority = 1,
|
TaskState = (int)TaskStateEnum.未执行,
|
ContainerCode = "等待识别",
|
FromLocationCode = site.Code,
|
ToLocationCode = "等待识别",
|
PartCode = "等待识别",
|
BeginTime = DateTimeOffset.Now,
|
};
|
|
using (var tran = await _wareTask.Database.BeginTransactionAsync())
|
{
|
try
|
{
|
await _wareTask.InsertAsync(wareTask);
|
await tran.CommitAsync();
|
}
|
catch (Exception ex)
|
{
|
await tran.RollbackAsync();
|
throw Oops.Oh(ex.Message);
|
}
|
}
|
return "";
|
}
|
|
/// <summary>
|
/// 获取移库目标库位
|
/// </summary>
|
/// <returns></returns>
|
[HttpGet("getlocation")]
|
[AllowAnonymous]
|
public async Task<string> GetMoveToLocation(string location)
|
{
|
#region
|
//var lvc = await _wareLocationVsContainer.DetachedEntities.Where(x => x.WareLocationCode == location && x.IsDeleted == false).FirstOrDefaultAsync();
|
|
////如果出库库位是远伸,近伸有货,移库操作
|
//int moveflag = 0;
|
//string movefromlocation = "";
|
//string movetolocation = "";
|
//string movecontainercode = "";
|
//WmsPlace emtpyLocation = null;
|
//List<WmsPlace> locationsList = new List<WmsPlace>();
|
//if (lvc != null)
|
//{
|
// if (lvc.IsEmptyContainer != null)//查询到有库位与托盘关系
|
// {
|
// var tempcvms = _wmsContainerPlaceRep.Where(u => u.WareContainerCode == lvc.WareContainerCode).ToList();
|
// moveflag = 1;
|
// movecontainercode = lvc.WareContainerCode;
|
// movefromlocation = lvc.WareLocationCode;
|
// var locationinfo = _wmsPlaceRep.DetachedEntities.Where(u => u.PlaceCode == lvc.WareLocationCode).FirstOrDefault();
|
|
// FindEmptyLocationServiceHandle handle = null;
|
// if ((bool)lvc.IsEmptyContainer)
|
// {
|
// handle = FindEmptyLocationServiceFactory.GetHandle(MeterialType.托盘, _v_EmptyLocationRep,
|
// _wmsPlaceRep,
|
// _wareTask,
|
// _wmsContainerPlaceRep,
|
// _wmsContainerRep,
|
// _wmsContainerType,
|
// _inventoryByContainer,
|
// lvc.WareContainerCode,
|
// "HMAX");
|
// }
|
// else
|
// {
|
// handle = FindEmptyLocationServiceFactory.GetHandle(MeterialType.物料, _v_EmptyLocationRep,
|
// _wmsPlaceRep,
|
// _wareTask,
|
// _wmsContainerPlaceRep,
|
// _wmsContainerRep,
|
// _wmsContainerType,
|
// _inventoryByContainer,
|
// lvc.WareContainerCode,
|
// "HMAX");
|
// }
|
// emtpyLocation = handle.MainFindEmptyLocation();
|
// if (emtpyLocation == null)
|
// {
|
// throw Oops.Oh("移库任务找不到空库位存放!");
|
// }
|
// movetolocation = emtpyLocation.PlaceCode;
|
// }
|
// //emtpyLocation.IsLocked = 1;
|
// locationsList.Add(emtpyLocation);
|
// var source = _wmsPlaceRep.Where(u => u.PlaceCode == lvc.WareLocationCode).FirstOrDefault();
|
// if (source != null)
|
// {
|
// //source.IsLocked = 1;
|
// locationsList.Add(source);
|
// }
|
|
//}
|
//else
|
//{
|
// throw Oops.Oh("库位为空,没有需要移库的库存");
|
//}
|
|
//using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
|
//{
|
// if (locationsList != null && locationsList.Count > 0)
|
// {
|
// await _wmsPlaceRep.UpdateAsync(locationsList);
|
// }
|
// scope.Complete();
|
//}
|
//return movetolocation;
|
#endregion
|
var vs = await _v_EmptyLocationRep.DetachedEntities.Where(u => u.WareLocationTypeCode == "HMAX").OrderByDescending(u => u.ColumnNo).FirstOrDefaultAsync();
|
return vs?.PlaceCode;
|
}
|
|
/// <summary>
|
/// 任务完成确认
|
/// </summary>
|
/// <returns></returns>
|
[HttpPost("taskcomplete")]
|
[AllowAnonymous]
|
[DisableOpLog]
|
public async Task<long> TaskComplete([FromBody] WMSConfirmInput input)
|
{
|
var taskbak = new WareTaskBak();
|
var tasksubbaks = new List<WareTaskSubBak>();
|
var locations = new List<WmsPlace>();
|
var upcvms = new List<WareContainerVsMaterial>();
|
var deletecvms = new List<WareContainerVsMaterial>();
|
var uplvcs = new List<WareLocationVsContainer>();
|
var deletelvcs = new List<WareLocationVsContainer>();
|
//var flowRecords = new List<WareFlowRecord>();
|
var insertlvc = new List<WareLocationVsContainer>();
|
var tasknews = new List<WareTask>();
|
|
var task = _wareTask.Where(u => u.Id == input.TaskId).FirstOrDefault();
|
if (task == null)
|
{
|
throw Oops.Oh($"{input.TaskId},不是正确的任务ID");
|
}
|
if (task.TaskState != TaskStateEnum.已完成 && task.TaskState != TaskStateEnum.已取消)
|
{
|
throw Oops.Oh("任务状态不是已完成或已取消");
|
}
|
//保存到历史主任务
|
taskbak = task.Adapt<WareTaskBak>();
|
taskbak.FinishedTime = DateTimeOffset.Now;
|
|
var tasksubs = _wareTaskSub.Where(u => u.TaskId == task.Id).ToList();
|
foreach (var item in tasksubs)
|
{
|
//保存到历史子任务
|
var temp = item.Adapt<WareTaskSubBak>();
|
tasksubbaks.Add(temp);
|
}
|
if (task.TaskCategory == TaskCategoryEnum.前置AGV任务)
|
{
|
var container = await _wmsContainerRep.DetachedEntities.Where(u => u.ContainerCode == input.ContainerCode).FirstOrDefaultAsync();
|
if (container == null)
|
{
|
throw Oops.Oh("托盘没有配置基础信息");
|
}
|
var containerType = await _wmsContainerType.DetachedEntities.Where(u => u.WareContainerTypeCode == container.ContainerTypeCode).FirstOrDefaultAsync();
|
if (containerType == null)
|
{
|
throw Oops.Oh("托盘类型没有配置基础信息");
|
}
|
|
bool isEmptyContainer = await _wmsContainerPlaceRep.DetachedEntities.AnyAsync(u => u.WareContainerCode == input.ContainerCode);
|
|
#region 入库查找入库的空库位
|
var WareLocationCode = "";
|
WmsPlace emtpyLocation = null;
|
FindEmptyLocationServiceHandle handle = null;
|
if (isEmptyContainer)
|
{
|
handle = FindEmptyLocationServiceFactory.GetHandle(MeterialType.物料, _v_EmptyLocationRep,
|
_wmsPlaceRep,
|
_wareTask,
|
_wmsContainerPlaceRep,
|
_wmsContainerRep,
|
_wmsContainerType,
|
_inventoryByContainer,
|
input.ContainerCode,
|
"");
|
}
|
else
|
{
|
handle = FindEmptyLocationServiceFactory.GetHandle(MeterialType.托盘, _v_EmptyLocationRep,
|
_wmsPlaceRep,
|
_wareTask,
|
_wmsContainerPlaceRep,
|
_wmsContainerRep,
|
_wmsContainerType,
|
_inventoryByContainer,
|
input.ContainerCode,
|
"");
|
}
|
emtpyLocation = handle.MainFindEmptyLocation();
|
if (emtpyLocation == null)
|
{
|
throw Oops.Oh("目前没有空库位存放!");
|
}
|
WareLocationCode = emtpyLocation.PlaceCode;
|
|
#endregion
|
|
//创建库位与托盘关系表记录
|
var lvcnew = new WareLocationVsContainer()
|
{
|
WareStorehouseCode = "CK001",
|
//WareRegionCode = wareShelves.RegId,
|
WareLocationCode = WareLocationCode,
|
WareContainerCode = input.ContainerCode,
|
IsEmptyContainer = isEmptyContainer,
|
Status = 0,
|
//Remarks = Enum.Parse(typeof(OrderTypeEnum), orders[0].OrderType).ToString() + "入库"
|
Row = emtpyLocation.RowNo,
|
Lane = emtpyLocation.Line,
|
DeepcellNo = (DeepcellNoEnum)Enum.Parse(typeof(DeepcellNoEnum), emtpyLocation.DeepcellNo.ToString()),
|
UnionCode = emtpyLocation.UnionCode,
|
LocTypeCode = emtpyLocation.WareLocationTypeCode,
|
};
|
insertlvc.Add(lvcnew);
|
|
// 创建任务
|
var tasknew = new WareTask
|
{
|
//OrderNo = input.OrderNo,
|
TaskNo = Yitter.IdGenerator.YitIdHelper.NextId().ToString(),
|
//TaskName = wcsTask.TaskName,
|
//TaskCategory = wcsTask.TaskType,
|
TaskCategory = TaskCategoryEnum.入库任务,
|
TaskDescribe = "",
|
TaskPriority = 99,
|
//TaskState = 0,
|
TaskState = (int)TaskStateEnum.未执行,
|
//TaskType = wcsTask.TaskType,
|
FromLocationCode = "102",
|
ToLocationCode = WareLocationCode,
|
ContainerCode = input.ContainerCode,
|
Lane = emtpyLocation.Line,
|
ContainerType = containerType.PLCTypeId,
|
};
|
tasknews.Add(tasknew);
|
}
|
else if (task.TaskCategory == TaskCategoryEnum.入库任务)
|
{
|
var emtpyLocation = await _wmsPlaceRep.DetachedEntities.Where(u => u.PlaceCode == task.ToLocationCode).FirstOrDefaultAsync();
|
//创建库位与托盘关系表记录
|
var lvcnew = new WareLocationVsContainer()
|
{
|
WareStorehouseCode = "CK001",
|
//WareRegionCode = wareShelves.RegId,
|
WareLocationCode = emtpyLocation.PlaceCode,
|
WareContainerCode = input.ContainerCode,
|
IsEmptyContainer = false,
|
Status = 0,
|
//Remarks = Enum.Parse(typeof(OrderTypeEnum), orders[0].OrderType).ToString() + "入库"
|
Row = emtpyLocation.RowNo,
|
Lane = emtpyLocation.Line,
|
DeepcellNo = (DeepcellNoEnum)Enum.Parse(typeof(DeepcellNoEnum), emtpyLocation.DeepcellNo.ToString()),
|
UnionCode = emtpyLocation.UnionCode,
|
LocTypeCode = emtpyLocation.WareLocationTypeCode,
|
};
|
insertlvc.Add(lvcnew);
|
|
upcvms = _wmsContainerPlaceRep.Where(u => u.WareContainerCode == task.ContainerCode).ToList();
|
foreach (var cvm in upcvms)
|
{
|
cvm.StockStatus = StockStatusEnum.在库;
|
cvm.IsLocked = false;
|
}
|
}
|
else if (task.TaskCategory == TaskCategoryEnum.出库任务)
|
{
|
foreach (var tasksub in tasksubs)
|
{
|
if (tasksub.TaskType == (int)TaskCategoryEnum.移库任务 && tasksub.TaskSequence == 3)
|
{
|
var lvc = _wareLocationVsContainer.Where(x => x.WareContainerCode == tasksub.ContainerCode && x.WareLocationCode == task.MoveFromLocation).FirstOrDefault();
|
if (lvc == null)
|
{
|
throw Oops.Oh($"移库任务,托盘{task.ContainerCode},库位{tasksub.SourcePlace},不是正确的库存");
|
}
|
lvc.WareLocationCode = tasksub.ToPlace;
|
lvc.IsEmptyContainer = true;
|
uplvcs.Add(lvc);
|
|
var cvm = await _wmsContainerPlaceRep.Where(u => u.WareContainerCode == tasksub.ContainerCode).FirstOrDefaultAsync();
|
cvm.StockStatus = StockStatusEnum.在库;
|
upcvms.Add(cvm);
|
}
|
}
|
var dlvc = _wareLocationVsContainer.Where(u => u.WareContainerCode == task.ContainerCode).FirstOrDefault();
|
if (dlvc == null)
|
{
|
throw Oops.Oh($"出库任务,托盘{task.ContainerCode},库位{task.FromLocationCode},不是正确的库存");
|
}
|
deletelvcs.Add(dlvc);
|
}
|
else if (task.TaskCategory == TaskCategoryEnum.移库任务)
|
{
|
foreach (var tasksub in tasksubs)
|
{
|
if (tasksub.TaskType == (int)TaskCategoryEnum.移库任务)
|
{
|
var lvc = _wareLocationVsContainer.Where(x => x.WareContainerCode == tasksub.ContainerCode && x.WareLocationCode == tasksub.SourcePlace).FirstOrDefault();
|
if (lvc == null)
|
{
|
throw Oops.Oh($"移库任务,托盘{task.ContainerCode},库位{tasksub.SourcePlace},不是正确的库存");
|
}
|
lvc.WareLocationCode = tasksub.ToPlace;
|
lvc.IsEmptyContainer = false;
|
uplvcs.Add(lvc);
|
|
var cvm = await _wmsContainerPlaceRep.Where(u => u.WareContainerCode == tasksub.ContainerCode).FirstOrDefaultAsync();
|
cvm.StockStatus = StockStatusEnum.在库;
|
upcvms.Add(cvm);
|
}
|
}
|
//var dlvc = _wareLocationVsContainer.Where(u => u.WareContainerCode == task.ContainerCode).FirstOrDefault();
|
//if (dlvc == null)
|
//{
|
// throw Oops.Oh($"移库任务,托盘{task.ContainerCode},库位{task.FromLocationCode},不是正确的库存");
|
//}
|
//deletelvcs.Add(dlvc);
|
}
|
|
using (var tran = await _wmsContainerPlaceRep.Database.BeginTransactionAsync())
|
{
|
try
|
{
|
//删除任务表
|
await _wareTask.DeleteAsync(task);
|
foreach (var item in tasksubs)
|
{
|
await _wareTaskSub.DeleteAsync(item);
|
}
|
//新增历史任务表
|
await _wareTaskBak.InsertAsync(taskbak);
|
if (tasksubbaks != null && tasksubbaks.Count > 0)
|
{
|
await _wareTaskSubBak.InsertAsync(tasksubbaks);
|
}
|
if (upcvms != null && upcvms.Count > 0)
|
{
|
await _wmsContainerPlaceRep.UpdateAsync(upcvms);
|
}
|
if (deletecvms != null && deletecvms.Count > 0)
|
{
|
await _wmsContainerPlaceRep.DeleteAsync(deletecvms);
|
}
|
if (deletelvcs != null && deletelvcs.Count > 0)
|
{
|
await _wareLocationVsContainer.DeleteAsync(deletelvcs);
|
}
|
if (uplvcs != null && uplvcs.Count > 0)
|
{
|
await _wareLocationVsContainer.UpdateAsync(uplvcs);
|
}
|
if (insertlvc != null && insertlvc.Count > 0)
|
{
|
await _wareLocationVsContainer.InsertAsync(insertlvc);
|
}
|
if (tasknews != null && tasknews.Count > 0)
|
{
|
await _wareTask.InsertAsync(tasknews);
|
}
|
await tran.CommitAsync();
|
}
|
catch
|
{
|
await tran.RollbackAsync();
|
}
|
}
|
return 1;
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost("deletebalance")]
|
[DisableOpLog]
|
public async Task DeleteBalance(WMSConfirmInput input)
|
{
|
var dlvc = await _wareLocationVsContainer.Where(u => u.WareContainerCode == input.ContainerCode && u.WareLocationCode == input.FromLocationCode).FirstOrDefaultAsync();
|
|
var cvm = await _wmsContainerPlaceRep.Where(u => u.WareContainerCode == input.ContainerCode).FirstOrDefaultAsync();
|
|
if (dlvc != null)
|
{
|
await _wareLocationVsContainer.DeleteAsync(dlvc);
|
}
|
if (cvm != null)
|
{
|
cvm.StockStatus = StockStatusEnum.出库中;
|
cvm.IsLocked = false;
|
await _wmsContainerPlaceRep.UpdateAsync(cvm);
|
}
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="input"></param>
|
/// <returns></returns>
|
[HttpPost("addBalance")]
|
[DisableOpLog]
|
public async Task AddBalance(WMSConfirmInput input)
|
{
|
var loc = await _wmsPlaceRep.DetachedEntities.Where(u => u.PlaceCode == input.FromLocationCode).FirstOrDefaultAsync();
|
if (loc == null)
|
{
|
throw Oops.Oh($"库位{input.FromLocationCode}没有查询到基础数据");
|
}
|
var temp = await _wareLocationVsContainer.DetachedEntities.Where(u => u.WareContainerCode == input.ContainerCode || u.WareLocationCode == input.FromLocationCode).FirstOrDefaultAsync();
|
if (temp != null)
|
{
|
throw Oops.Oh($"库位{temp.WareLocationCode}小车{temp.WareContainerCode}已有库存");
|
}
|
var container = await _wmsContainerRep.DetachedEntities.Where(u => u.ContainerCode == input.ContainerCode).FirstOrDefaultAsync();
|
if (container == null)
|
{
|
throw Oops.Oh($"小车{input.ContainerCode}没有查询到基础数据");
|
}
|
|
var lvcnew = new WareLocationVsContainer()
|
{
|
WareStorehouseCode = "CK001",
|
//WareRegionCode = wareShelves.RegId,
|
WareLocationCode = input.FromLocationCode,
|
WareContainerCode = input.ContainerCode,
|
IsEmptyContainer = false,
|
Status = 0,
|
//Remarks = Enum.Parse(typeof(OrderTypeEnum), orders[0].OrderType).ToString() + "入库"
|
Row = loc.RowNo,
|
Lane = loc.Line,
|
DeepcellNo = (DeepcellNoEnum)Enum.Parse(typeof(DeepcellNoEnum), loc.DeepcellNo.ToString()),
|
UnionCode = loc.UnionCode,
|
LocTypeCode = loc.WareLocationTypeCode,
|
};
|
|
var vs = _wmsContainerPlaceRep.Where(u => u.WareContainerCode == input.ContainerCode).ToList();
|
foreach (var cvm in vs)
|
{
|
cvm.StockStatus = StockStatusEnum.在库;
|
cvm.IsLocked = false;
|
}
|
|
await _wareLocationVsContainer.InsertAsync(lvcnew);
|
await _wmsContainerPlaceRep.UpdateAsync(vs);
|
}
|
}
|
}
|