using BLL.IDAL;
using Common;
using Model;
using NLog;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BLL.DAL
{
public class DAL_Pub
{
private Logger logger = LogManager.GetCurrentClassLogger();
public int SplitPosCode(string strSplit, ref int pai, ref int lie, ref int ceng)
{
pai = 0;
lie = 0;
ceng = 0;
try
{
pai = int.Parse(strSplit.Substring(strSplit.Length - 9, 3));
lie = int.Parse(strSplit.Substring(strSplit.Length - 6, 3));
ceng = int.Parse(strSplit.Substring(strSplit.Length - 3, 3));
}
catch
{
return -1;
}
return 0;
}
///
/// 移库获取移动目标货位,返回1表示分配的是里边库位,且该库位被外边货物挡住,需要先移库,返回0,表示该库位没被挡住
///
///
///
///
public int GetEmptyPos(ref string newPos, int height, string oriPos = null)
{
int iret = 0;
newPos = null;
string newP = null;
try
{
if (oriPos == null)//普通入库,优先最底层,第一列,...
{
//按顺序获取外边第一个空库位
DepotsLocation dl = new DepotsLocation();
StringBuilder strSql = new StringBuilder();
strSql.Append("select top(1) * from View_GetEmptyPos where ( LRow = 2 or LRow = 3 ) and Height >= ");
strSql.Append(height);
strSql.Append(" order by Height, LLayer, LRow, LColumn");
IDataReader dt = DataFactory.SqlDataBase().GetDataReaderBySQL(strSql);
if (dt != null)
{
dl = ModelConvertHelper.ReaderToModel(dt);
int LColumn = dl.LColumn;
int LLayer = dl.LLayer;
newP = dl.LocationCode;
//检测对应里边库位是否为空
StringBuilder sqlFindIn = new StringBuilder();
if (dl.LRow == 2)
{
sqlFindIn.Append("select * from View_GetEmptyPos where LRow = 1 and LColumn = @LColumn and LLayer = @LLayer");
}
else
{
sqlFindIn.Append("select * from View_GetEmptyPos where LRow = 4 and LColumn = @LColumn and LLayer = @LLayer");
}
SqlParam[] para = new SqlParam[]
{
new SqlParam("@LColumn", LColumn),
new SqlParam("@LLayer", LLayer)
};
IDataReader dt1 = DataFactory.SqlDataBase().GetDataReaderBySQL(sqlFindIn, para);
dl = ModelConvertHelper.ReaderToModel(dt1);
if (dl != null)
{
newP = dl.LocationCode;
}
newPos = newP;
}
else
{
//找里边空库位,该库位对应外边库位肯定是占用状态,被外库位挡着,需要移库
DepotsLocation dl2 = new DepotsLocation();
StringBuilder strSql2 = new StringBuilder();
strSql2.Append("select top(1) * from View_GetEmptyPos where ( LRow = 1 or LRow = 4 ) and Height >= ");
strSql2.Append(height);
strSql2.Append(" order by Height, LLayer, LRow, LColumn");
IDataReader dt2 = DataFactory.SqlDataBase().GetDataReaderBySQL(strSql2);
dl2 = ModelConvertHelper.ReaderToModel(dt2);
if (dl2 != null)
{
newP = dl2.LocationCode;
return 1;
}
else
{
return -2;
}
}
}
else
{
//移库,优先将外边移到对应里边库位,若里边不为空,找外边最近库位,然后再优先移到该最近库位对应里边库位
int row = 0, column = 0, layer = 0;
//解析库位坐标
SplitPosCode(oriPos, ref row, ref column, ref layer);
//
List lst3 = new List();
StringBuilder strSQLInner = new StringBuilder();
StringBuilder strSql3 = new StringBuilder();
//原始库位为外边库位,则判断对应里边库位是否为空,为空则分配出去
if (row == 2)
{
strSQLInner.Append("select * from View_GetEmptyPos where LRow = 1 and LColumn = ");
strSQLInner.Append(column);
strSQLInner.Append(" and LLayer = ");
strSQLInner.Append(layer);
IDataReader dr = DataFactory.SqlDataBase().GetDataReaderBySQL(strSQLInner);
if (dr != null && dr.IsEmpty())
{
DepotsLocation dl = new DepotsLocation();
dl = ModelConvertHelper.ReaderToModel(dr);
newPos = dl.LocationCode;
return 0;
}
}
if (row == 3)
{
strSQLInner.Append("select * from View_GetEmptyPos where LRow = 4 and LColumn = ");
strSQLInner.Append(column);
strSQLInner.Append(" and LLayer = ");
strSQLInner.Append(layer);
IDataReader dr = DataFactory.SqlDataBase().GetDataReaderBySQL(strSQLInner);
if (dr != null && dr.IsEmpty())
{
DepotsLocation dl = new DepotsLocation();
dl = ModelConvertHelper.ReaderToModel(dr);
newPos = dl.LocationCode;
return 0;
}
}
//获取2/3排是空库位货位
strSql3.Append("select * from View_GetEmptyPos where (LRow = 2 or LRow = 3) and Height >= ");
strSql3.Append(height + " and LocationCode != '" + oriPos + "' ");
strSql3.Append(" order by Height, LLayer, LColumn, LRow");
IDataReader dt3 = DataFactory.SqlDataBase().GetDataReaderBySQL(strSql3);
if (dt3 == null)
{
return 0;
}
lst3 = (List)ModelConvertHelper.DataReaderToModel(dt3);
int sum = 100000;
DepotsLocation depotsLocation = new DepotsLocation();
//获取最近外层库位
for (int j = 0; j < lst3.Count; j++)
{
DepotsLocation dl = lst3[j];
// liudl注释 神逻辑看不懂
//if ((dl != null) && (dl.Height > height))
//{
// break;//后边库位高度与实际不符,不在对比,除非depotsLocation为空
//}
int vAbs = (Math.Abs(dl.LRow - row) + Math.Abs(dl.LLayer - layer));
if (sum > vAbs)
{
sum = vAbs;
depotsLocation = dl;
}
}
StringBuilder strSqlIn = new StringBuilder();
//判断该外层库位对应里边库位是否为空
if (depotsLocation.LRow == 2)
{
strSqlIn.Append("select * from View_GetEmptyPos where LRow = 1 and LColumn = @LColumn and LLayer = @LLayer");
}
else
{
strSqlIn.Append("select * from View_GetEmptyPos where LRow = 4 and LColumn = @LColumn and LLayer = @LLayer");
}
SqlParam[] param = new SqlParam[]
{
new SqlParam("@LLayer", depotsLocation.LLayer),
new SqlParam("@LColumn", depotsLocation.LColumn)
};
List lstIn = new List();
IDataReader dtIn = DataFactory.SqlDataBase().GetDataReaderBySQL(strSqlIn, param);
//不为空,则将里边库位分配出去
if (dtIn != null)
{
lstIn = (List)ModelConvertHelper.DataReaderToModel(dtIn);
if ((lstIn.Count > 0) && (lstIn[0].LocationCode != oriPos))
{
depotsLocation = lstIn[0];
}
}
newPos = depotsLocation.LocationCode;
}
}
catch (Exception ex)
{
iret = -1;
}
return iret;
}
//检查出库单是否所有托盘出库完成更改出库单状态,并更新该条指令状态
public int Erp_to(string taskID, string palno, string oldAddre)
{
int r = -1;
try
{
StringBuilder SQL = new StringBuilder();
SQL.Append("select * from Erp_Out where Ordno= '" + taskID + "' ");
DataTable dd = DataFactory.SqlDataBase().GetDataTableBySQL(SQL);
if (dd.Rows.Count > 0)
{
StringBuilder hql = new StringBuilder();
hql.Append("update WH_CMD set IsDel =1 where TaskID = '" + taskID + "' and OldAddre ='" + oldAddre + "' and Palno ='" + palno + "' and CMDType='to'");
DataFactory.SqlDataBase().ExecuteBySql(hql);
StringBuilder aql = new StringBuilder();
aql.Append("update DepotsLocation set TurnoverDemand ='02' where LocationCode = '" + oldAddre + "'");
DataFactory.SqlDataBase().ExecuteBySql(aql);
//查询该指令下单号所有是否都出库,是则更改出库单状态
StringBuilder sql = new StringBuilder();
sql.Append("select * from WH_CMD where TaskID = '" + taskID + "' and IsDel=0");
DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(sql);
if (dt.Rows.Count <= 0)
{
StringBuilder eql = new StringBuilder();
eql.Append("update Erp_Out set Statu ='ER03' where Ordno = '" + taskID + "'");
DataFactory.SqlDataBase().ExecuteBySql(eql);
}
}
return r = 0;
}
catch (Exception)
{
return r;
}
}
///
/// 移库更改库存明细表托盘位置和指令表托盘位置
///
///
///
///
///
///
public int UpdatemoveStore(string taskID, string palno, string oldAddre, string nowAddre)
{
int r = -1;
try
{
if (taskID == "" || taskID == null)
{
StringBuilder sql = new StringBuilder();
sql.Append("update log_Store set Addre='" + nowAddre + "' where Addre = '" + oldAddre + "' and Palno='" + palno + "'");
DataFactory.SqlDataBase().ExecuteBySql(sql);
this.UpdateDeopotsLocation(nowAddre, "02");
this.UpdateDeopotsLocation(oldAddre, "01");
//更改未生成指令的出库单,对应的出库明细表中的托盘的库位地址
sql.Clear();
sql.Append("Update ErpOutDetail set addre = '" + nowAddre + "' ");
sql.Append("where Palno = '" + palno + "' and OrdNo in ");
sql.Append("(select OrdNo from Erp_Out where Statu = 'ER01' and Erp_Out.IsDel = 0);");
DataFactory.SqlDataBase().ExecuteBySql(sql);
//查询指令表中是不是有移走的托盘指令,有则更改该托盘新货位
StringBuilder hql = new StringBuilder();
hql.Append("select * from WH_CMD where OldAddre = '" + oldAddre + "' and Palno='" + palno + "' and CMDType !='move' and IsDel=0");
DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(hql);
if (dt.Rows.Count > 0)
{
StringBuilder eql = new StringBuilder();
eql.Append("update WH_CMD set OldAddre='" + nowAddre + "' where OldAddre = '" + oldAddre + "' and Palno='" + palno + "' and CMDType !='move' and IsDel=0 ");
DataFactory.SqlDataBase().ExecuteBySql(eql);
}
//更改指令表该条指令状态
StringBuilder ql = new StringBuilder();
ql.Append("update WH_CMD set IsDel=1 where OldAddre = '" + oldAddre + "' and Palno='" + palno + "' and NowAddre='" + nowAddre + "' and CMDType ='move' and IsDel=0 ");
DataFactory.SqlDataBase().ExecuteBySql(ql);
}
return r = 0;
}
catch (Exception)
{
return r;
}
}
///
/// 更改指令状态,查看是否出完所有托盘是则改出库单状态
///
///
///
///
///
public int UpdateOut(string taskID, string palno, string oldAddre)
{
int r = -1;
try
{
//StringBuilder hql = new StringBuilder();
//hql.Append("update WH_CMD set IsDel =1 where TaskID = '" + taskID + "' and OldAddre ='" + oldAddre + "' and Palno ='" + palno + "' and CMDType='out'");
//DataFactory.SqlDataBase().ExecuteBySql(hql);
////查询该指令下单号所有是否都出库和回库表中该订单是否需要回库,没有指令和回库则更改出库单状态
//StringBuilder sql = new StringBuilder();
//sql.Append("select * from WH_CMD where TaskID = '" + taskID + "' and IsDel=0");
//DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(sql);
//查询回库表中是否有该订单需要回库
//StringBuilder ql = new StringBuilder();
//ql.Append("select * from Picking where OrdNo = '" + taskID + "' and IsDel=0");
//DataTable tt = DataFactory.SqlDataBase().GetDataTableBySQL(ql);
//if (tt.Rows.Count <= 0)
//{
// eql.Append($"update Erp_Out set Statu ='03',CompletionTime=GETDATE() where Ordno = '" + taskID + "'");
//}
//else
//{
// eql.Append($"update Erp_Out set Statu ='04',CompletionTime=GETDATE() where Ordno = '" + taskID + "'");
//}
//eql.Append($"select 1 from View_ErpOutDetail where OrdNo='{taskID}'");
//DataTable tt = DataFactory.SqlDataBase().GetDataTableBySQL(eql);
//if (tt != null && tt.Rows.Count <= 0)
//{
StringBuilder eql = new StringBuilder();
eql.Clear();
eql.Append($"update Erp_Out set Statu ='03',CompletionTime=GETDATE() where Ordno = '" + taskID + "'");
DataFactory.SqlDataBase().ExecuteBySql(eql);
//}
return r = 0;
}
catch (Exception)
{
return r;
}
}
///
/// 查询出库托盘下是否有物料,有则回库,没有则更改货位状态为空货位
///
///
///
///
///
public int InsertPicking(string taskID, string palno, string oldAddre)
{
int r = -1;
try
{
//出库指令更新完库存后判断托盘是否还有物料,有则回库表插入数据,没有则更改货位状态为空货位
StringBuilder sql = new StringBuilder();
sql.Append("select 1 from log_Store where log_Store.Palno='" + palno + "' and IsDel=0");
DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(sql);
if (dt.Rows.Count > 0)
{
Hashtable ht = new Hashtable();
ht["OrdNo"] = "'" + taskID + "'";
ht["Palno"] = "'" + palno + "'";
ht["Addre"] = "'" + oldAddre + "'";
ht["IsDel"] = 0;
StringBuilder ql = new StringBuilder();
ql.Append("select * from Picking where OrdNo='" + taskID + "' and Palno='" + palno + "' AND IsDel=0 ");
DataTable tt = DataFactory.SqlDataBase().GetDataTableBySQL(ql);
if (tt != null && tt.Rows.Count <= 0)
{
DataFactory.SqlDataBase().InsertByHashtableNullParam("Picking", ht);
}
StringBuilder hql = new StringBuilder();
hql.Append("update DepotsLocation set TurnoverDemand ='03' where LocationCode = '" + oldAddre + "'");
DataFactory.SqlDataBase().ExecuteBySql(hql);
}
else
{
StringBuilder hql = new StringBuilder();
hql.Append("update DepotsLocation set TurnoverDemand ='01' where LocationCode = '" + oldAddre + "'");
DataFactory.SqlDataBase().ExecuteBySql(hql);
// 删除回库表数据
hql.Clear();
hql.Append($"UPDATE dbo.Picking SET IsDel=1 WHERE Palno='{palno}' AND Addre='{oldAddre}' AND IsDel=0");
DataFactory.SqlDataBase().ExecuteBySql(hql);
}
return r = 0;
}
catch (Exception)
{
return r;
}
}
///
/// 查询单号该out指令是不是出库单的
///
///
///
public int UpdateStore(string taskID, string palno, string OldAddre)
{
int r = 0;
try
{
StringBuilder SQL = new StringBuilder();
SQL.Append("select * from View_ErpOutDetail where OrdNo= '" + taskID + "' and Palno='" + palno + "'and LocationCode = '" + OldAddre + "' and Statu='02'");
DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(SQL);
//如果该指令任务号是出库单单号匹配则更改库存表
if (dt.Rows.Count > 0)
{
for (int i = 0; i < dt.Rows.Count; i++)
{
// 空托盘出库 物料编码为null
if (dt.Rows[i]["MatNo"].ToString() == "")
{
StringBuilder sql = new StringBuilder();
sql.Append("select quant from log_Store where LocationCode= '" + dt.Rows[i]["LocationCode"].ToString());
sql.Append("' and log_Store.Palno='" + dt.Rows[i]["Palno"].ToString() + "' and isnull(matno,'') = '' and IsDel=0");
DataTable ddd = DataFactory.SqlDataBase().GetDataTableBySQL(sql);
if (ddd.Rows.Count > 0)
{
int subtract = ddd.Rows[0]["Quant"].ToInt() - dt.Rows[i]["CurQuant"].ToInt();
if (subtract <= 0)
{
StringBuilder ht = new StringBuilder();
ht.Append("delete from log_Store where LocationCode= '" + dt.Rows[i]["LocationCode"].ToString() + "' and Palno='" + dt.Rows[i]["Palno"].ToString() + "' and isnull(MatNo,'')=''");
DataFactory.SqlDataBase().ExecuteBySql(ht);
}
else
{
StringBuilder ht = new StringBuilder();
ht.Append("update log_Store set Quant='" + subtract + "' where LocationCode= '" + dt.Rows[i]["LocationCode"].ToString() + "' and Palno='" + dt.Rows[i]["Palno"].ToString() + "' and isnull(MatNo,'')=''");
DataFactory.SqlDataBase().ExecuteBySql(ht);
}
}
}
else // 物料出库
{
//查询出库存明细表数量减去出库单数量并更新库存表 //lijiangang修改:增加合格证Certificate条件图号条件
StringBuilder hql = new StringBuilder();
hql.Append("select log_Store.Guid,log_Store.Quant,Log_Stroe_Mat.Quant as MatQuant from log_Store left join Log_Stroe_Mat on log_Store.MatNo = Log_Stroe_Mat.MatNo" +
" where log_Store.LocationCode= '" + dt.Rows[i]["LocationCode"].ToString() + "' and log_Store.Palno='" + dt.Rows[i]["Palno"].ToString() + "' " +
" and log_Store.MatNo='" + dt.Rows[i]["MatNo"].ToString() + "' " +
"and isnull(log_Store.TuNo,'') = '" + dt.Rows[i]["TuNo"].ToString() + "' and log_Store.lingno = '" + dt.Rows[i]["lingno"].ToString() + "'");
DataTable dd = DataFactory.SqlDataBase().GetDataTableBySQL(hql);
if (dd.Rows.Count > 0)
{
//更新库存明细表
int subtract = dd.Rows[0]["Quant"].ToInt() - dt.Rows[i]["CurQuant"].ToInt();
if (subtract <= 0)
{
StringBuilder ht = new StringBuilder();
//ht.Append("delete from log_Store where log_Store.Guid='" + dd.Rows[0]["Guid"].ToString() + "'");
ht.Append("update log_Store set isdel = '1' where log_Store.Guid='" + dd.Rows[0]["Guid"].ToString() + "'");
DataFactory.SqlDataBase().ExecuteBySql(ht);
}
else
{
StringBuilder ht = new StringBuilder();
ht.Append("update log_Store set Quant='" + subtract + "' where log_Store.Guid='" + dd.Rows[0]["Guid"].ToString() + "'");
DataFactory.SqlDataBase().ExecuteBySql(ht);
}
//更新库存总表
int subtractnum = dd.Rows[0]["MatQuant"].ToInt() - dt.Rows[i]["CurQuant"].ToInt();
StringBuilder qt = new StringBuilder();
qt.Append("update Log_Stroe_Mat set Quant='" + subtractnum + "' where Log_Stroe_Mat.MatNo='" + dt.Rows[i]["MatNo"].ToString() + "'");
DataFactory.SqlDataBase().ExecuteBySql(qt);
}
}
}
r = 1;
}
else // 库内托盘出库重新组盘
{
if (string.IsNullOrWhiteSpace(taskID))
{
StringBuilder hql = new StringBuilder();
hql.Append("update DepotsLocation set TurnoverDemand ='03' where LocationCode = '" + OldAddre + "'");
DataFactory.SqlDataBase().ExecuteBySql(hql);
}
}
return r;
}
catch (Exception)
{
r = -1;
return r;
}
}
//生成入库指令
public int GenPalletInOrder(Order order)
{
try
{
Hashtable ht = new Hashtable();
DateTime t = DateTime.Now;
ht["TaskID"] = order.TaskID;
ht["Palno"] = order.Palno;
ht["CMDType"] = order.CMDType;
ht["OldAddre"] = order.OldAddre;
ht["NowAddre"] = order.NowAddre;
ht["CMDStatu"] = order.CMDStatu;
ht["CreateUser"] = order.CreateUser;
ht["CreateTime"] = t;
ht["IsDel"] = 0;
int r = DataFactory.SqlDataBase().InsertByHashtable("WH_CMD", ht);
if (r > 0)
{
return 0;
}
else
{
return -1;
}
}
catch (Exception ex)
{
throw ex;
}
}
///
/// 改变库位状态
///
/// 库位地址
/// 库位状态
///
public bool UpdateLocationState(string Location, string statu)
{
try
{
bool bl = false;
StringBuilder sbStr = new StringBuilder();
sbStr.Append("Update DepotsLocation set TurnoverDemand = '" + statu + "' ");
sbStr.Append("where LocationCode = '" + Location + "';");
int rowCount = DataFactory.SqlDataBase().ExecuteBySql(sbStr);
if (rowCount > 0)
{
bl = true;
}
return bl;
}
catch (Exception ex)
{
throw ex;
}
}
//从CMD表获取第一条命令
public int GetErpInCmd(ref IList lst)
{
int ir = 0;
lst.Clear();
try
{
StringBuilder strSQL = new StringBuilder();
strSQL.Append("select top(1)* from WH_CMD where (CMDStatu = 1 or CMDStatu = 0 or CMDStatu = -1) and IsDel = 0 Order by CreateTime");
DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(strSQL);
if (dt != null)
{
if (dt.Rows.Count > 0)
lst = ModelConvertHelper.DataTableToModel(dt);
}
}
catch (Exception ex)
{
ir = -1;
}
return ir;
}
//通过托盘码从组盘表获得订单号
public int GetOrdByPalletNo(string PalletNo, string CMDID, ref string OrdNo)
{
int ir = 0;
bool bl = false;
OrdNo = "";
try
{
StringBuilder strSQL = new StringBuilder();
// 判断组盘表里是否存在此托盘码
strSQL.Append("select * from IPalletBind where PalletNo = '");
strSQL.Append(PalletNo);
// 过滤已删除数据
strSQL.Append("' and Statu = '1' and IsDel = '0';");
DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(strSQL);
if (dt != null)
{
if (dt.Rows.Count > 0)
{
OrdNo = dt.Rows[0]["OrdNo"].ToString();
bl = true;
}
}
// 判断空托盘表里是否存在此托盘码
strSQL.Clear();
strSQL.Append("select id from IPalletEmptyIn where PalletNo = '" + PalletNo + "'");
strSQL.Append(" and Statu = '1' and isDel = '0';");
DataTable dtt = DataFactory.SqlDataBase().GetDataTableBySQL(strSQL);
if (dtt.Rows.Count > 0)
{
bl = true;
}
if (!bl)
{
// 此托盘无单据关联,将该指令的statu状态置为 -5(非法托盘)
strSQL.Clear();
strSQL.Append("Update WH_CMD set CMDStatu = '-5' where CMDID='" + CMDID + "';");
DataFactory.SqlDataBase().ExecuteBySql(strSQL);
ir = -1;
}
}
catch
{
ir = -1;
}
return ir;
}
//更新cmd命令表
public int UpdateCmd(string PalletNo, int status, string OrdNo, string OriPos, string NewPos = "")
{
int ir = 0;
try
{
StringBuilder strSQL = new StringBuilder();
strSQL.Append("update WH_CMD set OldAddre = @OldAddre, NowAddre = @NowAddre, TaskID = @OrdNo, CMDStatu = @CMDStatu ");
if (status == 3)
{
strSQL.Append(" ,IsDel=1");
}
strSQL.Append(" where Palno = @Palno and IsDel = 0");
SqlParam[] param = new SqlParam[]
{
new SqlParam("@OldAddre", OriPos),
new SqlParam("@NowAddre", NewPos),
new SqlParam("@OrdNo", OrdNo),
new SqlParam("@CMDStatu", status),
new SqlParam("@Palno", PalletNo)
};
ir = DataFactory.SqlDataBase().ExecuteBySql(strSQL, param);
}
catch (Exception ex)
{
ir = -1;
}
return ir;
}
//更新Log_store库存明细表
public int UpdateLogStore(string Pos, IList lst)
{
int r = -1;
try
{
foreach (PalletBind pb in lst)
{
int has = 0;
StringBuilder strSQL = new StringBuilder();
StringBuilder strSQL2 = new StringBuilder();
strSQL.Append("select Quant,LocationCode from log_Store where MatNo = '");
strSQL.Append(pb.MatNo);
strSQL.Append("' and LingNo = '");
strSQL.Append(pb.LingNo);
strSQL.Append("' and Palno = '");
strSQL.Append(pb.PalletNo);
strSQL.Append("'");
strSQL.Append(" and isnull(Certificate,'') = '" + pb.HeGeZheng + "'");
strSQL.Append(" and isnull(tuno,'') = '" + pb.TuNo + "'");
strSQL.Append(" and isnull(BatchNo,'') = '" + pb.BatchNo + "'");
DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(strSQL);
if (dt != null)
{
if (dt.Rows.Count > 0)
{
has = int.Parse(dt.Rows[0]["Quant"].ToString());
has += int.Parse(pb.MatCount);
if (has > 0)
{
strSQL2.Append("update log_Store set Quant = '");
strSQL2.Append(has.ToString());
strSQL2.Append("' where ");
strSQL2.Append("MatNo = '");
strSQL2.Append(pb.MatNo);
strSQL2.Append("' and LingNo = '");
strSQL2.Append(pb.LingNo);
strSQL2.Append("' and Palno = '" + pb.PalletNo);
strSQL2.Append("' and isnull(Certificate,'') = '" + pb.HeGeZheng);
strSQL2.Append("' and isnull(tuno,'') = '" + pb.TuNo + "'");
strSQL2.Append("' and isnull(BatchNo,'') = '" + pb.BatchNo + "'");
r = DataFactory.SqlDataBase().ExecuteBySql(strSQL2);
}
}
else
{
DateTime t = DateTime.Now;
Hashtable ht = new Hashtable();
ht["LocationCode"] = Pos;
ht["Palno"] = pb.PalletNo;
ht["MatNo"] = pb.MatNo;
ht["LingNo"] = pb.LingNo;
ht["TuNo"] = pb.TuNo;
ht["PageNo"] = pb.PageNo;
ht["Quant"] = pb.MatCount;
ht["CQuant"] = 0;
ht["Certificate"] = pb.HeGeZheng;
ht["DepartGuid"] = pb.DepartGuid;
ht["MatGuid"] = pb.MatGuid;
ht["BatchNo"] = pb.BatchNo;
ht["BatchName"] = pb.BatchDemo;
// ht["CreateTime"] = t.ToString("yyyy-MM-dd HH:mm:ss");
//ht["Demo"] = pb.Demo;
//ht["CheckTime"] = t.ToString("yyyy-MM-dd HH:mm:ss");
r = DataFactory.SqlDataBase().InsertByHashtable("log_Store", ht);
}
}
//入库完成后往入库单物料位置表ErpInPosition插入货位和托盘信息,方便查看入库单物料存放位置
StringBuilder strSQL1 = new StringBuilder();
strSQL1.Append("select Quant,LocationCode from log_Store where MatNo = '");
strSQL1.Append(pb.MatNo);
strSQL1.Append("' and LingNo = '");
strSQL1.Append(pb.LingNo);
strSQL1.Append("' and Palno = '");
strSQL1.Append(pb.PalletNo);
strSQL1.Append("'");
strSQL1.Append(" and isnull(Certificate,'') = '" + pb.HeGeZheng + "'");
strSQL1.Append(" and isnull(tuno,'') = '" + pb.TuNo + "'");
strSQL1.Append(" and isnull(BatchNo,'') = '" + pb.BatchNo + "'");
DataTable dt1 = DataFactory.SqlDataBase().GetDataTableBySQL(strSQL1);
Hashtable ErpInPosition = new Hashtable();
ErpInPosition["OrdNo"] = pb.OrdNo;
ErpInPosition["MatNo"] = pb.MatNo;
ErpInPosition["PalletNo"] = pb.PalletNo;
ErpInPosition["AddreNo"] = dt1.Rows[0]["LocationCode"].ToString();
ErpInPosition["MatCount"] = pb.MatCount.ToInt();
int q = DataFactory.SqlDataBase().InsertByHashtable("ErpInPosition", ErpInPosition);
}
}
catch (Exception ex)
{
r = -1;
}
return r;
}
//空托盘更新库存总表
public int UpdateLogStoreMat(string Pos, string PalletNo, int count)
{
int r = -1;
try
{
DateTime t = DateTime.Now;
Hashtable ht = new Hashtable();
ht["MatNo"] = PalletNo;
ht["Quant"] = count;
ht["CreateUser"] = "SuperUser";
ht["CreateTime"] = t.ToString("yyyy-MM-dd HH:mm:ss");
ht["IsDel"] = 0;
r = DataFactory.SqlDataBase().InsertByHashtable("log_Stroe_Mat", ht);
}
catch (Exception ex)
{
r = -1;
}
return r;
}
//空托盘更新库存明细表
public int UpdatePalletLogStore(string Pos, string PalletNo, int count)
{
int r = -1;
try
{
int has = 0;
StringBuilder strSQL = new StringBuilder();
StringBuilder strSQL2 = new StringBuilder();
strSQL.Append("select Quant,Palno from log_Store where LocationCode = '" + Pos + "' and Palno='" + PalletNo + "'");
DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(strSQL);
if (dt != null)
{
if (dt.Rows.Count > 0)
{
has = int.Parse(dt.Rows[0]["Quant"].ToString());
has += count;
if (has > 0)
{
strSQL2.Append("update log_Store set Quant = '");
strSQL2.Append(has.ToString());
strSQL2.Append("' where ");
strSQL2.Append(" LocationCode = '");
strSQL2.Append(Pos);
strSQL2.Append("' and Palno = '");
strSQL2.Append(PalletNo);
strSQL2.Append("'");
r = DataFactory.SqlDataBase().ExecuteBySql(strSQL2);
}
}
else
{
DateTime t = DateTime.Now;
Hashtable ht = new Hashtable();
ht["LocationCode"] = Pos;
ht["Palno"] = PalletNo;
ht["Quant"] = count.ToString();
r = DataFactory.SqlDataBase().InsertByHashtable("log_Store", ht);
}
}
}
catch (Exception ex)
{
r = -1;
}
return r;
}
//更新Log_store_mat物料明细表
public int UpdateLogStoreMat(string Pos, IList lst)
{
int r = -1;
try
{
foreach (PalletBind em in lst)
{
int has = 0;
StringBuilder strSQL = new StringBuilder();
StringBuilder strSQL2 = new StringBuilder();
strSQL.Append("select Quant from Log_Stroe_Mat where MatNo = '");
strSQL.Append(em.MatNo);
strSQL.Append("'");
DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(strSQL);
if (dt != null)
{
if (dt.Rows.Count > 0)
{
has = int.Parse(dt.Rows[0]["Quant"].ToString());
has += int.Parse(em.MatCount);
if (has > 0)
{
strSQL2.Append("update log_Stroe_Mat set Quant = '");
strSQL2.Append(has.ToString());
strSQL2.Append("' where ");
strSQL2.Append("MatNo = '");
strSQL2.Append(em.MatNo);
strSQL2.Append("'");
r = DataFactory.SqlDataBase().ExecuteBySql(strSQL2);
}
}
else
{
DateTime t = DateTime.Now;
Hashtable ht = new Hashtable();
ht["MatNo"] = em.MatNo;
ht["Quant"] = em.MatCount;
ht["CreateUser"] = "SuperUser";
ht["CreateTime"] = t.ToString("yyyy-MM-dd HH:mm:ss");
ht["IsDel"] = 0;
r = DataFactory.SqlDataBase().InsertByHashtable("log_Stroe_Mat", ht);
}
}
}
}
catch (Exception ex)
{
r = -1;
}
return r;
}
//更新DeopotsLocation库位表
public int UpdateDeopotsLocation(string Pos, string statu)//1空;2合格;3待入;4待出;
{
int r = -1;
try
{
StringBuilder strSQL = new StringBuilder();
strSQL.Append("update DepotsLocation set TurnoverDemand = @statu where LocationCode = @Pos");
SqlParam[] param = new SqlParam[]
{
new SqlParam("@statu", statu),
new SqlParam("@Pos", Pos)
};
r = DataFactory.SqlDataBase().ExecuteBySql(strSQL, param);
}
catch (Exception ex)
{
r = -1;
}
return r;
}
//ErpIn逻辑状态判断
public int UpdateErp(string PalletNo)
{
int r = 0;
try
{
//获取该托盘上所有物料信息
StringBuilder strSQL = new StringBuilder();
strSQL.Append("select OrdNo from IPalletBind where PalNo = '");
strSQL.Append(PalletNo);
strSQL.Append("' and IsDel = 0 Group By OrdNo");
DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(strSQL);
if (dt != null)
{
//遍历所有入库单是否需要关单
for (int i = 0; i < dt.Rows.Count; i++)
{
bool bErpInClose = true;
string OrdNo = dt.Rows[i]["OrdNo"].ToString();
//该订单下所有物料
StringBuilder strSQLErpIn = new StringBuilder();
strSQLErpIn.Append("select * from ErpInDetail where OrdNo = '");
strSQLErpIn.Append(OrdNo);
strSQLErpIn.Append("'");
DataTable dt2 = DataFactory.SqlDataBase().GetDataTableBySQL(strSQLErpIn);
if (dt2 != null)
{
//该入库单下所有物料是否已经入库
for (int j = 0; j < dt2.Rows.Count; j++)
{
//某一种物料
int ErpInCount = int.Parse(dt2.Rows[j]["CurQuant"].ToString());
string MatNo = dt2.Rows[j]["MatNo"].ToString();
//该入库单下该物料已经入库数量
StringBuilder strGetAllMatCount = new StringBuilder();
strGetAllMatCount.Append("select * from IPalletBind where OrdNo = '");
strGetAllMatCount.Append(OrdNo);
strGetAllMatCount.Append("' and MatGuid = '");
strGetAllMatCount.Append(MatNo);
strGetAllMatCount.Append("' and Statu = '03'");
DataTable dtAll = DataFactory.SqlDataBase().GetDataTableBySQL(strGetAllMatCount);
if (dtAll != null)
{
int sum = 0;
for (int m = 0; m < dtAll.Rows.Count; m++)
{
sum += int.Parse(dtAll.Rows[m]["MatCount"].ToString());
}
if (sum < ErpInCount)
{
bErpInClose = false;
}
}
}
}
if (bErpInClose)
{
//入库单执行完成,
UpdateErpInStatus(OrdNo, "03");
DelPalletBind(OrdNo);
}
}
}
}
catch (Exception ex)
{
r = -1;
}
return r;
}
//更新Erpin入库单表
public int UpdateErpInStatus(string OrdNo, string status)
{
int r = 0;
try
{
StringBuilder strUpdateErpIn = new StringBuilder();
strUpdateErpIn.Append($"update Erp_in set Statu = '{status}',CompletionTime=GETDATE() where OrdNo = '{OrdNo}'");
r = DataFactory.SqlDataBase().ExecuteBySql(strUpdateErpIn);
}
catch
{
r = -1;
}
return r;
}
public bool UpdateErpInStatu(string PalletNo, string status)
{
bool bl = false;
try
{
// 根据托盘码获取关联入库单号
StringBuilder sbstr = new StringBuilder();
sbstr.Append("select distinct OrdNo from IPalletBind where Palno = '" + PalletNo + "' and Statu = '02' and IsDel = '0'");
DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(sbstr);
if (dt != null)
{
sbstr.Clear();
// 更改所有入库单,单据状态
foreach (DataRow row in dt.Rows)
{
sbstr.Append("Update Erp_in set Statu = '" + status);
sbstr.Append("' where OrdNo = '" + row["OrdNo"].ToString() + "';");
}
int rowCout = DataFactory.SqlDataBase().ExecuteBySql(sbstr);
if (rowCout > 0)
{
bl = true;
}
}
}
catch
{
bl = false;
}
return bl;
}
//删除托盘绑定
public int DelPalletBind(string OrdNo)
{
int r = 0;
try
{
//获取该订单下所有托盘
StringBuilder strAllPallet = new StringBuilder();
strAllPallet.Append("select * from IPalletBind where OrdNo = '");
strAllPallet.Append(OrdNo);
strAllPallet.Append("' and Statu = '03' and IsDel=0 ");
DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(strAllPallet);
if (dt != null)
{
//该订单下的所有托盘
for (int i = 0; i < dt.Rows.Count; i++)
{
bool delFlag = true;
string PalletNo = dt.Rows[i]["PalNo"].ToString();
StringBuilder strAllOrd = new StringBuilder();
strAllOrd.Append("select * from IPalletBind where PalNo = '");
strAllOrd.Append(PalletNo);
strAllOrd.Append("' and Statu = '03' and IsDel=0");
DataTable dt2 = DataFactory.SqlDataBase().GetDataTableBySQL(strAllOrd);
if (dt2 != null)
{
//该托盘下的所有订单
for (int j = 0; j < dt2.Rows.Count; j++)
{
string erpOrdNo = dt2.Rows[j]["OrdNo"].ToString();
StringBuilder strOrdStatu = new StringBuilder();
strOrdStatu.Append("select * from Erp_in where OrdNo = '");
strOrdStatu.Append(erpOrdNo);
strOrdStatu.Append("'");
//所有订单完成,才能删除
DataTable dt3 = DataFactory.SqlDataBase().GetDataTableBySQL(strOrdStatu);
if (dt3 != null)
{
//订单状态,有一个订单没完成,就不能删除该托盘
for (int k = 0; k < dt3.Rows.Count; k++)
{
string Statu = dt3.Rows[k]["Statu"].ToString();
if (Statu != "03")
{
delFlag = false;
}
}
}
if (delFlag)
{
//改托盘上所有订单都关闭,则关闭
StringBuilder strSQL = new StringBuilder();
strSQL.Append("update IPalletBind set IsDel = 1 where OrdNo = '");
strSQL.Append(erpOrdNo);
strSQL.Append("'and PalNo = '");
strSQL.Append(PalletNo);
strSQL.Append("' and IsDel=0");
r = DataFactory.SqlDataBase().ExecuteBySql(strSQL);
}
}
}
}
}
}
catch (Exception ex)
{
r = -1;
}
return r;
}
//根据物料删除托盘绑定
public int DelPalletBind(string OrdNo, string MatNo)
{
int r = 0;
try
{
StringBuilder strSQL = new StringBuilder();
strSQL.Append("update IPalletBind set IsDel = 1 where OrdNo = '");
strSQL.Append(OrdNo);
strSQL.Append("' and MatNo = '");
strSQL.Append(MatNo);
strSQL.Append("'");
r = DataFactory.SqlDataBase().ExecuteBySql(strSQL);
}
catch (Exception ex)
{
r = -1;
}
return r;
}
//根据入库单更新托盘绑定状态
public int UpdatePalletBindStatus(string PalletNo, string taskId, string status)
{
int r = 0;
try
{
StringBuilder strSQL = new StringBuilder();
strSQL.Append("update IPalletBind set Statu = '");
strSQL.Append(status);
strSQL.Append("' where Palno = '");
strSQL.Append(PalletNo);
strSQL.Append("' and IsDel = '0' and Statu = '02' ;");
// liudl 注释 存在一个托盘多个入库单情况
//strSQL.Append("' and OrdNo = '")
//strSQL.Append(taskId);
//strSQL.Append("'");
r = DataFactory.SqlDataBase().ExecuteBySql(strSQL);
}
catch (Exception ex)
{
r = -1;
}
return r;
}
//更新PallletBind托盘绑定表状态
public int UpdatePalletBind(string PalletNo, int status)
{
int r = -1;
try
{
StringBuilder strSQL = new StringBuilder();
strSQL.Append($"update IPalletBind set Statu = '0{status}' where Palno = '{PalletNo}' and Statu='01' and IsDel = 0");
r = DataFactory.SqlDataBase().ExecuteBySql(strSQL);
}
catch (Exception ex)
{
r = -1;
}
return r;
}
public int GetPalletNoAndOutPosByInPos(string InPos, ref string OutPos, ref string PalletNo)
{
int pai = 0, lie = 0, ceng = 0;
SplitPosCode(InPos, ref pai, ref lie, ref ceng);
StringBuilder strSQL = new StringBuilder();
if (pai == 1)
{
strSQL.Append("select top(1) * from View_GetEmptyPos where LRow = 2 and LColumn = ");
strSQL.Append(lie);
strSQL.Append(" and LLayer = ");
strSQL.Append(ceng);
DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(strSQL);
if (dt != null)
{
if (dt.Rows.Count > 0)
{
DepotsLocation dl = new DepotsLocation();
dl = (DepotsLocation)ModelConvertHelper.DataTableToModel(dt);
OutPos = dl.LocationCode;
}
}
}
if (pai == 4)
{
strSQL.Append("select top(1) * from View_GetEmptyPos where LRow = 3 and LColumn = ");
strSQL.Append(lie);
strSQL.Append(" and LLayer = ");
strSQL.Append(ceng);
DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(strSQL);
if (dt != null)
{
if (dt.Rows.Count > 0)
{
DepotsLocation dl = new DepotsLocation();
dl = (DepotsLocation)ModelConvertHelper.DataTableToModel(dt);
OutPos = dl.LocationCode;
}
}
}
StringBuilder strSQLPalletNo = new StringBuilder();
strSQLPalletNo.Append("select top(1) * from Log_Store where Addre = '");
strSQLPalletNo.Append(OutPos);
strSQLPalletNo.Append("'");
DataTable dt2 = DataFactory.SqlDataBase().GetDataTableBySQL(strSQLPalletNo);
if (dt2 != null)
{
if (dt2.Rows.Count > 0)
PalletNo = dt2.Rows[0]["Palno"].ToString();
}
return 0;
}
public int DelPalletEmptyIn(string PalletNo)
{
int ir = 0;
try
{
StringBuilder strSQL = new StringBuilder();
strSQL.Append("Update IPalletEmptyIn set IsDel = 1 where IsDel = 0 and PalNo = '");
strSQL.Append(PalletNo);
strSQL.Append("'");
ir = DataFactory.SqlDataBase().ExecuteBySql(strSQL);
}
catch (Exception ex)
{
ir = -1;
}
return ir;
}
public int UpdatePalletEmptyInStatus(string PalletNo, string status)
{
int ir = 0;
try
{
StringBuilder strSQL = new StringBuilder();
strSQL.Append("Update IPalletEmptyIn set Statu = '");
strSQL.Append(status);
strSQL.Append("' where IsDel = 0 and PalNo = '");
strSQL.Append(PalletNo);
strSQL.Append("'");
ir = DataFactory.SqlDataBase().ExecuteBySql(strSQL);
}
catch (Exception ex)
{
ir = -1;
}
return ir;
}
public int GetPalletEmptyCount(string PalletNo, ref int count)
{
int r = -1;
count = 0;
try
{
StringBuilder strSQL = new StringBuilder();
strSQL.Append("select * from IPalletEmptyIn where PalNo = '");
strSQL.Append(PalletNo);
strSQL.Append("' and Statu = '02'");
DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(strSQL);
if (dt != null)
{
if (dt.Rows.Count > 0)
{
count = int.Parse(dt.Rows[0]["PalCount"].ToString());
r = 0;
}
}
}
catch (Exception ex)
{
r = -1;
}
return r;
}
public int GetOutPosParamByInnerPos(string Pos, ref DepotsLocation dl)
{
int r = -1;
try
{
int pai = 0, lie = 0, ceng = 0;
r = SplitPosCode(Pos, ref pai, ref lie, ref ceng);
StringBuilder strSQL = new StringBuilder();
strSQL.Append("select tb1.*,tb2.Palno from DepotsLocation as tb1 ");
strSQL.Append("left join log_Store as tb2 on tb1.LocationCode = tb2.Addre ");
strSQL.Append("where LRow = ");
if (pai == 1)
strSQL.Append(2);
else
strSQL.Append(3);
strSQL.Append(" and LColumn = ");
strSQL.Append(lie);
strSQL.Append(" and LLayer = ");
strSQL.Append(ceng);
DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(strSQL);
if (dt != null)
{
IList ls = new List();
ls = (IList)ModelConvertHelper.DataTableToModel(dt);
dl = (DepotsLocation)ls[0];
r = 0;
}
}
catch (Exception ex)
{
r = -1;
}
return r;
}
public int InsertIPalletReturn(string PalletNo, string Address)
{
int r = -1;
if (string.IsNullOrEmpty(PalletNo) || string.IsNullOrEmpty(Address))
{
return -1;
}
try
{
string[] para = new string[] { PalletNo };
int ie = DataFactory.SqlDataBase().IsExist("IPalletReturn", "PalletNo", para);
if (ie > 0)
{
Hashtable ht = new Hashtable();
ht["Address"] = Address;
ie = DataFactory.SqlDataBase().UpdateByHashtable("IPalletReturn", "PalletNo", PalletNo, ht);
}
else
{
Hashtable ht = new Hashtable();
ht["PalletNo"] = PalletNo;
ht["Address"] = Address;
ie = DataFactory.SqlDataBase().InsertByHashtable("IPalletReturn", ht);
}
if (ie > 0)
r = 0;
}
catch (Exception)
{
r = -1;
}
return r;
}
#region 空取异常处理
///
/// 出库单空取异常处理
///
///
///
public bool SetErpOut(ErpInCmd cmd)
{
bool bl = false;
try
{
// 将该出库单明细表中该托盘码对应的物料备注改空取
StringBuilder sqlString = new StringBuilder();
sqlString.Append("update ErpOutDetail set Demo = '托盘空取异常' ");
sqlString.Append("where OrdNo = '" + cmd.TaskID + "' and Palno = '" + cmd.Palno + "'");
sqlString.Append(" and Addre = '" + cmd.OldAddre + "';");
int rowCount = DataFactory.SqlDataBase().ExecuteBySql(sqlString);
if (rowCount <= 0)
{
// 盘库异常在这里返回 不执行。
bl = false;
return bl;
}
// 将该出库单备注改为: 空取异常请进行盘库操作 (空托出库 = 2 出库单出库 = 1)
sqlString.Clear();
sqlString.Append("update Erp_Out SET Demo = '空取异常请进行盘库操作' where IsDel = '0' and Ordno = '" + cmd.TaskID + "'; ");
rowCount = DataFactory.SqlDataBase().ExecuteBySql(sqlString);
if (rowCount <= 0)
{
bl = false;
return bl;
}
// 处理出库单状态并删除该指令
this.UpdateOut(cmd.TaskID, cmd.Palno, cmd.OldAddre);
// 库位状态应改位空托盘
sqlString.Clear();
sqlString.Append("update DepotsLocation set TurnoverDemand = '01' where LocationCode = '" + cmd.OldAddre + "';");
rowCount = DataFactory.SqlDataBase().ExecuteBySql(sqlString);
if (rowCount <= 0)
{
bl = false;
return bl;
}
return true;
}
catch (Exception ex)
{
logger.ErrorException("出库单空取异常处理:", ex);
return bl;
}
}
///
/// 移库空取异常处理
///
///
///
///
public bool SetMove(ErpInCmd cmd)
{
bool bl = false;
try
{
// 将原库位和目标库位置为空货位,库位信息备注置为空取异常 删除指令
StringBuilder sqlString = new StringBuilder();
sqlString.Append("update DepotsLocation set TurnoverDemand = '01',Demo= '移库空取异常,请进行盘库。'");
sqlString.Append("where LocationCode = '" + cmd.OldAddre + "';");
int rowCount = DataFactory.SqlDataBase().ExecuteBySql(sqlString);
if (rowCount <= 0)
{
bl = false;
return bl;
}
sqlString.Clear();
sqlString.Append("update DepotsLocation set TurnoverDemand = '01' ");
sqlString.Append("where LocationCode = '" + cmd.NowAddre + "';");
rowCount = DataFactory.SqlDataBase().ExecuteBySql(sqlString);
if (rowCount <= 0)
{
bl = false;
return bl;
}
// 删除指令保证后续指令继续进行
sqlString.Clear();
sqlString.Append("Update WH_CMD set isdel = '1' where CMDid = '" + cmd.CMDID.ToString() + "';");
rowCount = DataFactory.SqlDataBase().ExecuteBySql(sqlString);
if (rowCount <= 0)
{
bl = false;
return bl;
}
return true;
}
catch (Exception ex)
{
logger.ErrorException("移库空取异常处理:", ex);
return bl;
}
}
#endregion
}
public class Order
{
public string TaskID;
public string NumberNo;
public string Palno;
public string CMDType;
public string OldAddre;
public string NowAddre;
public int CMDStatu;
public string CreateUser;
public DateTime CreateTime;
public string Demo;
public int IsDel;
public string guid;
}
}