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 } }