using System; using System.Collections; using System.Data; using BP.DA; using BP.Difference; using BP.Sys; using BP.Web; namespace BP.WF.HttpHandler { /// /// 页面功能实体 /// public class WF_CCForm_ChapterFrmDB : BP.WF.HttpHandler.DirectoryPageBase { /// /// 构造函数 /// public WF_CCForm_ChapterFrmDB() { } public string ChapterFrmDB_Init() { DataSet ds = new DataSet(); var en = new GEEntity(this.FrmID); en.OID = this.OID; if (en.RetrieveFromDBSources() == 0) en.InsertAsOID(this.OID); MapData md = new MapData(this.FrmID); ds.Tables.Add(md.ToDataTableField("Sys_MapData")); //获取分组信息 GroupFields gfs = new GroupFields(); gfs.Retrieve(GroupFieldAttr.FrmID, this.FrmID, "Idx"); MapDtls dtls = md.MapDtls; //获取字段信息 MapAttrs attrs = new MapAttrs(); attrs.Retrieve(MapAttrAttr.FK_MapData, this.FrmID, MapAttrAttr.MyDataType, 1, MapAttrAttr.UIVisible, 1, "Idx"); int mainVer = this.GetRequestValInt("MainVer"); int compareVer = this.GetRequestValInt("CompareVer"); if (mainVer == 0 || compareVer == 0) return "err@比对数据库的版本不正确:比对版本1=Ver" + mainVer + ".0 比对版本2=Ver" + compareVer + ".0"; //获取主版本的所有信息 FrmDBVers mainVers = new FrmDBVers(); mainVers.Retrieve("FrmID", this.FrmID, "RefPKVal", this.OID, "Ver", mainVer); FrmDBVers compareVers = new FrmDBVers(); compareVers.Retrieve("FrmID", this.FrmID, "RefPKVal", this.OID, "Ver", compareVer); MapAttrs newAttrs = new MapAttrs(); //获取历史版本数据 string mainStr = ""; string compareStr = ""; foreach(MapAttr attr in attrs) { if (attr.UIVisible == false) continue; mainStr = GetBigTextByKeyOfEn(attr.KeyOfEn, mainVers); compareStr = GetBigTextByKeyOfEn(attr.KeyOfEn, compareVers); if (mainStr.Equals(compareStr) == false) { attr.SetPara("MainStr", mainStr); attr.SetPara("CompareStr", compareStr); newAttrs.AddEntity(attr); continue; } } ds.Tables.Add(newAttrs.ToDataTableField("MapAttrs")); ds.Tables.Add(mainVers.ToDataTableField("MainVers")); ds.Tables.Add(compareVers.ToDataTableField("CompareVers")); //获取表单的主版本版本号 string mainVerPK = ""; foreach(FrmDBVer ver in mainVers) { if (DataType.IsNullOrEmpty(ver.KeyOfEn) == true) { mainVerPK = ver.MyPK; break; } } string compareVerPK = ""; foreach (FrmDBVer ver in compareVers) { if (DataType.IsNullOrEmpty(ver.KeyOfEn) == true) { compareVerPK = ver.MyPK; break; } } //获取从表的数据 mainStr = DBAccess.GetBigTextFromDB("Sys_FrmDBVer", "MyPK", mainVerPK, "FrmDtlDB"); compareStr = DBAccess.GetBigTextFromDB("Sys_FrmDBVer", "MyPK", compareVerPK, "FrmDtlDB"); gfs = GetNewGFS(gfs, mainStr, compareStr, "Dtl", dtls); //获取附件的数据 mainStr = DBAccess.GetBigTextFromDB("Sys_FrmDBVer", "MyPK", mainVerPK, "FrmAthDB"); compareStr = DBAccess.GetBigTextFromDB("Sys_FrmDBVer", "MyPK", compareVerPK, "FrmAthDB"); gfs = GetNewGFS(gfs, mainStr, compareStr, "Ath"); GroupFields ngfs = new GroupFields(); ngfs.AddEntities(gfs); //获取ChartFrmLink的对应表单数据 foreach (GroupField gf in gfs) { if (gf.CtrlType.Equals("ChapterFrmLinkFrm") == true) { mainStr = ""; compareStr = ""; string sql = "SELECT MyPK,Ver FROM Sys_FrmDBVer WHERE FrmID=" + SystemConfig.AppCenterDBVarStr + "FrmID AND RefPKVal=" + SystemConfig.AppCenterDBVarStr + "RefPKVal AND Ver IN(" + mainVer + "," + compareVer + ")"; Paras ps = new Paras(); ps.SQL = sql; ps.Add("FrmID", gf.CtrlID); ps.Add("RefPKVal", this.OID); DataTable dt = DBAccess.RunSQLReturnTable(ps); foreach (DataRow dr in dt.Rows) { int ver = int.Parse(dr[1].ToString()); if (ver == mainVer) mainStr = DBAccess.GetBigTextFromDB("Sys_FrmDBVer", "MyPK", dr[0].ToString(), "FrmDB"); if (ver == compareVer) compareStr = DBAccess.GetBigTextFromDB("Sys_FrmDBVer", "MyPK", dr[0].ToString(), "FrmDB"); } if (mainStr.Equals(compareStr) == true) ngfs.RemoveEn(gf); } continue; } ds.Tables.Add(ngfs.ToDataTableField("GroupFields")); return BP.Tools.Json.ToJson(ds); } private GroupFields GetNewGFS(GroupFields gfs, string mainStr, string compareStr, string ctrlType, MapDtls dtls = null) { //主版本和比对版本都不存在数据 if (DataType.IsNullOrEmpty(mainStr)==true && DataType.IsNullOrEmpty(compareStr) == true) { GroupFields ngfs = new GroupFields(); ngfs.AddEntities(gfs); foreach (GroupField gf in gfs) { if (gf.CtrlType.Equals(ctrlType) == true) ngfs.RemoveEn(gf); } return ngfs; } //两个比对版本其中一个为空时 if ((DataType.IsNullOrEmpty(mainStr) == true && DataType.IsNullOrEmpty(compareStr) == false) || (DataType.IsNullOrEmpty(mainStr) == false && DataType.IsNullOrEmpty(compareStr) == true)) return gfs; //两个版本的数据都不为空时,转成DataSet DataSet mds = BP.Tools.Json.ToDataSet(mainStr); DataSet cds = BP.Tools.Json.ToDataSet(compareStr); DataTable cdt = null; foreach(DataTable mdt in mds.Tables) { cdt = cds.Tables[mdt.TableName]; if (cdt != null) { //比对table中的内容 bool flag = CompareDataTable(mdt, cdt); if (flag == true) { if (ctrlType.Equals("Dtl") == true) { foreach(MapDtl dtl in dtls) { if(dtl.PTable.Equals(mdt.TableName)==true) gfs = RemoveByCtrlID(gfs, dtl.No); } } if (ctrlType.Equals("Ath") == true) gfs = RemoveByCtrlID(gfs, this.FrmID + "_" + mdt.TableName); } } } return gfs; } /// /// 比对两个DataTable在数据结构相同下数据是否相同 /// /// /// /// private bool CompareDataTable(DataTable dtA, DataTable dtB) { if (dtA.Rows.Count == dtB.Rows.Count) { //比内容 for (int i = 0; i < dtA.Rows.Count; i++) { for (int j = 0; j < dtA.Columns.Count; j++) { string columnName = dtA.Columns[j].ColumnName; if (columnName.Equals("OID") == true || columnName.Equals("WorkID") == true || columnName.Equals("MyPK") == true || columnName.Equals("RDT") == true) continue; if (dtA.Rows[i][j].Equals(dtB.Rows[i][j])==false) { return false; } } } return true; } else { return false; } } private GroupFields RemoveByCtrlID(GroupFields gfs,string ctrlID) { foreach(GroupField gf in gfs) { if (gf.CtrlID.Equals(ctrlID) == true) { gfs.RemoveEn(gf); return gfs; } } return gfs; } public string ChapterFrmDB_DtlInit() { string dtlNo = GetRequestVal("DtlNo"); DataSet myds = new DataSet(); MapDtl dtl = new MapDtl(dtlNo); DataTable Sys_MapDtl = dtl.ToDataTableField("Sys_MapDtl"); myds.Tables.Add(Sys_MapDtl); //明细表的表单描述 MapAttrs attrs = dtl.MapAttrs; DataTable Sys_MapAttr = attrs.ToDataTableField("Sys_MapAttr"); myds.Tables.Add(Sys_MapAttr); //明细表的配置信息. //DataTable Sys_MapExt = dtl.MapExts.ToDataTableField("Sys_MapExt"); // myds.Tables.Add(Sys_MapExt); //启用附件,增加附件信息 DataTable Sys_FrmAttachment = dtl.FrmAttachments.ToDataTableField("Sys_FrmAttachment"); myds.Tables.Add(Sys_FrmAttachment); return BP.Tools.Json.ToJson(myds); } public string ChapterFrmDB_Dtl() { string mainVerPK = this.GetRequestVal("MainVerPK"); string compareVerPK = this.GetRequestVal("CompareVerPK"); if (DataType.IsNullOrEmpty(mainVerPK) == true || DataType.IsNullOrEmpty(compareVerPK) == true) return "err@获取存储版本的主键值失败,请联系管理员"; //获取主版本的附件信息 string mainStr = DBAccess.GetBigTextFromDB("Sys_FrmDBVer", "MyPK", mainVerPK, "FrmDtlDB"); string compareStr = DBAccess.GetBigTextFromDB("Sys_FrmDBVer", "MyPK", compareVerPK, "FrmDtlDB"); DataTable dt = new DataTable(); dt.Columns.Add("MainDtls"); dt.Columns.Add("CompareDtls"); DataRow dr = dt.NewRow(); dr[0] = mainStr; dr[1] = compareStr; dt.Rows.Add(dr); return BP.Tools.Json.ToJson(dt); } /// /// 获取附件的版本比对信息 /// /// public string ChapterFrmDB_Ath() { string mainVerPK = this.GetRequestVal("MainVerPK"); string compareVerPK = this.GetRequestVal("CompareVerPK"); if (DataType.IsNullOrEmpty(mainVerPK) == true || DataType.IsNullOrEmpty(compareVerPK) == true) return "err@获取存储版本的主键值失败,请联系管理员"; //获取主版本的附件信息 string mainStr = DBAccess.GetBigTextFromDB("Sys_FrmDBVer", "MyPK", mainVerPK, "FrmAthDB"); string compareStr = DBAccess.GetBigTextFromDB("Sys_FrmDBVer", "MyPK", compareVerPK, "FrmAthDB"); DataTable dt = new DataTable(); dt.Columns.Add("MainAths"); dt.Columns.Add("CompareAths"); DataRow dr = dt.NewRow(); dr[0] = mainStr; dr[1] = compareStr; dt.Rows.Add(dr); return BP.Tools.Json.ToJson(dt); } public string ChapterFrmDB_FrmGener() { int mainVer = this.GetRequestValInt("MainVer"); int compareVer = this.GetRequestValInt("CompareVer"); if (mainVer==0 || compareVer==0) return "err@获取存储版本的主键值失败,请联系管理员"; MapData md = new MapData(this.FrmID); //主表实体. GEEntity en = new GEEntity(this.FrmID); en.OID = this.OID; if (en.RetrieveFromDBSources() == 0) return "表单" + md.Name + "的OID=" + this.OID + "的数据不存在"; string frmID = md.No; //根据表单存储的数据获取获取使用表单的版本号 int frmVer = 0; if (en.EnMap.Attrs.Contains("AtPara") == true) { frmVer = en.GetParaInt("FrmVer"); if (frmVer != 0 && frmVer != md.Ver2022) frmID = md.No + "." + frmVer; } DataSet ds = BP.Sys.CCFormAPI.GenerHisDataSet(frmID); //现在版本不是主版本的情况 if (frmID.Equals(this.FK_MapData) == false) { DataTable mddt = ds.Tables["Sys_MapData"]; mddt.Rows[0]["AtPara"] = mddt.Rows[0]["AtPara"] + "@MainFrmID=" + this.FK_MapData; //如果是傻瓜表单 if (md.HisFrmType == FrmType.FoolForm) { DataTable athdt = ds.Tables["Sys_FrmAttachment"]; if (frmVer != 0 && athdt.Rows.Count != 0) { DataTable gfdt = ds.Tables["Sys_GroupField"]; foreach (DataRow dr in athdt.Rows) { DataRow[] gfr = gfdt.Select("CtrlID='" + dr["MyPK"] + "'"); if (gfr.Length != 0) gfr[0]["CtrlID"] = md.No + "_" + dr["NoOfObj"]; dr["MyPK"] = md.No + "_" + dr["NoOfObj"]; } } } } //获取主版本的表单信息 string dbstr = SystemConfig.AppCenterDBVarStr; string sql = "SELECT MyPK,Ver FROM Sys_FrmDBVer WHERE FrmID=" + dbstr + "FrmID AND RefPKVal=" + dbstr + "RefPKVal AND Ver IN("+mainVer+","+compareVer+")"; Paras ps = new Paras(); ps.SQL = sql; ps.Add("FrmID", this.FrmID); ps.Add("RefPKVal", this.OID); DataTable dt = DBAccess.RunSQLReturnTable(ps); string mainStr = ""; string compareStr = ""; foreach (DataRow dr in dt.Rows) { int ver = int.Parse(dr[1].ToString()); if(ver==mainVer) mainStr = DBAccess.GetBigTextFromDB("Sys_FrmDBVer", "MyPK", dr[0].ToString(), "FrmDB"); if (ver == compareVer) compareStr = DBAccess.GetBigTextFromDB("Sys_FrmDBVer", "MyPK", dr[0].ToString(), "FrmDB"); } dt = new DataTable(); dt.TableName = "MainData"; dt.Columns.Add("Ver"); dt.Columns.Add("Data"); DataRow drr = dt.NewRow(); drr[0] = mainVer; drr[1] = mainStr; dt.Rows.Add(drr); drr = dt.NewRow(); drr[0] = compareVer; drr[1] = compareStr; dt.Rows.Add(drr); ds.Tables.Add(dt); return BP.Tools.Json.ToJson(ds); } /// /// 比对富文本的内容 /// /// /// /// private string GetBigTextByKeyOfEn(string keyOfEn,FrmDBVers vers) { foreach(FrmDBVer ver in vers) { if (DataType.IsNullOrEmpty(ver.KeyOfEn) == true) continue; if (ver.KeyOfEn.Equals(keyOfEn) == true) { return DBAccess.GetBigTextFromDB("Sys_FrmDBVer", "MyPK", ver.MyPK, "FrmDB"); } } return ""; } } }