using log4net.Layout;
|
using SkiaSharp;
|
using SqlSugar.SplitTableExtensions;
|
using System.Data;
|
using WIDESEA_Core;
|
using WIDESEA_Core.BaseRepository;
|
using WIDESEA_Core.BaseServices;
|
using WIDESEA_Core.Enums;
|
using WIDESEA_DTO;
|
using WIDESEA_IBusinessesRepository;
|
using WIDESEA_IBusinessServices;
|
using WIDESEA_Model.Models;
|
using WIDESEA_Repository;
|
|
namespace WIDESEA_BusinessServices
|
{
|
public class Dt_InboundOrderService : ServiceBase<Dt_InboundOrder, IDt_InboundOrderRepository>, IDt_InboundOrderService
|
{
|
#region 需注入接口
|
private readonly IUnitOfWorkManage _unitOfWorkManage;
|
private readonly IDt_InboundOrderDetailRepository _dt_InboundOrderDetailRepository;
|
private readonly IDt_InboundOrderProductionRepository _dt_InboundOrderProductionRepository;
|
private readonly IDt_InboundOrderProductionService _dt_InboundOrderProductionService;
|
|
private readonly IDt_InboundOrderPurchaseRepository _dt_InboundOrderPurchaseRepository;
|
private readonly IDt_InboundOrderPurchaseService _dt_InboundOrderPurchaseService;
|
|
private readonly IDt_BillGroupStockDetailRepository _dt_BillGroupStockDetailRepository;
|
private readonly IDt_BillGroupStockRepository _dt_BillGroupStockRepository;
|
private readonly IDt_MaterielInfoRepository _dt_MaterielInfoRepository;
|
private readonly IDt_WareAreaInfoRepository _dt_WareAreaInfoRepository;
|
private readonly IDt_StrategyRepository _dt_StrategyRepository;
|
private readonly IDt_LocationInfoRepository _dt_LocationInfoRepository;
|
private readonly IDt_TaskRepository _dt_TaskRepository;
|
private readonly IDt_TaskExecuteDetailRepository _dt_TaskExecuteDetailRepository;
|
|
private readonly IDt_RoadWayInfoRepository _dt_RoadWayInfoRepository;
|
#endregion
|
|
public Dt_InboundOrderService(IDt_InboundOrderRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IDt_InboundOrderDetailRepository dt_InboundOrderDetailRepository,
|
IDt_InboundOrderProductionService dt_InboundOrderProductionService, IDt_InboundOrderProductionRepository dt_InboundOrderProductionRepository,
|
IDt_InboundOrderPurchaseRepository dt_InboundOrderPurchaseRepository, IDt_InboundOrderPurchaseService dt_InboundOrderPurchaseService,
|
IDt_BillGroupStockDetailRepository dt_BillGroupStockDetailRepository, IDt_MaterielInfoRepository dt_MaterielInfoRepository,
|
IDt_WareAreaInfoRepository dt_WareAreaInfoRepository, IDt_StrategyRepository dt_StrategyRepository, IDt_LocationInfoRepository dt_LocationInfoRepository,
|
IDt_BillGroupStockRepository dt_BillGroupStockRepository, IDt_TaskRepository dt_TaskRepository, IDt_TaskExecuteDetailRepository dt_TaskExecuteDetailRepository
|
, IDt_RoadWayInfoRepository dt_RoadWayInfoRepository) : base(BaseDal)
|
{
|
_unitOfWorkManage = unitOfWorkManage;
|
_dt_InboundOrderDetailRepository = dt_InboundOrderDetailRepository;
|
_dt_InboundOrderProductionService = dt_InboundOrderProductionService;
|
_dt_InboundOrderProductionRepository = dt_InboundOrderProductionRepository;
|
_dt_InboundOrderPurchaseService = dt_InboundOrderPurchaseService;
|
_dt_InboundOrderPurchaseRepository = dt_InboundOrderPurchaseRepository;
|
_dt_BillGroupStockDetailRepository = dt_BillGroupStockDetailRepository;
|
_dt_MaterielInfoRepository = dt_MaterielInfoRepository;
|
_dt_WareAreaInfoRepository = dt_WareAreaInfoRepository;
|
_dt_StrategyRepository = dt_StrategyRepository;
|
_dt_LocationInfoRepository = dt_LocationInfoRepository;
|
_dt_BillGroupStockRepository = dt_BillGroupStockRepository;
|
_dt_TaskRepository = dt_TaskRepository;
|
_dt_TaskExecuteDetailRepository = dt_TaskExecuteDetailRepository;
|
_dt_RoadWayInfoRepository = dt_RoadWayInfoRepository;
|
}
|
/// <summary>
|
/// 同步生产入库原始单据到本系统入库单表,并更新原始单据的同步标志
|
/// 同步标志 SynchronizationFlag 0:未同步 1:同步成功 2:同步失败
|
/// </summary>
|
/// <returns></returns>
|
public async Task<WebResponseContent> GetInboundOrderFromProductionOrigin()
|
{
|
WebResponseContent content = new WebResponseContent();
|
new LogLibrary.Log.LogFactory().GetLog("接口").InfoFormat(true, "生产入库单同步-GetInboundOrderFromProductionOrigin", "请求", "无参数");
|
|
List<Dt_InboundOrderProduction> Dt_InboundOrderProductionList = await _dt_InboundOrderProductionService.GetDt_InboundOrderProduction((int)SynchronizationFlagEmun.未同步);
|
foreach (var mainItem in Dt_InboundOrderProductionList)
|
{
|
try
|
{
|
|
List<Dt_InboundOrder> Dt_InboundOrderList = new List<Dt_InboundOrder>();
|
List<Dt_InboundOrderDetail> Dt_InboundOrderDetailList = new List<Dt_InboundOrderDetail>();
|
|
#region 入库原始单据主表校验,单据转换为本系统入库单主表
|
//todo:此处做原始单据主表字段校验
|
Dt_InboundOrder dt_InboundOrder = new Dt_InboundOrder();
|
dt_InboundOrder.OrderId = Guid.NewGuid();
|
dt_InboundOrder.InboundNo = dt_InboundOrder.OrderId.ToString();//todo:调用自动生成单号方法
|
dt_InboundOrder.InboundUpperNo = mainItem.ProductionNo;
|
dt_InboundOrder.BatchNo = mainItem.BatchNo;
|
dt_InboundOrder.InboundDate = mainItem.CreateDate;
|
dt_InboundOrder.InboundType = mainItem.ProductionType;
|
dt_InboundOrder.InboundState = mainItem.ProductionState;
|
dt_InboundOrder.Remark = mainItem.Remark;
|
Dt_InboundOrderList.Add(dt_InboundOrder);
|
#endregion
|
|
#region 入库原始单据明细表校验,单据转换为本系统入库单明细
|
foreach (var detailItem in mainItem.Dt_InboundOrderProductionDetailList)
|
{
|
//todo:此处做原始单据明细字段校验
|
Dt_InboundOrderDetail dt_InboundOrderDetail = new Dt_InboundOrderDetail();
|
dt_InboundOrderDetail.OrderDetailId = Guid.NewGuid();
|
dt_InboundOrderDetail.OrderId = mainItem.OrderId;
|
dt_InboundOrderDetail.InboundNo = dt_InboundOrder.InboundNo;
|
dt_InboundOrderDetail.BatchNo = dt_InboundOrder.BatchNo;
|
dt_InboundOrderDetail.InboundType = dt_InboundOrder.InboundType;
|
dt_InboundOrderDetail.InboundState = dt_InboundOrder.InboundState;
|
dt_InboundOrderDetail.MaterialNo = detailItem.ProductionMatcode;
|
dt_InboundOrderDetail.MaterialName = detailItem.ProductionName;
|
dt_InboundOrderDetail.PreInboundQuantity = detailItem.ReceivableQuantity;
|
Dt_InboundOrderDetailList.Add(dt_InboundOrderDetail);
|
}
|
#endregion
|
|
try
|
{
|
//开启事物
|
_unitOfWorkManage.BeginTran();
|
BaseDal.AddData(Dt_InboundOrderList);//保存主表
|
_dt_InboundOrderDetailRepository.AddData(Dt_InboundOrderDetailList);//保存明细
|
mainItem.SynchronizationFlag = (int)SynchronizationFlagEmun.同步成功; //更新原单据同步标识为:1:同步成功
|
_dt_InboundOrderProductionRepository.UpdateData(mainItem);
|
//提交事务
|
_unitOfWorkManage.CommitTran();
|
new LogLibrary.Log.LogFactory().GetLog("接口").InfoFormat(true, "生产入库单同步-GetInboundOrderFromProductionOrigin", "响应", "同步成功");
|
}
|
catch (Exception)
|
{
|
_unitOfWorkManage.RollbackTran();
|
throw;
|
}
|
}
|
catch (Exception ex)
|
{
|
mainItem.SynchronizationFlag = (int)SynchronizationFlagEmun.同步失败; //更新原单据同步标识为:2:同步失败
|
mainItem.Remark = ex.Message;//记录失败原因
|
_dt_InboundOrderProductionRepository.UpdateData(mainItem);
|
new LogLibrary.Log.LogFactory().GetLog("接口").InfoFormat(true, "生产入库单同步-GetInboundOrderFromProductionOrigin", "响应", $"同步失败{ex.ToString()}");
|
}
|
|
}
|
|
return WebResponseContent.Instance.OK();
|
}
|
|
|
|
/// <summary>
|
/// 同步采购入库原始单据到本系统入库单表,并更新原始单据的同步标志
|
/// 同步标志 SynchronizationFlag 0:未同步 1:同步成功 2:同步失败
|
/// </summary>
|
/// <returns></returns>
|
public async Task<WebResponseContent> GetInboundOrderFromPurchaseOrigin()
|
{
|
WebResponseContent content = new WebResponseContent();
|
new LogLibrary.Log.LogFactory().GetLog("接口").InfoFormat(true, "采购入库单同步-GetInboundOrderFromProductionOrigin", "请求", "无参数");
|
List<Dt_InboundOrderPurchase> Dt_InboundOrderPurchaseList = await _dt_InboundOrderPurchaseService.GetDt_InboundOrderPurchase((int)SynchronizationFlagEmun.未同步);
|
|
foreach (var mainItem in Dt_InboundOrderPurchaseList)
|
{
|
try
|
{
|
List<Dt_InboundOrder> Dt_InboundOrderList = new List<Dt_InboundOrder>();
|
List<Dt_InboundOrderDetail> Dt_InboundOrderDetailList = new List<Dt_InboundOrderDetail>();
|
|
#region 入库原始单据主表校验,单据转换为本系统入库单主表
|
//todo:此处做原始单据主表字段校验
|
Dt_InboundOrder dt_InboundOrder = new Dt_InboundOrder();
|
dt_InboundOrder.OrderId = Guid.NewGuid();
|
dt_InboundOrder.InboundNo = dt_InboundOrder.OrderId.ToString();//todo:调用自动生成单号方法
|
dt_InboundOrder.InboundUpperNo = mainItem.PurchaseNo;
|
dt_InboundOrder.BatchNo = mainItem.BatchNo;
|
dt_InboundOrder.InboundDate = mainItem.CreateDate;
|
dt_InboundOrder.InboundType = mainItem.PurchaseType;
|
dt_InboundOrder.InboundState = mainItem.PurchaseState;
|
dt_InboundOrder.Remark = mainItem.Remark;
|
Dt_InboundOrderList.Add(dt_InboundOrder);
|
#endregion
|
|
#region 入库原始单据明细表校验,单据转换为本系统入库单明细
|
foreach (var detailItem in mainItem.Dt_InboundOrderPurchaseDetailList)
|
{
|
//todo:此处做原始单据明细字段校验
|
Dt_InboundOrderDetail dt_InboundOrderDetail = new Dt_InboundOrderDetail();
|
dt_InboundOrderDetail.OrderDetailId = Guid.NewGuid();
|
dt_InboundOrderDetail.OrderId = mainItem.OrderId;
|
dt_InboundOrderDetail.InboundNo = dt_InboundOrder.InboundNo;
|
dt_InboundOrderDetail.BatchNo = dt_InboundOrder.BatchNo;
|
dt_InboundOrderDetail.InboundType = dt_InboundOrder.InboundType;
|
dt_InboundOrderDetail.InboundState = dt_InboundOrder.InboundState;
|
dt_InboundOrderDetail.MaterialNo = detailItem.ProductionMatcode;
|
dt_InboundOrderDetail.MaterialName = detailItem.ProductionName;
|
dt_InboundOrderDetail.PreInboundQuantity = detailItem.ReceivableQuantity;
|
Dt_InboundOrderDetailList.Add(dt_InboundOrderDetail);
|
}
|
#endregion
|
|
try
|
{
|
//开启事物
|
_unitOfWorkManage.BeginTran();
|
BaseDal.AddData(Dt_InboundOrderList);//保存主表
|
_dt_InboundOrderDetailRepository.AddData(Dt_InboundOrderDetailList);//保存明细
|
mainItem.SynchronizationFlag = (int)SynchronizationFlagEmun.同步成功; //更新原单据同步标识为:1:同步成功
|
_dt_InboundOrderPurchaseRepository.UpdateData(mainItem);
|
//提交事务
|
_unitOfWorkManage.CommitTran();
|
}
|
catch (Exception)
|
{
|
_unitOfWorkManage.RollbackTran();
|
throw;
|
}
|
}
|
catch (Exception ex)
|
{
|
mainItem.SynchronizationFlag = (int)SynchronizationFlagEmun.同步失败; //更新原单据同步标识为:2:同步失败
|
mainItem.Remark = ex.Message;//记录失败原因
|
_dt_InboundOrderPurchaseRepository.UpdateData(mainItem);
|
new LogLibrary.Log.LogFactory().GetLog("接口").InfoFormat(true, "采购入库单同步-GetInboundOrderFromProductionOrigin", "响应", $"同步失败{ex.ToString()}");
|
}
|
|
}
|
|
return WebResponseContent.Instance.OK();
|
}
|
|
|
/// 产生入库任务 分配巷道
|
/// 1,根据物料属性指定库区
|
/// 2,查询满足条件的空闲货位的巷道:空闲货位占比 物料库存占比
|
/// </summary>
|
/// <param name="plateCode">托盘条码</param>
|
/// <param name="SourceAddress">起始地址</param>
|
/// <returns></returns>
|
public WebResponseContent GenerateInboundTask(string plateCode, string SourceAddress)
|
{
|
WebResponseContent webResponseContent = new WebResponseContent();
|
try
|
{
|
new LogLibrary.Log.LogFactory().GetLog("接口").InfoFormat(true, "产生入库任务并分配巷道-GenerateInboundTask", "请求", $"plateCode:{plateCode}-SourceAddress:{SourceAddress}");
|
List<RoadWayDTO> roadWays = new List<RoadWayDTO>();
|
//根据托盘码查询物料编码
|
List<Dt_BillGroupStock> billGroup = _dt_BillGroupStockRepository.QueryData(x => x.PalletCode == plateCode && x.State == StockStateEmun.组盘暂存.ToString());
|
List<Dt_InboundOrder> inboundOrders = new List<Dt_InboundOrder>();
|
if (billGroup != null && billGroup.Count == 1)
|
{
|
|
//根据物料编码,查询物料属性
|
List<Dt_MaterielInfo> masterielInfoList = _dt_MaterielInfoRepository.QueryData(x => x.MaterielCode == billGroup[0].MaterialNo);
|
if (masterielInfoList != null && masterielInfoList.Count > 0)
|
{
|
//查询巷道分配策略
|
List<Dt_Strategy> strategyList = _dt_StrategyRepository.QueryData(x => x.StrategyType == "InboundRoadway" && x.IsPreset == true);
|
if (strategyList != null && strategyList.Count > 0)
|
{
|
string strategyName = strategyList[0].StrategyName;
|
if (strategyName == "空闲货位占比")//todo:策略名称,这里可以在数据库中配置策略后,在这里根据不同的策略来处理
|
{
|
//获取空闲货位降序列表
|
|
var roadWayList = _dt_LocationInfoRepository.QueryData(x => x.Status == (int)LocationStatus.空闲 && x.WareAreaCode == masterielInfoList[0].WareAreaCode.ToString()).GroupBy(x => x.Roadway).OrderByDescending(group => group.Count()).ToList(); // 计算每个分组的数量
|
foreach (var item in roadWayList)
|
{
|
//去掉禁用的巷道
|
Dt_RoadWayInfo roadway= _dt_RoadWayInfoRepository.QueryData(x => x.RoadWayNO == item.Key).FirstOrDefault();
|
if (roadway != null&&roadway.IsEnable==false)
|
{
|
continue;
|
}
|
|
//查询巷道任务数
|
int taskCount = _dt_TaskRepository.QueryData(x => x.Roadway == item.Key && (x.TaskState == TaskStatusEmun.新建入库任务.ToString() || x.TaskState == TaskStatusEmun.AGV入库执行中.ToString() || x.TaskState == TaskStatusEmun.输送线入库执行中.ToString())).Count();
|
RoadWayDTO roadWayDTO = new RoadWayDTO();
|
roadWayDTO.RoadWayNO = item.Key;
|
roadWayDTO.FreeLocationCount = item.Count();
|
roadWayDTO.TaskCount = taskCount;
|
roadWays.Add(roadWayDTO);
|
}
|
//按空闲货大到小排序,优先取任务数为0的,再选任务数小于平均数的的巷道,最后默认取第一条空闲货位最多的
|
decimal taskSum = roadWays.Sum(x => x.TaskCount);
|
decimal avgQTY = roadWays.Count() == 0 ? 0 : taskSum / roadWays.Count();
|
string roadWay = "";
|
//todo:根据巷道任务数和空闲数返回巷道号
|
foreach (var item in roadWays)
|
{
|
if (item.TaskCount == 0)
|
{
|
roadWay = item.RoadWayNO;
|
break;
|
}
|
else if (item.TaskCount <= avgQTY)
|
{
|
roadWay = item.RoadWayNO;
|
break;
|
}
|
else
|
{
|
roadWay = roadWays[0].RoadWayNO;
|
break;
|
}
|
|
}
|
//查询对应的入库单,用于取值入库单类型
|
inboundOrders = BaseDal.QueryData(x => x.InboundNo == billGroup[0].InboundNo);
|
try
|
{
|
//开启事物
|
_unitOfWorkManage.BeginTran();
|
//生成任务,并返回任务
|
Dt_Task dt_Task = new Dt_Task();
|
dt_Task.TaskId = Guid.NewGuid();
|
dt_Task.TaskNum = GetTaskNo();
|
dt_Task.PalletCode = plateCode;
|
dt_Task.InboundNo = billGroup[0].InboundNo;
|
dt_Task.Roadway = roadWay;
|
dt_Task.TaskType = inboundOrders[0].InboundType;
|
dt_Task.TaskState = TaskStatusEmun.新建入库任务.ToString();
|
dt_Task.MaterialNo = billGroup[0].MaterialNo;
|
dt_Task.SourceAddress = SourceAddress;
|
dt_Task.Dispatchertime = DateTime.Now;
|
_dt_TaskRepository.AddData(dt_Task);
|
//初始化任务执行明细
|
List<Dt_TaskExecuteDetail> dt_TaskExecuteDetails = new List<Dt_TaskExecuteDetail>();
|
Dt_TaskExecuteDetail dt_TaskExecuteDetail = new Dt_TaskExecuteDetail();
|
dt_TaskExecuteDetail.TaskDetailId = Guid.NewGuid();
|
dt_TaskExecuteDetail.TaskId = dt_Task.TaskId;
|
dt_TaskExecuteDetail.TaskNum = dt_Task.TaskNum.ToString();
|
dt_TaskExecuteDetail.TaskState = dt_Task.TaskState;
|
dt_TaskExecuteDetail.IsManual = false;
|
dt_TaskExecuteDetails.Add(dt_TaskExecuteDetail);
|
_dt_TaskExecuteDetailRepository.AddData(dt_TaskExecuteDetail);
|
dt_Task.Dt_TaskExecuteDetailList = dt_TaskExecuteDetails;
|
|
//提交事物
|
_unitOfWorkManage.CommitTran();
|
webResponseContent.OK("获取巷道号成功!", dt_Task);
|
|
}
|
catch (Exception)
|
{
|
_unitOfWorkManage.RollbackTran();
|
throw;
|
}
|
|
}
|
}
|
else
|
{
|
new LogLibrary.Log.LogFactory().GetLog("接口").InfoFormat(true, "产生入库任务并分配巷道-GenerateInboundTask", "响应", $"plateCode:{plateCode}-无此物料基本信息,请配置分配巷道策略!");
|
webResponseContent.Error($"plateCode:{plateCode}-无此物料基本信息,请配置分配巷道策略!");
|
}
|
}
|
else
|
{
|
new LogLibrary.Log.LogFactory().GetLog("接口").InfoFormat(true, "产生入库任务并分配巷道-GenerateInboundTask", "响应", $"plateCode:{plateCode}-无此物料基本信息,物料编号:{billGroup[0].MaterialNo}");
|
webResponseContent.Error($"plateCode:{plateCode}-无此物料基本信息,物料编号:{billGroup[0].MaterialNo}");
|
}
|
}
|
}
|
catch(Exception ex)
|
{
|
new LogLibrary.Log.LogFactory().GetLog("接口").InfoFormat(true, "产生入库任务并分配巷道-GenerateInboundTask", "响应", $"当前拖盘号为{plateCode}获取失败{ex.ToString()}");
|
webResponseContent.Error($"当前拖盘号为{plateCode}获取失败{ex.ToString()}");
|
|
}
|
|
return webResponseContent.OK();
|
|
}
|
|
/// <summary>
|
/// 根据任务号获取货位号
|
/// </summary>
|
/// <param name="taskNo">任务号</param>
|
/// <returns></returns>
|
public WebResponseContent GetInboundLocation(int taskNum)
|
{
|
WebResponseContent webResponseContent = new WebResponseContent();
|
try
|
{
|
new LogLibrary.Log.LogFactory().GetLog("接口").InfoFormat(true, "根据任务号获取货位号-GetInboundLocation", "请求", $"taskNum-{taskNum}");
|
List<Dt_Task> dt_TaskList = _dt_TaskRepository.QueryData(x => x.TaskNum == taskNum);
|
if (dt_TaskList != null && dt_TaskList.Count > 0)
|
{
|
//根据巷道查询货位号
|
List<Dt_LocationInfo> dt_LocationInfoList = _dt_LocationInfoRepository.QueryData(x => x.Roadway == dt_TaskList[0].Roadway && x.Status == (int)LocationStatus.空闲).ToList();
|
//查询符合要求的货位号
|
List<Dt_LocationInfo> dt_LocationInfoResult = new List<Dt_LocationInfo>();
|
foreach (Dt_LocationInfo dt_LocationInfo in dt_LocationInfoList)
|
{
|
//如果深度为2,则需判断对应的1深位(列,层一样,排为奇数,当前排数-1),如果1深位空闲,则符合要求
|
if (dt_LocationInfo.Depth == "2")
|
{
|
Dt_LocationInfo locationItem = _dt_LocationInfoRepository.QueryData(x => x.Layer == dt_LocationInfo.Layer && x.Column == dt_LocationInfo.Column && x.Line == (int.Parse(dt_LocationInfo.Line.ToString()) - 1).ToString() && x.Status == (int)LocationStatus.空闲).FirstOrDefault();
|
if (locationItem != null)
|
{
|
dt_LocationInfoResult.Add(dt_LocationInfo);
|
}
|
}
|
else//如果深度为1,则需判断对应的2深位(列,层一样,排为偶数,当前排数+1),如果2深位有货,则符合要求
|
{
|
Dt_LocationInfo locationItem = _dt_LocationInfoRepository.QueryData(x => x.Layer == dt_LocationInfo.Layer && x.Column == dt_LocationInfo.Column && x.Line == (int.Parse(dt_LocationInfo.Line.ToString()) + 1).ToString() && x.Status == (int)LocationStatus.有货).FirstOrDefault();
|
if (locationItem != null)
|
{
|
dt_LocationInfoResult.Add(dt_LocationInfo);
|
}
|
}
|
}
|
//todo:对符合要求的货位,进行筛选,先按深度降序(深度优先),再按排升序(就近原则),再按层数(先下后上)
|
dt_LocationInfoResult.OrderByDescending(x => x.Depth).ThenBy(x => x.Column).ThenBy(x => x.Layer).ToList();
|
List<Dt_LocationInfo> dt_Locations = new List<Dt_LocationInfo>();
|
Dt_Task dt_task = dt_TaskList[0];
|
foreach (var locationResult in dt_LocationInfoResult)
|
{
|
if (locationResult != null)
|
{
|
//1,锁定货位状态,如果是2深位,需同时锁定1,2深位;1深位,只需锁定当前货位
|
//2,添加当前任务的货位号
|
if (locationResult.Depth == "2")
|
{
|
locationResult.IsLocked = true;
|
locationResult.Status = (int)LocationStatus.锁定;
|
//获取对应的1深位货位信息
|
Dt_LocationInfo location = _dt_LocationInfoRepository.QueryData(x => x.Layer == locationResult.Layer && x.Column == locationResult.Column && x.Line == (int.Parse(locationResult.Line.ToString()) - 1).ToString() && x.Status == (int)LocationStatus.空闲).FirstOrDefault();
|
if (location != null)
|
{
|
location.IsLocked = true;
|
location.Status = (int)LocationStatus.锁定;
|
dt_Locations.Add(locationResult);//1深位
|
dt_Locations.Add(location);//2深位
|
|
dt_task.LocationCode = locationResult.LocationCode;
|
break;
|
}
|
else
|
{
|
continue;
|
}
|
|
}
|
else
|
{
|
locationResult.IsLocked = true;
|
locationResult.Status = (int)LocationStatus.锁定;
|
dt_Locations.Add(locationResult);
|
dt_task.LocationCode = locationResult.LocationCode;
|
break;
|
}
|
|
}
|
}
|
if (dt_Locations.Count > 0)
|
{
|
try
|
{
|
//开启事物
|
_unitOfWorkManage.BeginTran();
|
_dt_TaskRepository.UpdateData(dt_task);//更新货位编号LocationCode
|
_dt_LocationInfoRepository.UpdateData(dt_Locations);//更新货位状态
|
_unitOfWorkManage.CommitTran();//提交事物
|
webResponseContent.OK("获取成功",dt_task);
|
}
|
catch (Exception)
|
{
|
throw;
|
}
|
|
}
|
else
|
{
|
new LogLibrary.Log.LogFactory().GetLog("接口").InfoFormat(true, "根据任务号获取货位号-GetInboundLocation", "响应", $"当前任务号:{taskNum} 未分配到合适的货位!");
|
webResponseContent.Error($"当前任务号:{taskNum} 未分配到合适的货位!");
|
}
|
|
}
|
else
|
{
|
new LogLibrary.Log.LogFactory().GetLog("接口").InfoFormat(true, "根据任务号获取货位号-GetInboundLocation", "响应", $"未查询到当前任务号:{taskNum}");
|
webResponseContent.Error($"未查询到当前任务号:{taskNum}");
|
}
|
}
|
catch (Exception ex)
|
{
|
new LogLibrary.Log.LogFactory().GetLog("接口").InfoFormat(true, "根据任务号获取货位号-GetInboundLocation", "响应", $"当前任务号为{taskNum}获取失败{ex.ToString()}");
|
webResponseContent.Error($"当前任务号为{taskNum}获取失败{ex.ToString()}");
|
}
|
|
return webResponseContent;
|
|
|
}
|
|
|
/// <summary>
|
/// 入库任务完成处理
|
/// </summary>
|
/// <returns></returns>
|
public WebResponseContent FinishInboundTask(int taskNum)
|
{
|
WebResponseContent webResponseContent = new WebResponseContent();
|
try
|
{
|
//1,修改货位状态
|
new LogLibrary.Log.LogFactory().GetLog("接口").InfoFormat(true, "入库任务完成处理-FinishInboundTask", "请求", $"taskNum-{taskNum}");
|
List<Dt_LocationInfo> dt_Locations = new List<Dt_LocationInfo>();
|
List<Dt_Task> dt_TaskList = _dt_TaskRepository.QueryData(x => x.TaskNum == taskNum);
|
if (dt_TaskList != null && dt_TaskList.Count > 0)
|
{
|
List<Dt_LocationInfo> locationinfos = _dt_LocationInfoRepository.QueryData(x => x.LocationCode == dt_TaskList[0].LocationCode).ToList();
|
if (locationinfos != null && locationinfos.Count > 0)
|
{
|
Dt_LocationInfo locationinfo = locationinfos[0];
|
//如果是2深位,连1深位状态一起释放
|
if (locationinfo != null && locationinfo.Depth == "2")
|
{
|
//获取对应的1深位货位信息
|
Dt_LocationInfo location = _dt_LocationInfoRepository.QueryData(x => x.Layer == locationinfo.Layer && x.Column == locationinfo.Column && x.Line == (int.Parse(locationinfo.Line.ToString()) - 1).ToString() && x.Status == (int)LocationStatus.锁定).FirstOrDefault();
|
if (location != null)
|
{
|
locationinfo.Status = (int)LocationStatus.空闲;
|
locationinfo.IsLocked = false;
|
location.Status = (int)LocationStatus.空闲;
|
location.IsLocked = false;
|
locationinfos.Add(locationinfo);
|
locationinfos.Add(location);
|
}
|
}
|
else
|
{
|
locationinfo.Status = (int)LocationStatus.空闲;
|
locationinfo.IsLocked = false;
|
locationinfos.Add(locationinfo);
|
}
|
}
|
dt_TaskList[0].TaskState = TaskStatusEmun.入库任务完成.ToString();
|
}
|
|
if (dt_Locations.Count > 0)
|
{
|
try
|
{
|
//开启事物
|
_unitOfWorkManage.BeginTran();
|
//1,更新货位状态
|
_dt_LocationInfoRepository.UpdateData(dt_Locations);
|
//2,更新任务状态
|
_dt_TaskRepository.UpdateData(dt_TaskList[0]);
|
_unitOfWorkManage.CommitTran();//提交事物
|
webResponseContent.OK("获取成功", dt_TaskList[0]);
|
}
|
catch (Exception)
|
{
|
throw;
|
}
|
|
}
|
else
|
{
|
new LogLibrary.Log.LogFactory().GetLog("接口").InfoFormat(true, "入库任务完成处理-FinishInboundTask", "响应", $"当前任务号:{taskNum} 未找到当前任务号关联的货位!");
|
webResponseContent.Error($"当前任务号:{taskNum} 未找到当前任务号关联的货位!");
|
}
|
}
|
catch(Exception ex)
|
{
|
new LogLibrary.Log.LogFactory().GetLog("接口").InfoFormat(true, "入库任务完成处理-FinishInboundTask", "响应", $"当前任务号为{taskNum}入库完成处理失败{ex.ToString()}");
|
webResponseContent.Error($"当前任务号为{taskNum}入库完成处理失败{ex.ToString()}");
|
}
|
|
return webResponseContent;
|
}
|
|
/// <summary>
|
/// 获取任务编号
|
/// </summary>
|
/// <returns></returns>
|
public int GetTaskNo()
|
{
|
DataTable dt = BaseDal.QueryTable("select next value for dbo.seqTaskNum");
|
return int.Parse(dt.Rows[0][0].ToString());
|
}
|
|
|
}
|
}
|