SVN r1104

SVN-Revision: r1104
This commit is contained in:
cyf
2026-01-30 07:48:24 +00:00
parent 5ccfe15fee
commit 47cf35aa28
45 changed files with 4096 additions and 449 deletions
@@ -34,6 +34,8 @@ using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Web;
using System.Windows.Forms;
@@ -100,22 +102,22 @@ namespace Lskj.Control.Model
//判断是否存在网址框(需要绑定右键打开事件判断是否生成 网址框右键)
bool existLabWWW = false;
if (view is GridControlEx)
if (view is GridControlEx)
{
GridControlEx grid= view as GridControlEx;
foreach (GridColumn item in grid.GridView.Columns)
GridControlEx grid = view as GridControlEx;
foreach (GridColumn item in grid.GridView.Columns)
{
if (item.Tag is GridColumnModel)
if (item.Tag is GridColumnModel)
{
GridColumnModel gridColumnModel = item.Tag as GridColumnModel;
if (gridColumnModel.FieldType == ControlType.LabWWW) existLabWWW = true;
}
}
}
if (((table == null || table.Rows.Count == 0) && menu == null)&& !existLabWWW) return;
if (((table == null || table.Rows.Count == 0) && menu == null) && !existLabWWW) return;
ContextMenuStrip cmsMenu = new ContextMenuStrip();
cmsMenu.Opening += new CancelEventHandler(MenuStripOpening);
@@ -274,17 +276,20 @@ namespace Lskj.Control.Model
ToolStripMenuItem item = sender as ToolStripMenuItem;
DXMenuItem items = sender as DXMenuItem;
DataRow[] rowArray = GetSelectedRows();
GridRightMenuModel model = item == null ? items.Tag as GridRightMenuModel : item.Tag as GridRightMenuModel;
if (!model.Mergeexec && !model.MoreClick && rowArray.Length > 1)
{
MessageUtil.Show(string.Format(ResourceKeys.ExecRightMenuOnlyOne, model.MenuName));
return;
}
if (model.AllowNullExec && rowArray.Length == 0)
{
rowArray = new DataRow[] { new DataTable().NewRow() };
}
if (rowArray.Length == 0 && model.IsMustSelectRow())
{
MessageUtil.Show(ResourceKeys.SelectRowIsNull);
@@ -341,9 +346,9 @@ namespace Lskj.Control.Model
MessageUtil.Show(Message, ex.Message);
LogHelper.Instance.WriteError(ex);
}
finally
finally
{
if(!string.IsNullOrEmpty(model.UnionZTid))ToDBatching(AccountItem, AccountItem);
if (!string.IsNullOrEmpty(model.UnionZTid)) ToDBatching(AccountItem, AccountItem);
}
}
/// <summary>
@@ -449,7 +454,7 @@ namespace Lskj.Control.Model
string actionSql = string.Empty;
bool execOnlyOne = IsExecOnlyOne(model, paramListEx, rows, out actionSql);
bool tipOnlyOne = true; // 执行是否提示一次
bool allowBefore = ApiHelper.IsExecEventApi(Interface.Api.OperateEvent.BeforeModuleContextMenu, Model.ModuleCode, model.Id);
bool allowAfter = ApiHelper.IsExecEventApi(Interface.Api.OperateEvent.AfterModuleContextMenu, Model.ModuleCode, model.Id);
@@ -531,25 +536,74 @@ namespace Lskj.Control.Model
// 特殊处理程序
else if (dllName.Contains(".exe") && !model.WipeExes.Contains(dllName.ToString()) && (dllName.ToLower() != "lstest.exe"))
{
//删除选中行的json信息
if(!string.IsNullOrWhiteSpace(maintabFocusedRowJson))paramList.Remove(maintabFocusedRowJson);
// 创建进程启动信息对象
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = File.Exists(dllName) ? dllName : PubUtil.AbsolutelyLibPath + dllName; // 指定要启动的 EXE 路径
// 将参数数组拼接为命令行字符串(注意空格处理)
// 若参数包含空格,需要用双引号包裹,避免被解析为多个参数
startInfo.Arguments = string.Join(" ", paramList.Select(arg =>
arg.Contains(" ") ? $"\"{arg}\"" : arg
));
// 可选:设置进程启动选项
startInfo.UseShellExecute = false; // 不使用系统外壳程序(建议为 false,便于重定向输入输出)
startInfo.CreateNoWindow = false; // 是否在新窗口中启动(false 为显示窗口)
// 启动进程
Process process = Process.Start(startInfo);
// 执行exe程序
//WinHelper.WinExec(File.Exists(dllName) ? dllName : PubUtil.AbsolutelyLibPath + dllName, 1);
// WinHelper.WinExec(dllName);
string[] dllNameSplit = Regex.Split(dllName, ":args=");
string[] pmsSplit = dllNameSplit.Length > 1 ? (dllNameSplit[1] + "").Split(',') : null;
if (dllNameSplit.Length > 1 && pmsSplit != null && pmsSplit.Length > 0)//嵌入exe模块
{
string[] pmsArgs = pmsSplit.Select(pms => ReplaceHelper.ReplaceUserInfo(pms)).ToArray();
string guid = Guid.NewGuid().ToString();
Panel mainPanel = new Panel();
ProcessStartInfo processStartInfo = new ProcessStartInfo()
{
FileName = dllNameSplit[0],
Arguments = HandleHelper.CombineArgs(pmsArgs),
UseShellExecute = false,
RedirectStandardOutput = false,
RedirectStandardError = false,
CreateNoWindow = false
};
Process startedProcess = Process.Start(processStartInfo);
if (startedProcess == null)
{
MessageUtil.Show("进程启动失败");
return false;
}
startedProcess.WaitForInputIdle();
int retry = 0;
while (startedProcess.MainWindowHandle == IntPtr.Zero && retry < 500)
{
Thread.Sleep(100);
startedProcess.Refresh();
retry++;
}
IntPtr exeMainHandle = startedProcess.MainWindowHandle;
if (exeMainHandle == IntPtr.Zero)
{
MessageBox.Show("无法获取启动程序的主窗口句柄");
return false;
}
HandleHelper.SetFormNoneStyle(exeMainHandle, mainPanel);
mainPanel.Dock = DockStyle.Fill;
using (BaseForm baseForm = new BaseForm())
{
baseForm.WindowState = FormWindowState.Maximized;
baseForm.Controls.Add(mainPanel);
baseForm.ShowDialog();
}
}
else
{
//删除选中行的json信息
if (!string.IsNullOrWhiteSpace(maintabFocusedRowJson)) paramList.Remove(maintabFocusedRowJson);
// 创建进程启动信息对象
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = File.Exists(dllName) ? dllName : PubUtil.AbsolutelyLibPath + dllName; // 指定要启动的 EXE 路径
// 将参数数组拼接为命令行字符串(注意空格处理)
// 若参数包含空格,需要用双引号包裹,避免被解析为多个参数
startInfo.Arguments = string.Join(" ", paramList.Select(arg =>
arg.Contains(" ") ? $"\"{arg}\"" : arg
));
// 可选:设置进程启动选项
startInfo.UseShellExecute = false; // 不使用系统外壳程序(建议为 false,便于重定向输入输出)
startInfo.CreateNoWindow = false; // 是否在新窗口中启动(false 为显示窗口)
// 启动进程
Process process = Process.Start(startInfo);
// 执行exe程序
//WinHelper.WinExec(File.Exists(dllName) ? dllName : PubUtil.AbsolutelyLibPath + dllName, 1);
}
}
else if (dllName.StartsWith("www.") ||
dllName.StartsWith("http://") ||
@@ -580,7 +634,7 @@ namespace Lskj.Control.Model
switch (model.ActionType)
{
case 1: // 执行存储过程
if (i == rows.Length - 1 || execOnlyOne )
if (i == rows.Length - 1 || execOnlyOne)
{
//执行最后一条
FinallySucceeded = true;
@@ -633,8 +687,13 @@ namespace Lskj.Control.Model
return resultValue;
}
public bool OpenFrmcCover(GridRightMenuModel model, List<string> paramList)
/// <summary>
/// 导入数据或者反写到界面
/// </summary>
/// <param name="model"></param>
/// <param name="paramList"></param>
/// <returns></returns>
public bool OpenFrmcCover(GridRightMenuModel model, List<string> paramList)
{
bool importIntoDatabase = false;
@@ -647,32 +706,58 @@ namespace Lskj.Control.Model
return false;
}
}
else
else
{
//模式2,保存到数据库中,在执行保存后sql
importIntoDatabase = true;
if (string.IsNullOrWhiteSpace(paramList[1]) )
if (string.IsNullOrWhiteSpace(paramList[1]))
{
MessageUtil.Show("模块编号未配置");
return false;
}
}
string primaryKey = paramList[2];
FrmCover frmCover = new FrmCover(importIntoDatabase,paramList[1], paramList[2], paramList[3]);
if (frmCover.ShowDialog() == DialogResult.OK&& !importIntoDatabase)
FrmCover frmCover = new FrmCover(importIntoDatabase, paramList[1], paramList[2], paramList[3]);
if (frmCover.ShowDialog() == DialogResult.OK && !importIntoDatabase)
{
//反写数据源
DataTable ReverseData = frmCover.ReverseData;
//外部数据
DataTable table = GetDataTable();
// 2. 筛选出 ReverseData 和 table 中名称和数据类型都相同的列(排除主键列,避免重复赋值)
// 提取 ReverseData 中所有的主键值
HashSet<object> reversePrimaryKeys = new HashSet<object>(
ReverseData.AsEnumerable()
.Select(dr => dr[primaryKey])
.Where(val => val != DBNull.Value && val != null)
);
// 获取table中,没有更新的行(在ReverseData中没有对应主键)
IEnumerable<DataRow> noUpdateRows = table.AsEnumerable()
.Where(dr => dr[primaryKey] != DBNull.Value && dr[primaryKey] != null
&& !reversePrimaryKeys.Contains(dr[primaryKey]));
//提示存在没有更新的行
if (noUpdateRows.Any())
{
// 提示没有反写的数据
string noUpdateIds = string.Join("、", noUpdateRows.Select(dr => dr[primaryKey].ToString()));
string text = string.Format("有 {0} 条数据未更新,主键为:{1} \r\n请确认是否要继续", noUpdateRows.Count(), noUpdateIds);
DialogResult result = MessageUtil.Show(text, MessageBoxButtons.YesNo);
if (result != DialogResult.Yes)
{
return false;
}
}
//筛选出 ReverseData 和 table 中名称和数据类型都相同的列(排除主键列,避免重复赋值)
var commonColumns = ReverseData.Columns.Cast<DataColumn>()
.Where(col1 => col1.ColumnName != primaryKey // 跳过 id 列(无需更新)
&& table.Columns.Contains(col1.ColumnName) // 列名存在于 table2
)
)
.Select(col => col.ColumnName)
.ToList();
@@ -691,7 +776,7 @@ namespace Lskj.Control.Model
continue; // 跳过 id 为空的行
// 在 table2 中查找 id 匹配的行(使用 Select 方法快速定位)
DataRow[] matchedRows = table.Select($""+ primaryKey + " = '"+ idValue + "'");
DataRow[] matchedRows = table.Select($"" + primaryKey + " = '" + idValue + "'");
// 只处理找到唯一匹配行的情况
if (matchedRows.Length == 1)
@@ -855,9 +940,9 @@ namespace Lskj.Control.Model
catch (Exception)
{
result = 0;
if (result==0 )
if (result == 0)
{
SqlStoredProcedurepPrompt.GenerateProcedureExecutionScript(procName, paramList, isFirstFlag, comfirmFlag );
SqlStoredProcedurepPrompt.GenerateProcedureExecutionScript(procName, paramList, isFirstFlag, comfirmFlag);
}
}
finally
@@ -1011,7 +1096,7 @@ namespace Lskj.Control.Model
/// <para>版本:1.0</para>
/// </summary>
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
private bool ExecDynamicLinkLibary(GridRightMenuModel model, List<string> paramList, string dllName, bool isAddPage = false,DataRow rowData = null)
private bool ExecDynamicLinkLibary(GridRightMenuModel model, List<string> paramList, string dllName, bool isAddPage = false, DataRow rowData = null)
{
if (string.IsNullOrWhiteSpace(dllName))
{
@@ -1214,7 +1299,8 @@ namespace Lskj.Control.Model
{
form.SubForm.Show();
}
else {
else
{
form.SubForm.ShowDialog();
StaticControl.DogVerifyNoPageForms.Remove(form);
form.SubForm.Dispose();
@@ -1227,7 +1313,7 @@ namespace Lskj.Control.Model
XtraTabPage tp = new XtraTabPage();
tp.Text = model.MenuName;
if (!string.IsNullOrWhiteSpace(model.PageName))
if (!string.IsNullOrWhiteSpace(model.PageName))
{
tp.Text = ReplaceHelper.ReplaceRowParam(rowData, model.PageName).Trim();
}
@@ -1288,8 +1374,8 @@ namespace Lskj.Control.Model
int filequency = 0;
bool isOpenvisble = rows.Count() > 0;
string parmaryKey = BaseImpl.GetBasePrimaryKey(this.Model.ModuleCode);//获取主键
//string detailparmaryKey = parmaryKey;
List <GridDetailModel> details = GetDetails(Model.ModuleCode);//捕获所有明细 // 2. 筛选出 “关联下载” 的明细
//string detailparmaryKey = parmaryKey;
List<GridDetailModel> details = GetDetails(Model.ModuleCode);//捕获所有明细 // 2. 筛选出 “关联下载” 的明细
List<GridDetailModel> downloadRelated = details
.Where(d => d.IsDownloadRelated) // 只保留 IsDownloadRelated 为 true 的项
.ToList();
@@ -1308,7 +1394,7 @@ namespace Lskj.Control.Model
{
foreach (DataRow row in dataTable.Rows)
{
string url = row["webpath"] + "";
if (!string.IsNullOrEmpty(url))
{
@@ -1423,7 +1509,8 @@ namespace Lskj.Control.Model
MessageUtil.Show("未配置关联明细数据");
}
}
else {
else
{
MessageUtil.Show("没有需要下载的数据");
}
@@ -1446,7 +1533,7 @@ namespace Lskj.Control.Model
List<SqlParameter> sqlParamList = new List<SqlParameter>();
SqlParameter pMsg = new SqlParameter("@msg", SqlDbType.VarChar, 2000);
SqlParameter pComfirmFlag = new SqlParameter("@comfirmFlag", SqlDbType.Int);
paramList = model.Mergeexec? paramList:this.HandleRightMenuParams(model.ParamList,dataRow, null, model.ActionType);
paramList = model.Mergeexec ? paramList : this.HandleRightMenuParams(model.ParamList, dataRow, null, model.ActionType);
for (int i = 0; i < paramStr.Length; i++)
{
string item = paramStr[i];
@@ -1588,7 +1675,7 @@ namespace Lskj.Control.Model
/// <param name="model">The model.</param>
/// <param name="rowItem">The row item.</param>
/// <returns>System.String.</returns>
protected string GetSearchSql(GridDetailModel model, DataRow rowItem,string ParmaryKey)
protected string GetSearchSql(GridDetailModel model, DataRow rowItem, string ParmaryKey)
{
string fieldName = !string.IsNullOrEmpty(model.UnionParentField) && rowItem.Table.Columns.Contains(model.UnionParentField) ? model.UnionParentField : ParmaryKey;
string sqlValue = model.IsReadOnly || model.IsChart ? model.DetailSql : model.SystemModel.MenuSql;
@@ -1778,10 +1865,10 @@ namespace Lskj.Control.Model
return null;
}
/// <summary>
/// 获取外面的数据源
/// </summary>
/// <returns></returns>
/// <summary>
/// 获取外面的数据源
/// </summary>
/// <returns></returns>
protected virtual DataTable GetDataTable()
{
return null;
@@ -1972,28 +2059,4 @@ namespace Lskj.Control.Model
DataRow[] dataRows = columnsTab.Select().Where(n => (n["name"] + "").Equals(colunmField.Key)).ToArray();
if (dataRows.Length == 0)
{
string addColSql = string.Format("alter table P_PrivateDllTab add {0} {1}", colunmField.Key, colunmField.Value);
SqlHelper.ExecuteNonQuery(addColSql);//添加列
}
}
}
else
{
string createTabSql = "create table P_PrivateDllTab(id int IDENTITY(1,1) NOT NULL,{0})";
string createCol = string.Empty;
foreach (KeyValuePair<string, string> colunmField in colDic)
{
createCol += string.Format("{0} {1},", colunmField.Key, colunmField.Value);
}
createTabSql = string.Format(createTabSql, createCol.TrimEnd(','));
SqlHelper.ExecuteNonQuery(createTabSql);//创建表
}
return true;
}
catch (Exception)
{
return false;
}
}
}
}
string a
@@ -327,6 +327,12 @@ namespace Lskj.Control.Model
/// 页签名称(审核模块以页签形式打开,可以配置单据id)
/// </summary>
public string PageName;
/// <summary>
/// 右键菜单是否可用条件2(单据模块中使用。点击时实时判断主键控件是否满足条件,MenuCond之前写成了重置按钮时根据主表判断是否可以交互。)
/// </summary>
/// <value>The menu cond.</value>
public string ClickCond;
/// <summary>
/// 需要单独处理的exe程序
@@ -451,4 +457,5 @@ namespace Lskj.Control.Model
if (item.Table.Columns.Contains("DuringExecutionMinimize"))
this.DuringExecutionMinimize = string.IsNullOrWhiteSpace(item["DuringExecutionMinimize"] + "") ? false : "1".Equals(item["DuringExecutionMinimize"] + "");
if (item.Table.Columns.Contains("SqlDirectExecution"))
this.SqlDirectExecution = string.IsNullOrWhi
this.SqlDirectExecution = string.IsNullOrWhiteSpace(item["SqlDirectExecution"] + "") ? false : "1".Equals(item["SqlDirectExecution"] + "");
if (item