using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using Mesnac.Action.Base;
using Mesnac.Basic;
using Mesnac.Codd.Session;
using Mesnac.Controls.Base;
using Mesnac.Controls.Default;
namespace Mesnac.Action.Default.Purview
{
///
/// 窗体、控件权限信息加载类
/// 创建人:李毓明
/// 创建时间:2013-7-25
/// 说明:从工程文件中加载窗体、控件权限信息至数据表中
///
public class LoadPurview : DatabaseAction , IAction
{
private string _projectPath = Path.Combine( Application.StartupPath , "Data" , "MCProject" , "nodeForm" ); //组态工程路径
List listPurview = null;
public void Run(RuntimeParameter runtime)
{
base.RunIni(runtime);//必须调用
if ( MessageBox.Show( Language(12) , Language(11) , MessageBoxButtons.YesNo , MessageBoxIcon.Warning ) == DialogResult.No )
{
return;
}
base.LogDebug( "通用方法——将权限窗体加载至数据库" );
DbHelper dbHelper = NewDbHelper(Mesnac.Basic.DataSourceFactory.MCDbType.Local);
if (dbHelper == null)
{
return;
}
dbHelper.ClearParameter();
dbHelper.CommandType = CommandType.Text;
dbHelper.CommandText = "UPDATE BasForm SET DeleteFlag='1';UPDATE BasFormFunction SET DeleteFlag='1';";
dbHelper.ExecuteNonQuery();
listPurview = new List();
#region 命令
Dictionary> dic = XmlHandler.GetProjectCommands( Path.Combine( Application.StartupPath , "Data" , "MCProject" ) );
foreach ( string actionname in dic.Keys )
{
listPurview.Add( new FormPurview( string.Empty , actionname , actionname , "Command" ) );
}
#endregion
#region 画面
if ( Directory.Exists( _projectPath ) )
{
DirectoryInfo dicInfo = new DirectoryInfo( _projectPath );
FileInfo[] files = dicInfo.GetFiles( "*.xml" , SearchOption.AllDirectories );
if ( files.Length > 0 )
{
string cleandown;
StreamReader sr;
XmlDocument doc;
foreach ( FileInfo file in files )
{
try
{
sr = new StreamReader( file.FullName );
cleandown = sr.ReadToEnd();
sr.Close();
cleandown = "" + cleandown + "";
doc = new XmlDocument();
doc.LoadXml( cleandown );
loadPurview( doc );
}
catch ( Exception ex )
{
Console.Write( ex.Message );
}
}
}
}
#endregion
freshPurview( dbHelper );
ShowMsg( Language(9) );
}
private void loadPurview( XmlDocument doc )
{
if ( doc == null )
return;
XmlNode nForm = doc.DocumentElement.FirstChild;//窗体组态保存xml时,规定第一个元素是Form
if ( nForm != null )
{
FormPurview formPurview = new FormPurview( nForm );
if ( !string.IsNullOrEmpty( formPurview.PurviewName ) && !string.IsNullOrEmpty( formPurview.PurviewText ) && !string.IsNullOrEmpty( formPurview.PurviewType ) )
listPurview.Add( formPurview );
}
}
private void freshPurview( DbHelper helper )
{
if ( listPurview == null )
return;
StringBuilder sb;
helper.CommandType = CommandType.Text;
foreach ( FormPurview pur in listPurview )
{
sb = new StringBuilder();
sb.AppendLine( "IF EXISTS(SELECT * FROM BasForm WHERE FormName=@FormName)" );
sb.AppendLine( "UPDATE BasForm SET FormText=@FormText, FormType=@FormType, DeleteFlag='0' OUTPUT inserted.ObjID WHERE FormName=@FormName;" );
sb.AppendLine( "ELSE" );
sb.AppendLine( "INSERT INTO BasForm(FormName,FormText,FormType,DeleteFlag) OUTPUT inserted.ObjID" );
sb.Append( "VALUES(@FormName,@FormText,@FormType,'0');" );
helper.ClearParameter();
helper.AddParameter( "@FormName" , pur.PurviewName );
helper.AddParameter( "@FormText" , pur.PurviewText );
helper.AddParameter( "@FormType" , pur.PurviewType );
helper.CommandText = sb.ToString();
int formId = Convert.ToInt32( helper.ToScalar() );
if ( formId < 1 || pur.FunctionList == null || pur.FunctionList.Count < 1 )
continue;
foreach ( FunctionPurview func in pur.FunctionList )
{
freshFunction( func , helper , formId );
}
}
}
private void freshFunction( FunctionPurview func , DbHelper helper , int formId )
{
StringBuilder sb = new StringBuilder();
sb.AppendLine( "IF EXISTS(SELECT * FROM BasFormFunction WHERE FormID=@FormID AND FunctionName=@FunctionName)" );
sb.AppendLine( "UPDATE BasFormFunction SET FunctionText=@FunctionText, FunctionType=@FunctionType, DeleteFlag='0' WHERE FormID=@FormID AND FunctionName=@FunctionName;" );
sb.AppendLine( "ELSE" );
sb.AppendLine( "INSERT INTO BasFormFunction(FormID,FunctionName,FunctionText,FunctionType,DeleteFlag)" );
sb.Append( "VALUES(@FormID,@FunctionName,@FunctionText,@FunctionType,'0');" );
helper.ClearParameter();
helper.AddParameter( "@FormID" , formId );
helper.AddParameter( "@FunctionName" , func.PurviewName );
helper.AddParameter( "@FunctionText" , func.PurviewText );
helper.AddParameter( "@FunctionType" , func.PurviewType );
helper.CommandText = sb.ToString();
helper.ExecuteNonQuery();
}
}
///
/// 窗体权限类
///
class FormPurview : APurview
{
private List listFunction = null;
public FormPurview( XmlNode node )
{
if ( node != null )
{
XmlAttribute att = node.OwnerDocument.DocumentElement.Attributes[ "FILE_NAME" ];//;node.Attributes[ "name" ];
if ( att != null )
PurviewName = att.Value;
XmlNode n = node.SelectSingleNode( "Property[@name=\"Text\"]" );
if ( n != null )
PurviewText = n.InnerText;
att = node.Attributes[ "type" ];
if ( att != null )
PurviewType = att.Value.Split( ',' )[ 0 ];
FunctionPurview func;
listFunction = new List();
XmlNodeList cnList = node.SelectNodes( "//Property[@name=\"MCPurview\"]" );
foreach ( XmlNode cn in cnList )
{
if ( cn.ParentNode.Attributes[ "name" ].Value == PurviewName )
continue;
if ( cn.InnerText.ToLower() != "true" )
continue;
func = new FunctionPurview( cn.ParentNode );
if ( !string.IsNullOrEmpty( func.PurviewName ) && !string.IsNullOrEmpty( func.PurviewText ) && !string.IsNullOrEmpty( func.PurviewType ) )
listFunction.Add( func );
}
}
}
public FormPurview( string objId , string formName , string formText , string formType )
: base( objId , formName , formText , formType )
{
listFunction = new List();
}
public List FunctionList
{
get
{
return listFunction;
}
}
public override DataTable GetPurviews( DbHelper dbhelper )
{
if ( dbhelper == null )
return null;
dbhelper.ClearParameter();
dbhelper.CommandType = CommandType.Text;
dbhelper.CommandText = "SELECT ObjID,FormName,FormText,FormType FROM BasForm WHERE DeleteFlag='0'";
return dbhelper.ToDataTable();
}
}
///
/// 控件权限类
///
class FunctionPurview : APurview
{
public FunctionPurview( XmlNode node )
{
if ( node != null )
{
XmlAttribute att = node.Attributes[ "name" ];
if ( att != null )
PurviewName = att.Value;
XmlNode n = node.SelectSingleNode( "Property[@name=\"Text\"]" );
if ( n != null )
PurviewText = n.InnerText;
att = node.Attributes[ "type" ];
if ( att != null )
PurviewType = att.Value.Split( ',' )[ 0 ];
}
}
public FunctionPurview( string objId , string functionName , string functionText , string functionType )//string formId ,
: base( objId , functionName , functionText , functionType )
{
}
public override DataTable GetPurviews( DbHelper dbhelper )
{
if ( dbhelper == null )
return null;
dbhelper.ClearParameter();
dbhelper.CommandType = CommandType.Text;
dbhelper.CommandText = "SELECT ObjID,FormID,FunctionName,FunctionText,FunctionType FROM BasForm WHERE DeleteFlag='0'";
return dbhelper.ToDataTable();
}
}
interface IPurview
{
DataTable GetPurviews( DbHelper dbhelper );
}
abstract class APurview : IPurview
{
protected APurview()
{
}
public APurview( string objId , string purviewName , string purviewText , string purviewType )
{
this.ObjID = objId;
this.PurviewName = purviewName;
this.PurviewText = purviewText;
this.PurviewType = purviewType;
}
public string ObjID
{
get;
set;
}
public string PurviewName
{
get;
set;
}
public string PurviewText
{
get;
set;
}
public string PurviewType
{
get;
set;
}
#region IPurview 成员
public abstract DataTable GetPurviews( DbHelper dbhelper );
#endregion
}
}