using HanHe.Utility.Data;
using HH.WMS.Common.MagicModel;
using HH.WMS.Entitys.Common;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.OracleClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HH.WMS.DAL.Common
{
///
/// 建模DAL层
///
/// HanHe [FJ] CREATE(2017/09/15)
public class MagicDAL : BaseDAL
{
#region 分页获得datatable
///
/// 分页获得datatable
///
///
///
///
///
///
///
///
///
public DataTable GetData(string tabName, string SWhere, string OrderBy, int pageSize, int pageIndex, out int totalPages, out int totalRows)
{
DataTable dt = new DataTable();
try
{
DbCommand cmdall = DataAccess.GetStoredProcCommand("prc_query");
this.DataAccess.AddInParameter(cmdall, "TableName", ComDbType.STRING, tabName);
this.DataAccess.AddInParameter(cmdall, "WhereStr", ComDbType.STRING, SWhere);
this.DataAccess.AddInParameter(cmdall, "OrderByStr", ComDbType.STRING, OrderBy);
this.DataAccess.AddInParameter(cmdall, "PageSize", ComDbType.INT64, pageSize);
this.DataAccess.AddInParameter(cmdall, "PageIndex", ComDbType.INT64, pageIndex);
this.DataAccess.AddOutParameter(cmdall, "TotalPage", ComDbType.INT64, 8);
this.DataAccess.AddOutParameter(cmdall, "TotalRecord", ComDbType.INT64, 8);
//如果是oracle 增加特性
if (!string.IsNullOrEmpty(Now_dbType) && Now_dbType.Equals("ORACLE"))
{
//处理游标类型 因DbType无游标类型,游标类型单独处理
ComDbType.AddOrcOutParameter(cmdall, "v_cur", OracleType.Cursor);
}
dt = DataAccessExtensive.ExecuteDataTable(this.DataAccess, cmdall);
totalPages = Convert.ToInt32(this.DataAccess.GetParameterValue(cmdall, "TotalPage"));
totalRows = Convert.ToInt32(this.DataAccess.GetParameterValue(cmdall, "TotalRecord"));
return dt;
}
catch (Exception e)
{
throw e;
}
}
#endregion
#region 不分页查询
///
/// 不分页查询
///
///
///
public DataTable GetData(string strSql)
{
DataTable dt = new DataTable();
try
{
DbCommand cmdall = DataAccess.GetSqlStringCommand(strSql);
dt = DataAccessExtensive.ExecuteDataTable(this.DataAccess, cmdall);
}
catch (Exception ex)
{
throw ex;
}
return dt;
}
#endregion
#region 新增
///
/// 新增
///
///
///
///
/// [HanHe(fj)] create 2017/7/22
public SqlExecuteResult Add(MagicAddEntity entity, MagicDefaultEntity defaultEntity, DbTransaction trans)
{
List lstColumn = GetLstColumn(entity.lstColumn, defaultEntity, "Add");
if (lstColumn == null || lstColumn.Count == 0 || string.IsNullOrEmpty(entity.TableName))
{
return new SqlExecuteResult { Success = false };
}
//SQL字符串
StringBuilder strSql = new StringBuilder();
#region 拼接SQL字符串
StringBuilder column_str = new StringBuilder();
StringBuilder column_val = new StringBuilder();
for (int i = 0; i < lstColumn.Count; i++)
{
if (lstColumn[i].name != null && lstColumn[i].type != null && lstColumn[i].value != null)
{
column_str.Append(lstColumn[i].name + ",");
column_val.Append(":" + lstColumn[i].name + ",");
}
}
strSql.Append("insert into " + entity.TableName + " (");
strSql.AppendLine(column_str.ToString().TrimEnd(','));
strSql.AppendLine(" )");
strSql.AppendLine(" values (");
strSql.AppendLine(column_val.ToString().TrimEnd(','));
strSql.AppendLine(" ) ");
#endregion
DbCommand cmd = DataAccess.GetSqlStringCommand(strSql.ToString());
for (int i = 0; i < lstColumn.Count; i++)
{
if (lstColumn[i].name != null && lstColumn[i].type != null && lstColumn[i].value != null)
{
//获得dbtype类型
DbType comType = GetDbType(lstColumn[i].type);
if (comType != ComDbType.STRING)
{
}
DataAccess.AddInParameter(cmd, lstColumn[i].name, comType, lstColumn[i].value);
}
}
return ExecuteCommand(cmd, trans);
}
#endregion
#region 修改
///
/// 修改
///
///
///
///
public SqlExecuteResult Update(MagicAddEntity entity, MagicDefaultEntity defaultEntity, DbTransaction trans)
{
List lstColumn = GetLstColumn(entity.lstColumn, defaultEntity, "Edit");
if (lstColumn == null || lstColumn.Count == 0 || string.IsNullOrEmpty(entity.TableName))
{
return new SqlExecuteResult { Success = false };
}
StringBuilder strSql = new StringBuilder();
strSql.AppendLine("update " + entity.TableName + " set ");
for (int i = 0; i < lstColumn.Count; i++)
{
if (lstColumn[i].name != null && lstColumn[i].type != null && lstColumn[i].value != null)
{
strSql.AppendLine(lstColumn[i].name + "=:" + lstColumn[i].name);
if (i != (lstColumn.Count - 1))
{
strSql.Append(",");
}
}
}
strSql.AppendLine(" where CN_GUID=:CN_GUID");
DbCommand cmd = DataAccess.GetSqlStringCommand(strSql.ToString());
for (int i = 0; i < lstColumn.Count; i++)
{
if (lstColumn[i].name != null && lstColumn[i].type != null && lstColumn[i].value != null)
{
//获得dbtype类型
DbType comType = GetDbType(lstColumn[i].type);
DataAccess.AddInParameter(cmd, lstColumn[i].name, comType, lstColumn[i].value);
}
}
return ExecuteCommand(cmd, trans);
}
#endregion
#region 获得集合
///
/// 获得集合
///
/// 客户端传递的用户操作实体
/// 固有集合
/// 操作类型 Add Edit
///
private static List GetLstColumn(List entity_lstColumn, MagicDefaultEntity defaultEntity, string handType)
{
List lstColumn = new List();
//获得用户自定义字段属性
List lstOut = entity_lstColumn.Where(o => o.value != null).ToList();
//获得固有字段属性
List lstIn = GetProperties(defaultEntity, handType);
//取并集 固有字段以后台添加的为准,前台如果有则去除
lstColumn = lstIn.Union(lstOut).ToList();
return lstColumn;
}
#endregion
#region 获得实体数据
///
/// 获得实体数据
///
///
///
///
///
public DataTable GetModel(string tableName, string fileds, string guid)
{
StringBuilder strSql = new StringBuilder();
strSql.AppendLine("SELECT " + fileds + " FROM " + tableName + " WHERE 1=1 AND CN_GUID=:CN_GUID");
DbCommand cmd = DataAccess.GetSqlStringCommand(strSql.ToString());
DataAccess.AddInParameter(cmd, "CN_GUID", ComDbType.STRING, guid);
DataTable dt = DataAccessExtensive.ExecuteDataTable(this.DataAccess, cmd);
return dt;
}
#endregion
#region 删除
///
/// 删除
///
///
///
///
public SqlExecuteResult Delete(string tableName, string guids)
{
StringBuilder strSql = new StringBuilder();
strSql.AppendLine("DELETE FROM " + tableName + " WHERE 1=1 AND CN_GUID in ('" + guids + "')");
DbCommand cmd = DataAccess.GetSqlStringCommand(strSql.ToString());
return ExecuteCommand(cmd, null);
}
#endregion
#region 获得DBTYPE类型
///
/// 获得DBTYPE类型
///
///
///
private DbType GetDbType(string typeStr)
{
//默认
DbType comType = ComDbType.STRING;
switch (typeStr.ToLower())
{
case "string":
comType = ComDbType.STRING;
break;
case "varchar":
comType = ComDbType.STRING;
break;
case "char":
comType = ComDbType.STRING;
break;
case "diction":
comType = ComDbType.STRING;
break;
case "quete":
comType = ComDbType.STRING;
break;
case "int":
comType = ComDbType.INT;
break;
case "datetime":
comType = ComDbType.DATE;
break;
case "float":
comType = ComDbType.FLOAT;
break;
case "decimal":
comType = ComDbType.DECIMAL;
break;
case "double":
comType = ComDbType.DOUBLE;
break;
}
return comType;
}
#endregion
#region 获得固有属性信息
///
/// 获得固有属性信息
///
///
///
/// 新增或者修改
///
public static List GetProperties(T t, string handType)
{
List lstColumn = new List();
string tStr = string.Empty;
if (t == null)
{
return lstColumn;
}
//将所有属性转换成一个集合供循环读取
System.Reflection.PropertyInfo[] properties = t.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
//如果类中没有属性则返回
if (properties.Length <= 0)
{
return lstColumn;
}
foreach (System.Reflection.PropertyInfo item in properties)
{
//如果类中的属性字段为值类型
if ((item.PropertyType.IsValueType || item.PropertyType.Name.StartsWith("String")))
{
string name = item.Name;
object value = item.GetValue(t, null);
string type = item.PropertyType.Name;
//如果修改
if (handType.Equals("Edit"))
{
object[] objArray = item.GetCustomAttributes(false);
if (objArray.Length > 0)
{
if ((objArray[0] as HH.WMS.Common.MagicModel.Property).Value == handType)
{
Column c = new Column();
c.name = name;
c.value = value == null ? "" : value.ToString();
c.type = type.ToUpper();
lstColumn.Add(c);
}
}
}
//如果是新增
else if (handType.Equals("Add"))
{
Column c = new Column();
c.name = name;
c.value = value == null ? "" : value.ToString();
c.type = type.ToUpper();
lstColumn.Add(c);
}
}
}
return lstColumn;
}
#endregion
#region 版本控制的 取状态和版本号
///
/// 版本控制的 取状态和版本号
///
///
///
///
public VersionControlEntity GetStatusVersioin(string CN_GUID, string TableName)
{
string strSql = "SELECT CN_N_VERSION,CN_S_STATUS FROM " + TableName + " WHERE CN_GUID=:CN_GUID";
DbCommand cmd = DataAccess.GetSqlStringCommand(strSql);
DataAccess.AddInParameter(cmd, "CN_GUID", ComDbType.STRING, CN_GUID);
VersionControlEntity entity = DataAccessExtensive.ExecuteSingleEntity(this.DataAccess, cmd, SetVersionEntity);
return entity;
}
private void SetVersionEntity(VersionControlEntity entity, IDataReader reader)
{
SetEntityUti(entity, "CN_N_VERSION", "CN_N_VERSION", reader);
SetEntityUti(entity, "CN_S_STATUS", "CN_S_STATUS", reader);
}
#endregion
#region 根据GUID更新状态
///
/// 根据GUID更新状态
///
///
///
///
///
///
public SqlExecuteResult UpdateStatus(string CN_GUID, string CN_S_STATUS, string tableName, bool update_version, DbTransaction trans)
{
string version = "";
if (update_version)
{
version = " ,CN_C_SCRAP_VERSION='N'";
}
string strSql = "UPDATE " + tableName + " SET CN_S_STATUS=:CN_S_STATUS " + version + " WHERE CN_GUID in ('" + CN_GUID + "')";
DbCommand cmd = DataAccess.GetSqlStringCommand(strSql);
DataAccess.AddInParameter(cmd, "CN_S_STATUS", ComDbType.STRING, CN_S_STATUS);
return ExecuteCommand(cmd, trans);
}
#endregion
#region 如果需要过程控制,则根据编码取最大版本的GUID
///
/// 如果需要过程控制,则根据编码取最大版本号对应的GUID
///
/// 编码名称 例如:ITEM目前是CN_S_ITEM_CODE,仓库为CN_S_STOCK_CODE
/// 编码名称对应的值
/// 表名称
///
public string GetGuid(string code_name, string code_value, string tableName)
{
StringBuilder strSql = new StringBuilder();
strSql.AppendLine("select CN_GUID from " + tableName + " ");
strSql.AppendLine(" where " + code_name + "='" + code_value + "' AND CN_N_VERSION=");
strSql.AppendLine("(SELECT MAX(CN_N_VERSION) FROM tn_ab_item_proc WHERE " + code_name + "='" + code_value + "' )");
DbCommand cmd = DataAccess.GetSqlStringCommand(strSql.ToString());
object obj = DataAccess.ExecuteScalar(cmd);
return obj == null ? "" : obj.ToString();
}
#endregion
#region 如果需要过程控制,则根据编码取最小版本的GUID
///
/// 如果需要过程控制,则根据编码取最小版本的GUID
///
/// 编码名称 例如:ITEM目前是CN_S_ITEM_CODE,仓库为CN_S_STOCK_CODE
/// 编码名称对应的值
/// 表名称
public string GetMinGuid(string code_name, string code_value, string tableName)
{
StringBuilder strSql = new StringBuilder();
strSql.AppendLine("select CN_GUID from " + tableName + " ");
strSql.AppendLine(" where " + code_name + "='" + code_value + "' AND CN_N_VERSION=");
strSql.AppendLine("(SELECT MIN(CN_N_VERSION) FROM tn_ab_item_proc WHERE " + code_name + "='" + code_value + "' )");
DbCommand cmd = DataAccess.GetSqlStringCommand(strSql.ToString());
object obj = DataAccess.ExecuteScalar(cmd);
return obj == null ? "" : obj.ToString();
}
#endregion
}
}