using System; using System.ComponentModel; using System.Reflection; using HcUtility.Comm; using System.Data.Common; using System.Data; using System.Text; using System.Collections.Generic; using Newtonsoft.Json.Converters; using Microsoft.Practices.EnterpriseLibrary.Data; namespace HcUtility.Core { /// /// 功能: 业务单据的基类 /// 创建: 吴伟 2009-05-07 /// 说明: /// /// public abstract class ModelObjectBill : ModelObjectBase { virtual public string GetBillNoFieldName() { return "BillNo"; } virtual public string GetStateFieldName() { return "STATE"; } virtual public string GetOrgCode() { return "OrgCode"; } virtual public string GetYwTypeFieldName() { return "YwType"; } virtual public string GetTimeMarkFieldName() { return "TimeMark"; } virtual public string GetCompanyFieldName() { return "CORPID"; } virtual public string GetDeptFieldName() { return "SALEDEPT"; } /// /// 用于某些实体类保存后更新一次timemark 以便连续进行保存 /// virtual public void TimeMarkNext() { var _TimeMarkField = GetTimeMarkFieldName(); if (!string.IsNullOrEmpty(_TimeMarkField)) { var TimeMarkValue = Convert.ToInt32(GetValue(_TimeMarkField)); TimeMarkValue++; SetValue(_TimeMarkField, TimeMarkValue.ToString()); } } virtual public object GetBillNoValue() { return GetPropertyValue(GetBillNoFieldName()); } virtual public object GetStateValue() { return GetPropertyValue(GetStateFieldName()); } //virtual public List GetFieldList() //{ // //从数据库获取字段信息表 // var headList = new List(); // Database db = DatabaseFactory.CreateDatabase(); // string sql = "select * from tSYS_FieldInfo where TABLENAME='" + TableName + "' "; // using (IDataReader reader = db.ExecuteReader(CommandType.Text, sql)) // { // while (reader.Read()) // { // Fieldmb data = new Fieldmb(); // #region Set DB data to Object // data.GID = Convert.ToString(reader["GID"]); // data.TABLENAME = Convert.ToString(reader["TABLENAME"]); // data.FIELDNAME = Convert.ToString(reader["FIELDNAME"]); // data.FIELDTYPE = Convert.ToString(reader["FIELDTYPE"]); // data.DEFAULTVALUE = Convert.ToString(reader["DEFAULTVALUE"]); // data.NOTFLANK = Convert.ToString(reader["NOTFLANK"]); // data.DECIMALLIMIT = Convert.ToString(reader["DECIMALLIMIT"]); // data.SORT = Convert.ToString(reader["SORT"]); // data.VIEWTYPE = Convert.ToString(reader["VIEWTYPE"]); // data.WIDTH = Convert.ToString(reader["WIDTH"]); // data.HEIGHT = Convert.ToString(reader["HEIGHT"]); // #endregion // headList.Add(data); // } // reader.Close(); // } // return headList; // //return FieldList; //} //取得新的单据号 //获取新的业务编号 public static List> getDicList(List ExtendObjectList) { var list = new List>(); if (ExtendObjectList.Count > 0) { foreach (var data in ExtendObjectList) { list.Add(data.ExtendDic); } } return list; } virtual public string GetNewBillNo(Database db) { string billNo = String.Empty; using (DbCommand cmd = db.GetStoredProcCommand("sSysGetBillNo")) { db.AddInParameter(cmd, "ps_BillType", DbType.String, GetPropertyValue(GetYwTypeFieldName()).ToString()); db.AddOutParameter(cmd, "ps_BillNo", DbType.String, 20); db.ExecuteNonQuery(cmd); billNo = Convert.ToString(db.GetParameterValue(cmd, "ps_BillNo")); } return billNo; } //检查时间戳 virtual public DBResult CheckTimeMark(Database db, IDbConnection idbConn, IDbTransaction idbTran, ref List listCmd) { DBResult result = new DBResult(); result.Success = true; result.Message = ""; string timeMarkFieldName = this.GetTimeMarkFieldName(); if (!string.IsNullOrEmpty(timeMarkFieldName)) { ModelDBAttribute attribute; if ((base.DbOperationType != DbOperationType.DbotUpd) && (base.DbOperationType != DbOperationType.DbotDel)) { return result; } DbCommand sqlStringCommand = null; string str2 = string.Empty; string str3 = string.Empty; StringBuilder builder = new StringBuilder(); StringBuilder builder2 = new StringBuilder(); builder.Append("select convert(bigint ," + timeMarkFieldName + ") from " + base.TableName); builder.Append(" where "); PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(this); foreach (PropertyDescriptor descriptor in properties) { foreach (Attribute attribute2 in descriptor.Attributes) { if (attribute2 is ModelDBAttribute) { attribute = (ModelDBAttribute)attribute2; if (ModelDBOprationType.Edit == (ModelDBOprationType.Edit & attribute.MDBType)) { str2 = (attribute.UpdFieldName == string.Empty) ? descriptor.Name : attribute.UpdFieldName; str3 = (attribute.UpdParamName == string.Empty) ? descriptor.Name : attribute.UpdParamName; if (attribute.IsPrimary) { if (builder2.Length != 0) { builder2.Append(" and "); } builder2.Append(str2 + "=@" + str3); } } } } } if (Extended()) { foreach (var d in ExtendDataList) { if (d.MDB.IsPrimary) { if (builder2.Length != 0) { builder2.Append(" and "); } builder2.Append("[" + d.Name + "]" + "=@" + d.Name); } } } builder.Append(builder2.ToString()); sqlStringCommand = db.GetSqlStringCommand(builder.ToString()); sqlStringCommand.Connection = (DbConnection)idbConn; sqlStringCommand.Transaction = (DbTransaction)idbTran; foreach (PropertyDescriptor descriptor in properties) { foreach (Attribute attribute2 in descriptor.Attributes) { if (attribute2 is ModelDBAttribute) { attribute = (ModelDBAttribute)attribute2; if (ModelDBOprationType.Edit == (ModelDBOprationType.Edit & attribute.MDBType)) { str2 = (attribute.UpdFieldName == string.Empty) ? descriptor.Name : attribute.UpdFieldName; str3 = (attribute.UpdParamName == string.Empty) ? descriptor.Name : attribute.UpdParamName; if (attribute.IsPrimary) { str3 = (attribute.UpdParamName == string.Empty) ? descriptor.Name : attribute.UpdParamName; DbType dbType = TypeConvertUtil.ConverTypeToDbType(descriptor.PropertyType); object obj2 = descriptor.GetValue(this); db.AddInParameter(sqlStringCommand, "@" + str3, dbType, descriptor.GetValue(this)); } } } } } if (Extended()) { foreach (var d in ExtendDataList) { if (d.MDB.IsPrimary) { db.AddInParameter(sqlStringCommand, "@" + d.Name, DbType.String, d.Value); } } } if (listCmd != null) { listCmd.Add(sqlStringCommand); } object obj3 = sqlStringCommand.ExecuteScalar(); object propertyValue = this.GetPropertyValue(this.GetTimeMarkFieldName()); if (!(Convert.ToDecimal(obj3) == Convert.ToDecimal(propertyValue))) { result.Success = false; result.Message = "数据已被其他人修改!请刷新后重试!"; } } return result; } //删除前处理 public virtual DBResult BeforeDeleteHandler(Database db, IDbConnection idbConn, IDbTransaction idbTran) { string prcName = "sMsSysBeforeDelete"; return this.ProcedureHandlerComm(db, idbConn, idbTran, prcName); } //删除后处理 public virtual DBResult AfterDeleteHandler(Database db, IDbConnection idbConn, IDbTransaction idbTran) { string prcName = "sMsSysAfterDelete"; return this.ProcedureHandlerComm(db, idbConn, idbTran, prcName); } //保存后处理 virtual public DBResult AfterSaveHandler(Database db, IDbConnection idbConn, IDbTransaction idbTran, ref List listCmd) { string prcName = "sMsSysAfterSave"; return this.ProcedureHandlerComm(db, idbConn, idbTran, prcName); } private DBResult ProcedureHandlerComm(Database db, IDbConnection idbConn, IDbTransaction idbTran, string prcName) { DBResult result = new DBResult(); result.Success = true; string ywTypeFieldName = this.GetYwTypeFieldName(); string str2 = Convert.ToString(this.GetPropertyValue(ywTypeFieldName)); if (string.IsNullOrEmpty(str2)) { result.Success = true; result.Message = "不需要处理"; return result; } try { DbCommand storedProcCommand = db.GetStoredProcCommand(prcName); storedProcCommand.Connection = (DbConnection)idbConn; storedProcCommand.Transaction = (DbTransaction)idbTran; storedProcCommand.Parameters.Clear(); db.AddInParameter(storedProcCommand, "ps_BillNo", DbType.String, this.GetPropertyValue(this.GetBillNoFieldName()).ToString()); db.AddInParameter(storedProcCommand, "ps_YwType", DbType.String, str2); decimal loginUserID = 0M; string loginUserCode = string.Empty; string loginUserName = string.Empty; if (this is ModelObjectBillHead) { ModelObjectBillHead head = (ModelObjectBillHead)this; loginUserID = head.LoginUserID; loginUserCode = head.LoginUserCode; loginUserName = head.LoginUserName; } db.AddInParameter(storedProcCommand, "ps_UserCode", DbType.String, loginUserCode); db.AddInParameter(storedProcCommand, "ps_UserName", DbType.String, loginUserName); db.AddOutParameter(storedProcCommand, "pi_Result", DbType.Int32, 0x20); db.AddOutParameter(storedProcCommand, "ps_Message", DbType.String, 0x7d0); storedProcCommand.ExecuteNonQuery(); result.Success = Convert.ToInt32(db.GetParameterValue(storedProcCommand, "pi_Result")) == 1; result.Message = Convert.ToString(db.GetParameterValue(storedProcCommand, "ps_Message")); if (!result.Success) { throw new ModelDbException(result.Message); } } catch (Exception exception) { result.Success = false; if (!(exception is ModelDbException)) { result.Message = exception.ToString(); } } return result; } //取得属性的值 public object GetPropertyValue(string propertyname) { Type type = null; try { type = this.GetType(); PropertyInfo myPropInfo = type.GetProperty(propertyname); if (myPropInfo != null) { object value = myPropInfo.GetValue(this, null); if (value == null) return String.Empty; if (value!=null && string.IsNullOrEmpty(value.ToString())) { return GetExtendValue(propertyname); } else return value; } else { return GetExtendValue(propertyname); } } catch { return String.Empty; } } public string GetValue(string propertyname) { try { return GetPropertyValue(propertyname).ToString(); } catch (Exception e) { return ""; } } public bool isnew() { var result = false; if (GetValue(GetBillNoFieldName()) == "*" || string.IsNullOrWhiteSpace(GetValue(GetBillNoFieldName()))) { result = true; } return result; } public int GetInt32(string propertyname) { string _r = GetPropertyValue(propertyname).ToString(); var result = 0; var _r2 = isNumberic(_r,out result); return result; } public Decimal GetDecimal(string propertyname) { string _r = GetPropertyValue(propertyname).ToString(); Decimal result = 0; var _r2 = isDecimal(_r, out result); return result; } protected bool isNumberic(string message, out int result) { //判断是否为整数字符串 //是的话则将其转换为数字并将其设为out类型的输出值、返回true, 否则为false result = 0; //result 定义为out 用来输出值 try { //当数字字符串的为是少于4时,以下三种都可以转换,任选一种 //如果位数超过4的话,请选用Convert.ToInt32() 和int.Parse() //result = int.Parse(message); //result = Convert.ToInt16(message); result = Convert.ToInt32(message); return true; } catch { return false; } } protected bool isDecimal(string message, out Decimal result) { //判断是否为整数字符串 //是的话则将其转换为数字并将其设为out类型的输出值、返回true, 否则为false result = 0; //result 定义为out 用来输出值 try { //当数字字符串的为是少于4时,以下三种都可以转换,任选一种 //如果位数超过4的话,请选用Convert.ToInt32() 和int.Parse() //result = int.Parse(message); //result = Convert.ToInt16(message); result = Convert.ToDecimal(message); return true; } catch { return false; } } public bool GetBoolen(string propertyname) { var _r = GetPropertyValue(propertyname).ToString(); bool result = (_r.Trim() == ""|| _r=="false"|| _r == "False" || _r == "0") ? false : true; return result; } public Decimal GetMoney(string propertyname) { try { var result = Convert.ToDecimal(GetValue(propertyname)); return result; } catch { return -1; } } //public class ModelObjectConvert where T:ModelObjectBase //{ // private static ModelObjectBase Converter(T inputObject) // { // return inputObject; // } // public static List ToModelObjectList(List objList) // { // if (objList == null) // return null; // return objList.ConvertAll(new Converter(Converter)); // } // public static List> ToExtendList(List objList) // { // if (objList == null) // return null; // else{ // var result = new List>(); // foreach(var obj in objList){ // result.Add(obj.ExtendDic); // } // return result; // } // } //} ///////////// //设置属性的值 /// /// /////////// /// /// /// /// public bool SetPropertyValue(string propertyname, object value) { Type type = null; try { type = this.GetType(); PropertyInfo myPropInfo = type.GetProperty(propertyname); if (myPropInfo != null) { myPropInfo.SetValue(this, value, null); return true; } else { return SetExtendValue(propertyname, value.ToString()); } } catch (NullReferenceException e) { throw new Exception(type.ToString() + "中没有(" + propertyname + ")属性!错误信息:" + e.ToString()); } } public bool SetPropertyValue(IDataReader reader) { for (int i = 0; i < reader.FieldCount; i++) { var _name = reader.GetName(i); var _value = Convert.ToString(reader.GetValue(i)); try { SetPropertyValue(reader.GetName(i), Convert.ToString(reader.GetValue(i))); } catch (NullReferenceException e) { throw e; } } return true; } public bool AddDBParam(string propertyName, object propertyValue) { //动态添加一个name=propertyName value=propertyValue的属性 //令其Attribut为ModelDBAttribute //try //{ // var newproperty = new System.Collections.Generic.KeyValuePair(propertyName, propertyValue); // (this as System.Collections.Generic.ICollection>).Add(newproperty); //} //catch (Exception e) { // throw e; //} return false; //var ca = TypeDescriptor.GetAttributes(this).OfType(); //TypeDescriptor.AddAttributes(typeof(this), new CategoryAttribute("naughty")); //ca = TypeDescriptor.GetAttributes(typeof(ModelDBAttribute)).OfType().FirstOrDefault(); } /// /// 获取扩展的属性值 /// /// /// public object GetExtendValue(string propertyname) { if (Extended()) { foreach (var d in ExtendDataList) { if (d.Name == propertyname) return d.Value; } } return String.Empty; } //设置属性的值 public bool SetExtendValue(string propertyname, string value) { if (Extended()) { if (Have(propertyname)) { foreach (var d in ExtendDataList) { if (d.Name == propertyname) { d.Value = value; return true; } } } else { AddExtendDate(propertyname, value); return true; } } else { AddExtendDate(propertyname, value); return true; } return false; } //private void AddEData(string propertyname, string value) //{ // var _dt = GetPKey(); // if ((_dt[propertyname] & ModelDBOprationType.All) > 0) // { // AddExtendDate(propertyname, value, true, _dt[propertyname]); // } // else // { // AddExtendDate(propertyname, value); // } //} public bool SetExtendValue(IDataReader reader, bool upper = false) { for (int i = 0; i < reader.FieldCount; i++) { var _name = reader.GetName(i); var _value = Convert.ToString(reader.GetValue(i)); if (upper) _value = _value.ToUpper(); try { SetExtendValue(_name, _value); } catch (NullReferenceException e) { throw e; } } return true; } public bool SetExtendValue(DataTable table,DataRow row) { var namelist = GetColumnsByDataTable(table); int a = table.Rows.Count; var _i = 0; foreach (var fieldname in namelist) { var value = row[_i].ToString(); SetValue(fieldname, value); _i++; } return true; } public static string[] GetColumnsByDataTable(DataTable dt) { string[] strColumns = null; if (dt.Columns.Count > 0) { int columnNum = 0; columnNum = dt.Columns.Count; strColumns = new string[columnNum]; for (int i = 0; i < dt.Columns.Count; i++) { strColumns[i] = dt.Columns[i].ColumnName; } } return strColumns; } public void SetExtendValue_Save(Dictionary SaveDicList) { foreach (var d in SaveDicList) { try { if (d.Value == null) { SetExtendValue(d.Key, ""); }else SetExtendValue(d.Key, d.Value.ToString()); } catch (NullReferenceException e) { throw e; } } } public void SetExtendValue_Null(Dictionary SaveDicList) { foreach (var d in SaveDicList) { try { SetExtendValue(d.Key, ""); } catch (NullReferenceException e) { throw e; } } } //获取表的字段值 public void GetTableField(Database db) { this.SaveDic.Clear(); using (DbCommand cmd = db.GetSqlStringCommand("select sc.name Name, case when st.name='timestamp' then 0 when st.name='image' then 0 else 1 end CanSave from syscolumns sc,systypes st where sc.xtype=st.xtype and sc.id in(select id from sysobjects where xtype='U' and name='" + TableName + "')")) { var reader = db.ExecuteReader(cmd); while (reader.Read()) { var Name = Convert.ToString(reader["Name"]); if (!this.SaveDic.ContainsKey(Name)) this.SaveDic.Add(Name, Convert.ToString(reader["CanSave"])); } } } public static T Deserialize(string json) {//只为了解析成Dictionary T obj = Activator.CreateInstance(); var jsonObj = json; if (json == null) jsonObj = string.Empty; obj = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonObj); return obj; } public void SetValue(Database db, string JsonStr) { this.GetTableField(db); var _Dic = Deserialize>(JsonStr); this.SetExtendValue_Save(_Dic); } public void SetValue(Database db, Dictionary Dic) { //this.GetTableField(db); //var _Dic = Deserialize>(JsonStr); this.SetExtendValue_Save(Dic); } public void SetValue(Dictionary Dic) { //this.GetTableField(db); //var _Dic = Deserialize>(JsonStr); this.SetExtendValue_Save(Dic); } public void SetValue(string Name, string Value) { //this.GetTableField(db); //var _Dic = Deserialize>(JsonStr); this.SetExtendValue(Name, Value); } public bool isNull(string Name) { if (string.IsNullOrWhiteSpace(GetValue(Name))) { return true; } else return false; } /// /// 如果被写入的值为空 则将值写入 /// 用于填充默认值(有值的就不填默认进去了) /// /// /// public void setNoNullDef(string Name,string DefValue="0") { if (isNull(Name)) { SetValue(Name, DefValue); } } /// /// 如果值不为空 则将值写入 /// 用于批量修改(未设置值的数据将不会被更新成空) /// /// /// public void setValue_NoNull(string Name, string Value) { if (!string.IsNullOrWhiteSpace(Value)) { SetValue(Name, Value); } } public void SetBoolToTinyint(string Name) { var v = this.GetExtendValue(Name).ToString(); if (v == "true") { this.SetExtendValue(Name, "1"); } else { this.SetExtendValue(Name, "0"); } } } }