using HH.WCS.Mobox3.HD.models.other;
using HH.WCS.Mobox3.HD.util;
using SqlSugar;
using SqlSugar.Extensions;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Runtime.ConstrainedExecution;
using System.Text;
using System.Threading.Tasks;
using System.Web.UI;
using static HH.WCS.Mobox3.HD.api.WmsController;
using static HH.WCS.Mobox3.HD.dispatch.NDC;
using static HH.WCS.Mobox3.HD.util.ExpressionHelper;
using static System.Runtime.CompilerServices.RuntimeHelpers;
namespace HH.WCS.Mobox3.HD.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 List GetCntrListByPurpose(string dest, string cntrType, int state) {
//1.0 查货位容器表
var db = new SqlHelper().GetInstance();
var list = db.Queryable().Where(a => a.S_DEST == dest && a.S_TYPE == cntrType && a.N_B_STATE == state).ToList();
return list;
}
///
/// 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 bool AddCntr(string cntrCode, string itemCode) {
var res = false;
var db = new SqlHelper().GetInstance();
var TN_Container = new Container { S_CODE = cntrCode };
var cntrItemRel = new CntrItemRel { S_CNTR_CODE = cntrCode, S_ITEM_CODE = itemCode };
try {
db.BeginTran();
db.Insertable(TN_Container).ExecuteCommand();
db.Insertable(cntrItemRel).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 bool BindNewCntrItem(string loc,string cntrCode, string itemCode) {
var res = false;
var itemName = ItemHelper.GetItemInfo(itemCode).S_ITEM_NAME;
var db = new SqlHelper().GetInstance();
try {
db.BeginTran();
var cntr = new Container { S_CODE = cntrCode, N_DETAIL_COUNT = 1 };
db.Insertable(cntr).ExecuteCommand();
//获取物料信息,填充到容器货品明细,方便人工查看
var cir = new CntrItemRel { S_CNTR_CODE = cntr.S_CODE.Trim(), F_QTY = 1, S_ITEM_CODE = itemCode, S_ITEM_NAME = itemName };
db.Insertable(cir).ExecuteCommand();
var lcr = new LocCntrRel { S_CNTR_CODE = cntrCode, S_LOC_CODE = loc };
db.Insertable(lcr).ExecuteCommand();
db.CommitTran();
res = true;
}
catch (Exception ex) {
db.RollbackTran();
Console.WriteLine(ex.Message);
}
return res;
}
///
/// 删除容器物料信息
///
///
///
///
///
internal static bool deleteCntrItem(string cntrCode)
{
bool res = false;
var db = new SqlHelper().GetInstance();
try
{
db.BeginTran();
/* db.Deleteable().Where(a => a.S_CODE == cntrCode).ExecuteCommand();*/
db.Updateable().SetColumns(a => new Container() { N_DETAIL_COUNT = 1 ,T_MODIFY = DateTime.Now }).Where(a => a.S_CODE == cntrCode).ExecuteCommand();
db.Deleteable().Where(a => a.S_CNTR_CODE == cntrCode).ExecuteCommand();
LogHelper.Info($"物料删除留痕,容器编码:{cntrCode}", "WMS");
db.CommitTran();
res = true;
}
catch (Exception ex)
{
db.RollbackTran();
Console.WriteLine(ex.Message);
}
return res;
}
///
/// 物料信息绑定到满容器上
///
///
///
///
///
///
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 CntrItemRel { S_CNTR_CODE = cntr.S_CODE.Trim(), S_BATCH_NO = batchNo, F_QTY = qty, S_ITEM_CODE = itemCode, S_PUTAWAY_NO = putawayNo };
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, it.S_SRC }).ExecuteCommand();
db.CommitTran();
res = true;
}
catch (Exception ex) {
db.RollbackTran();
Console.WriteLine(ex.Message);
}
return res;
}
internal static void addCntr(string cntrCode ,int detailCount = 1) {
var db = new SqlHelper().GetInstance();
// 1.查询容器信息,如无,则新建容器信息
var cntr = db.Queryable().Where(a => a.S_CODE == cntrCode).First();
if (cntr == null)
{
cntr = new Container { S_CODE = cntrCode, N_DETAIL_COUNT = detailCount };
db.Insertable(cntr).ExecuteCommand();
}
else
{
cntr.N_DETAIL_COUNT = detailCount;
db.Updateable(cntr).UpdateColumns(it => new { it.N_DETAIL_COUNT }).ExecuteCommand();
}
}
///
/// 初始化容器
///
///
///
public static bool initContainer(string cntrCode)
{
var res = false;
var db = new SqlHelper().GetInstance();
var cntr = db.Queryable().Where(a => a.S_CODE == cntrCode).First();
if (cntr == null)
{
cntr = new Container { S_CODE = cntrCode, N_DETAIL_COUNT = 1 };
res = db.Insertable(cntr).ExecuteCommand( )> 0;
}
else
{
res = db.Updateable().SetColumns(a => new Container() { N_DETAIL_COUNT = 1, T_MODIFY = DateTime.Now }).Where(a => a.S_CODE == cntrCode).ExecuteCommand() > 0;
}
return res;
}
///
/// 绑定容器和物料
///
///
///
///
///
internal static bool BindCntrItemSingle(string cntrCode, CntrItemRel cntrItemRel) {
var res = false;
var db = new SqlHelper().GetInstance();
try {
db.BeginTran();
// 1.查询容器信息,如无,则新建容器信息
var cntr = db.Queryable().Where(a => a.S_CODE == cntrCode).First();
if (cntr == null)
{
cntr = new Container { S_CODE = cntrCode, N_DETAIL_COUNT = 1 };
db.Insertable(cntr).ExecuteCommand();
}
// 2.查询容器物料信息,如无,则新建
cntrItemRel.S_CNTR_CODE = cntrCode;
List oldCntrItemList = db.Queryable().Where(a => a.S_CNTR_CODE == cntrCode).ToList();
if (oldCntrItemList != null && oldCntrItemList.Count > 0) {
ContainerHelper.deleteCntrItem(cntrCode);
}
db.Insertable(cntrItemRel).ExecuteCommand();
/* CntrItemRel cntrItemInfo = db.Queryable().Where(a => a.S_CNTR_CODE == cntrCode && a.S_ITEM_CODE == cntrItemRel.S_ITEM_CODE).First();
// 3.更新物料信息
if (cntrItemInfo == null) {
db.Insertable(cntrItemRel).ExecuteCommand();
}
else
{
cntrItemInfo. S_CNTR_CODE = cntrCode;
cntrItemInfo. S_WORK_NO = cntrItemRel.S_WORK_NO;
cntrItemInfo. S_WORK_NAME = cntrItemRel.S_WORK_NAME;
cntrItemInfo. S_DEPART_NO = cntrItemRel.S_DEPART_NO;
cntrItemInfo. S_PARTDRAW_NO = cntrItemRel.S_PARTDRAW_NO;
cntrItemInfo. S_PART_NAME = cntrItemRel.S_PART_NAME;
cntrItemInfo. S_OPER_NO = cntrItemRel.S_OPER_NO;
cntrItemInfo. S_OPER_NAME = cntrItemRel.S_OPER_NAME;
cntrItemInfo. F_QTY = cntrItemRel.F_QTY;
cntrItemInfo. F_WEIGHT = cntrItemRel.F_WEIGHT;
cntrItemInfo. S_ITEM_TYPE = cntrItemRel.S_ITEM_TYPE;
cntrItemInfo.S_ITEM_CODE = cntrItemRel.S_ITEM_CODE;
cntrItemInfo.S_ITEM_NAME = cntrItemRel.S_ITEM_NAME;
// 钢卷信息
cntrItemInfo.S_COIL_NO = cntrItemRel.S_COIL_NO;
cntrItemInfo.S_ITEM_SPEC = cntrItemRel.S_ITEM_SPEC;
cntrItemInfo.S_HEAT_NO = cntrItemRel.S_HEAT_NO;
cntrItemInfo.S_TEXTURE = cntrItemRel.S_TEXTURE;
cntrItemInfo.S_SHOOT_NO = cntrItemRel.S_SHOOT_NO;
cntrItemInfo.S_PHYSICAL_NO = cntrItemRel.S_PHYSICAL_NO;
cntrItemInfo.F_INIT_WEIGHT = cntrItemRel.F_INIT_WEIGHT;
cntrItemInfo.T_IN_STOCK = cntrItemRel.T_IN_STOCK;
db.Updateable(cntrItemInfo).ExecuteCommand();
}*/
db.CommitTran();
res = true;
}
catch (Exception ex) {
db.RollbackTran();
}
return res;
}
///
/// 分页查询容器物料信息
///
///
///
internal static PageInfo GetCntrItemPage(QueryItemModel model) {
PageInfo page = new PageInfo();
int totalCount = 0;
var db = new SqlHelper().GetInstance();
var query = db.Queryable()
.LeftJoin((a, i) => a.S_CNTR_CODE == i.S_CNTR_CODE)
.LeftJoin((a, i, l) => i.S_LOC_CODE == l.S_CODE).Where((a, i, l) => (a.S_ITEM_TYPE == "成品" || a.S_ITEM_TYPE == "半成品"));
if (model.trayCode != null)
{
query.Where((a, i, l) => a.S_CNTR_CODE.Contains(model.trayCode));
};
if (model.itemCode != null)
{
query.Where((a, i, l) => a.S_ITEM_CODE.Contains(model.itemCode));
};
if (model.workNo != null)
{
query.Where((a, i, l) => a.S_WORK_NO.Contains(model.workNo));
};
if (model.dePartNo != null)
{
query.Where((a, i, l) => a.S_DEPART_NO.Contains(model.dePartNo));
};
if (model.partDrawNo != null)
{
query.Where((a, i, l) => a.S_PARTDRAW_NO.Contains(model.partDrawNo));
};
if (model.areaCode != null) {
query.Where((a, i, l) => l.S_AREA_CODE == model.areaCode);
};
if (model.startTime != null)
{
DateTime startTime = DateTime.ParseExact(model.startTime, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
query.Where("CONVERT(DATETIME, a.T_IN_STOCK, 121) >= @startTime ", new { startTime });
};
if (model.endTime != null)
{
DateTime endTime = DateTime.ParseExact(model.endTime, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
query.Where("CONVERT(DATETIME, a.T_IN_STOCK, 121) <= @endTime ", new { endTime });
};
List list = query.OrderByDescending((a, i, l) => a.T_IN_STOCK).OrderBy((a, i, l) => new { a.S_PARTDRAW_NO, a.S_WORK_NO}).Select((a,i,l)=> new TrayItemInfoRes
{
trayCode = a.S_CNTR_CODE,
workNo = a.S_WORK_NO,
dePartNo = a.S_DEPART_NO,
partDrawNo = a.S_PARTDRAW_NO,
partName = a.S_PART_NAME,
operNo = a.S_OPER_NO,
operName = a.S_OPER_NAME,
itemCode = a.S_ITEM_CODE,
itemName = a.S_ITEM_NAME,
quantity = a.F_QTY.ToString(),
weight = a.F_WEIGHT.ToString(),
fullTime = a.T_IN_STOCK,
isFinish = a.S_ITEM_TYPE,
areaCode = l.S_AREA_CODE
}).ToPageList(model.pageNum, model.pageSize, ref totalCount);
page.totalCount = totalCount;
page.pageNum = model.pageNum;
page.pageSize = model.pageSize;
page.data = list;
return page;
}
///
/// 根据容器来源和状态获取托盘
///
///
///
///
internal static List GetCntr(string dest, int state, string cntrType = "") {
var db = new SqlHelper().GetInstance();
if (cntrType == "") {
return db.Queryable().Where(a => a.S_DEST == dest && a.N_B_STATE == state).ToList();
}
else {
return db.Queryable().Where(a => a.S_DEST == dest && a.N_B_STATE == state && a.S_TYPE == cntrType).ToList();
}
}
internal static bool UpdateCntr(List cntrs, string dest, 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.S_DEST = dest; a.N_B_STATE = state;
db.Updateable(a).UpdateColumns(it => new { it.S_DEST, it.N_B_STATE }).ExecuteCommand();
});
res = true;
}
return res;
}
internal static bool UpdateCntrItem(string cntrNo ,int isFind)
{
var res = false;
var db = new SqlHelper().GetInstance();
res = db.Updateable().SetColumns(a => new CntrItemRel() { ISFIND = isFind }).Where(a => a.S_CNTR_CODE == cntrNo).ExecuteCommand() > 0;
return res;
}
internal static bool UpdateCntrDest(List cntrs, string dest) {
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.S_DEST = dest;
db.Updateable(a).UpdateColumns(it => new { it.S_DEST }).ExecuteCommand();
});
res = true;
}
return res;
}
///
/// 更新托盘来源
///
///
///
///
internal static bool UpdateCntrSrc(string cntr, string src) {
var res = false;
var db = new SqlHelper().GetInstance();
var model = db.Queryable().Where(a => a.S_CODE == cntr).First();
if (model != null) {
model.S_SRC = src;
model.T_MODIFY = DateTime.Now;
res = db.Updateable(model).UpdateColumns(it => new { it.S_SRC, it.T_MODIFY }).ExecuteCommand() > 0;
}
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;
}
internal static bool UpdateCntr(List cntrs, string src, string dest, 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.S_DEST = dest; a.N_B_STATE = state; a.S_SRC = src;
db.Updateable(a).UpdateColumns(it => new { it.S_DEST, it.N_B_STATE, it.S_SRC }).ExecuteCommand();
});
res = true;
}
return res;
}
public static bool ClearCntrInfo(string cntr) {
var db = new SqlHelper().GetInstance();
var model = db.Queryable().Where(a => a.S_CODE == cntr).First();
if (model != null) {
model.S_SRC = "";
model.S_DEST = "";
model.N_B_STATE = 0;
model.T_MODIFY = DateTime.Now;
}
db.Updateable(model).UpdateColumns(it => new { it.S_SRC, it.S_DEST, it.N_B_STATE, it.T_MODIFY }).ExecuteCommand();
return db.Deleteable().Where(a => a.S_CNTR_CODE.Trim() == cntr.Trim()).ExecuteCommand() > 0;
}
internal static List GetCntrBySrc(string src, int state, string cntrType = "") {
var db = new SqlHelper().GetInstance();
if (cntrType == "") {
return db.Queryable().Where(a => a.S_SRC == src && a.N_B_STATE == state).ToList();
}
else {
return db.Queryable().Where(a => a.S_SRC == src && a.N_B_STATE == state && a.S_TYPE == cntrType).ToList();
}
}
///
/// 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 di = new DayuanIn
{
CN_S_ARRIVAL_NO = a.S_PUTAWAY_NO,
CN_F_QUANTITY = a.F_QTY,
CN_S_BATCH_NO = a.S_BATCH_NO,
CN_S_ITEM_CODE = a.S_ITEM_CODE,
};
db.Insertable(di).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();
}
}
}
public static LocCntrRel getLocCntr(string cntrCode)
{
var db = new SqlHelper().GetInstance();
return db.Queryable().Where(a => a.S_CNTR_CODE == cntrCode).First();
}
public static LocCntrRel getLocCntrByLoc(string locCode)
{
var db = new SqlHelper().GetInstance();
return db.Queryable().Where(a => a.S_LOC_CODE == locCode).OrderBy(a => a.T_CREATE).First();
}
}
}