using System;
using System.Data;
using System.Collections;
using BP.DA;
using BP.En;
namespace BP.Sys
{
///
/// 通用OID实体
///
public class GEEntity : Entity
{
#region 构造函数
///
/// 设置或者获取主键值.
///
public Int64 OID
{
get
{
return this.GetValInt64ByKey("OID");
}
set
{
this.SetValByKey("OID", value);
}
}
///
/// 主键值
///
public override string PK
{
get
{
return "OID";
}
}
///
/// 主键字段
///
public override string PKField
{
get
{
return "OID";
}
}
///
/// 转化为类.
///
///
public override string ToString()
{
return this.FrmID;
}
public override string ClassID
{
get
{
return this.FrmID;
}
}
///
/// 主键
///
public string FrmID = null;
///
/// 通用OID实体
///
public GEEntity()
{
}
///
/// 通用OID实体
///
/// 节点ID
public GEEntity(string fk_mapdata)
{
this.FrmID = fk_mapdata;
this._enMap = null;
}
///
///
///
///
///
public GEEntity(string frmID, object pk)
{
this.FrmID = frmID;
this.PKVal = pk;
this._enMap = null;
this.Retrieve();
}
#endregion
#region 构造映射.
///
/// 重写基类方法
///
public override Map EnMap
{
get
{
if (this._enMap != null)
return this._enMap;
if (this.FrmID == null)
throw new Exception("没有给[" + this.FrmID + "]值,您不能获取它的Map。");
this._enMap = BP.Sys.MapData.GenerHisMap(this.FrmID);
return this._enMap;
}
}
///
/// GEEntitys
///
public override Entities GetNewEntities
{
get
{
if (this.FrmID == null)
return new GEEntitys();
return new GEEntitys(this.FrmID);
}
}
#endregion
///
/// 从另外的一个实体来copy数据.
///
///
public void CopyFromFrm(GEEntity en)
{
//先求出来旧的OID.
Int64 oldOID = this.OID;
//复制主表数据.
this.Copy(en);
this.Save();
this.OID = oldOID;
//复制从表数据.
MapDtls dtls = new MapDtls(this.FrmID);
//被copy的明细集合.
MapDtls dtlsFrom = new MapDtls(en.FrmID);
if (dtls.Count != dtls.Count)
throw new Exception("@复制的两个表单从表不一致...");
//序号.
int i = 0;
foreach (MapDtl dtl in dtls)
{
//删除旧的数据.
DBAccess.RunSQL("DELETE FROM " + dtl.PTable + " WHERE RefPK='" + this.OID+"'");
//求对应的Idx的,从表配置.
MapDtl dtlFrom = dtlsFrom[i] as MapDtl;
GEDtls ensDtlFrom = new GEDtls(dtlFrom.No);
ensDtlFrom.Retrieve(GEDtlAttr.RefPK, oldOID);
//创建一个实体.
GEDtl dtlEnBlank = new GEDtl(dtl.No);
// 遍历数据,执行copy.
foreach (GEDtl enDtlFrom in ensDtlFrom)
{
dtlEnBlank.Copy(enDtlFrom);
dtlEnBlank.RefPK = this.OID.ToString();
dtlEnBlank.SaveAsNew();
}
i++;
}
//复制附件数据.
FrmAttachments aths = new FrmAttachments(this.FrmID);
FrmAttachments athsFrom = new FrmAttachments(en.FrmID);
foreach (FrmAttachment ath in aths)
{
//删除数据,防止copy重复
DBAccess.RunSQL("DELETE FROM Sys_FrmAttachmentDB WHERE FK_MapData='"+this.FrmID+"' AND RefPKVal='" + this.OID + "'");
foreach (FrmAttachment athFrom in athsFrom)
{
if (athFrom.NoOfObj != ath.NoOfObj)
continue;
FrmAttachmentDBs athDBsFrom = new FrmAttachmentDBs();
athDBsFrom.Retrieve(FrmAttachmentDBAttr.FK_FrmAttachment, athFrom.MyPK, FrmAttachmentDBAttr.RefPKVal, en.OID.ToString());
foreach (FrmAttachmentDB athDBFrom in athDBsFrom)
{
athDBFrom.setMyPK(DBAccess.GenerGUID());
athDBFrom.FrmID= this.FrmID;
athDBFrom.FK_FrmAttachment = ath.MyPK;
athDBFrom.RefPKVal = this.OID.ToString();
athDBFrom.Insert();
}
}
}
}
///
/// 把当前实体的数据copy到指定的主键数据表里.
///
/// 指定的主键
public void CopyToOID(Int64 oid)
{
//实例化历史数据表单entity.
Int64 oidOID = this.OID;
this.OID = oid;
this.Save();
//复制从表数据.
MapDtls dtls = new MapDtls(this.FrmID);
foreach (MapDtl dtl in dtls)
{
//删除旧的数据.
DBAccess.RunSQL("DELETE FROM " + dtl.PTable + " WHERE RefPK='" + this.OID+"'");
GEDtls ensDtl = new GEDtls(dtl.No);
// var typeVal = BP.Sys.Base.Glo.GenerRealType( ensDtl.GetNewEntity.EnMap.Attrs, GEDtlAttr.RefPK, this.OID);
ensDtl.Retrieve(GEDtlAttr.RefPK, oidOID.ToString() );
foreach (GEDtl enDtl in ensDtl)
{
enDtl.RefPK = this.OID.ToString();
enDtl.InsertAsNew();
}
}
//复制附件数据.
FrmAttachments aths = new FrmAttachments(this.FrmID);
foreach (FrmAttachment ath in aths)
{
//删除可能存在的新oid数据。
DBAccess.RunSQL("DELETE FROM Sys_FrmAttachmentDB WHERE FK_MapData='" + this.FrmID + "' AND RefPKVal='" + this.OID + "'");
//找出旧数据.
FrmAttachmentDBs athDBs = new FrmAttachmentDBs(this.FrmID, oidOID.ToString());
foreach (FrmAttachmentDB athDB in athDBs)
{
FrmAttachmentDB athDB_N = new FrmAttachmentDB();
athDB_N.Copy(athDB);
athDB_N.FrmID =this.FrmID;
athDB_N.RefPKVal =this.OID.ToString();
if (athDB_N.HisAttachmentUploadType == AttachmentUploadType.Single)
{
/*如果是单附件.*/
athDB_N.setMyPK(athDB_N.FK_FrmAttachment + "_" + this.OID);
if (athDB_N.IsExits == true)
continue; /*说明上一个节点或者子线程已经copy过了, 但是还有子线程向合流点传递数据的可能,所以不能用break.*/
athDB_N.Insert();
}
else
{
athDB_N.setMyPK(DBAccess.GenerGUID());
athDB_N.Insert();
}
}
}
}
private ArrayList _Dtls = null;
public ArrayList Dtls
{
get
{
if (_Dtls == null)
_Dtls = new ArrayList();
return _Dtls;
}
}
#region public 方法
protected virtual string SerialKey
{
get
{
return "OID";
}
}
///
/// 作为一个新的实体保存。
///
public void SaveAsNew()
{
try
{
this.OID = DBAccess.GenerOIDByKey32(this.SerialKey);
this.RunSQL(SqlBuilder.Insert(this));
}
catch (System.Exception ex)
{
this.CheckPhysicsTable();
throw ex;
}
}
///
/// 按照指定的OID Insert.
///
public void InsertAsOID(int oid)
{
this.SetValByKey("OID", oid);
try
{
this.RunSQL(SqlBuilder.Insert(this));
}
catch (Exception ex)
{
this.CheckPhysicsTable();
throw ex;
}
}
public void InsertAsOID(Int64 oid)
{
try
{
//先设置一个标记值,为的是不让其在[beforeInsert]产生oid.
this.SetValByKey("OID", -999);
//调用方法.
this.beforeInsert();
//设置主键.
this.SetValByKey("OID", oid);
this.RunSQL(SqlBuilder.Insert(this));
this.afterInsert();
}
catch (Exception ex)
{
this.CheckPhysicsTable();
throw ex;
}
}
///
/// 按照指定的OID 保存
///
///
public void SaveAsOID(int oid)
{
this.SetValByKey("OID", oid);
if (this.Update() == 0)
this.InsertAsOID(oid);
// this.SetValByKey("OID",oid);
// if (this.IsExits==false)
// this.InsertAsOID(oid);
//this.Update();
}
#endregion
}
///
/// 通用OID实体s
///
public class GEEntitys : EntitiesOID
{
#region 重载基类方法
public override string ToString()
{
//if (this.FrmID == null)
// throw new Exception("@没有能 FK_MapData 给值。");
return this.FrmID;
}
///
/// 主键
///
public string FrmID = null;
#endregion
#region 方法
///
/// 得到它的 Entity
///
public override Entity GetNewEntity
{
get
{
//if (this.FrmID == null)
// throw new Exception("@没有能 FK_MapData 给值。");
if (this.FrmID == null)
return new GEEntity();
return new GEEntity(this.FrmID);
}
}
///
/// 通用OID实体ID
///
public GEEntitys()
{
}
public GEEntitys(string frmID)
{
this.FrmID = frmID;
}
#endregion
#region 为了适应自动翻译成java的需要,把实体转换成List.
///
/// 转化成 java list,C#不能调用.
///
/// List
public System.Collections.Generic.IList ToJavaList()
{
return (System.Collections.Generic.IList)this;
}
///
/// 转化成list
///
/// List
public System.Collections.Generic.List Tolist()
{
System.Collections.Generic.List list = new System.Collections.Generic.List();
for (int i = 0; i < this.Count; i++)
{
list.Add((GEEntity)this[i]);
}
return list;
}
#endregion 为了适应自动翻译成java的需要,把实体转换成List.
}
}