using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SqlSugar;
using WMS.Core._02Entity;
using WMS.Core.APPBLL;
using WMS.Info;
using WMS.Info.Enum;
using WMS.Info.Models;
using WMS.Util;
namespace WMS.Core
{
///
/// 托盘操作类
///
public class TrayBLL : AppCoreBLL
{
///
/// 扫码托盘码
///
///
///
public ResInfo ScanTrayNo(TrayNoRequest reqData)
{
try
{
if (string.IsNullOrWhiteSpace(reqData?.TrayNo))
throw SysExCore.ThrowFailException("参数不能为空");
//根据位置码盘点判断成品或原料
var location = GetPointInfo(reqData.LocationNo);
if (location == null)
throw SysExCore.ThrowFailException("请扫描正确的货位码!");
List workOrders = new List();
//switch ((EPointType)location.F_type)
//{
// case EPointType.AGVM:
// //todo:根据托盘号调用飞旭接口获取组盘信息
// break;
// case EPointType.AGVP:
// workOrders = GetList(reqData.TrayNo);
// break;
// default:
// throw SysExCore.ThrowFailException("请扫描正确的货位码!");
//}
//workOrders.Add(new FX_sod_det
//{
// sod_part = "三星",
// sod_line = 1,
// sod_nbr = "fx001",
// sod_qty_ord = 100,
// sod_qty_ship = 50
//});
return SysExCore.GetResSucc(data: workOrders);
}
catch (Exception ex)
{
throw ex;
}
}
///
/// 根据托盘创建任务
///
///
///
public ResInfo TrayTaskCreate(TrayCallRequest reqData)
{
using (var ctx = SysDbCore.GetDbCtx())
{
ctx.BeginTran();
try
{
foreach (var item in reqData.LstInventoryNo.Distinct())
{
var invEntity = ctx.Queryable().First(i => i.F_trayNo == item);
if (invEntity == null)
throw SysExCore.ThrowFailException("获取库存数据异常");
var invLocation = ctx.Queryable().First(l => l.F_trayNo == invEntity.F_trayNo && l.F_status == (int)EWareCellState.Stored);
if (invLocation == null)
throw SysExCore.ThrowFailException($"获取托盘:{invEntity.F_trayNo}货位数据异常");
if (invLocation.F_status == (int)EWareCellState.In && invLocation.F_status == (int)EWareCellState.Out)
throw SysExCore.ThrowFailException($"托盘:{invEntity.F_trayNo}货位正在执行任务无法下架");
var task = new WMS_TASK
{
F_addTime = DateTime.Now,
F_addUserNo = LoginUser.UserNo,
F_editTime = DateTime.Now,
F_isBonded = invLocation.F_isBonded,
F_posidTo = reqData.LocationNo,
F_priority = (int)EPriority.NotUrgent,
F_taskStatus = (int)ETaskStatus.NotIssued,
F_taskType = (int)ETaskComType.OutStock,
F_boxNo = invEntity.F_boxNo,
F_trayNo = invEntity.F_trayNo,
F_pickPort = reqData.LocationNo,
F_posidFrom = invLocation.F_no,
F_posidcur = invLocation.F_no,
F_EquipmentType = (int)EEquipmentType.RGV,
F_orderType = (int)EStockOutOrderType.StockOutOrderTypeHalfTray,
F_memo = "呼叫半托"
};
var taskReturn = ctx.Insertable(task).ExecuteReturnEntity();
var upd = ctx.Updateable().SetColumns(it => new BASE_LOCATION()
{
F_status = (int)EWareCellState.Out,
F_editTime = DateTime.Now,
F_editUserNo = LoginUser.UserNo,
}).Where(w => w.F_no == invLocation.F_no).ExecuteCommand();
if (upd <= 0)
throw SysExCore.ThrowFailException("更新货位状态失败,请重试。");
}
ctx.CommitTran();
return SysExCore.GetResSucc("任务生成成功");
}
catch (Exception e)
{
ctx.RollbackTran();
throw;
}
}
}
///
/// 托盘下架
///
///
///
public ResInfo TrayTaskStockOutCreate(TrayCallRequest reqData)
{
using (var ctx = SysDbCore.GetDbCtx())
{
ctx.BeginTran();
try
{
var point = ctx.Queryable().First(a=>a.F_no==reqData.LocationNo);
if(point==null)
throw SysExCore.ThrowFailException("点位信息无效。");
if(!(point.F_type==(int)EPointType.CPCKJXK || point.F_type==(int)EPointType.YLCKJXK))
throw SysExCore.ThrowFailException("托盘下架只能从拣选口出。");
foreach (var item in reqData.LstInventoryNo.Distinct())
{
//生成出库任务
BILL_STOCKOUT order = new BILL_STOCKOUT()
{
F_addTime = DateTime.Now,
F_addUserNo = LoginUser.UserNo,
F_no = SerialNumberProvider.Instance.OrderNumber("wms", "CK"),
F_orderStatus = (int)EOrderState.New,
F_totalOrderLines = reqData.LstInventoryNo.Count,
F_warehouseNo = SysSetCore.GetSysSet().DefaultWarehouseNo
};
List lstStockOutLines = new List();
List lstStockOutLineDetails = new List();
var invLst = ctx.Queryable().Where(i => i.F_trayNo == item).ToList();
if (invLst == null)
throw SysExCore.ThrowFailException("获取库存数据异常");
var invLocation = ctx.Queryable().First(l => l.F_trayNo == item && l.F_status == (int)EWareCellState.Stored);
if (invLocation == null)
throw SysExCore.ThrowFailException($"获取托盘:{item}货位数据异常");
if (invLocation.F_status == (int)EWareCellState.In && invLocation.F_status == (int)EWareCellState.Out)
throw SysExCore.ThrowFailException($"托盘:{item}货位正在执行任务无法下架");
foreach (var invEntity in invLst)
{
lstStockOutLines.Add(new BILL_STOCKOUTLINE
{
//F_actualQty = invEntity.F_quantity,
F_addTime = DateTime.Now,
F_addUserNo = LoginUser.UserNo,
F_editTime = DateTime.Now,
F_batchNo = invEntity.F_batchNo,
F_matType = invEntity.F_matType,
F_planQty = invEntity.F_quantity,
F_matNo = invEntity.F_matNo,
F_orderLineNo = reqData.LstInventoryNo.IndexOf(item) + 1,
F_matName = invEntity.F_matName,
F_pNo = order.F_no,
F_warehouseNo = SysSetCore.GetSysSet().DefaultWarehouseNo
});
lstStockOutLineDetails.Add(new BILL_STOCKOUTLINEDETAIL
{
F_addTime = DateTime.Now,
F_addUserNo = LoginUser.UserNo,
F_locationNo = invLocation.F_no,
F_boxNo = invEntity.F_boxNo,
F_matName = invEntity.F_matName,
F_matNo = invEntity.F_matNo,
F_matType = invEntity.F_matType,
F_quantity = invEntity.F_quantity,
F_pNo = order.F_no,
F_projectNo = invEntity.F_projectNo,
F_uid = invEntity.F_uid,
F_trayNo = item
});
}
var task = new WMS_TASK
{
F_addTime = DateTime.Now,
F_addUserNo = LoginUser.UserNo,
F_editTime = DateTime.Now,
F_isBonded = invLocation.F_isBonded,
F_posidTo = reqData.LocationNo,
F_posidNext = reqData.LocationNo,
F_priority = (int)EPriority.NotUrgent,
F_taskStatus = (int)ETaskStatus.NotIssued,
F_taskType = (int)ETaskComType.OutStock,
F_trayNo = item,
F_pickPort = reqData.LocationNo,
F_posidFrom = invLocation.F_no,
F_posidcur = invLocation.F_no,
F_orderNo = order.F_no,
F_EquipmentType = (int)EEquipmentType.RGV,
};
if (invLst.First().F_matType == (int)EMatType.Mat)
{
order.F_orderType = (int)EStockOutOrderType.StockOutOrderTypeMaterial;
task.F_orderType = (int)ETaskOrderType.StockOutOrderTypeMaterial;
}
else if (invLst.First().F_matType == (int)EMatType.Product)
{
order.F_orderType = (int)EStockOutOrderType.StockOutOrderTypeMaterial;
task.F_orderType = (int)ETaskOrderType.StockOutOrderTypeMaterial;
}
else
{
order.F_orderType = (int)EStockOutOrderType.StockOutOrderTypeTray;
task.F_orderType = (int)ETaskOrderType.StockOutOrderTypeEmptyTrayGroup;
}
var taskReturn = ctx.Insertable(task).ExecuteReturnEntity();
var upd = ctx.Updateable().SetColumns(it => new BASE_LOCATION()
{
F_status = (int)EWareCellState.Out,
F_editTime = DateTime.Now,
F_editUserNo = LoginUser.UserNo,
}).Where(w => w.F_no == invLocation.F_no).ExecuteCommand();
if (upd <= 0)
throw SysExCore.ThrowFailException("更新货位状态失败,请重试。");
ctx.Insertable(order).ExecuteCommand();
ctx.Insertable(lstStockOutLines).ExecuteCommand();
ctx.Insertable(lstStockOutLineDetails).ExecuteCommand();
}
ctx.CommitTran();
return SysExCore.GetResSucc("任务生成成功");
}
catch (Exception e)
{
ctx.RollbackTran();
throw;
}
}
}
///
/// 半托查询
///
///
///
public ResInfo HalfQuery(HalfTrayQueryRequest reqData)
{
using (var ctx = SysDbCore.GetDbCtx())
{
var invs = ctx.Queryable((inv, loc) => new object[] { JoinType.Inner, inv.F_trayNo == loc.F_trayNo })
.Where((inv, loc) => loc.F_height > loc.F_matHeight && loc.F_status == (int)EWareCellState.Stored);
if (reqData.Type == (int)EMatType.Mat)
{
invs = invs.Where(inv => inv.F_matType == (int)EMatType.Mat);
if (!string.IsNullOrWhiteSpace(reqData.KeyWord))
invs = invs.Where(inv => inv.F_uid == reqData.KeyWord);
}
if (reqData.Type == (int)EMatType.Product)
{
invs = invs.Where(inv => inv.F_matType == (int)EMatType.Product);
if (!string.IsNullOrWhiteSpace(reqData.KeyWord))
invs = invs.Where(inv => inv.F_matNo == reqData.KeyWord);
}
if (reqData.IsBonded)
invs.Where((inv, loc) => loc.F_isBonded == reqData.IsBonded);
if (FuncStr.NullToInt(reqData.SpaceNum.TrimEnd('%')) > 0)
invs = invs.Where((inv, loc) => (loc.F_matHeight * 100) / loc.F_height >= FuncStr.NullToInt(reqData.SpaceNum.TrimEnd('%')));
var invsReturn = invs.Select("inv.f_no,inv.F_trayNo,inv.F_matNo,inv.F_UID,cast(cast(IIF((F_matHeight*100)/F_height=0,100,(F_matHeight*100)/F_height) as int) as nvarchar(50))+'%' spaceNum");
List list = null;
int count = 0;
list = invsReturn.OrderBy("inv.F_matNo asc").ToPageList(reqData.pagination.page, reqData.pagination.rows, ref count);
reqData.pagination.records = count;
return SysExCore.GetResSucc("查询成功", data: new { list = list, pageInfo = reqData.pagination });
}
}
///
/// 托盘查询
///
///
///
public ResInfo Query(TrayQueryRequest reqData)
{
using (var ctx = SysDbCore.GetDbCtx())
{
var invs = ctx.Queryable((inv, loc) => new object[] { JoinType.Inner, inv.F_trayNo == loc.F_trayNo })
.Where((inv, loc) => loc.F_height > loc.F_matHeight && loc.F_status == (int)EWareCellState.Stored);
if (!string.IsNullOrWhiteSpace(reqData.KeyWord))
invs = invs.Where(inv => inv.F_matNo == reqData.KeyWord);
if (FuncStr.NullToInt(reqData.SpaceNum.TrimEnd('%')) > 0)
invs = invs.Where((inv, loc) => (loc.F_matHeight * 100) / loc.F_height >= FuncStr.NullToInt(reqData.SpaceNum.TrimEnd('%')));
var invsReturn = invs.Select("inv.f_no,inv.F_trayNo,inv.F_matNo,inv.F_UID,cast(cast(IIF((F_matHeight*100)/F_height=0,100,(F_matHeight*100)/F_height) as int) as nvarchar(50))+'%' spaceNum");
List list = null;
int count = 0;
list = invsReturn.OrderBy("inv.F_matNo asc").ToPageList(reqData.pagination.page, reqData.pagination.rows, ref count);
reqData.pagination.records = count;
return SysExCore.GetResSucc("查询成功", data: new { list = list, pageInfo = reqData.pagination });
}
}
}
}