using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
using WIDESEA_Common.CommonEnum;
|
using WIDESEA_Common.LocationEnum;
|
using WIDESEA_Common.MaterielEnum;
|
using WIDESEA_Common.OtherEnum;
|
using WIDESEA_Common.StockEnum;
|
using WIDESEA_Common.TaskEnum;
|
using WIDESEA_Common.WareHouseEnum;
|
using WIDESEA_Core;
|
using WIDESEA_Core.Helper;
|
using WIDESEA_DTO.Basic;
|
using WIDESEA_DTO.Task;
|
using WIDESEA_Model.Models;
|
|
namespace WIDESEA_TaskInfoService
|
{
|
public partial class TaskService
|
{
|
/// <summary>
|
/// 判断是否需要移库
|
/// </summary>
|
/// <param name="taskNum"></param>
|
/// <param name="locationCode"></param>
|
/// <returns></returns>
|
//public WebResponseContent IsRelocation(int taskNum, string locationCode)
|
//{
|
// try
|
// {
|
// Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == locationCode);
|
// if (locationInfo == null)
|
// {
|
// return WebResponseContent.Instance.Error($"未找到对应的货位信息");
|
// }
|
|
// Dt_Task task = Repository.QueryFirst(x => x.TaskNum == taskNum);
|
// if (task == null)
|
// {
|
// return WebResponseContent.Instance.Error($"未找到任务信息");
|
// }
|
|
// List<Dt_LocationInfo> littleDepthLocations = _basicService.LocationInfoService.GetGroupLocations(locationInfo);
|
|
// Dt_LocationInfo? needRelocationItem = littleDepthLocations.Where(x => x.LocationStatus != LocationStatusEnum.Free.ObjToInt() && x.LocationStatus != LocationStatusEnum.FreeLock.ObjToInt() && x.Depth < locationInfo.Depth).OrderBy(x => x.Depth).FirstOrDefault();
|
|
// if (needRelocationItem == null)
|
// {
|
// return WebResponseContent.Instance.OK(data: _mapper.Map<WMSTaskDTO>(task));
|
// }
|
// else
|
// {
|
// Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.QueryFirst(x => x.LocationCode == needRelocationItem.LocationCode);
|
// if (stockInfo == null)
|
// {
|
// return WebResponseContent.Instance.Error($"未找到对应货位的库存信息");
|
// }
|
|
// Dt_Task taskTemp = Repository.QueryFirst(x => x.PalletCode == stockInfo.PalletCode);
|
// if (taskTemp != null)
|
// {
|
// return WebResponseContent.Instance.OK(data: _mapper.Map<WMSTaskDTO>(taskTemp));
|
// }
|
|
// int heightType = 0;
|
// if(needRelocationItem.Layer == 5)
|
// {
|
// heightType = 3;
|
// }
|
// else if(needRelocationItem.Layer == 4)
|
// {
|
// heightType = 2;
|
// }
|
// else if(needRelocationItem.Layer <= 3 && needRelocationItem.Layer >= 1)
|
// {
|
// heightType = 1;
|
// }
|
|
// Dt_LocationInfo? newLocation = _basicService.LocationInfoService.AssignLocation(needRelocationItem.RoadwayNo, task.PalletType, task.WarehouseId, needRelocationItem.LocationCode);
|
// if (newLocation != null)
|
// {
|
// Dt_Task newTask = new Dt_Task()
|
// {
|
// Roadway = task.Roadway,
|
// WarehouseId = task.WarehouseId,
|
// CurrentAddress = locationCode,
|
// Grade = 99,
|
// NextAddress = newLocation.LocationCode,
|
// OrderNo = "",
|
// PalletCode = stockInfo.PalletCode,
|
// PalletType = stockInfo.PalletType,
|
// SourceAddress = needRelocationItem.LocationCode,
|
// TargetAddress = newLocation.LocationCode,
|
// TaskNum = Repository.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
|
// TaskStatus = 0,
|
// TaskType = TaskTypeEnum.Relocation.ObjToInt()
|
// };
|
|
// _unitOfWorkManage.BeginTran();
|
// Repository.AddData(newTask);
|
// {
|
// LocationStatusEnum lastStatus = (LocationStatusEnum)newLocation.LocationStatus;
|
// _basicService.LocationInfoService.UpdateLocationStatus(newLocation, task.PalletType, LocationStatusEnum.Lock, stockInfo.WarehouseId);
|
// _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(newLocation, lastStatus, LocationStatusEnum.Lock, LocationChangeType.RelocationAssignLocation, taskNum: newTask.TaskNum);
|
// }
|
// {
|
// LocationStatusEnum lastStatus = (LocationStatusEnum)needRelocationItem.LocationStatus;
|
// _basicService.LocationInfoService.UpdateLocationStatus(needRelocationItem, task.PalletType, LocationStatusEnum.Lock, stockInfo.WarehouseId);
|
// _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(needRelocationItem, lastStatus, LocationStatusEnum.Lock, LocationChangeType.RelocationAssignLocation, taskNum: newTask.TaskNum);
|
// }
|
// stockInfo.StockStatus = StockStatusEmun.移库锁定.ObjToInt();
|
// _stockRepository.StockInfoRepository.UpdateData(stockInfo);
|
|
// _unitOfWorkManage.CommitTran();
|
|
// return WebResponseContent.Instance.OK(data: _mapper.Map<WMSTaskDTO>(newTask));
|
// }
|
// else
|
// {
|
// return WebResponseContent.Instance.Error($"未找到可分配货位,请查看该巷道【{task.Roadway}】是否还有空闲可使用货位");
|
// }
|
// }
|
// }
|
// catch (Exception ex)
|
// {
|
// _unitOfWorkManage.RollbackTran();
|
// return WebResponseContent.Instance.Error(ex.Message);
|
// }
|
//}
|
public WebResponseContent RelocationTaskCompleted(Dt_Task task)
|
{
|
try
|
{
|
Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress);
|
if (stockInfo == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到对应货位的库存信息");
|
}
|
|
Dt_LocationInfo locationInfoStart = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress);
|
if (locationInfoStart == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到对应的起点货位信息");
|
}
|
|
Dt_LocationInfo locationInfoEnd = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
|
if (locationInfoEnd == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到对应的终点货位信息");
|
}
|
task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
|
_unitOfWorkManage.BeginTran();
|
stockInfo.LocationCode = locationInfoEnd.LocationCode;
|
stockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
|
_stockService.StockInfoService.Repository.UpdateData(stockInfo);
|
_basicService.LocationInfoService.UpdateLocationStatus(locationInfoStart, stockInfo.PalletType, LocationStatusEnum.Free, stockInfo.WarehouseId);
|
_basicService.LocationInfoService.UpdateLocationStatus(locationInfoEnd, stockInfo.PalletType, LocationStatusEnum.InStock, stockInfo.WarehouseId);
|
BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
|
_unitOfWorkManage.CommitTran();
|
return WebResponseContent.Instance.OK();
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
public WebResponseContent IsRelocation(string startAddress,string endAddress,string roadWay)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
//获取货位
|
Dt_LocationInfo startLocationInfo = _basicRepository.LocationInfoRepository.QueryFirst(x => x.LocationCode == startAddress);
|
Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.LocationCode == startAddress);
|
Dt_LocationInfo endLocationInfo = _basicRepository.LocationInfoRepository.QueryFirst(x => x.LocationCode == endAddress);
|
//判断条件
|
if (startLocationInfo != null && startLocationInfo.LocationStatus==LocationStatusEnum.InStock.ObjToInt() && endLocationInfo != null && endLocationInfo.LocationStatus==LocationStatusEnum.Free.ObjToInt() && endLocationInfo.EnableStatus==EnableStatusEnum.Normal.ObjToInt() && stockInfo!=null)
|
{
|
//生成任务
|
Dt_Task newTask = new Dt_Task()
|
{
|
Roadway = roadWay,
|
WarehouseId = stockInfo.WarehouseId,
|
CurrentAddress = startLocationInfo.LocationCode,
|
Grade = 99,
|
NextAddress = endLocationInfo.LocationCode,
|
OrderNo = "",
|
PalletCode = stockInfo.PalletCode,
|
PalletType = stockInfo.PalletType,
|
SourceAddress = startLocationInfo.LocationCode,
|
TargetAddress = endLocationInfo.LocationCode,
|
TaskNum = Repository.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
|
TaskStatus = TaskStatusEnum.SC_Execute.ObjToInt(),
|
TaskType = TaskTypeEnum.Relocation.ObjToInt()
|
};
|
stockInfo.StockStatus = StockStatusEmun.移库锁定.ObjToInt();
|
_unitOfWorkManage.BeginTran();
|
Repository.AddData(newTask);
|
_basicService.LocationInfoService.UpdateLocationStatus(startLocationInfo, stockInfo.PalletType, LocationStatusEnum.Lock, stockInfo.WarehouseId);
|
_basicService.LocationInfoService.UpdateLocationStatus(endLocationInfo, stockInfo.PalletType, LocationStatusEnum.Lock, stockInfo.WarehouseId);
|
_stockService.StockInfoService.Repository.UpdateData(stockInfo);
|
_unitOfWorkManage.CommitTran();
|
PushTasksToWCS(new List<Dt_Task> { newTask });
|
content.OK("成功");
|
}
|
else
|
{
|
content.Error("库存货位信息为空");
|
}
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// 原料巷道间移库任务 todo:临时
|
/// </summary>
|
public WebResponseContent RelocationRoadWay(string roadWay, int Count)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
//获取对应库存
|
List<Dt_StockInfo> stockInfos = _stockRepository.StockInfoRepository.QueryData(x => x.MaterielWide <2200 && x.StockStatus == StockStatusEmun.入库完成.ObjToInt()).OrderBy(x => x.CreateDate).Take(Count).ToList();
|
|
//获取货位
|
List<Dt_LocationInfo> locationInfos = _basicRepository.LocationInfoRepository.QueryData(x => stockInfos.Select(x => x.LocationCode).Contains(x.LocationCode));
|
foreach (var item in stockInfos)
|
{
|
Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.LocationCode == item.LocationCode);
|
if (locationInfo != null && locationInfo.EnableStatus == EnableStatusEnum.Normal.ObjToInt() && locationInfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt())
|
{
|
item.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
|
}
|
else
|
{
|
return content.Error($"货位状态不正确");
|
}
|
}
|
|
List<Dt_Task> tasks = GetTasks(stockInfos, TaskTypeEnum.OutPick);
|
if (tasks == null || tasks.Count <= 0)
|
{
|
return content.Error($"生成任务失败");
|
}
|
tasks.ForEach(x =>
|
{
|
x.TargetAddress = roadWay;
|
});
|
//判断是否有出库单信息
|
_unitOfWorkManage.BeginTran();
|
//更新库存状态
|
_stockRepository.StockInfoRepository.UpdateData(stockInfos);
|
//更新货位状态
|
_basicRepository.LocationInfoRepository.UpdateLocationStatus(locationInfos, LocationStatusEnum.Lock);
|
//加入货位变动记录
|
_recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfos, LocationStatusEnum.Lock, LocationChangeType.OutboundAssignLocation, taskNums: tasks.Select(x => x.TaskNum).ToList());
|
//新建任务
|
BaseDal.AddData(tasks);
|
_unitOfWorkManage.CommitTran();
|
PushTasksToWCS(tasks);
|
content.OK();
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
|
/// <summary>
|
/// 料框请求入库
|
/// </summary>
|
/// <param name="contaionerNo">料框编号</param>
|
/// <param name="originalArea">当前扫码所在区域</param>
|
/// <param name="originalLocation">当前扫描所在点位</param>
|
/// <returns></returns>
|
public WebResponseContent qwe(string contaionerNo, string originalArea, string originalLocation)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
_unitOfWorkManage.BeginTran();
|
|
if (string.IsNullOrEmpty(contaionerNo) || string.IsNullOrEmpty(originalArea) || string.IsNullOrEmpty(originalLocation))
|
{
|
content.Error("参数不能为空");
|
return content;
|
}
|
|
// 1. 根据容器编号查询库存信息
|
Dt_BlankStockInfo balnkstockInfo = BaseDal.Db.Queryable<Dt_BlankStockInfo>().Where(x => x.ContainerCode == contaionerNo).FirstOrDefault();
|
if (balnkstockInfo != null)
|
{
|
content.Error($"{contaionerNo}库存已存在");
|
return content;
|
}
|
|
// 2. 根据料框编号查询任务信息
|
Dt_Task task = BaseDal.QueryFirst(x => x.ContainerNo == contaionerNo);
|
if (task != null)
|
{
|
content.Error($"{contaionerNo}任务已存在");
|
return content;
|
}
|
|
// 3. 根据当前扫码所在区域和点位查询位置信息
|
Dt_LocationInfo originalLocationInfo = _basicRepository.LocationInfoRepository.QueryFirst(x => x.AreaCode == originalArea && x.LocationCode == originalLocation);
|
if (originalLocationInfo == null)
|
{
|
content.Error("未找到当前扫码所在位置信息");
|
return content;
|
}
|
|
// 4. 创建组盘信息
|
Dt_BlankStockInfo info = new Dt_BlankStockInfo()
|
{
|
ContainerCode = contaionerNo,
|
LocationCode = "",
|
StockStatus = StockStatusEmun.入库确认.ObjToInt(),
|
ContainerType = 1,
|
WarehouseId = WarehouseEnum.FLPL.ObjToInt(),
|
OrderNo = ""
|
};
|
BaseDal.Db.Insertable(info).ExecuteReturnIdentity();
|
|
// 5. 创建入库任务
|
Dt_Task newTask = new Dt_Task()
|
{
|
Roadway = originalLocationInfo.RoadwayNo,
|
WarehouseId = WarehouseEnum.FLPL.ObjToInt(),
|
CurrentAddress = originalLocationInfo.LocationCode,
|
Grade = 99,
|
NextAddress = originalLocationInfo.LocationCode,
|
OrderNo = "",
|
ContainerNo = contaionerNo,
|
SourceAddress = originalLocationInfo.LocationCode,
|
TargetAddress = originalLocationInfo.LocationCode,
|
TaskNum = Repository.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
|
TaskStatus = TaskStatusEnum.TaskCreated.ObjToInt(),
|
TaskType = (int)TaskTypeEnum.Inbound
|
};
|
Repository.AddData(newTask);
|
|
// 6. 提交事务
|
_unitOfWorkManage.CommitTran();
|
|
// 7. 返回成功响应
|
content.OK("入库请求成功", new
|
{
|
warehouseId = WarehouseEnum.FLPL.ObjToInt().ToString(),
|
roadway = originalLocationInfo.RoadwayNo,
|
orderNo = "",
|
containerNo = contaionerNo,
|
containerType = "1",
|
taskNo = newTask.TaskNum.ToString(),
|
station = originalLocation,
|
locationCode = "",
|
stockStatus = StockStatusEmun.入库确认.ObjToInt().ToString(),
|
orderCode = ""
|
});
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
}
|
}
|