Files
lserp_cs_6.0/插件库/Lskj.Control/Model/CommonMenu.cs
T
2026-08-04 13:49:05 +08:00

558 lines
24 KiB
C#

/******************************
* 说明:辅助工具操作类
* 创建人:龚宇超
* 创建日期:2017-12-20
* 修改人:
* 修改日期:
* 修改备注:
* 版本:1.0.0.0
******************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Windows.Forms;
using Lskj.Util;
using Lskj.Business.Impl;
using System.Diagnostics;
using Lskj.Model;
using Lskj.Data;
using System.IO;
using System.Data.SqlClient;
using Lskj.Business;
using DevExpress.XtraGrid.Views.Grid;
using Lskj.Core;
namespace Lskj.Control.Model
{
/// <summary>
/// 辅助工具操作类
/// </summary>
public class CommonMenu
{
protected GridControlEx GridControlObj;
protected GridView BaseGridView;
private DynamicModel _model;
/// <summary>
/// 控件面板
/// </summary>
private MyControl _controlObj;
public bool issuccess = true;
/// <summary>
/// 最初账套版本
/// </summary>
public DataRow AccountItem;
/// <summary>
/// Occurs when [apply before].
/// </summary>
public event CommonToolApplyEventHandler ApplyBefore;
public event CommonToolAfterDynamicLinkEventHandler DynamicLinkAfter;
public event StoredProcedureAfterExecute ReturnStoredProcedureValue;
/// <summary>
/// Initializes a new instance of the <see cref="CommonMenu"/> class.
/// </summary>
/// <param name="rowItem">常用工具数据行.</param>
public CommonMenu(DynamicModel model, MyControl control, System.Windows.Forms.Control view = null)
{
this._model = model;
this._controlObj = control;
if (view != null) this.GridControlObj = view as GridControlEx;
if (this.GridControlObj != null)
{
this.BaseGridView = this.GridControlObj.GridView;
}
}
/// <summary>
/// <para>说明:执行常用功能</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-12-20 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="rowItem">当前选中按钮绑定的数据源行</param>
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
public bool Apply(DataRow rowItem)
{
bool resultValue = false;
if (rowItem == null || this._controlObj == null) return resultValue;
GridRightMenuModel model = new GridRightMenuModel(rowItem);
try
{
//if (!string.IsNullOrWhiteSpace(model.MenuCond))
//{
// try
// {
// string cond = ReplaceHelper.ReplaceUserInfo(model.MenuCond);
// if (this._controlObj != null)
// {
// cond = _controlObj.ReplaceControlValue(model.MenuCond);
// }
// if (BaseGridView != null && BaseGridView.GetFocusedDataRow() != null)
// {
// DataRow parentitem = BaseGridView.GetFocusedDataRow();
// cond = ReplaceHelper.ReplaceRowParam(parentitem, cond) + "";
// }
// bool result = ReplaceHelper.EvalCond(cond);
// if (!result) return false;
// }
// catch (Exception)
// {
// MessageUtil.Show(ResourceKeys.SetRightMenuCondFault);
// }
//}
if (!string.IsNullOrEmpty(model.UnionZTid))
{
string UnionZTid = ReplaceHelper.ReplaceRowParam(BaseGridView.GetFocusedDataRow(), model.UnionZTid);
string condition = string.Format("where ShowName ='{0}'", ERPInfo.Instance.AccountBook);
DataTable dt = MainImpl.GetLedgerList(condition);
DataRow RT = BaseImpl.GetDataRowResult($"select * from p_sydbGroupTab where ID={UnionZTid}");
AccountItem = dt.Rows[0];
AccountItem["IP"] = DBConfig.Instance.ServerName;
ToDBatching(RT, AccountItem);
}
if (!string.IsNullOrWhiteSpace(model.BeforeMsg))
{
string prompt = this._controlObj.ReplaceControlValue(model.BeforeMsg);
if (prompt.StartsWith("@") || prompt.StartsWith("!"))
{
prompt = BaseImpl.GetDefaultValue(prompt);
}
if (!string.IsNullOrWhiteSpace(prompt))
{
DialogResult result = MessageUtil.Show(prompt, MessageBoxButtons.YesNo);
// DialogResult result = MessageUtil.Show(this._controlObj.ReplaceControlValue(model.BeforeMsg), MessageBoxButtons.YesNo);
if (result != DialogResult.Yes)
{
return resultValue;
}
}
}
ApplyArgs applyArgs = new ApplyArgs();
applyArgs.MemuModel = model;
if (ApplyBefore != null)
{
ApplyBefore(applyArgs);
}
if (applyArgs.CancelFlag) return false;
List<string> paramList = HandleRightMenuParams(model.ParamList);
string maintabFocusedRowJson = "";
if (BaseGridView != null && BaseGridView.GetFocusedDataRow() != null)
{
maintabFocusedRowJson = BaseGridView.GetFocusedDataRow().ToJsonObject(); // 假设 ToJsonObject() 是将对象转换为 JSON 字符串的方法
}
paramList.Add(maintabFocusedRowJson);
string dllName = this._controlObj.ReplaceControlValue(model.DllName).Trim();
if (BaseGridView != null && BaseGridView.GetFocusedDataRow() != null)
{
DataRow parentitem = BaseGridView.GetFocusedDataRow();
dllName = ReplaceHelper.ReplaceRowParam(parentitem, dllName).Trim();
}
switch (model.ActionType)
{
case 1: // 执行存储过程
resultValue = ExecProcedure(model.Action, paramList);
break;
case 2: // 调用dll程序
resultValue = ExecDynamicLinkLibary(model, paramList, rowItem, dllName);
break;
case 3: //调用delphi程序
resultValue = ExecDelphiLibary(model.DllName, paramList);
break;
case 0: // 执行sql语句
resultValue = ExecSqlValue(model.Action);
break;
default:
// 特殊处理程序
if (dllName.EndsWith(".exe") && !model.WipeExes.Contains(dllName.ToString()))
{
// 执行exe程序
WinHelper.WinExec(dllName, 1);
}
else if (dllName.StartsWith("www.") ||
dllName.StartsWith("http://") ||
dllName.StartsWith("https://") ||
dllName.StartsWith("ftp://") ||
dllName.StartsWith("file://"))
{
// 打开网页程序
Process.Start(dllName);
}
break;
}
}
catch (Exception ex)
{
LogUtil.WriteError("执行常用功能出错!", ex);
//MessageUtil.Show("执行常用功能出错!" + ex);
string Message = ErrorMessage.PromptErrorMessage(ex);
MessageUtil.Show(Message, ex.Message);
}
finally
{
if (!string.IsNullOrEmpty(model.UnionZTid)) ToDBatching(AccountItem, AccountItem);
}
return true;
}
/// <summary>
/// <para>说明:处理常用工具菜单10个扩展参数</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-10-30 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="paramList">The parameter list.</param>
private List<string> HandleRightMenuParams(List<string> paramList)
{
List<string> handleParamList = new List<string>();
foreach (string item in paramList)
{
if (!string.IsNullOrWhiteSpace(item))
{
string fieldValue = ReplaceHelper.ReplaceUserInfo(item);
string firstChar = fieldValue.Substring(0, 1);
switch (firstChar)
{
case "@": // sql处理
{
if (BaseGridView != null && BaseGridView.GetFocusedDataRow() != null)
{
DataRow parentitem = BaseGridView.GetFocusedDataRow();
fieldValue = ReplaceHelper.ReplaceRowParam(parentitem, item) + "";
}
string value = MainImpl.GetResult(this._controlObj.ReplaceControlValue(fieldValue.Replace("@", ""))) + "";
handleParamList.Add(value);
}
break;
case "{": // 字段特殊替换
{
if (BaseGridView != null && BaseGridView.GetFocusedDataRow() != null)
{
DataRow parentitem = BaseGridView.GetFocusedDataRow();
fieldValue = ReplaceHelper.ReplaceRowParam(parentitem, item) + "";
}
handleParamList.Add(this._controlObj.ReplaceControlValue(fieldValue));
}
break;
case "#": // 需要传入的sql语句
handleParamList.Add(this._controlObj.ReplaceControlValue(fieldValue.Replace("#", "")));
break;
case "[": //[FormTitle_格式数据
if (fieldValue.StartsWith("[FormTitle_"))
{
handleParamList.Add(this._controlObj.ReplaceControlValue(fieldValue.Replace("[FormTitle_", "")));
}
else
{
handleParamList.Add(this._controlObj.ReplaceControlValue(fieldValue));
}
break;
default:
if (BaseGridView != null && BaseGridView.GetFocusedDataRow() != null)
{
DataRow parentitem = BaseGridView.GetFocusedDataRow();
fieldValue = ReplaceHelper.ReplaceRowParam(parentitem, item) + "";
}
handleParamList.Add(this._controlObj.ReplaceControlValue(fieldValue));
break;
}
}
else
{
handleParamList.Add(item);
}
}
return handleParamList;
}
/// <summary>
/// <para>说明:执行存储过程</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-10-31 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="procName">Name of the proc.</param>
/// <param name="paramList">The parameter list.</param>
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
private bool ExecProcedure(string procName, List<string> paramList)
{
if (string.IsNullOrWhiteSpace(procName))
{
MessageUtil.Show(ResourceKeys.OperFault + "未配置执行存储过程.");
return false;
}
else
{
bool reaultValue = true;
List<string> procParams = ReplaceHelper.GetParamFields(procName);
if (procParams.Count == 0)
{
MessageUtil.Show(ResourceKeys.OperFault + "存储过程配置错误.");
return false;
}
string[] paramStr = procParams[0].Replace("{", "").Replace("}", "").Split(',');
List<SqlParameter> sqlParamList = new List<SqlParameter>();
SqlParameter pMsg = new SqlParameter("@msg", SqlDbType.VarChar, 2000);
for (int i = 0; i < paramStr.Length; i++)
{
string item = paramStr[i];
if (paramStr[i].Equals("@msg", StringComparison.OrdinalIgnoreCase))
{
pMsg.Direction = ParameterDirection.InputOutput;
pMsg.Value = "";
sqlParamList.Add(pMsg);
}
else
{
string paramStr1 = paramStr[i];
SqlParameter param = new SqlParameter(string.Format("{0}", paramStr1), SqlDbType.VarChar);
param.Value = paramList[i];
sqlParamList.Add(param);
}
}
SqlParameter returnValue = new SqlParameter("@return", SqlDbType.Int, 4);
returnValue.Direction = ParameterDirection.ReturnValue;
sqlParamList.Add(returnValue);
int result = MainImpl.ExecProcedure(procName.Replace(procParams[0], ""), sqlParamList.ToArray());
int rValue = Convert.ToInt32(returnValue.Value);
switch (rValue)
{
case -1:
MessageUtil.Show(ResourceKeys.OperFault + "\n" + pMsg.Value);
reaultValue = false;
break;
case 99:
MessageUtil.Show(pMsg.Value + "");
break;
case 9999:
FrmPrompt frmPrompt = new FrmPrompt(pMsg.Value + "");
DialogResult dialogResult = frmPrompt.ShowDialog();
if (dialogResult == DialogResult.OK)
{
SqlParameter param = sqlParamList.FirstOrDefault(x => "@msg".Equals(x.ParameterName));
param.Value = frmPrompt.PromptMsg;
this.ExecProcedure(procName, paramList);
}
break;
default:
if (ReturnStoredProcedureValue != null)
{
ReturnStoredProcedureValue(pMsg.Value + "");
}
MessageUtil.Show(ResourceKeys.OperSuccess);
break;
}
return reaultValue;
}
}
/// <summary>
/// <para>说明:执行sql语句</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-10-31 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="sqlValue">The SQL value.</param>
/// <param name="rowData">The row data.</param>
private bool ExecSqlValue(string sqlValue)
{
if (string.IsNullOrWhiteSpace(sqlValue))
{
MessageUtil.Show(ResourceKeys.OperFault + "未配置执行sql语句");
return false;
}
else
{
MainImpl.GetResult(this._controlObj.ReplaceControlValue(sqlValue));
MessageUtil.Show(ResourceKeys.OperSuccess);
}
return true;
}
/// <summary>
/// <para>说明:执行动态链接库</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-11-01 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
private bool ExecDynamicLinkLibary(GridRightMenuModel model, List<string> paramList, DataRow rowItem, string dllname)
{
issuccess = true;
if (string.IsNullOrWhiteSpace(dllname))
{
MessageUtil.Show(ResourceKeys.OperFault + "未配置动态链接库.");
return false;
}
else
{
switch (dllname.ToLower())
{
case "iexplore.exe": // 调用ie浏览器
string url = (paramList[0] + Uri.EscapeUriString(paramList[1])).Replace("#", "%23");
Process.Start("iexplore.exe", url);
break;
case "lstest.exe": // 调用附件下载
StringBuilder dfile = new StringBuilder();
StringBuilder rfile = new StringBuilder();
int hwnd = 0;
dfile.Append(paramList[0] + paramList[1]);
rfile = DelphiHelper.DownloadAttach(dfile, hwnd);
rfile.Clear();
rfile.Append(PubUtil.FileDownLoadTempPath + Path.GetFileName(dfile.ToString()));
if (File.Exists(rfile.ToString()))
{
Process.Start(rfile.ToString(), "");
}
break;
default:
List<string> str = new List<string>
{
//_model.FormText,
model.MenuName,
ERPInfo.Instance.UserId,
ERPInfo.Instance.UserName,
"3",
_model.ModuleCode,
paramList[0],
paramList[1],
paramList[2],
paramList[3],
paramList[4],
paramList[5],
paramList[6],
paramList[7],
paramList[8],
paramList[9],
paramList[10],
paramList[11],
paramList[12]//固定添加行数据json字符串
};
//string maintabFocusedRowJson = "";
//if (BaseGridView != null && BaseGridView.GetFocusedDataRow() != null)
//{
// maintabFocusedRowJson = BaseGridView.GetFocusedDataRow().ToJsonObject(); // 假设 ToJsonObject() 是将对象转换为 JSON 字符串的方法
//}
//str.Add(maintabFocusedRowJson); // 现在可以添加元素了,因为 str 是 List<string>
// // 假设你需要将 List<string> 转回字符串数组,可以这样操作
string[] strArray = str.ToArray();
IForm form = FormHelper.LoadDllForm(dllname, strArray);
if (form == null)
{
MessageUtil.Show(ResourceKeys.DyncmicDllNotFount);
return false;
}
if (form.SubForm == null)
{
MessageUtil.Show(ResourceKeys.DyncmicDllInitFault);
return false;
}
form.SubForm.WindowState = model.MaxWindow ? FormWindowState.Maximized : FormWindowState.Normal;
form.SubForm.Text = model.MenuName;
if (form.SubForm is BaseForm)
{
(form.SubForm as BaseForm).ParentView = this.BaseGridView;
}
form.SubForm.ShowDialog();
if (DynamicLinkAfter != null)
{
ApplyArgs applyArgs = new ApplyArgs();
applyArgs.MemuModel = model;
if (form.SubForm.Tag != null && form.SubForm.Tag is FormDialogModel)
{
applyArgs.DialogModel = form.SubForm.Tag as FormDialogModel;
}
DynamicLinkAfter(this, applyArgs);
}
break;
}
}
return true;
}
/// <summary>
/// <para>说明:</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-11-01 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="libaryName">Name of the libary.</param>
/// <param name="paramList">The parameter list.</param>
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
private bool ExecDelphiLibary(string libaryName, List<string> paramList)
{
try
{
DelphiHelper.LoadDelphiDll(libaryName, paramList[0], paramList[1], paramList[2], paramList[3], Convert.ToInt32(paramList[4]), paramList[5]);
return true;
}
catch (Exception ex)
{
//MessageUtil.Show(ex);
string Message = ErrorMessage.PromptErrorMessage(ex);
MessageUtil.Show(Message, ex.Message);
}
return false;
}
/// <summary>
/// 启动账套数据源刷新
/// </summary>
protected void ToDBatching(DataRow RT, DataRow firstrow)
{
string serverIP = RT["IP"] + "";
string dbName = RT["DBName"] + "";
string dataBook = RT["ShowName"] + "";
bool isInternal = RT.Table.Columns.Contains("IsInternalNetwork") && !string.IsNullOrEmpty(RT["IsInternalNetwork"] + "") ? "1".Equals(RT["IsInternalNetwork"] + "") : false;
DBConfig.Instance.DataBook = dataBook;
DBConfig.Instance.ServerName = serverIP;
DBConfig.Instance.DataBase = dbName;
DBConfig.Instance.IsInternalNetwork = isInternal;
if (!DBConfig.Instance.CreateConnection())
{
ToDBatching(firstrow, firstrow);
}
}
}
}