using HH.WCS.DaYang.models.other;
using HH.WCS.DaYang.util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static HH.WCS.DaYang.dispatch.NDC;
namespace HH.WCS.DaYang.wms
{
///
/// 容器帮助类
///
internal class ContainerHelper
{
internal static string GenerateCntrNo()
{
var id = SYSHelper.GetSerialNumber("托盘号", "TP");
var date = DateTime.Now.ToString("yyMMdd");
return $"TP{date}{id.ToString().PadLeft(4, '0')}";
}
internal static bool CreateCntrItem(string loc, string cntr, string itemcode)
{
var res = false;
var db = new SqlHelper().GetInstance();
try
{
LogHelper.Info($"bindCntr:托盘{cntr}:添加货位{loc}绑定关系,添加容器货品表");
var location = db.Queryable().Where(a => a.S_CODE == loc).First();
if (location != null)
{
db.BeginTran();
var container = new Container { S_CODE = cntr };
var cir = new CntrItemDetail { S_CNTR_CODE = cntr, S_ITEM_CODE = itemcode };
var loctp = new LocCntrRel { S_LOC_CODE = loc, S_CNTR_CODE = cntr };
db.Insertable(container).ExecuteCommand();
db.Insertable(cir).ExecuteCommand();
db.Insertable(loctp).ExecuteCommand();
location.N_CURRENT_NUM = location.N_CURRENT_NUM + 1;
db.Updateable(location).UpdateColumns(it => new { it.N_CURRENT_NUM }).ExecuteCommand();
db.Ado.CommitTran();
res = true;
}
else
{
res = false;
LogHelper.Info($"bindCntr:根据货位{loc}未找到货位信息");
db.Ado.RollbackTran();
return res;
}
}
catch (Exception ex)
{
LogHelper.Info($"CreateCntrItem => erro:托盘{cntr}添加失败" + ex.Message.ToString());
db.Ado.RollbackTran();
}
return res;
}
internal static bool CreateCntrLoc(string loc, string cntr)
{
var res = false;
var db = new SqlHelper().GetInstance();
try
{
LogHelper.Info($"bindCntr:托盘{cntr}:添加货位{loc}绑定关系,添加容器货品表");
var location = db.Queryable().Where(a => a.S_CODE == loc).First();
if (location != null)
{
var loccntr = db.Queryable().Where(a => a.S_LOC_CODE == loc).First();
if (loccntr == null)
{
db.BeginTran();
var loctp = new LocCntrRel { S_LOC_CODE = loc, S_CNTR_CODE = cntr };
db.Insertable(loctp).ExecuteCommand();
location.N_CURRENT_NUM = location.N_CURRENT_NUM + 1;
db.Updateable(location).UpdateColumns(it => new { it.N_CURRENT_NUM }).ExecuteCommand();
db.Ado.CommitTran();
res = true;
}
else
{
res = false;
LogHelper.Info($"CreateCntrLoc:货位{loc},已经有托盘货位绑定关系");
db.Ado.RollbackTran();
return res;
}
}
else
{
res = false;
LogHelper.Info($"CreateCntrLoc:根据货位{loc}未找到货位信息");
db.Ado.RollbackTran();
return res;
}
}
catch (Exception ex)
{
LogHelper.Info($"CreateCntrItem => erro:托盘{cntr}添加失败" + ex.Message.ToString());
db.Ado.RollbackTran();
}
return res;
}
///
/// TN_ContainerHelper.test("4L天然水箱装6入", 50, "335ml东方树叶15入", 30);
///
///
///
///
///
//internal static void test(string item1, int qty1, string item2, int qty2) {
// var db = new SqlHelper().GetInstance();
// var cntr = db.Queryable().Includes(a => a.CntrItemRelList).
// Where(a => a.CntrItemRelList.Count(b => b.S_ITEM_CODE == item1 && int.Parse(b.F_QTY) > qty1) > 0
// && a.CntrItemRelList.Count(b => b.S_ITEM_CODE == item2 && int.Parse(b.F_QTY) > qty2) > 0).First();
//}
///
/// 判断容器是否绑定货位
///
///
///
internal static bool CheckEmpty(string cntr)
{
//1.0 查货位容器表
var db = new SqlHelper().GetInstance();
return db.Queryable().Count(a => a.S_LOC_CODE.Trim() == cntr) == 0;
}
///
/// 根据托盘编码查询托盘物料绑定
///
///
///
internal static CntrItemDetail FindCntrItemByCntr(string cntr)
{
//1.0 查货位容器表
var db = new SqlHelper().GetInstance();
return db.Queryable().Where(a => a.S_CNTR_CODE.Trim() == cntr).First();
}
///
/// 修改入库时间
///
///
///
internal static bool UpdateInTime(CntrItemDetail cntrItem)
{
//1.0 查货位容器表
var db = new SqlHelper().GetInstance();
cntrItem.T_INBOUND_TIME = DateTime.Now.ToString("yyyy-MM-dd");
return db.Updateable(cntrItem).UpdateColumns(a => new { a.T_INBOUND_TIME }).ExecuteCommand() > 0;
}
///
/// 根据容器号获取货位容器绑定关系
///
///
///
internal static LocCntrRel GetLocCntrByCntr(string cntr)
{
//1.0 查货位容器表
var db = new SqlHelper().GetInstance();
return db.Queryable().Where(a => a.S_CNTR_CODE.Trim() == cntr).First();
}
internal static bool AddCntr(string cntrCode,string source="1")
{
var res = false;
var db = new SqlHelper().GetInstance();
var TN_Container = new Container { S_CODE = cntrCode, S_SOURCE = source };
try
{
db.BeginTran();
db.Insertable(TN_Container).ExecuteCommand();
db.CommitTran();
res = true;
}
catch (Exception ex)
{
db.RollbackTran();
}
return res;
}
///
/// 根据容器号获取容器信息
///
///
///
internal static Container GetCntr(string cntr, bool create = false)
{
//1.0 查货位容器表
var db = new SqlHelper().GetInstance();
var old = db.Queryable().Where(a => a.S_CODE == cntr).First();
if (old == null && create)
{
var model = new Container { S_CODE = cntr };
if (db.Insertable(model).ExecuteCommand() > 0)
{
old = model;
}
}
return old;
}
///
/// 根据容器获取物料信息
///
///
///
internal static List GetCntrItemRel(string cntr)
{
var db = new SqlHelper().GetInstance();
var list = db.Queryable().Where(a => a.S_CNTR_CODE == cntr).ToList();
return list;
}
///
/// 根据物料获取容器信息
///
///
///
internal static List GetItemCntrRel(string itemcode)
{
var db = new SqlHelper().GetInstance();
var list = db.Queryable().Where(a => a.S_ITEM_CODE == itemcode).ToList();
return list;
}
///
/// 物料信息绑定到满容器上
///
///
///
///
///
///
internal static bool BindCntrItem(Container cntr, string itemCode, string batchNo, float qty, string putawayNo)
{
var res = false;
var db = new SqlHelper().GetInstance();
try
{
db.BeginTran();
//1.查看是否有相同物料批次的信息,如果有要累加,不同批次的可以分开
var cir = db.Queryable().Where(a => a.S_CNTR_CODE == cntr.S_CODE && a.S_ITEM_CODE == itemCode && a.S_BATCH_NO == batchNo).First();
if (cir != null)
{
cir.F_QTY += qty;
db.Updateable(cir).UpdateColumns(it => new { it.F_QTY }).ExecuteCommand();
}
else
{
//2.插入新的容器物料信息(容器号不变)
cir = new CntrItemDetail { S_CNTR_CODE = cntr.S_CODE.Trim(), S_BATCH_NO = batchNo, F_QTY = qty, S_ITEM_CODE = itemCode };
db.Insertable(cir).ExecuteCommand();
}
var count = db.Queryable().Count(a => a.S_CNTR_CODE == cntr.S_CODE);
cntr.N_DETAIL_COUNT = count;
cntr.C_ENABLE = "N";//码盘后将托盘设置为不可用状态,入库后变成可用
db.Updateable(cntr).UpdateColumns(it => new { it.N_DETAIL_COUNT, it.C_ENABLE }).ExecuteCommand();
db.CommitTran();
res = true;
}
catch (Exception ex)
{
db.RollbackTran();
Console.WriteLine(ex.Message);
}
return res;
}
internal static bool UpdateCntrState(List cntrs, int state)
{
var res = false;
var db = new SqlHelper().GetInstance();
var models = db.Queryable().Where(a => cntrs.Contains(a.S_CODE)).ToList();
if (models.Count > 0)
{
models.ForEach(a =>
{
a.N_B_STATE = state;
db.Updateable(a).UpdateColumns(it => new { it.N_B_STATE }).ExecuteCommand();
});
res = true;
}
return res;
}
///
/// enable 让托盘允许被出库计算到,同时增加量表数据
///
///
internal static void Enable(string cntr, string loc)
{
var db = new SqlHelper().GetInstance();
var cntrInfo = db.Queryable().Where(a => a.S_CODE == cntr).First();
//获取仓库量表
//获取物理库区
//获取逻辑库区
if (cntrInfo != null)
{
try
{
db.BeginTran();
//防止接口重复调用,量表重复增加
if (cntrInfo.C_ENABLE == "N")
{
cntrInfo.C_ENABLE = "Y";
db.Updateable(cntrInfo).UpdateColumns(a => new { a.C_ENABLE, a.T_MODIFY }).ExecuteCommand();
var cirList = db.Queryable().Where(a => a.S_CNTR_CODE == cntr).ToList();
if (cirList.Count > 0)
{
cirList.ForEach(a =>
{
var wh = db.Queryable().Where(b => b.S_ITEM_CODE == a.S_ITEM_CODE).First();
if (wh != null)
{
//更新仓库量表
wh.F_QTY += a.F_QTY;
wh.T_MODIFY = DateTime.Now;
db.Updateable(wh).UpdateColumns(it => new { it.F_QTY, it.T_MODIFY }).ExecuteCommand();
}
else
{
//新增仓库量表
wh = new WHInventory { F_QTY = a.F_QTY, S_ITEM_CODE = a.S_ITEM_CODE };
db.Insertable(wh).ExecuteCommand();
}
//写入第三方中间表
//如果要统计分拣中,分拣回的量,无法跟踪托盘,除非对托盘加标识,属于哪个库区。
//另外分拣回可能去别的巷道,别的逻辑库区,逻辑库区的量控制更复杂,不能计算分拣中和分拣回。所以库区量表本项目暂不考虑
/*
//获取货位的物理库区和所有逻辑库区
var location = db.Queryable().Where(l => l.S_CODE == loc).First();
if (location != null) {
var az = db.Queryable().Where(b => b.S_ITEM_CODE == a.S_ITEM_CODE && b.S_AREA_CODE == location.S_AREA_CODE).First();
if (az != null) {
//更新库区量表
az.F_QTY += a.F_QTY;
az.T_MODIFY = DateTime.Now;
db.Updateable(az).UpdateColumns(it => new { it.F_QTY, it.T_MODIFY }).ExecuteCommand();
}
else {
//新增库区量表
az = new AZInventory { F_QTY = a.F_QTY, S_ITEM_CODE = a.S_ITEM_CODE, S_AREA_CODE = location.S_AREA_CODE };
db.Insertable(az).ExecuteCommand();
}
}
//逻辑库区的量表
var zoneList = db.Queryable().Where(l => l.S_LOC_CODE == loc).ToList();
if (zoneList.Count > 0) {
zoneList.ForEach(z => {
var az = db.Queryable().Where(b => b.S_ITEM_CODE == a.S_ITEM_CODE && b.S_AREA_CODE == z.S_ZONE_CODE).First();
if (az != null) {
//更新库区量表
az.F_QTY += a.F_QTY;
az.T_MODIFY = DateTime.Now;
db.Updateable(az).UpdateColumns(it => new { it.F_QTY, it.T_MODIFY }).ExecuteCommand();
}
else {
//新增库区量表
az = new AZInventory { F_QTY = a.F_QTY, S_ITEM_CODE = a.S_ITEM_CODE, S_AREA_CODE = z.S_ZONE_CODE, C_IS_LOGIC_AREA = "Y" };
db.Insertable(az).ExecuteCommand();
}
});
}
*/
});
}
}
db.CommitTran();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
db.RollbackTran();
}
}
}
}
}