using HH.WMS.Entitys;
using HH.WMS.Entitys.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HH.WMS.Entitys.Basic;
using HH.WMS.DAL;
using HH.WMS.Common;
using HH.WMS.BLL;
using HH.WMS.DAL.CoreServer;
using HH.WMS.BLL.Interface;
namespace HH.WMS.BLL.CoreServer
{
public class WaveServiceBLL : DapperBaseBLL
{
#region 生成波次分拣单
///
/// 生成波次分拣单
///
///
///
public OperateResult WaveCreate(BatchesResult r)
{
return UseTransaction(trans =>
{
//生成波次主表
CreateDAL>().Add(r.WaveMst, trans);
//生成波次子表
CreateDAL>().AddRange(r.WaveMst.WaveDtlList, trans);
if (r.ShortageOutList.Any())
{
//存缺件的生成新的发货单--主表
CreateDAL>().AddRange(r.ShortageOutList, trans);
var shortageOutDtl = new List();
r.ShortageOutList.ForEach(f => shortageOutDtl.AddRange(f.OutDtlList));
//子表
CreateDAL>().AddRange(shortageOutDtl, trans);
}
//没有缺货的出库单,要改变状态
var stayOutMst = r.OutMstList.FindAll(f => !r.ShortageOutList.Exists(e => e.CN_S_OP_NO == f.CN_S_OP_NO));
if (stayOutMst.Any())
{
//设置状态为待出库,赋值所属波次
CreateDAL().UpdateOutState(stayOutMst, trans);
}
//全部缺货和取消的出库单
CreateDAL().CancelAndAllShortageOut(r.CancelAndAllShortageOut, trans);
//记录仓库库存锁定明细
CreateDAL>().AddRange(r.OutLockingDtlList, trans);
//生成减少库存业务主表
CreateDAL>().AddRange(r.ReduceInventoryMstList, trans);
//生成减少库存业务子表
r.ReduceInventoryMstList.ForEach(p =>
{
//所有出库单子表数据
r.ReduceInventoryDtlList.AddRange(p.DTLEntity);
});
CreateDAL>().AddRange(r.ReduceInventoryDtlList, trans);
//生成分拣单主表
CreateDAL>().AddRange(r.SortingList, trans);
//分拣单子表数据
var sortingDtlList = new List();
r.SortingList.ForEach(p =>
{
sortingDtlList.AddRange(p.SortingDtlList);
});
//生成分拣单子表
CreateDAL>().AddRange(sortingDtlList, trans);
//库区量表分配量上升
CreateDAL().UpdateAreaAlloc(r.StockAreaList, trans);
});
}
#endregion
#region 执行分拣
///
/// 执行分拣
///
///
///
public OperateResult ExecuteSorting(TN_WM_SORTING_LISTEntity sortingEntity)
{
return UseTransaction(trans =>
{
//更新分拣单分拣中
CreateDAL>().Update(new
{
CN_S_STATE = Constants.Sorting_Being
}, new
{
CN_S_SORTING_NO = sortingEntity.CN_S_SORTING_NO
}, trans);
//更新波次状态为分拣中
CreateDAL>().Update(new
{
CN_S_STATE = Constants.Sorting_Being
}, new
{
CN_S_WAVE_NO = sortingEntity.CN_S_FROM_NO
}, trans);
//增加分拣明细
CreateDAL>().AddRange(sortingEntity.SortingLocationList, trans);
if (sortingEntity.Tasks.Any())
{
//增加出库任务
CreateDAL>().AddRange(sortingEntity.Tasks, trans);
//起点置为预出库锁定,终点预入库锁定
foreach (var task in sortingEntity.Tasks)
{
if (task.EndAreaEntity.CN_C_IS_AUTO == Constants.Y)
{
CreateDAL>().Update(new
{
CN_S_LOCATION_STATE = Constants.Location_State_OutLock
}, new
{
CN_S_LOCATION_CODE = task.CN_S_START_BIT
}, trans);
//存在终点
if (!string.IsNullOrEmpty(task.CN_S_END_BIT))
{
CreateDAL>().Update(new
{
CN_S_LOCATION_STATE = Constants.Location_State_InLock
}, new
{
CN_S_LOCATION_CODE = task.CN_S_END_BIT
}, trans);
//发送ams任务
var sendAms = BLLCreator.Create().SendAmsTask(task);
if (!sendAms.Success)
throw new Exception(sendAms.Msg);
}
}
}
}
});
}
#endregion
#region 执行任务
///
/// 执行任务
///
///
///
public OperateResult ExecuteTask(TN_WM_TASKEntity entity)
{
return UseTransaction(trans =>
{
//设置终点货位
CreateDAL>().Update(new
{
CN_S_END_BIT = entity.CN_S_END_BIT,
CN_B_SENDAMS = true,
}, new
{
CN_S_TASK_NO = entity.CN_S_TASK_NO
}, trans);
//货位状态
if (entity.EndAreaEntity.CN_C_IS_AUTO == Constants.Y)
{
CreateDAL>().Update(new
{
CN_S_LOCATION_STATE = Constants.Location_State_InLock
}, new
{
CN_S_LOCATION_CODE = entity.CN_S_END_BIT
}, trans);
}
//发送ams任务
var sendAms = BLLCreator.Create().SendAmsTask(entity);
if (!sendAms.Success)
throw new Exception(sendAms.Msg);
});
}
#endregion
}
}