You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1519 lines
63 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections;
using System.Data;
using BP.DA;
using BP.Web;
using BP.En;
using BP.Sys;
using BP.Difference;
using BP.WF.Template.Frm;
using System.Text.RegularExpressions;
using BP.Tools;
using Newtonsoft.Json.Linq;
namespace BP.WF
{
/// <summary>
/// 表单引擎api
/// </summary>
public class CCFormAPI : Dev2Interface
{
/// <summary>
/// 获得Pop的字段的值
/// </summary>
/// <param name="tableName"></param>
/// <param name="fieldName"></param>
/// <param name="pk"></param>
/// <returns>返回data, No=编号,Name=名称两个列. </returns>
/// <exception cref="Exception"></exception>
public static DataTable GenerPopData2022(string pk, string fieldName)
{
//判断该字段是否启用了pop返回值
string sql = "SELECT Tag1 AS VAL FROM Sys_FrmEleDB WHERE RefPKVal=" + pk + " AND EleID='" + fieldName + "'";
string emps = "";
DataTable dtVals = DBAccess.RunSQLReturnTable(sql);
DataTable dt = new DataTable();
dt.Columns.Add("No");
dt.Columns.Add("Name");
//获取接受人并格式化接受人,
if (dtVals.Rows.Count > 0)
{
foreach (DataRow dr in dtVals.Rows)
emps += dr[0].ToString() + ",";
}
if (emps.Contains(",") && emps.Contains(";"))
{
/*如果包含,; 例如 zhangsan,张三;lisi,李四;*/
string[] myemps1 = emps.Split(';');
foreach (string str in myemps1)
{
if (DataType.IsNullOrEmpty(str))
continue;
string[] ss = str.Split(',');
DataRow dr = dt.NewRow();
dr[0] = ss[0];
dt.Rows.Add(dr);
}
return dt;
}
emps = emps.Replace(";", ",");
emps = emps.Replace("", ",");
emps = emps.Replace("", ",");
emps = emps.Replace("、", ",");
emps = emps.Replace("@", ",");
// 把它加入接受人员列表中.
string[] myemps = emps.Split(',');
foreach (string s in myemps)
{
if (DataType.IsNullOrEmpty(s))
continue;
DataRow dr = dt.NewRow();
dr[0] = s;
dt.Rows.Add(dr);
}
return dt;
}
/// <summary>
/// 仅获取表单数据
/// </summary>
/// <param name="enName"></param>
/// <param name="pkval"></param>
/// <param name="atParas"></param>
/// <param name="specDtlFrmID"></param>
/// <returns></returns>
private static DataSet GenerDBForVSTOExcelFrmModelOfEntity(string enName, object pkval, string atParas, string specDtlFrmID = null)
{
DataSet myds = new DataSet();
#region 主表
Entity en = BP.En.ClassFactory.GetEn(enName);
en.PKVal = pkval;
// if (DataType.IsNullOrEmpty(pkval)==false)
en.Retrieve();
//设置外部传入的默认值.
if (BP.Difference.SystemConfig.isBSsystem == true)
{
// 处理传递过来的参数。
//2019-07-25 zyt改造
foreach (string k in HttpContextHelper.RequestParamKeys)
{
en.SetValByKey(k, HttpContextHelper.RequestParams(k));
}
}
//主表数据放入集合.
DataTable mainTable = en.ToDataTableField();
mainTable.TableName = "MainTable";
myds.Tables.Add(mainTable);
#region 主表 Sys_MapData
string sql = "SELECT * FROM Sys_MapData WHERE 1=2 ";
DataTable dt = DBAccess.RunSQLReturnTable(sql);
dt.TableName = "Sys_MapData";
Map map = en.EnMapInTime;
DataRow dr = dt.NewRow();
dr[MapDataAttr.No] = enName;
dr[MapDataAttr.Name] = map.EnDesc;
dr[MapDataAttr.PTable] = map.PhysicsTable;
dt.Rows.Add(dr);
myds.Tables.Add(dt);
#endregion 主表 Sys_MapData
#region 主表 Sys_MapAttr
sql = "SELECT * FROM Sys_MapAttr WHERE 1=2 ";
dt = DBAccess.RunSQLReturnTable(sql);
dt.TableName = "Sys_MapAttr";
foreach (Attr attr in map.Attrs)
{
dr = dt.NewRow();
dr[MapAttrAttr.MyPK] = enName + "_" + attr.Key;
dr[MapAttrAttr.Name] = attr.Desc;
dr[MapAttrAttr.MyDataType] = attr.MyDataType; //数据类型.
dr[MapAttrAttr.MinLen] = attr.MinLength; //最小长度.
dr[MapAttrAttr.MaxLen] = attr.MaxLength; //最大长度.
// 设置他的逻辑类型.
dr[MapAttrAttr.LGType] = 0; //逻辑类型.
switch (attr.MyFieldType)
{
case FieldType.Enum:
dr[MapAttrAttr.LGType] = 1;
dr[MapAttrAttr.UIBindKey] = attr.UIBindKey;
//增加枚举字段.
if (myds.Tables.Contains(attr.UIBindKey) == false)
{
string mysql = "SELECT IntKey AS No, Lab as Name FROM " + BP.Sys.Base.Glo.SysEnum() + " WHERE EnumKey='" + attr.UIBindKey + "' ORDER BY IntKey ";
DataTable dtEnum = DBAccess.RunSQLReturnTable(mysql);
dtEnum.TableName = attr.UIBindKey;
myds.Tables.Add(dtEnum);
}
break;
case FieldType.FK:
dr[MapAttrAttr.LGType] = 2;
Entities ens = attr.HisFKEns;
dr[MapAttrAttr.UIBindKey] = ens.ToString();
//把外键字段也增加进去.
if (myds.Tables.Contains(ens.ToString()) == false && attr.UIIsReadonly == false)
{
ens.RetrieveAll();
DataTable mydt = ens.ToDataTableDescField();
mydt.TableName = ens.ToString();
myds.Tables.Add(mydt);
}
break;
default:
break;
}
// 设置控件类型.
dr[MapAttrAttr.UIContralType] = (int)attr.UIContralType;
dt.Rows.Add(dr);
}
myds.Tables.Add(dt);
#endregion 主表 Sys_MapAttr
#region //主表 Sys_MapExt 扩展属性
////主表的配置信息.
//sql = "SELECT * FROM Sys_MapExt WHERE 1=2";
//dt = DBAccess.RunSQLReturnTable(sql);
//dt.TableName = "Sys_MapExt";
//myds.Tables.Add(dt);
#endregion //主表 Sys_MapExt 扩展属性
#endregion
#region 从表
foreach (EnDtl item in map.Dtls)
{
#region 把从表的数据放入集合.
Entities dtls = item.Ens;
QueryObject qo = qo = new QueryObject(dtls);
if (dtls.ToString().Contains("CYSheBeiUse") == true)
qo.addOrderBy("RDT"); //按照日期进行排序,不用也可以.
qo.AddWhere(item.RefKey, pkval);
DataTable dtDtl = qo.DoQueryToTable();
dtDtl.TableName = item.EnsName; //修改明细表的名称.
myds.Tables.Add(dtDtl); //加入这个明细表.
#endregion 把从表的数据放入.
#region 从表 Sys_MapDtl (相当于mapdata)
Entity dtl = dtls.GetNewEntity;
map = dtl.EnMap;
//明细表的 描述 .
sql = "SELECT * FROM Sys_MapDtl WHERE 1=2";
dt = DBAccess.RunSQLReturnTable(sql);
dt.TableName = "Sys_MapDtl_For_" + item.EnsName;
dr = dt.NewRow();
dr[MapDtlAttr.No] = item.EnsName;
dr[MapDtlAttr.Name] = item.Desc;
dr[MapDtlAttr.PTable] = dtl.EnMap.PhysicsTable;
dt.Rows.Add(dr);
myds.Tables.Add(dt);
#endregion 从表 Sys_MapDtl (相当于mapdata)
#region 明细表 Sys_MapAttr
sql = "SELECT * FROM Sys_MapAttr WHERE 1=2";
dt = DBAccess.RunSQLReturnTable(sql);
dt.TableName = "Sys_MapAttr_For_" + item.EnsName;
foreach (Attr attr in map.Attrs)
{
dr = dt.NewRow();
dr[MapAttrAttr.MyPK] = enName + "_" + attr.Key;
dr[MapAttrAttr.Name] = attr.Desc;
dr[MapAttrAttr.MyDataType] = attr.MyDataType; //数据类型.
dr[MapAttrAttr.MinLen] = attr.MinLength; //最小长度.
dr[MapAttrAttr.MaxLen] = attr.MaxLength; //最大长度.
// 设置他的逻辑类型.
dr[MapAttrAttr.LGType] = 0; //逻辑类型.
switch (attr.MyFieldType)
{
case FieldType.Enum:
dr[MapAttrAttr.LGType] = 1;
dr[MapAttrAttr.UIBindKey] = attr.UIBindKey;
//增加枚举字段.
if (myds.Tables.Contains(attr.UIBindKey) == false)
{
string mysql = "SELECT IntKey AS No, Lab as Name FROM " + BP.Sys.Base.Glo.SysEnum() + " WHERE EnumKey='" + attr.UIBindKey + "' ORDER BY IntKey ";
DataTable dtEnum = DBAccess.RunSQLReturnTable(mysql);
dtEnum.TableName = attr.UIBindKey;
myds.Tables.Add(dtEnum);
}
break;
case FieldType.FK:
dr[MapAttrAttr.LGType] = 2;
Entities ens = attr.HisFKEns;
dr[MapAttrAttr.UIBindKey] = ens.ToString();
//把外键字段也增加进去.
if (myds.Tables.Contains(ens.ToString()) == false && attr.UIIsReadonly == false)
{
ens.RetrieveAll();
DataTable mydt = ens.ToDataTableDescField();
mydt.TableName = ens.ToString();
myds.Tables.Add(mydt);
}
break;
default:
break;
}
// 设置控件类型.
dr[MapAttrAttr.UIContralType] = (int)attr.UIContralType;
dt.Rows.Add(dr);
}
myds.Tables.Add(dt);
#endregion 明细表 Sys_MapAttr
}
#endregion
return myds;
}
/// <summary>
/// 仅获取表单数据
/// </summary>
/// <param name="frmID">表单ID</param>
/// <param name="pkval">主键</param>
/// <param name="atParas">参数</param>
/// <param name="specDtlFrmID">指定明细表的参数,如果为空就标识主表数据,否则就是从表数据.</param>
/// <returns>数据</returns>
public static DataSet GenerDBForVSTOExcelFrmModel(string frmID, object pkval, string atParas, string specDtlFrmID = null)
{
//如果是一个实体类.
if (frmID.ToUpper().Contains("BP."))
{
// 执行map同步.
Entities ens = BP.En.ClassFactory.GetEns(frmID + "s");
Entity myen = ens.GetNewEntity;
myen.DTSMapToSys_MapData();
return GenerDBForVSTOExcelFrmModelOfEntity(frmID, pkval, atParas, specDtlFrmID = null);
}
//数据容器,就是要返回的对象.
DataSet myds = new DataSet();
//映射实体.
MapData md = new MapData(frmID);
Map map = md.GenerHisMap();
Entity en = null;
if (map.Attrs.Contains("OID") == true)
{
//实体.
GEEntity wk = new GEEntity(frmID);
wk.OID = int.Parse(pkval.ToString());
if (wk.RetrieveFromDBSources() == 0)
wk.Insert();
ExecEvent.DoFrm(md,EventListFrm.FrmLoadBefore, wk, null);
en = wk;
}
if (map.Attrs.Contains("MyPK") == true)
{
//实体.
GEEntityMyPK wk = new GEEntityMyPK(frmID);
wk.setMyPK(pkval.ToString());
if (wk.RetrieveFromDBSources() == 0)
wk.Insert();
ExecEvent.DoFrm(md,EventListFrm.FrmLoadBefore, wk, null);
en = wk;
}
//加载事件.
//把参数放入到 En 的 Row 里面。
if (DataType.IsNullOrEmpty(atParas) == false)
{
AtPara ap = new AtPara(atParas);
foreach (string key in ap.HisHT.Keys)
{
switch(key)
{
case "FrmID":
case "FK_MapData":
continue;
default:
break;
}
if (en.Row.ContainsKey(key) == true) //有就该变.
en.Row[key] = ap.GetValStrByKey(key);
else
en.Row.Add(key, ap.GetValStrByKey(key)); //增加他.
}
}
//属性.
MapExt me = null;
DataTable dtMapAttr = null;
MapExts mes = null;
#region 表单模版信息.(含主、从表的,以及从表的枚举/外键相关数据).
//增加表单字段描述.
string sql = "SELECT * FROM Sys_MapData WHERE No='" + frmID + "' ";
DataTable dt = DBAccess.RunSQLReturnTable(sql);
dt.TableName = "Sys_MapData";
myds.Tables.Add(dt);
//增加表单字段描述.
sql = "SELECT * FROM Sys_MapAttr WHERE FK_MapData='" + frmID + "' ";
dt = DBAccess.RunSQLReturnTable(sql);
dt.TableName = "Sys_MapAttr";
myds.Tables.Add(dt);
//增加从表信息.
sql = "SELECT * FROM Sys_MapDtl WHERE FK_MapData='" + frmID + "' ";
dt = DBAccess.RunSQLReturnTable(sql);
dt.TableName = "Sys_MapDtl";
myds.Tables.Add(dt);
//主表的配置信息.
sql = "SELECT * FROM Sys_MapExt WHERE FK_MapData='" + frmID + "'";
dt = DBAccess.RunSQLReturnTable(sql);
dt.TableName = "Sys_MapExt";
myds.Tables.Add(dt);
#region 加载 从表表单模版信息.(含 从表的枚举/外键相关数据)
foreach (MapDtl item in md.MapDtls)
{
#region 返回指定的明细表的数据.
if (DataType.IsNullOrEmpty(specDtlFrmID) == true)
{
}
else
{
if (item.No != specDtlFrmID)
continue;
}
#endregion 返回指定的明细表的数据.
//明细表的主表描述
sql = "SELECT * FROM Sys_MapDtl WHERE No='" + item.No + "'";
dt = DBAccess.RunSQLReturnTable(sql);
dt.TableName = "Sys_MapDtl_For_" + (DataType.IsNullOrEmpty(item.Alias) ? item.No : item.Alias);
myds.Tables.Add(dt);
//明细表的表单描述
sql = "SELECT * FROM Sys_MapAttr WHERE FK_MapData='" + item.No + "'";
dtMapAttr = DBAccess.RunSQLReturnTable(sql);
dtMapAttr.TableName = "Sys_MapAttr_For_" + (DataType.IsNullOrEmpty(item.Alias) ? item.No : item.Alias);
myds.Tables.Add(dtMapAttr);
//明细表的配置信息.
sql = "SELECT * FROM Sys_MapExt WHERE FK_MapData='" + item.No + "'";
dt = DBAccess.RunSQLReturnTable(sql);
dt.TableName = "Sys_MapExt_For_" + (DataType.IsNullOrEmpty(item.Alias) ? item.No : item.Alias);
myds.Tables.Add(dt);
#region 从表的 外键表/枚举
mes = new MapExts(item.No);
foreach (DataRow dr in dtMapAttr.Rows)
{
string lgType = dr["LGType"].ToString();
//不是枚举/外键字段
if (lgType.Equals("0"))
continue;
string uiBindKey = dr["UIBindKey"].ToString();
string mypk = dr["MyPK"].ToString();
#region 枚举字段
if (lgType.Equals("1"))
{
// 如果是枚举值, 判断是否存在.
if (myds.Tables.Contains(uiBindKey) == true)
continue;
string mysql = "SELECT IntKey AS No, Lab as Name FROM " + BP.Sys.Base.Glo.SysEnum() + " WHERE EnumKey='" + uiBindKey + "' ORDER BY IntKey ";
DataTable dtEnum = DBAccess.RunSQLReturnTable(mysql);
dtEnum.TableName = uiBindKey;
myds.Tables.Add(dtEnum);
continue;
}
#endregion
string UIIsEnable = dr["UIIsEnable"].ToString();
if (UIIsEnable.Equals("0")) //字段未启用
continue;
#region 外键字段
// 检查是否有下拉框自动填充。
string keyOfEn = dr["KeyOfEn"].ToString();
#region 处理下拉框数据范围. for 小杨.
me = mes.GetEntityByKey(MapExtAttr.ExtType, MapExtXmlList.AutoFullDLL, MapExtAttr.AttrOfOper, keyOfEn) as MapExt;
if (me != null) //有范围限制时
{
string fullSQL = me.Doc.Clone() as string;
fullSQL = fullSQL.Replace("~", ",");
fullSQL = BP.WF.Glo.DealExp(fullSQL, en, null);
dt = DBAccess.RunSQLReturnTable(fullSQL);
dt.TableName = mypk;
myds.Tables.Add(dt);
continue;
}
#endregion 处理下拉框数据范围.
else //无范围限制时
{
// 判断是否存在.
if (myds.Tables.Contains(uiBindKey) == true)
continue;
myds.Tables.Add(BP.Pub.PubClass.GetDataTableByUIBineKey(uiBindKey));
}
#endregion 外键字段
}
#endregion 从表的 外键表/枚举
}
#endregion 加载 从表表单模版信息.(含 从表的枚举/外键相关数据)
#endregion 表单模版信息.(含主、从表的,以及从表的枚举/外键相关数据).
#region 主表数据
if (BP.Difference.SystemConfig.isBSsystem == true)
{
// 处理传递过来的参数。
foreach (string k in HttpContextHelper.RequestParamKeys)
{
en.SetValByKey(k, HttpContextHelper.RequestParams(k));
}
}
// 执行表单事件..
string msg = ExecEvent.DoFrm(md,EventListFrm.FrmLoadBefore, en);
if (DataType.IsNullOrEmpty(msg) == false)
throw new Exception("err@错误:" + msg);
//重设默认值.
en.ResetDefaultVal();
//执行装载填充.
me = new MapExt();
if (me.Retrieve(MapExtAttr.ExtType, MapExtXmlList.PageLoadFull, MapExtAttr.FK_MapData, frmID) == 1)
{
//执行通用的装载方法.
MapAttrs attrs = new MapAttrs(frmID);
MapDtls dtls = new MapDtls(frmID);
en =DealPageLoadFull(en, me, attrs, dtls) as GEEntity;
}
//增加主表数据.
DataTable mainTable = en.ToDataTableField(md.No);
mainTable.TableName = "MainTable";
myds.Tables.Add(mainTable);
#endregion 主表数据
#region 从表数据
foreach (MapDtl dtl in md.MapDtls)
{
#region 返回指定的明细表的数据.
if (DataType.IsNullOrEmpty(specDtlFrmID) == true)
{
}
else
{
if (dtl.No != specDtlFrmID)
continue;
}
#endregion 返回指定的明细表的数据.
GEDtls dtls = new GEDtls(dtl.No);
QueryObject qo = null;
if (dtl.RefPK == "")
{
try
{
qo = new QueryObject(dtls);
switch (dtl.DtlOpenType)
{
case DtlOpenType.ForEmp: // 按人员来控制.
qo.AddWhere(GEDtlAttr.RefPK, pkval);
qo.addAnd();
qo.AddWhere(GEDtlAttr.Rec, WebUser.No);
break;
case DtlOpenType.ForWorkID: // 按工作ID来控制
qo.AddWhere(GEDtlAttr.RefPK, pkval);
break;
case DtlOpenType.ForPWorkID: // 按工作ID来控制
qo.AddWhere(GEDtlAttr.RefPK, DBAccess.RunSQLReturnValInt("SELECT PWorkID FROM WF_GenerWorkFlow WHERE WorkID="+ pkval) );
break;
case DtlOpenType.ForFID: // 按流程ID来控制.
qo.AddWhere(GEDtlAttr.FID, pkval);
break;
}
}
catch
{
dtls.GetNewEntity.CheckPhysicsTable();
}
}
else
{
qo = new QueryObject(dtls);
qo.AddWhere(dtl.RefPK, pkval);
}
//条件过滤.
if ( DataType.IsNullOrEmpty( dtl.FilterSQLExp)==false)
{
string[] strs = dtl.FilterSQLExp.Split('=');
qo.addAnd();
qo.AddWhere(strs[0], strs[1]);
}
//排序.
if (DataType.IsNullOrEmpty(dtl.OrderBySQLExp)==false)
{
qo.addOrderBy(dtl.OrderBySQLExp);
}
//从表
DataTable dtDtl = qo.DoQueryToTable();
// 为明细表设置默认值.
MapAttrs mattrs = new MapAttrs(dtl.No);
foreach (MapAttr attr in mattrs)
{
//处理它的默认值.
if (attr.DefValReal.Contains("@") == false)
continue;
foreach (DataRow dr in dtDtl.Rows)
dr[attr.KeyOfEn] = attr.DefVal;
}
dtDtl.TableName = DataType.IsNullOrEmpty(dtl.Alias) ? dtl.No : dtl.Alias; //edited by liuxc,2017-10-10.如果有别名则使用别名没有则使用No
myds.Tables.Add(dtDtl); //加入这个明细表, 如果没有数据xml体现为空.
}
#endregion 从表数据
#region 主表的 外键表/枚举
dtMapAttr = myds.Tables["Sys_MapAttr"];
mes = md.MapExts;
foreach (DataRow dr in dtMapAttr.Rows)
{
string uiBindKey = dr["UIBindKey"] as string;
if (DataType.IsNullOrEmpty(uiBindKey) == true)
continue;
string myPK = dr["MyPK"].ToString();
string lgType = dr["LGType"].ToString();
if (lgType.Equals("1"))
{
// 如果是枚举值, 判断是否存在.,
if (myds.Tables.Contains(uiBindKey) == true)
continue;
string mysql = "SELECT IntKey AS No, Lab as Name FROM " + BP.Sys.Base.Glo.SysEnum() + " WHERE EnumKey='" + uiBindKey + "' ORDER BY IntKey ";
DataTable dtEnum = DBAccess.RunSQLReturnTable(mysql);
dtEnum.TableName = uiBindKey;
myds.Tables.Add(dtEnum);
continue;
}
if (lgType.Equals("2") == false)
continue;
string UIIsEnable = dr["UIIsEnable"].ToString();
if (UIIsEnable.Equals("0"))
continue;
// 检查是否有下拉框自动填充。
string keyOfEn = dr["KeyOfEn"].ToString();
string fk_mapData = dr["FK_MapData"].ToString();
#region 处理下拉框数据范围. for 小杨.
me = mes.GetEntityByKey(MapExtAttr.ExtType, MapExtXmlList.AutoFullDLL, MapExtAttr.AttrOfOper, keyOfEn) as MapExt;
if (me != null)
{
string fullSQL = me.Doc.Clone() as string;
fullSQL = fullSQL.Replace("~", ",");
fullSQL = BP.WF.Glo.DealExp(fullSQL, en, null);
dt = DBAccess.RunSQLReturnTable(fullSQL);
dt.TableName = myPK; //可能存在隐患,如果多个字段,绑定同一个表,就存在这样的问题.
myds.Tables.Add(dt);
continue;
}
#endregion 处理下拉框数据范围.
dt = BP.Pub.PubClass.GetDataTableByUIBineKey(uiBindKey);
dt.TableName = uiBindKey;
myds.Tables.Add(dt);
}
#endregion 主表的 外键表/枚举
string name = "";
foreach (DataTable item in myds.Tables)
{
name += item.TableName + ",";
}
//返回生成的dataset.
return myds;
}
/// <summary>
/// 执行PageLoad装载数据
/// </summary>
/// <param name="item"></param>
/// <param name="en"></param>
/// <param name="mattrs"></param>
/// <param name="dtls"></param>
/// <returns></returns>
public static Entity DealPageLoadFull(Entity en, MapExt item, MapAttrs mattrs, MapDtls dtls, bool isSelf = false, int nodeID = 0, long workID = 0)
{
if (item == null)
return en;
DataTable dt = null;
string sql = item.Doc;
/* 如果有填充主表的sql */
sql = Glo.DealExp(sql, en, null);
string fk_dbSrc = item.DBSrcNo;
//填充方式0=sql1=url,2=CCFromRef.js , 3=webapi
string doWay = item.DoWay;
SFDBSrc sfdb = null;
//如果是sql方式填充
if (doWay.Equals("0") || doWay.Equals("None"))
{
if (DataType.IsNullOrEmpty(fk_dbSrc) == false && fk_dbSrc.Equals("local") == false)
sfdb = new SFDBSrc(fk_dbSrc);
if (string.IsNullOrEmpty(sql) == false)
{
if (string.IsNullOrEmpty(sql) == false)
{
int num = Regex.Matches(sql.ToUpper(), "WHERE").Count;
if (num == 1)
{
string sqlext = sql.Substring(0, sql.ToUpper().IndexOf("WHERE"));
sqlext = sql.Substring(sqlext.Length + 1);
if (sqlext.Contains("@"))
throw new Exception("设置的sql有错误可能有没有替换的变量:" + sql);
}
if (num > 1 && sql.Contains("@"))
throw new Exception("设置的sql有错误可能有没有替换的变量:" + sql);
if (sfdb != null)
dt = sfdb.RunSQLReturnTable(sql);
else
dt = DBAccess.RunSQLReturnTable(sql);
Attrs attrs = en.EnMap.Attrs;
if (dt.Rows.Count == 1)
{
DataRow dr = dt.Rows[0];
foreach (DataColumn dc in dt.Columns)
{
//去掉一些不需要copy的字段.
switch (dc.ColumnName)
{
case WorkAttr.OID:
case WorkAttr.FID:
case WorkAttr.Rec:
case WorkAttr.MD5:
case GERptAttr.FlowEnder:
case GERptAttr.FlowEnderRDT:
case GERptAttr.AtPara:
case GERptAttr.PFlowNo:
case GERptAttr.PWorkID:
case GERptAttr.PNodeID:
case GERptAttr.BillNo:
case GERptAttr.FlowDaySpan:
case "RefPK":
case WorkAttr.RecText:
continue;
default:
break;
}
//如果不包含数据库.
if (attrs.Contains(dc.ColumnName) == false)
continue;
//开始赋值.
if (string.IsNullOrEmpty(en.GetValStringByKey(dc.ColumnName)) || en.GetValStringByKey(dc.ColumnName) == "0" || en.GetValStringByKey(dc.ColumnName).Contains("0.0"))
{
en.SetValByKey(dc.ColumnName, dr[dc.ColumnName].ToString());
continue;
}
//获取attr
Entity entity = mattrs.GetEntityByKey("KeyOfEn", dc.ColumnName);
if (entity != null)
{
MapAttr attr = (MapAttr)entity;
if (attr.LGType == FieldTypeS.Enum && en.GetValStringByKey(dc.ColumnName).Equals("-1"))
{
en.SetValByKey(dc.ColumnName, dr[dc.ColumnName].ToString());
continue;
}
continue;
}
}
}
}
}
}
//如果是webapi方式填充
else if (doWay.Equals("3"))
{
//请求地址
string apiUrl = sql;
//设置请求头
Hashtable headerMap = new Hashtable();
//设置返回值格式
headerMap.Add("Content-Type", "application/json");
//设置token用于接口校验
headerMap.Add("Authorization", WebUser.Token);
try
{
//post方式请求数据
string postData = BP.Tools.PubGlo.HttpPostConnect(apiUrl, headerMap, "");
//数据序列化
JObject jsonData = postData.ToJObject();
//code=200表示请求成功否则失败
if (!jsonData["code"].ToString().Equals("200"))
return en;
//获取返回的数据
JObject data = jsonData["data"].ToString().ToJObject();
//获取主表数据
string mainTable = data["mainTable"].ToString();
dt = Json.ToDataTable(mainTable);
//获取全部附件数据
JObject athsJSON = jsonData["aths"].ToString().ToJObject();
for (int i = 0; i < athsJSON.Count; i++)
{
//获取附件
JToken athDatas = athsJSON[i];
//获取附件组件ID
string FK_FrmAttachment = athDatas["attachmentid"].ToString();
//获取当前组件中的附件数据
JObject athArryData = athDatas["attachmentdbs"].ToString().ToJObject();
//填充附件数据
for (int k = 0; k < athArryData.Count; k++)
{
JToken athData = athArryData[k];
//生成mypk主键值
string guid = DBAccess.GenerGUID();
FrmAttachment attachment = new FrmAttachment(FK_FrmAttachment);
//是否要先删除掉原有附件?根据实际需求,再做调整
//FrmAttachmentDBs attachmentDBs = new FrmAttachmentDBs();
//attachmentDBs.Retrieve(FrmAttachmentDBAttr.RefPKVal, workID, FrmAttachmentDBAttr.FK_MapData, attachment.FrmID);
//attachmentDBs.Delete();
//插入数据
FrmAttachmentDB attachmentDB = new FrmAttachmentDB();
attachmentDB.setMyPK(guid);
attachmentDB.FK_FrmAttachment = FK_FrmAttachment;
attachmentDB.FrmID =attachment.FrmID;
attachmentDB.RefPKVal = workID.ToString();
attachmentDB.FID = 0;//先默认为0
attachmentDB.Rec = athData["rec"].ToString();//执行人
attachmentDB.FileFullName = athData["fileFullName"].ToString();//附件全路径
attachmentDB.FileName = athData["fileName"].ToString();//附件名称
attachmentDB.FileExts = athData["fileExts"].ToString();//文件类型
attachmentDB.Sort = athData["sort"].ToString();//附件类型
attachmentDB.DeptNo = athData["fk_dept"].ToString();//上传人所在部门
attachmentDB.DeptName = athData["fk_deptName"].ToString();//上传人所在部门名称
attachmentDB.RecName = athData["recName"].ToString();//上传人名称
attachmentDB.RDT = athData["rdt"].ToString();//上传时间
attachmentDB.UploadGUID = guid;
attachment.Insert();
}
}
//获取从表数据
JObject dtlJSON = jsonData["dtls"].ToString().ToJObject();
for (int i = 0; i < dtlJSON.Count; i++)
{
JToken dtlDatas = dtlJSON[i];
//获取从表编号
string dtlNo = dtlDatas["dtlNo"].ToString();
//定义map
MapDtl dtl = new MapDtl(dtlNo);
//插入之前判断
GEDtls gedtls = null;
try
{
gedtls = new GEDtls(dtl.No);
if (dtl.DtlOpenType == DtlOpenType.ForFID)
{
if (gedtls.RetrieveByAttr(GEDtlAttr.RefPK, workID) > 0)
continue;
}
else
{
//如果存在数据,默认先删除
if (gedtls.RetrieveByAttr(GEDtlAttr.RefPK, en.PKVal) > 0)
gedtls.Delete(GEDtlAttr.RefPK, en.PKVal);
}
}
catch (Exception ex)
{
(gedtls.GetNewEntity as GEDtl).CheckPhysicsTable();
}
//获取从表数据
JObject dtlArryData = dtlDatas["dtl"].ToString().ToJObject();
for (int k = 0; k < dtlArryData.Count; k++)
{
//获取一条数据
JToken dtlData = dtlArryData[k];
//从表数据
string dtlDataStr = dtlData["dtlData"].ToString();
//从表附件数据
JObject dtlAthData = dtlData["dtlAths"].ToString().ToJObject();
//从表数据字符串转换成datatable
DataTable dtlDt = Json.ToDataTable(dtlDataStr);
//执行数据插入
foreach (DataRow dr in dtlDt.Rows)
{
GEDtl gedtl = gedtls.GetNewEntity as GEDtl;
foreach (DataColumn dc in dt.Columns)
{
gedtl.SetValByKey(dc.ColumnName, dr[dc.ColumnName].ToString());
}
switch (dtl.DtlOpenType)
{
case DtlOpenType.ForEmp: // 按人员来控制.
gedtl.RefPK = en.PKVal.ToString();
gedtl.FID = long.Parse(en.PKVal.ToString());
break;
case DtlOpenType.ForWorkID: // 按工作ID来控制
gedtl.RefPK = en.PKVal.ToString();
gedtl.FID = long.Parse(en.PKVal.ToString());
break;
case DtlOpenType.ForFID: // 按流程ID来控制.
gedtl.RefPK = workID.ToString();
gedtl.FID = long.Parse(en.PKVal.ToString());
break;
}
gedtl.RDT = DataType.CurrentDateTime;
gedtl.Rec = WebUser.No;
gedtl.Insert();
}
}
}
}
catch (Exception ex)
{
throw new Exception("接口请求失败,message:" + ex.Message.ToString());
}
}
if (string.IsNullOrEmpty(item.Tag1)
|| item.Tag1.Length < 15)
return en;
// 填充从表.
foreach (MapDtl dtl in dtls)
{
//如果有数据,就不要填充了.
string[] sqls = item.Tag1.Split('$');
foreach (string mysql in sqls)
{
if (string.IsNullOrEmpty(mysql))
continue;
if (mysql.Contains(dtl.No + ":") == false)
continue;
if (mysql.Equals(dtl.No + ":") == true)
continue;
#region 处理sql.
sql = Glo.DealSQLExp(mysql.Replace(dtl.No + ":", "").ToString(), en, null);
#endregion 处理sql.
if (string.IsNullOrEmpty(sql))
continue;
int num = Regex.Matches(sql.ToUpper(), "WHERE").Count;
if (num == 1)
{
string sqlext = sql.Substring(0, sql.ToUpper().IndexOf("WHERE"));
sqlext = sql.Substring(sqlext.Length + 1);
if (sqlext.Contains("@"))
throw new Exception("设置的sql有错误可能有没有替换的变量:" + sql);
}
if (num > 1 && sql.Contains("@"))
throw new Exception("设置的sql有错误可能有没有替换的变量:" + sql);
if (isSelf == true)
{
MapDtl mdtlSln = new MapDtl();
mdtlSln.No = dtl.No + "_" + nodeID;
int result = mdtlSln.RetrieveFromDBSources();
if (result != 0)
{
dtl.DtlOpenType = mdtlSln.DtlOpenType;
}
}
GEDtls gedtls = null;
try
{
gedtls = new GEDtls(dtl.No);
if (dtl.DtlOpenType == DtlOpenType.ForFID)
{
if (gedtls.RetrieveByAttr(GEDtlAttr.RefPK, workID) > 0)
continue;
}
else
{
if (gedtls.RetrieveByAttr(GEDtlAttr.RefPK, en.PKVal) > 0)
continue;
}
//gedtls.Delete(GEDtlAttr.RefPK, en.PKVal);
}
catch (Exception ex)
{
(gedtls.GetNewEntity as GEDtl).CheckPhysicsTable();
}
sql = sql.StartsWith(dtl.No + "=") ? sql.Substring((dtl.No + "=").Length) : sql;
if (sfdb != null)
dt = sfdb.RunSQLReturnTable(sql);
else
dt = DBAccess.RunSQLReturnTable(sql);
foreach (DataRow dr in dt.Rows)
{
GEDtl gedtl = gedtls.GetNewEntity as GEDtl;
foreach (DataColumn dc in dt.Columns)
{
gedtl.SetValByKey(dc.ColumnName, dr[dc.ColumnName].ToString());
}
switch (dtl.DtlOpenType)
{
case DtlOpenType.ForEmp: // 按人员来控制.
gedtl.RefPK = en.PKVal.ToString();
gedtl.FID = long.Parse(en.PKVal.ToString());
break;
case DtlOpenType.ForWorkID: // 按工作ID来控制
gedtl.RefPK = en.PKVal.ToString();
gedtl.FID = long.Parse(en.PKVal.ToString());
break;
case DtlOpenType.ForFID: // 按流程ID来控制.
gedtl.RefPK = workID.ToString();
gedtl.FID = long.Parse(en.PKVal.ToString());
break;
}
gedtl.RDT = DataType.CurrentDateTime;
gedtl.Rec = WebUser.No;
gedtl.Insert();
}
}
}
return en;
}
/// <summary>
/// 获取上传附件集合信息
/// </summary>
/// <param name="athDesc"></param>
/// <param name="pkval"></param>
/// <param name="FK_FrmAttachment"></param>
/// <param name="workid"></param>
/// <param name="fid"></param>
/// <param name="pworkid"></param>
/// <param name="isContantSelf"></param>
/// <param name="fk_node"></param>
/// <param name="fk_mapData"></param>
/// <returns></returns>
public static BP.Sys.FrmAttachmentDBs GenerFrmAttachmentDBs(FrmAttachment athDesc, string pkval, string FK_FrmAttachment,
Int64 workid = 0, Int64 fid = 0, Int64 pworkid = 0, bool isContantSelf = true, int fk_node = 0, string fk_mapData = null)
{
if (pkval == null)
pkval = "0"; //解决预览的时候的错误.
BP.Sys.FrmAttachmentDBs dbs = new BP.Sys.FrmAttachmentDBs();
//查询使用的workId
string ctrlWayId = "";
if (FK_FrmAttachment.Contains("AthMDtl") == true || athDesc.GetParaBoolen("IsDtlAth") == true)
ctrlWayId = pkval;
else
{
MapData mapData = new MapData(athDesc.FrmID);
if (mapData.EntityType == EntityType.FrmDict || mapData.EntityType == EntityType.FrmBill)
ctrlWayId = pkval;
else
ctrlWayId = BP.WF.Dev2Interface.GetAthRefPKVal(workid, pworkid, fid, fk_node, fk_mapData, athDesc);
}
//如果是空的,就返回空数据结构. @lizhen.
if (ctrlWayId.Equals("0") == true)
return dbs;
BP.En.QueryObject qo = new BP.En.QueryObject(dbs);
//从表附件
if (FK_FrmAttachment.Contains("AthMDtl") || athDesc.GetParaBoolen("IsDtlAth") == true)
{
/*如果是一个明细表的多附件就直接按照传递过来的PK来查询.*/
qo.AddWhere(FrmAttachmentDBAttr.RefPKVal, pkval);
qo.addAnd();
qo.AddWhere(FrmAttachmentDBAttr.NoOfObj, athDesc.NoOfObj);
qo.DoQuery();
return dbs;
}
if (athDesc.HisCtrlWay == AthCtrlWay.MySelfOnly || athDesc.HisCtrlWay == AthCtrlWay.PK)
{
qo.AddWhere(FrmAttachmentDBAttr.RefPKVal, pkval);
qo.addAnd();
qo.AddWhere(FrmAttachmentDBAttr.FK_FrmAttachment, FK_FrmAttachment);
if (isContantSelf == false)
{
qo.addAnd();
qo.AddWhere(FrmAttachmentDBAttr.Rec, "!=", WebUser.No);
}
qo.addOrderBy("Idx,RDT");
qo.DoQuery();
return dbs;
}
/* 继承模式 */
if (athDesc.AthUploadWay == AthUploadWay.Interwork)
qo.AddWhere(FrmAttachmentDBAttr.RefPKVal, ctrlWayId);
else
qo.AddWhereIn(FrmAttachmentDBAttr.RefPKVal, "('" + ctrlWayId + "','" + pkval + "')");
qo.addAnd();
qo.AddWhere(FrmAttachmentDBAttr.NoOfObj, athDesc.NoOfObj);
if (isContantSelf == false)
{
qo.addAnd();
qo.AddWhere(FrmAttachmentDBAttr.Rec, "!=", WebUser.No);
}
qo.addOrderBy("Idx,RDT");
qo.DoQuery();
return dbs;
}
/// <summary>
/// 获取从表数据用于显示dtl.htm
/// </summary>
/// <param name="frmID">表单ID</param>
/// <param name="pkval">主键</param>
/// <param name="atParas">参数</param>
/// <param name="specDtlFrmID">指定明细表的参数,如果为空就标识主表数据,否则就是从表数据.</param>
/// <returns>数据</returns>
public static DataSet GenerDBForCCFormDtl(string frmID, MapDtl dtl, int pkval, string atParas,string dtlRefPKVal,Int64 fid)
{
//数据容器,就是要返回的对象.
DataSet myds = new DataSet();
//实体.
GEEntity en = new GEEntity(frmID);
en.OID = pkval;
if (en.RetrieveFromDBSources() == 0)
en.Insert();
//把参数放入到 En 的 Row 里面。
if (DataType.IsNullOrEmpty(atParas) == false)
{
AtPara ap = new AtPara(atParas);
foreach (string key in ap.HisHT.Keys)
{
try
{
if (en.Row.ContainsKey(key) == true) //有就该变.
en.Row[key] = ap.GetValStrByKey(key);
else
en.Row.Add(key, ap.GetValStrByKey(key)); //增加他.
}
catch (Exception ex)
{
throw new Exception(key);
}
}
}
if (BP.Difference.SystemConfig.isBSsystem == true)
{
// 处理传递过来的参数。
foreach (string k in HttpContextHelper.RequestParamKeys)
{
en.SetValByKey(k, HttpContextHelper.RequestParams(k));
}
}
#region 加载从表表单模版信息.
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);
//明细表的配置信息.
MapExts mes = dtl.MapExts;
DataTable Sys_MapExt = mes.ToDataTableField("Sys_MapExt");
myds.Tables.Add(Sys_MapExt);
//启用附件,增加附件信息
DataTable Sys_FrmAttachment = dtl.FrmAttachments.ToDataTableField("Sys_FrmAttachment");
myds.Tables.Add(Sys_FrmAttachment);
#endregion 加载从表表单模版信息.
#region 把从表的- 外键表/枚举 加入 DataSet.
MapExt me = null;
DataTable ddlTable = new DataTable();
ddlTable.Columns.Add("No");
foreach (MapAttr attr in attrs)
{
//没有绑定外键
string uiBindKey = attr.UIBindKey;
if (DataType.IsNullOrEmpty(uiBindKey) == true)
continue;
#region 枚举字段
if (attr.LGType == FieldTypeS.Enum)
{
// 如果是枚举值, 判断是否存在.
if (myds.Tables.Contains(uiBindKey) == true)
continue;
string mysql = "SELECT IntKey AS No, Lab as Name FROM " + BP.Sys.Base.Glo.SysEnum() + " WHERE EnumKey='" + uiBindKey + "' ORDER BY IntKey ";
DataTable dtEnum = DBAccess.RunSQLReturnTable(mysql);
dtEnum.TableName = uiBindKey;
dtEnum.Columns[0].ColumnName = "No";
dtEnum.Columns[1].ColumnName = "Name";
myds.Tables.Add(dtEnum);
continue;
}
#endregion
// 检查是否有下拉框自动填充。
string keyOfEn = attr.KeyOfEn;
#region 处理下拉框数据范围. for 小杨.
me = mes.GetEntityByKey(MapExtAttr.ExtType, MapExtXmlList.AutoFullDLL,
MapExtAttr.AttrOfOper, keyOfEn) as MapExt;
if (me != null && myds.Tables.Contains(uiBindKey) == false) //是否存在.
{
string fullSQL = me.Doc.Clone() as string;
fullSQL = fullSQL.Replace("~", "'");
fullSQL = BP.WF.Glo.DealExp(fullSQL, en, null);
if (DataType.IsNullOrEmpty(fullSQL) == true)
throw new Exception("err@没有给AutoFullDLL配置SQLMapExt=" + me.MyPK+",原始的配置SQL为:"+me.Doc);
DataTable dt = DBAccess.RunSQLReturnTable(fullSQL);
if (uiBindKey.ToLower().Equals("blank"))
dt.TableName = keyOfEn;
else
dt.TableName = uiBindKey;
if (BP.Difference.SystemConfig.AppCenterDBFieldCaseModel == FieldCaseModel.UpperCase)
{
if (dt.Columns.Contains("NO") == true)
dt.Columns["NO"].ColumnName = "No";
if (dt.Columns.Contains("NAME") == true)
dt.Columns["NAME"].ColumnName = "Name";
if (dt.Columns.Contains("PARENTNO") == true)
dt.Columns["PARENTNO"].ColumnName = "ParentNo";
}
if (BP.Difference.SystemConfig.AppCenterDBFieldCaseModel == FieldCaseModel.Lowercase)
{
if (dt.Columns.Contains("no") == true)
dt.Columns["no"].ColumnName = "No";
if (dt.Columns.Contains("name") == true)
dt.Columns["name"].ColumnName = "Name";
if (dt.Columns.Contains("parentno") == true)
dt.Columns["parentno"].ColumnName = "ParentNo";
}
myds.Tables.Add(dt);
continue;
}
#endregion 处理下拉框数据范围.
#region 外键字段
// 判断是否存在.
if (myds.Tables.Contains(uiBindKey) == true)
continue;
// 获得数据.
DataTable mydt = BP.Pub.PubClass.GetDataTableByUIBineKey(uiBindKey,en.Row);
if (uiBindKey.ToLower().Equals("blank"))
mydt.TableName = keyOfEn;
if (mydt == null)
{
DataRow ddldr = ddlTable.NewRow();
ddldr["No"] = uiBindKey;
ddlTable.Rows.Add(ddldr);
}
else
{
myds.Tables.Add(mydt);
}
#endregion 外键字段
}
ddlTable.TableName = "UIBindKey";
myds.Tables.Add(ddlTable);
#endregion 把从表的- 外键表/枚举 加入 DataSet.
#region 把主表数据放入.
//重设默认值.
en.ResetDefaultVal();
//增加主表数据.
DataTable mainTable = en.ToDataTableField(frmID);
mainTable.TableName = "MainTable";
myds.Tables.Add(mainTable);
#endregion 把主表数据放入.
#region 把从表的数据放入.
DataTable dtDtl = GetDtlInfo(dtl,en, dtlRefPKVal);
//从表集合为空时填充从表的情况
if (dtDtl.Rows.Count == 0)
{
GEDtl endtl = null;
//1.行初始化字段,设置了改字段值时默认就添加枚举值集合的行数据,一般不再新增从表数据
if (DataType.IsNullOrEmpty(dtl.InitDBAttrs) == false)
{
string[] keys = dtl.InitDBAttrs.Split(',');
MapAttr attr = null;
foreach (string keyOfEn in keys)
{
Entity ent = dtl.MapAttrs.GetEntityByKey(dtl.No + "_" + keyOfEn);
if (ent == null)
continue;
attr = ent as MapAttr;
if (DataType.IsNullOrEmpty(attr.UIBindKey) == true)
continue;
DataTable dt = null;
//枚举字段
if (attr.LGType == FieldTypeS.Enum && attr.MyDataType == DataType.AppInt)
dt = myds.Tables[attr.UIBindKey];
//外键、外部数据源
if ((attr.LGType == FieldTypeS.FK && attr.MyDataType == DataType.AppString)
|| (attr.LGType == FieldTypeS.Normal && attr.MyDataType == DataType.AppString && attr.UIContralType == UIContralType.DDL))
dt = myds.Tables[attr.UIBindKey];
if (dt == null)
continue;
foreach (DataRow dr in dt.Rows)
{
endtl = new GEDtl(dtl.No);
endtl.ResetDefaultVal();
endtl.SetValByKey(keyOfEn, dr[0]);
endtl.RefPK = dtlRefPKVal;
endtl.FID = fid;
endtl.Insert();
}
}
}
//2.从表装载填充
me = mes.GetEntityByKey("ExtModel", MapExtXmlList.PageLoadFullDtl) as MapExt;
if (me != null && me.DoWay.Equals("1") && DataType.IsNullOrEmpty(me.Doc) ==false)
{
string sql = Glo.DealSQLExp(me.Doc, en, null);
int num = Regex.Matches(sql.ToUpper(), "WHERE").Count;
if (num == 1)
{
string sqlext = sql.Substring(0, sql.ToUpper().IndexOf("WHERE"));
sqlext = sql.Substring(sqlext.Length + 1);
if (sqlext.Contains("@"))
throw new Exception("设置的sql有错误可能有没有替换的变量:" + sql);
}
if (num > 1 && sql.Contains("@"))
throw new Exception("设置的sql有错误可能有没有替换的变量:" + sql);
DataTable dt = DBAccess.RunSQLReturnTable(sql);
foreach (DataRow dr in dt.Rows)
{
endtl = new GEDtl(dtl.No);
foreach (DataColumn dc in dt.Columns)
{
endtl.SetValByKey(dc.ColumnName, dr[dc.ColumnName].ToString());
}
endtl.RefPK = dtlRefPKVal;
endtl.FID = fid;
endtl.RDT = DataType.CurrentDateTime;
endtl.Rec = WebUser.No;
endtl.Insert();
}
}
dtDtl = GetDtlInfo(dtl, en, dtlRefPKVal);
}
// 为明细表设置默认值.
MapAttrs mattrs = new MapAttrs(dtl.No);
foreach (MapAttr attr in mattrs)
{
if (attr.UIContralType == UIContralType.TB)
continue;
//处理它的默认值.
if (attr.DefValReal.Contains("@") == false)
continue;
foreach (DataRow dr in dtDtl.Rows)
{
if(dr[attr.KeyOfEn] == null || DataType.IsNullOrEmpty(dr[attr.KeyOfEn].ToString())==true)
dr[attr.KeyOfEn] = attr.DefVal;
}
}
dtDtl.TableName = "DBDtl"; //修改明细表的名称.
myds.Tables.Add(dtDtl); //加入这个明细表, 如果没有数据xml体现为空.
#endregion 把从表的数据放入.
//放入一个空白的实体,用与获取默认值.
GEDtl dtlBlank = new GEDtl(dtl.No);
dtlBlank.ResetDefaultVal();
myds.Tables.Add(dtlBlank.ToDataTableField("Blank"));
return myds;
}
public static DataTable GetDtlInfo(MapDtl dtl,GEEntity en,string dtlRefPKVal,bool isReload=false)
{
QueryObject qo = null;
GEDtls dtls = new GEDtls(dtl.No);
try
{
qo = new QueryObject(dtls);
switch (dtl.DtlOpenType)
{
case DtlOpenType.ForEmp: // 按人员来控制.
qo.AddWhere(GEDtlAttr.RefPK, dtlRefPKVal);
qo.addAnd();
qo.AddWhere(GEDtlAttr.Rec, WebUser.No);
break;
case DtlOpenType.ForWorkID: // 按工作ID来控制
case DtlOpenType.ForPWorkID:
qo.AddWhere(GEDtlAttr.RefPK, dtlRefPKVal);
break;
case DtlOpenType.ForFID: // 按工作ID来控制
qo.AddWhere(GEDtlAttr.FID, dtlRefPKVal);
break;
default:
qo.AddWhere(GEDtlAttr.RefPK, dtlRefPKVal);
break;
}
//条件过滤.
string exp = dtl.FilterSQLExp;
if (DataType.IsNullOrEmpty(exp) == false)
{
exp = Glo.DealExp(exp, en);
exp = exp.Replace("''", "'");
if (exp.Substring(0, 5).ToLower().Contains("and") == false)
exp = " AND " + exp;
qo.SQL = exp;
}
//排序.
if (DataType.IsNullOrEmpty(dtl.OrderBySQLExp) == false)
{
qo.addOrderBy(dtl.OrderBySQLExp);
}
else
{
//增加排序.
qo.addOrderBy("Idx");
}
qo.DoQuery();
//放入一个空白的实体,用与获取默认值.
GEDtl dtlBlank = new GEDtl(dtl.No);
dtlBlank.ResetDefaultVal();
if (dtls.Count == 0 && dtl.RowsOfList != 0 && dtl.ItIsInsert == true)
{
for (int i = 0; i < dtl.RowsOfList; i++)
{
GEDtl geDtl = new GEDtl(dtl.No);
geDtl.Copy(dtlBlank);
dtls.AddEntity(geDtl);
}
}
return dtls.ToDataTableField();
}
catch (Exception ex)
{
dtl.IntMapAttrs();
dtl.CheckPhysicsTable();
CacheFrmTemplate.Remove(dtl.No);
Cache.SetMap(dtl.No, null);
Cache.SQL_Cache.Remove(dtl.No);
if (isReload == false)
return GetDtlInfo(dtl, en, dtlRefPKVal, true);
else
throw new Exception("获取从表[" + dtl.Name + "]失败,错误:" + ex.Message);
}
}
}
}