using System;
using System.IO;
using System.Data;
using BP.DA;
using BP.Port;
using BP.En;
using BP.Sys;
using BP.WF.Template;
namespace BP.WF.DTS
{
///
/// Method 的摘要说明
///
public class OneKeyLoadTemplete : Method
{
///
/// 不带有参数的方法
///
public OneKeyLoadTemplete()
{
this.Title = "一键恢复流程模版目录";
this.Help = "此功能是一键备份流程的逆向操作.";
this.Help += "@执行时请注意";
this.Help += "@1,系统所有的流程数据、模版数据、组织结构数据、将会被删除。";
this.Help += "@2,重新装载C:/CCFlowTemplete 的数据。";
this.Help += "@3,此功能一般提供给ccflow的开发者用于不同的数据库之间的移植。";
this.GroupName = "数据备份/恢复";
}
///
/// 设置执行变量
///
///
public override void Init()
{
}
///
/// 当前的操纵员是否可以执行这个方法
///
public override bool IsCanDo
{
get
{
if (BP.Web.WebUser.No != "admin")
return false;
return true;
}
}
public override object Do()
{
string msg = "";
#region 检查数据文件是否完整.
string path = "C:/CCFlowTemplete";
if (System.IO.Directory.Exists(path) == false)
msg += "@错误:约定的目录不存在服务器" + path + ",请把从ccflow备份的文件放入" + path;
//PortTables.
string file = path + "/PortTables.xml";
if (System.IO.File.Exists(file) == false)
msg += "@错误:约定的文件不存在," + file;
//SysTables.
file = path + "/SysTables.xml";
if (System.IO.File.Exists(file) == false)
msg += "@错误:约定的文件不存在," + file;
//FlowTables.
file = path + "/FlowTables.xml";
if (System.IO.File.Exists(file) == false)
msg += "@错误:约定的文件不存在," + file;
#endregion 检查数据文件是否完整.
#region 1 装载流程基础表数据.
DataSet ds = new DataSet();
ds.ReadXml(path + "/FlowTables.xml");
//流程类别.
FlowSorts sorts = new FlowSorts();
sorts.ClearTable();
DataTable dt = ds.Tables["WF_FlowSort"];
// sorts = QueryObject.InitEntitiesByDataTable(sorts, dt, null) as FlowSorts;
foreach (FlowSort item in sorts)
{
item.DirectInsert(); //插入数据.
}
#endregion 1 装载流程基础表数据.
#region 2 组织结构.
ds = new DataSet();
ds.ReadXml(path + "/PortTables.xml");
//Port_Emp.
Emps emps = new Emps();
emps.ClearTable();
dt = ds.Tables["Port_Emp"];
emps = QueryObject.InitEntitiesByDataTable(emps, dt, null) as Emps;
foreach (Emp item in emps)
{
item.DirectInsert(); //插入数据.
}
//Depts.
Depts depts = new Depts();
depts.ClearTable();
dt = ds.Tables["Port_Dept"];
depts = QueryObject.InitEntitiesByDataTable(depts, dt, null) as Depts;
foreach (Dept item in depts)
{
item.DirectInsert(); //插入数据.
}
//Stations.
Stations stas = new Stations();
stas.ClearTable();
dt = ds.Tables["Port_Station"];
stas = QueryObject.InitEntitiesByDataTable(stas, dt, null) as Stations;
foreach (Station item in stas)
item.DirectInsert(); //插入数据.
//EmpDepts.
BP.Port.DeptEmps eds = new BP.Port.DeptEmps();
eds.ClearTable();
dt = ds.Tables["Port_DeptEmp"];
eds = QueryObject.InitEntitiesByDataTable(eds, dt, null) as BP.Port.DeptEmps;
foreach (BP.Port.DeptEmp item in eds)
{
item.DirectInsert(); //插入数据.
}
#endregion 2 组织结构.
#region 3 恢复系统数据.
ds = new DataSet();
ds.ReadXml(path + "/SysTables.xml");
//枚举Main.
SysEnumMains sems = new SysEnumMains();
sems.ClearTable();
dt = ds.Tables["Sys_EnumMain"];
sems = QueryObject.InitEntitiesByDataTable(sems, dt, null) as SysEnumMains;
foreach (SysEnumMain item in sems)
{
item.DirectInsert(); //插入数据.
}
//枚举.
SysEnums ses = new SysEnums();
ses.ClearTable();
dt = ds.Tables["Sys_Enum"];
ses = QueryObject.InitEntitiesByDataTable(ses, dt, null) as SysEnums;
foreach (SysEnum item in ses)
{
item.DirectInsert(); //插入数据.
}
////Sys_FormTree.
//BP.Sys.SysFormTrees sfts = new SysFormTrees();
//sfts.ClearTable();
//dt = ds.Tables["Sys_FormTree"];
//sfts = QueryObject.InitEntitiesByDataTable(sfts, dt, null) as SysFormTrees;
//foreach (SysFormTree item in sfts)
//{
// try
// {
// item.DirectInsert(); //插入数据.
// }
// catch
// {
// }
//}
#endregion 3 恢复系统数据.
#region 4.备份表单相关数据.
if (1 == 2)
{
string pathOfTables = path + "/SFTables";
System.IO.Directory.CreateDirectory(pathOfTables);
SFTables tabs = new SFTables();
tabs.RetrieveAll();
foreach (SFTable item in tabs)
{
if (item.No.Contains("."))
continue;
string sql = "SELECT * FROM " + item.No;
ds = new DataSet();
ds.Tables.Add(DBAccess.RunSQLReturnTable(sql));
ds.WriteXml(pathOfTables + "/" + item.No + ".xml");
}
}
#endregion 4 备份表单相关数据.
#region 5.恢复表单数据.
//删除所有的流程数据.
MapDatas mds = new MapDatas();
mds.RetrieveAll();
foreach (MapData fl in mds)
{
//if (fl.FK_FormTree.Length > 1 || fl.FK_FrmSort.Length > 1)
// continue;
fl.Delete(); //删除流程.
}
//清除数据.
SysFormTrees fss = new SysFormTrees();
fss.ClearTable();
// 调度表单文件。
string frmPath = path + "/Form";
DirectoryInfo dirInfo = new DirectoryInfo(frmPath);
DirectoryInfo[] dirs = dirInfo.GetDirectories();
foreach (DirectoryInfo item in dirs)
{
if (item.FullName.Contains(".svn"))
continue;
string[] fls = System.IO.Directory.GetFiles(item.FullName);
if (fls.Length == 0)
continue;
SysFormTree fs = new SysFormTree();
fs.No = item.Name.Substring(0, item.Name.IndexOf('.'));
fs.Name = item.Name.Substring(item.Name.IndexOf('.'));
fs.ParentNo = "0";
fs.Insert();
foreach (string f in fls)
{
try
{
msg += "@开始调度表单模板文件:" + f;
System.IO.FileInfo info = new System.IO.FileInfo(f);
if (info.Extension != ".xml")
continue;
ds = new DataSet();
ds.ReadXml(f);
MapData md = MapData.ImpMapData(ds);
md.FK_FormTree = fs.No;
md.Update();
}
catch (Exception ex)
{
msg += "@调度失败,文件:" + f + ",异常信息:" + ex.Message;
}
}
}
#endregion 5.恢复表单数据.
#region 6.恢复流程数据.
//删除所有的流程数据.
Flows flsEns = new Flows();
flsEns.RetrieveAll();
foreach (Flow fl in flsEns)
{
fl.DoDelete(); //删除流程.
}
dirInfo = new DirectoryInfo(path + "/Flow/");
dirs = dirInfo.GetDirectories();
//删除数据.
FlowSorts fsRoots = new FlowSorts();
fsRoots.ClearTable();
//生成流程树.
FlowSort fsRoot = new FlowSort();
fsRoot.No = "99";
fsRoot.Name = "流程树";
fsRoot.ParentNo = "0";
fsRoot.DirectInsert();
foreach (DirectoryInfo dir in dirs)
{
if (dir.FullName.Contains(".svn"))
continue;
string[] fls = System.IO.Directory.GetFiles(dir.FullName);
if (fls.Length == 0)
continue;
FlowSort fs = new FlowSort();
fs.No = dir.Name.Substring(0, dir.Name.IndexOf('.'));
fs.Name = dir.Name.Substring(3);
fs.ParentNo = fsRoot.No;
fs.Insert();
foreach (string filePath in fls)
{
msg += "\t\n@开始调度流程模板文件:" + filePath;
Flow myflow = BP.WF.Template.TemplateGlo.LoadFlowTemplate(fs.No, filePath, ImpFlowTempleteModel.AsTempleteFlowNo);
msg += "\t\n@流程:" + myflow.Name + "装载成功。";
System.IO.FileInfo info = new System.IO.FileInfo(filePath);
myflow.Name = info.Name.Replace(".xml", "");
if (myflow.Name.Substring(2, 1) == ".")
myflow.Name = myflow.Name.Substring(3);
myflow.DirectUpdate();
}
}
#endregion 6.恢复流程数据.
BP.DA.Log.DebugWriteInfo(msg);
//删除多余的空格.
BP.WF.DTS.DeleteBlankGroupField dts = new DeleteBlankGroupField();
dts.Do();
//执行生成签名.
GenerSiganture gs = new GenerSiganture();
gs.Do();
return msg;
}
}
}