using System;
using System.Data;
using System.Collections;
using BP.DA;
using BP.Sys.Base;
using BP.En;
using System.Collections.Generic;
using System.IO;
using BP.Pub;
using BP.Web;
namespace BP.Sys
{
///
/// 映射基础
///
public class MapDataAttr : EntityNoNameAttr
{
///
/// 表单事件实体类
///
public const string FormEventEntity = "FormEventEntity";
///
/// 存储表
///
public const string PTable = "PTable";
///
/// 表存储格式0=自定义表,1=指定表,可以修改字段2=执行表不可以修改字段.
///
public const string PTableModel = "PTableModel";
///
/// 从表数量
///
public const string Dtls = "Dtls";
///
/// 实体主键
///
public const string EnPK = "EnPK";
///
/// 宽度
///
public const string FrmW = "FrmW";
///
/// 表格列(对傻瓜表单有效)
///
public const string TableCol = "TableCol";
///
/// 来源
///
public const string FrmFrom = "FrmFrom";
///
/// 设计者
///
public const string Designer = "Designer";
///
/// 设计者单位
///
public const string DesignerUnit = "DesignerUnit";
///
/// 设计者联系方式
///
public const string DesignerContact = "DesignerContact";
///
/// 设计器
///
public const string DesignerTool11 = "DesignerTool";
///
/// 表单树类别
///
public const string FK_FormTree = "FK_FormTree";
///
/// 表单类型
///
public const string FrmType = "FrmType";
///
/// 业务类型
///
public const string EntityType = "EntityType";
///
/// 表单展示方式
///
public const string FrmShowType = "FrmShowType";
///
/// 单据模板
///
public const string FrmModel = "FrmModel";
///
/// Url(对于嵌入式表单有效)
///
public const string UrlExt = "UrlExt";
///
/// Tag
///
public const string Tag = "Tag";
///
/// 备注
///
public const string Note = "Note";
///
/// Idx
///
public const string Idx = "Idx";
///
/// GUID
///
public const string GUID = "GUID";
///
/// 版本号
///
public const string Ver = "Ver";
///
/// 应用类型
///
public const string AppType = "AppType";
///
/// 表单body属性.
///
public const string BodyAttr = "BodyAttr";
///
/// 流程控件
///
public const string FlowCtrls = "FlowCtrls";
///
///组织结构.
///
public const string OrgNo = "OrgNo";
///
/// Icon.
///
public const string Icon = "Icon";
#region DBList类型的实体.
///
/// 数据源
///
public const string DBSrc = "DBSrc";
///
/// 数据源类型
///
public const string DBType = "DBType";
///
/// 单行
///
public const string ExpEn = "ExpEn";
///
/// 列表
///
public const string ExpList = "ExpList";
///
/// 表达式
///
public const string ExpCount = "ExpCount";
///
/// 分页的模式
///
public const string ExpListPageModel = "ExpListPageModel";
#endregion DBList类型的实体.
#region 报表属性(参数的方式存储).
///
/// 是否关键字查询
///
public const string IsSearchKey = "IsSearchKey";
///
/// 时间段查询方式
///
public const string DTSearchWay = "DTSearchWay";
///
/// 时间字段
///
public const string DTSearchKey = "DTSearchKey";
///
/// 查询外键枚举字段
///
public const string RptSearchKeys = "RptSearchKeys";
#endregion 报表属性(参数的方式存储).
#region 其他计算属性,参数存储.
///
/// 最左边的值
///
public const string MaxLeft = "MaxLeft";
///
/// 最右边的值
///
public const string MaxRight = "MaxRight";
///
/// 最头部的值
///
public const string MaxTop = "MaxTop";
///
/// 最底部的值
///
public const string MaxEnd = "MaxEnd";
#endregion 其他计算属性,参数存储.
#region 参数属性.
public const string EnsName = "EnsName";
///
/// 是否是加密
///
public const string IsJM = "IsJM";
#endregion 参数属性.
}
///
/// 映射基础
///
public class MapData : EntityNoName
{
#region entity 相关属性(参数属性)
///
/// 属性ens
///
public string EnsName
{
get
{
return this.GetValStringByKey(MapDataAttr.EnsName);
}
set
{
this.SetPara(MapDataAttr.EnsName, value);
}
}
///
/// 是不是加密,为铁路局增加.
///
public bool ItIsJM
{
get
{
return this.GetParaBoolen(MapDataAttr.IsJM);
}
set
{
this.SetPara(MapDataAttr.IsJM, value);
}
}
#endregion entity 相关操作.
#region 报表属性(参数方式存储).
///
/// 是否关键字查询
///
public bool ItIsSearchKey
{
get
{
return this.GetParaBoolen(MapDataAttr.IsSearchKey, true);
}
set
{
this.SetPara(MapDataAttr.IsSearchKey, value);
}
}
///
/// 时间段查询方式
///
public DTSearchWay DTSearchWay
{
get
{
return (DTSearchWay)this.GetParaInt(MapDataAttr.DTSearchWay);
}
set
{
this.SetPara(MapDataAttr.DTSearchWay, (int)value);
}
}
///
/// 查询外键枚举字段
///
public string RptSearchKeys
{
get
{
return this.GetParaString(MapDataAttr.RptSearchKeys, "*");
}
set
{
this.SetPara(MapDataAttr.RptSearchKeys, value);
}
}
///
/// 查询key.
///
public string DTSearchKey
{
get
{
return this.GetParaString(MapDataAttr.DTSearchKey);
}
set
{
this.SetPara(MapDataAttr.DTSearchKey, value);
}
}
#endregion 报表属性(参数方式存储).
#region 外键属性
///
/// 版本号
///
public int Ver2022
{
get
{
return this.GetParaInt(MapDataAttr.Ver, 1);
}
set
{
this.SetPara(MapDataAttr.Ver, value);
}
}
public string OrgNo
{
get
{
return this.GetValStringByKey(MapDataAttr.OrgNo);
}
set
{
this.SetValByKey(MapDataAttr.OrgNo, value);
}
}
///
/// 顺序号
///
public int Idx
{
get
{
return this.GetValIntByKey(MapDataAttr.Idx);
}
set
{
this.SetValByKey(MapDataAttr.Idx, value);
}
}
///
/// 框架
///
public MapFrames MapFrames
{
get
{
Entities ens = this.GetEntitiesAttrFromAutoNumCache(new MapFrames(),
MapExtAttr.FK_MapData, this.No);
return ens as MapFrames;
}
}
///
/// 分组字段
///
public GroupFields GroupFields
{
get
{
GroupFields obj = this.GetRefObject("GroupFields") as GroupFields;
if (obj == null)
{
obj = new GroupFields(this.No);
this.SetRefObject("GroupFields", obj);
}
return obj;
}
}
///
/// 逻辑扩展
///
public MapExts MapExts
{
get
{
Entities ens = this.GetEntitiesAttrFromAutoNumCache(new MapExts(),
MapExtAttr.FK_MapData, this.No);
return ens as MapExts;
//MapExts obj = this.GetRefObject("MapExts") as MapExts;
//if (obj == null)
//{
// obj = new MapExts(this.No);
// this.SetRefObject("MapExts", obj);
//}
//return obj;
}
}
///
/// 事件:
/// 1.该事件与Node,Flow,MapDtl,MapData一样的算法.
/// 2.如果一个业务逻辑有变化,其他的也要变化.
///
public FrmEvents FrmEvents
{
get
{
Entities ens = this.GetEntitiesAttrFromAutoNumCache(new FrmEvents(),
FrmEventAttr.FrmID, this.No);
return ens as FrmEvents;
}
}
///
/// 从表原始属性的获取
///
public MapDtls OrigMapDtls
{
get
{
Entities ens = this.GetEntitiesAttrFromAutoNumCache(new MapDtls(),
MapDtlAttr.FK_MapData, this.No, MapDtlAttr.FK_Node, 0);
return ens as MapDtls;
}
}
///
/// 查询给MapData下的所有从表数据
///
public MapDtls MapDtls
{
get
{
Entities ens = this.GetEntitiesAttrFromAutoNumCache(new MapDtls(),
MapDtlAttr.FK_MapData, this.No);
return ens as MapDtls;
//MapDtls obj = this.GetRefObject("MapDtls") as MapDtls;
//if (obj == null)
//{
// obj = new MapDtls(this.No);
// this.SetRefObject("MapDtls", obj);
//}
//return obj;
}
}
///
/// 枚举值
///
public SysEnums SysEnums
{
get
{
SysEnums obj = this.GetRefObject("SysEnums") as SysEnums;
obj = null;
if (obj == null)
{
obj = new SysEnums();
if (BP.Difference.SystemConfig.AppCenterDBType == DBType.MySQL)
{
string strs = "";
Paras ps = new Paras();
ps.SQL = "SELECT UIBindKey FROM Sys_MapAttr WHERE FK_MapData=" + ps.DBStr + "FK_MapData AND LGType=1";
ps.Add("FK_MapData", this.No);
DataTable dt = DBAccess.RunSQLReturnTable(ps);
foreach (DataRow dr in dt.Rows)
{
strs += "'" + dr[0].ToString() + "',";
}
if (dt.Rows.Count >= 1)
{
strs += "'ssss'";
obj.RetrieveInOrderBy("EnumKey", strs, SysEnumAttr.IntKey);
}
}
else
{
if (BP.Difference.SystemConfig.CCBPMRunModel == CCBPMRunModel.SAAS)
{
string enumKeySQL = "SELECT UIBindKey FROM Sys_MapAttr WHERE FK_MapData = '" + this.No + "' AND LGType = 1 ";
string sqlWhere = " EnumKey IN (" + enumKeySQL + ") AND OrgNo='" + BP.Web.WebUser.OrgNo + "'";
string sqlEnum = "SELECT * FROM " + BP.Sys.Base.Glo.SysEnum() + " WHERE " + sqlWhere;
sqlEnum += " UNION ";
sqlEnum += "SELECT * FROM " + BP.Sys.Base.Glo.SysEnum() + " WHERE EnumKey IN (" + enumKeySQL + ") AND EnumKey NOT IN (SELECT EnumKey FROM Sys_Enum WHERE " + sqlWhere + ") AND (OrgNo Is Null Or OrgNo='')";
sqlEnum += "Order By IntKey";
DataTable dt = DBAccess.RunSQLReturnTable(sqlEnum);
QueryObject.InitEntitiesByDataTable(obj, dt, null);
}
else
{
obj.RetrieveInSQL(SysEnumAttr.EnumKey, "SELECT UIBindKey FROM Sys_MapAttr WHERE FK_MapData='" + this.No + "' AND LGType=1 ", SysEnumAttr.IntKey);
}
}
this.SetRefObject("SysEnums", obj);
}
return obj;
}
}
///
/// 图片
///
public FrmImgs FrmImgs
{
get
{
Entities ens = this.GetEntitiesAttrFromAutoNumCache(new FrmImgs(),
FrmImgAttr.FrmID, this.No);
return ens as FrmImgs;
}
}
///
/// 附件
///
public FrmAttachments FrmAttachments
{
get
{
Entities ens = this.GetEntitiesAttrFromAutoNumCache(new FrmAttachments(),
FrmAttachmentAttr.FK_MapData, this.No);
return ens as FrmAttachments;
}
}
///
/// 附件模板列表
///
// public SysFileManagers sysFileManagers
// {
// get
// {
// var ens = this.GetEntitiesAttrFromAutoNumCache(new SysFileManagers(),
//SysFileManagerAttr.FrmID, this.No);
// return ens as SysFileManagers;
// }
// }
///
/// 图片附件
///
public FrmImgAths FrmImgAths
{
get
{
Entities ens = this.GetEntitiesAttrFromAutoNumCache(new FrmImgAths(),
FrmImgAthAttr.FrmID, this.No);
return ens as FrmImgAths;
}
}
///
/// 单选按钮
///
public FrmRBs FrmRBs
{
get
{
Entities ens = this.GetEntitiesAttrFromAutoNumCache(new FrmRBs(),
FrmRBAttr.FrmID, this.No);
return ens as FrmRBs;
}
}
///
/// 属性
///
public MapAttrs MapAttrs
{
get
{
MapAttrs obj = this.GetRefObject("MapAttrs") as MapAttrs;
if (obj == null)
{
obj = new MapAttrs(this.No);
this.SetRefObject("MapAttrs", obj);
}
return obj;
}
}
#endregion
#region 缓存方法.
public void CleanObject()
{
this.Row.SetValByKey("FrmEles", null);
this.Row.SetValByKey("MapFrames", null);
this.Row.SetValByKey("GroupFields", null);
this.Row.SetValByKey("MapExts", null);
this.Row.SetValByKey("FrmEvents", null);
this.Row.SetValByKey("MapDtls", null);
this.Row.SetValByKey("SysEnums", null);
this.Row.SetValByKey("FrmRpts", null);
this.Row.SetValByKey("FrmLinks", null);
this.Row.SetValByKey("FrmBtns", null);
this.Row.SetValByKey("FrmEles", null);
// this.Row.SetValByKey("FrmLines", null);
// this.Row.SetValByKey("FrmLabs", null);
this.Row.SetValByKey("FrmAttachments", null);
this.Row.SetValByKey("FrmImgAthDBs", null);
this.Row.SetValByKey("FrmRBs", null);
this.Row.SetValByKey("MapAttrs", null);
return;
}
///
/// 清空缓存
///
public string ClearCache()
{
CacheFrmTemplate.Remove(this.No);
Cache.SetMap(this.No, null);
CleanObject();
Cache.SQL_Cache.Remove(this.No);
return "执行成功.";
}
#endregion 缓存方法.
#region 基本属性.
///
/// 事件实体
///
public string FormEventEntity
{
get
{
return this.GetValStringByKey(MapDataAttr.FormEventEntity);
}
set
{
this.SetValByKey(MapDataAttr.FormEventEntity, value);
}
}
public static Boolean IsEditDtlModel
{
get
{
string s = BP.Web.WebUser.GetSessionByKey("IsEditDtlModel", "0");
if (s.Equals("0"))
return false;
else
return true;
}
set
{
BP.Web.WebUser.SetSessionByKey("IsEditDtlModel", "1");
}
}
public string ICON
{
get
{
return this.GetValStringByKey(MapDataAttr.Icon);
}
}
#endregion 基本属性.
#region 属性
///
/// 物理表
///
public string PTable
{
get
{
string s = this.GetValStrByKey(MapDataAttr.PTable);
if (DataType.IsNullOrEmpty(s) == true)
return this.No;
return s.Trim();
}
set
{
this.SetValByKey(MapDataAttr.PTable, value);
}
}
///
/// 表存储模式0=自定义表,1,指定的表,2=指定的表不能修改表结构.
/// @周朋
///
public int PTableModel
{
get
{
return this.GetValIntByKey(MapDataAttr.PTableModel);
}
set
{
this.SetValByKey(MapDataAttr.PTableModel, value);
}
}
///
/// URL
///
public string UrlExt
{
get
{
return this.GetValStrByKey(MapDataAttr.UrlExt);
}
set
{
this.SetValByKey(MapDataAttr.UrlExt, value);
}
}
public DBUrlType HisDBUrl
{
get
{
return DBUrlType.AppCenterDSN;
// return (DBUrlType)this.GetValIntByKey(MapDataAttr.DBURL);
}
}
public int HisFrmTypeInt
{
get
{
return this.GetValIntByKey(MapDataAttr.FrmType);
}
set
{
this.SetValByKey(MapDataAttr.FrmType, value);
}
}
public FrmType HisFrmType
{
get
{
return (FrmType)this.GetValIntByKey(MapDataAttr.FrmType);
}
set
{
this.SetValByKey(MapDataAttr.FrmType, (int)value);
}
}
public int HisEntityType
{
get
{
return this.GetValIntByKey(MapDataAttr.EntityType);
}
set
{
this.SetValByKey(MapDataAttr.EntityType, value);
}
}
///
/// 表单类型名称
///
public string HisFrmTypeText
{
get
{
return this.HisFrmType.ToString();
// SysEnum se = new SysEnum("FrmType", this.HisFrmTypeInt);
// return se.Lab;
}
}
///
/// 备注
///
public string Note
{
get
{
return this.GetValStrByKey(MapDataAttr.Note);
}
set
{
this.SetValByKey(MapDataAttr.Note, value);
}
}
///
/// 是否有CA.
///
public bool ItIsHaveCA
{
get
{
return this.GetParaBoolen("IsHaveCA", false);
}
set
{
this.SetPara("IsHaveCA", value);
}
}
///
///是否启用装载填充
///
public bool ItIsPageLoadFull
{
get
{
return this.GetParaBoolen("IsPageLoadFull", false);
}
set
{
this.SetPara("IsPageLoadFull", value);
}
}
///
/// 数据源
///
public string DBSrc
{
get
{
return this.GetValStrByKey(MapDataAttr.DBSrc);
}
set
{
this.SetValByKey(MapDataAttr.DBSrc, value);
}
}
///
/// 类别,可以为空.
///
public string FormTreeNo
{
get
{
return this.GetValStrByKey(MapDataAttr.FK_FormTree);
}
set
{
this.SetValByKey(MapDataAttr.FK_FormTree, value);
}
}
///
/// 类别名称
///
public string FormTreeText
{
get
{
return DBAccess.RunSQLReturnStringIsNull("SELECT Name FROM Sys_FormTree WHERE No='" + this.FormTreeNo + "'", "目录错误");
}
}
///
/// 从表集合.
///
public string Dtls
{
get
{
return this.GetValStrByKey(MapDataAttr.Dtls);
}
set
{
this.SetValByKey(MapDataAttr.Dtls, value);
}
}
///
/// 主键
///
public string EnPK
{
get
{
string s = this.GetValStrByKey(MapDataAttr.EnPK);
if (DataType.IsNullOrEmpty(s))
return "OID";
return s;
}
set
{
this.SetValByKey(MapDataAttr.EnPK, value);
}
}
private Entities _HisEns = null;
public new Entities HisEns
{
get
{
if (_HisEns == null)
{
_HisEns = BP.En.ClassFactory.GetEns(this.No);
}
return _HisEns;
}
}
public Entity HisEn
{
get
{
return this.HisEns.GetNewEntity;
}
}
public float FrmW
{
get
{
return this.GetValFloatByKey(MapDataAttr.FrmW);
}
set
{
this.SetValByKey(MapDataAttr.FrmW, value);
}
}
///
/// 应用类型. 0独立表单.1节点表单
///
public string AppType
{
get
{
return this.GetValStrByKey(MapDataAttr.AppType);
}
set
{
this.SetValByKey(MapDataAttr.AppType, value);
}
}
///
/// 表单body属性.
///
public string BodyAttr
{
get
{
string str = this.GetValStrByKey(MapDataAttr.BodyAttr);
str = str.Replace("~", "'");
return str;
}
set
{
this.SetValByKey(MapDataAttr.BodyAttr, value);
}
}
///
/// 流程控件s.
///
public string FlowCtrls
{
get
{
return this.GetValStrByKey(MapDataAttr.FlowCtrls);
}
set
{
this.SetValByKey(MapDataAttr.FlowCtrls, value);
}
}
public int TableCol
{
get
{
return this.GetValIntByKey(MapDataAttr.TableCol);
}
set
{
this.SetValByKey(MapDataAttr.TableCol, value);
}
}
///
/// 实体表单类型.@0=独立表单@1=单据@2=编号名称实体@3=树结构实体
///
public EntityType EntityType
{
get
{
return (EntityType)this.GetValIntByKey(MapDataAttr.EntityType);
}
set
{
this.SetValByKey(MapDataAttr.EntityType, (int)value);
}
}
#endregion
#region 构造方法
public Map GenerHisMap()
{
MapAttrs mapAttrs = this.MapAttrs;
if (mapAttrs.Count == 0)
{
this.RepairMap();
mapAttrs = this.MapAttrs;
}
Map map = new Map(this.PTable, this.Name);
Attrs attrs = new Attrs();
foreach (MapAttr mapAttr in mapAttrs)
map.AddAttr(mapAttr.HisAttr);
// 产生从表。
MapDtls dtls = this.MapDtls; // new MapDtls(this.No);
foreach (MapDtl dtl in dtls)
{
GEDtls dtls1 = new GEDtls(dtl.No);
map.AddDtl(dtls1, "RefPK");
}
#region 查询条件.
map.ItIsShowSearchKey = this.ItIsSearchKey; //是否启用关键字查询.
// 按日期查询.
map.DTSearchWay = this.DTSearchWay; //日期查询方式.
map.DTSearchKey = this.DTSearchKey; //日期字段.
//是否是加密
map.ItIsJM = this.ItIsJM;
//加入外键查询字段.
string[] keys = this.RptSearchKeys.Split('*');
foreach (string key in keys)
{
if (DataType.IsNullOrEmpty(key))
continue;
if (map.Attrs.Contains(key) == false)
continue;
map.AddSearchAttr(key);
}
#endregion 查询条件.
return map;
}
private GEEntity _HisEn = null;
public GEEntity HisGEEn
{
get
{
if (this._HisEn == null)
_HisEn = new GEEntity(this.No);
return _HisEn;
}
}
///
/// 生成实体
///
///
///
public GEEntity GenerGEEntityByDataSet(DataSet ds)
{
// New 它的实例.
GEEntity en = this.HisGEEn;
// 它的table.
DataTable dt = ds.Tables[this.No];
//装载数据.
en.Row.LoadDataTable(dt, dt.Rows[0]);
// dtls.
MapDtls dtls = this.MapDtls;
foreach (MapDtl item in dtls)
{
DataTable dtDtls = ds.Tables[item.No];
GEDtls dtlsEn = new GEDtls(item.No);
foreach (DataRow dr in dtDtls.Rows)
{
// 产生它的Entity data.
GEDtl dtl = (GEDtl)dtlsEn.GetNewEntity;
dtl.Row.LoadDataTable(dtDtls, dr);
//加入这个集合.
dtlsEn.AddEntity(dtl);
}
//加入到他的集合里.
en.Dtls.Add(dtDtls);
}
return en;
}
///
/// 生成map.
///
///
///
public static Map GenerHisMap(string no)
{
if (BP.Difference.SystemConfig.isDebug)
{
MapData md = new MapData();
md.No = no;
md.Retrieve();
return md.GenerHisMap();
}
else
{
Map map = Cache.GetMap(no);
if (map == null)
{
MapData md = new MapData();
md.No = no;
md.Retrieve();
map = md.GenerHisMap();
Cache.SetMap(no, map);
}
return map;
}
}
///
/// 映射基础
///
public MapData()
{
}
///
/// 映射基础
///
/// 映射编号
public MapData(string no)
{
this.No = no;
this.Retrieve();
}
///
/// EnMap
///
public override Map EnMap
{
get
{
if (this._enMap != null)
return this._enMap;
Map map = new Map("Sys_MapData", "表单注册表");
#region 基础信息.
map.AddTBStringPK(MapDataAttr.No, null, "编号", true, false, 1, 200, 100);
map.AddTBString(MapDataAttr.Name, null, "描述", true, false, 0, 500, 20);
map.AddTBString(MapDataAttr.FormEventEntity, null, "事件实体", true, true, 0, 100, 20, true);
map.AddTBString(MapDataAttr.EnPK, null, "实体主键", true, false, 0, 200, 20);
map.AddTBString(MapDataAttr.PTable, null, "物理表", true, false, 0, 500, 20);
//@周朋 表存储格式0=自定义表,1=指定表,可以修改字段2=执行表不可以修改字段.
map.AddTBInt(MapDataAttr.PTableModel, 0, "表存储模式", true, true);
map.AddTBString(MapDataAttr.UrlExt, null, "连接(对嵌入式表单有效)", true, false, 0, 500, 20);
map.AddTBString(MapDataAttr.Dtls, null, "从表", true, false, 0, 500, 20);
//格式为: @1=方案名称1@2=方案名称2@3=方案名称3
//map.AddTBString(MapDataAttr.Slns, null, "表单控制解决方案", true, false, 0, 500, 20);
map.AddTBInt(MapDataAttr.FrmW, 900, "FrmW", true, true);
// @0=4列, @1=6 列.
map.AddTBInt(MapDataAttr.TableCol, 0, "傻瓜表单显示的列", true, true);
//Tag
map.AddTBString(MapDataAttr.Tag, null, "Tag", true, false, 0, 500, 20);
// 可以为空这个字段。
//map.AddTBString(MapDataAttr.FK_FrmSort, null, "表单类别", true, false, 0, 500, 20);
map.AddTBString(MapDataAttr.FK_FormTree, null, "表单树类别", true, false, 0, 500, 20);
// enumFrmType @自由表单,@傻瓜表单,@嵌入式表单.
map.AddDDLSysEnum(MapDataAttr.FrmType, (int)BP.Sys.FrmType.FoolForm, "表单类型", true, false, MapDataAttr.FrmType);
map.AddTBInt(MapDataAttr.FrmShowType, 0, "表单展示方式", true, true);
map.AddDDLSysEnum(MapDataAttr.EntityType, 0, "业务类型", true, false, MapDataAttr.EntityType,
"@0=独立表单@1=单据@2=编号名称实体@3=树结构实体");
map.SetHelperAlert(MapDataAttr.EntityType, "该实体的类型,@0=单据@1=编号名称实体@2=树结构实体.");
map.AddBoolean("IsEnableJs", false, "是否启用自定义js函数?", true, true, true);
// 应用类型. 0独立表单.1节点表单
map.AddTBInt(MapDataAttr.AppType, 0, "应用类型", true, false);
map.AddTBString(MapDataAttr.DBSrc, "local", "数据源", true, false, 0, 100, 20);
map.AddTBString(MapDataAttr.BodyAttr, null, "表单Body属性", true, false, 0, 100, 20);
#endregion 基础信息.
#region 设计者信息.
map.AddTBString(MapDataAttr.Note, null, "备注", true, false, 0, 500, 20);
map.AddTBString(MapDataAttr.Designer, null, "设计者", true, false, 0, 500, 20);
map.AddTBString(MapDataAttr.DesignerUnit, null, "单位", true, false, 0, 500, 20);
map.AddTBString(MapDataAttr.DesignerContact, null, "联系方式", true, false, 0, 500, 20);
map.AddTBInt(MapDataAttr.Idx, 100, "顺序号", true, true);
map.AddTBString(MapDataAttr.GUID, null, "GUID", true, false, 0, 128, 20);
map.AddTBString(MapDataAttr.Ver, null, "版本号", true, false, 0, 30, 20);
map.AddTBString(MapDataAttr.Icon, null, "Icon", true, false, 0, 100, 20, true);
//流程控件.
map.AddTBString(MapDataAttr.FlowCtrls, null, "流程控件", true, true, 0, 200, 20);
//增加参数字段.
map.AddTBAtParas(4000);
#endregion
map.AddTBString(MapDataAttr.OrgNo, null, "OrgNo", true, false, 0, 50, 20);
this._enMap = map;
return this._enMap;
}
}
///
/// 执行复制.
///
///
///
///
public string DoCopy(string copyToFrmID, string frmName)
{
BP.Sys.CCFormAPI.CopyFrm(this.No, copyToFrmID, frmName, this.FormTreeNo);
return "执行成功";
}
///
/// 上移
///
public void DoUp()
{
this.DoOrderUp(MapDataAttr.FK_FormTree, this.FormTreeNo, MapDataAttr.Idx);
}
///
/// 下移
///
public void DoOrderDown()
{
this.DoOrderDown(MapDataAttr.FK_FormTree, this.FormTreeNo, MapDataAttr.Idx);
}
//检查表单
public void CheckPTableSaveModel(string filed)
{
if (this.PTableModel == 2)
{
/*如果是存储格式*/
if (DBAccess.IsExitsTableCol(this.PTable, filed) == false)
throw new Exception("@表单的表存储模式不允许您创建不存在的字段(" + filed + "),不允许修改表结构.");
}
}
///
/// 获得PTableModel=2模式下的表单,没有被使用的字段集合.
///
///
///
public static DataTable GetFieldsOfPTableMode2(string frmID)
{
string pTable = "";
MapDtl dtl = new MapDtl();
dtl.No = frmID;
if (dtl.RetrieveFromDBSources() == 1)
{
pTable = dtl.PTable;
}
else
{
MapData md = new MapData();
md.No = frmID;
md.RetrieveFromDBSources();
pTable = md.PTable;
}
//获得原始数据.
DataTable dt = DBAccess.GetTableSchema(pTable);
//创建样本表结构.
DataTable mydt = DBAccess.GetTableSchema(pTable);
mydt.Rows.Clear();
//获得现有的列..
MapAttrs attrs = new MapAttrs(frmID);
string flowFiels = ",GUID,PRI,PrjNo,PrjName,PEmp,AtPara,FlowNote,WFSta,PNodeID,FK_FlowSort,FK_Flow,OID,FID,Title,WFState,CDT,FlowStarter,FlowStartRDT,FK_Dept,FK_NY,FlowDaySpan,FlowEmps,FlowEnder,FlowEnderRDT,FlowEndNode,MyNum,PWorkID,PFlowNo,BillNo,ProjNo,";
//排除已经存在的列. 把所有的列都输出给前台,让前台根据类型分拣.
foreach (DataRow dr in dt.Rows)
{
string key = dr["FName"].ToString();
if (attrs.Contains(MapAttrAttr.KeyOfEn, key) == true)
continue;
if (flowFiels.Contains("," + key + ",") == true)
continue;
DataRow mydr = mydt.NewRow();
mydr["FName"] = dr["FName"];
mydr["FType"] = dr["FType"];
mydr["FLen"] = dr["FLen"];
mydr["FDesc"] = dr["FDesc"];
mydt.Rows.Add(mydr);
}
return mydt;
}
#endregion
#region 常用方法.
private FormEventBase _HisFEB = null;
public FormEventBase HisFEB
{
get
{
if (this.FormEventEntity.Equals(""))
return null;
if (_HisFEB == null)
_HisFEB = BP.Sys.Base.Glo.GetFormEventBaseByEnName(this.No);
return _HisFEB;
}
}
///
/// 升级逻辑.
///
public void Upgrade()
{
string sql = "";
#region 升级ccform控件.
//if (DBAccess.IsExitsObject("Sys_FrmLine") == true)
//{
// //重命名.
// BP.Sys.SFDBSrc dbsrc = new SFDBSrc("local");
// dbsrc.Rename("Table", "Sys_FrmLine", "Sys_FrmLineBak");
//}
if (DBAccess.IsExitsObject("Sys_FrmLab") == true)
{
//重命名.
BP.Sys.SFDBSrc dbsrc = new SFDBSrc("local");
dbsrc.Rename("Table", "Sys_FrmLab", "Sys_FrmLabBak");
}
if (DBAccess.IsExitsObject("Sys_FrmBtn") == true)
{
//重命名.
BP.Sys.SFDBSrc dbsrc = new SFDBSrc("local");
dbsrc.Rename("Table", "Sys_FrmLab", "Sys_FrmLabBak");
}
#endregion 升级ccform控件.
}
///
/// 导入数据
///
///
///
public static MapData ImpMapData(DataSet ds)
{
string errMsg = "";
if (ds.Tables.Contains("WF_Flow") == true)
errMsg += "@此模板文件为流程模板。";
if (ds.Tables.Contains("Sys_MapAttr") == false)
errMsg += "@缺少表:Sys_MapAttr";
if (ds.Tables.Contains("Sys_MapData") == false)
errMsg += "@缺少表:Sys_MapData";
if (errMsg != "")
throw new Exception(errMsg);
DataTable dt = ds.Tables["Sys_MapData"];
string fk_mapData = dt.Rows[0]["No"].ToString();
MapData md = new MapData();
md.No = fk_mapData;
if (md.IsExits)
throw new Exception("err@已经存在(" + fk_mapData + ")的表单ID,所以您不能导入。");
//执行删除操作. 导入时为什么要执行删除?本来就没有这个表单,删除肯定报错,先注释了
//md.Delete();
//导入.
return ImpMapData(fk_mapData, ds);
}
///
/// 设置表单为只读属性
///
/// 表单ID
public static void SetFrmIsReadonly(string fk_mapdata)
{
//把主表字段设置为只读.
MapAttrs attrs = new MapAttrs(fk_mapdata);
foreach (MapAttr attr in attrs)
{
if (attr.DefValReal.Contains("@"))
{
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.setDefValReal(""); //清空默认值.
attr.SetValByKey("ExtDefVal", ""); //设置默认值.
attr.Update();
continue;
}
if (attr.UIIsEnable == true)
{
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.Update();
continue;
}
}
//把从表字段设置为只读.
MapDtls dtls = new MapDtls(fk_mapdata);
foreach (MapDtl dtl in dtls)
{
dtl.ItIsInsert = false;
dtl.ItIsUpdate = false;
dtl.ItIsDelete = false;
dtl.Update();
attrs = new MapAttrs(dtl.No);
foreach (MapAttr attr in attrs)
{
if (attr.DefValReal.Contains("@"))
{
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.setDefValReal(""); //清空默认值.
attr.SetValByKey("ExtDefVal", ""); //设置默认值.
attr.Update();
}
if (attr.UIIsEnable == true)
{
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.Update();
continue;
}
}
}
//把附件设置为只读.
FrmAttachments aths = new FrmAttachments(fk_mapdata);
foreach (FrmAttachment item in aths)
{
item.ItIsUpload = false;
item.HisDeleteWay = AthDeleteWay.DelSelf;
//如果是从开始节点表单导入的,就默认为, 按照主键PK的方式显示.
if (fk_mapdata.IndexOf("ND") == 0)
{
item.DataRefNoOfObj = "AttachM1";
}
item.Update();
}
}
///
/// 导入表单
///
/// 指定的表单ID
/// 表单数据
/// 是否设置只读?
///
public static MapData ImpMapData(string specFrmID, DataSet ds)
{
if (DataType.IsNullOrEmpty(specFrmID) == true)
ImpMapData(ds);
#region 检查导入的数据是否完整.
string errMsg = "";
//if (ds.Tables[0].TableName != "Sys_MapData")
// errMsg += "@非表单模板。";
if (ds.Tables.Contains("WF_Flow") == true)
errMsg += "@此模板文件为流程模板。";
if (ds.Tables.Contains("Sys_MapAttr") == false)
errMsg += "@缺少表:Sys_MapAttr";
if (ds.Tables.Contains("Sys_MapData") == false)
errMsg += "@缺少表:Sys_MapData";
DataTable dtCheck = ds.Tables["Sys_MapAttr"];
bool isHave = false;
foreach (DataRow dr in dtCheck.Rows)
{
if (dr["KeyOfEn"].ToString().Equals("OID"))
{
isHave = true;
break;
}
}
if (isHave == false)
errMsg += "@表单模版缺少列:OID";
if (errMsg != "")
throw new Exception("@以下错误不可导入,可能的原因是非表单模板文件:" + errMsg);
#endregion
// 定义在最后执行的sql.
string endDoSQL = "";
MapData mdOld = new MapData();
mdOld.No = specFrmID;
int count = mdOld.RetrieveFromDBSources();
if (count == 1)
mdOld.Delete();
// 求出dataset的map.
string oldMapID = "";
DataTable dtMap = ds.Tables["Sys_MapData"];
if (dtMap.Rows.Count == 1)
{
oldMapID = dtMap.Rows[0]["No"].ToString();
}
else
{
// 求旧的表单ID.
foreach (DataRow dr in dtMap.Rows)
oldMapID = dr["No"].ToString();
if (DataType.IsNullOrEmpty(oldMapID) == true)
oldMapID = dtMap.Rows[0]["No"].ToString();
}
//现在表单的类型
FrmType frmType = mdOld.HisFrmType;
//业务类型
int entityType = mdOld.HisEntityType;
//mdOld.Delete();
string timeKey = DBAccess.GenerGUID();
#region 表单元素
foreach (DataTable dt in ds.Tables)
{
int idx = 0;
switch (dt.TableName)
{
case "Sys_MapDtl":
foreach (DataRow dr in dt.Rows)
{
MapDtl dtl = new MapDtl();
foreach (DataColumn dc in dt.Columns)
{
object val = dr[dc.ColumnName] as object;
if (val == null)
continue;
//编号列.
string colName = dc.ColumnName.ToLower();
if (colName.Equals("no") || colName.Equals("name") || colName.Equals("fk_mapdata"))
dtl.SetValByKey(dc.ColumnName, val.ToString().Replace(oldMapID, specFrmID));
else
dtl.SetValByKey(dc.ColumnName, val.ToString());
}
dtl.Insert();
}
break;
case "Sys_MapData":
foreach (DataRow dr in dt.Rows)
{
MapData md = new MapData();
string htmlCode = "";
foreach (DataColumn dc in dt.Columns)
{
if (dc.ColumnName.Equals("HtmlTemplateFile") == true)
{
htmlCode = dr[dc.ColumnName] as string;
continue;
}
object val = dr[dc.ColumnName] as object;
if (val == null)
continue;
string colName = dc.ColumnName.ToLower();
if (colName.Equals("no") == true || colName.Equals("name") == true)
md.SetValByKey(dc.ColumnName, val.ToString().Replace(oldMapID, specFrmID));
else
md.SetValByKey(dc.ColumnName, val.ToString());
}
//表单类别编号不为空,则用原表单类别编号
md.FormTreeNo = mdOld.FormTreeNo;
if (DataType.IsNullOrEmpty(mdOld.PTable) == false)
md.PTable = mdOld.PTable;
//如果物理表为空,则使用编号为物理数据表
if (DataType.IsNullOrEmpty(md.PTable.Trim()) == true)
md.PTable = md.No;
if (DataType.IsNullOrEmpty(mdOld.Name) == false)
md.Name = mdOld.Name;
if (count == 1)
md.HisFrmType = mdOld.HisFrmType;
else
frmType = md.HisFrmType;
if (entityType != md.HisEntityType)
md.HisEntityType = entityType;
//表单应用类型保持不变
md.AppType = mdOld.AppType;
if (md.DirectUpdate() == 0)
md.DirectInsert();
Cache2019.UpdateRow(md.ToString(), md.No.ToString(), md.Row);
//如果是开发者表单,赋值HtmlTemplateFile数据库的值并保存到DataUser下
if (frmType == FrmType.Develop)
{
// string htmlCode = DBAccess.GetBigTextFromDB("Sys_MapData", "No", oldMapID, "HtmlTemplateFile");
if (DataType.IsNullOrEmpty(htmlCode) == false)
{
htmlCode = htmlCode.Replace(oldMapID, specFrmID);
//保存到数据库,存储html文件
//保存到DataUser/CCForm/HtmlTemplateFile/文件夹下
string filePath = BP.Difference.SystemConfig.PathOfDataUser + "CCForm/HtmlTemplateFile/";
if (Directory.Exists(filePath) == false)
Directory.CreateDirectory(filePath);
filePath = filePath + md.No + ".htm";
//写入到html 中
DataType.WriteFile(filePath, htmlCode);
// HtmlTemplateFile 保存到数据库中
DBAccess.SaveBigTextToDB(htmlCode, "Sys_MapData", "No", md.No, "HtmlTemplateFile");
}
else
{
//如果htmlCode是空的需要删除当前节点的html文件
string filePath = BP.Difference.SystemConfig.PathOfDataUser + "CCForm/HtmlTemplateFile/" + md.No + ".htm";
if (File.Exists(filePath) == true)
File.Delete(filePath);
DBAccess.SaveBigTextToDB("", "Sys_MapData", "No", md.No, "HtmlTemplateFile");
}
}
}
break;
case "Sys_FrmBtn":
foreach (DataRow dr in dt.Rows)
{
idx++;
FrmBtn en = new FrmBtn();
foreach (DataColumn dc in dt.Columns)
{
object val = dr[dc.ColumnName] as object;
if (val == null)
continue;
en.SetValByKey(dc.ColumnName, val.ToString().Replace(oldMapID, specFrmID));
}
//en.setMyPK("Btn_" + idx + "_" + fk_mapdata;
en.setMyPK(DBAccess.GenerGUID());
en.Insert();
}
break;
case "Sys_FrmImg":
foreach (DataRow dr in dt.Rows)
{
idx++;
FrmImg en = new FrmImg();
foreach (DataColumn dc in dt.Columns)
{
object val = dr[dc.ColumnName] as object;
if (val == null)
continue;
en.SetValByKey(dc.ColumnName, val.ToString().Replace(oldMapID, specFrmID));
}
if (DataType.IsNullOrEmpty(en.KeyOfEn) == true)
en.setMyPK(DBAccess.GenerGUID());
en.Insert();
}
break;
case "Sys_FrmImgAth":
foreach (DataRow dr in dt.Rows)
{
idx++;
FrmImgAth en = new FrmImgAth();
foreach (DataColumn dc in dt.Columns)
{
object val = dr[dc.ColumnName] as object;
if (val == null)
continue;
en.SetValByKey(dc.ColumnName, val.ToString().Replace(oldMapID, specFrmID));
}
if (DataType.IsNullOrEmpty(en.CtrlID))
en.CtrlID = "ath" + idx;
en.Insert();
}
break;
case "Sys_FrmRB":
foreach (DataRow dr in dt.Rows)
{
idx++;
FrmRB en = new FrmRB();
foreach (DataColumn dc in dt.Columns)
{
object val = dr[dc.ColumnName] as object;
if (val == null)
continue;
en.SetValByKey(dc.ColumnName, val.ToString().Replace(oldMapID, specFrmID));
}
try
{
en.Save();
}
catch
{
}
}
break;
case "Sys_FrmAttachment":
foreach (DataRow dr in dt.Rows)
{
idx++;
FrmAttachment en = new FrmAttachment();
foreach (DataColumn dc in dt.Columns)
{
object val = dr[dc.ColumnName] as object;
if (val == null)
continue;
en.SetValByKey(dc.ColumnName, val.ToString().Replace(oldMapID, specFrmID));
}
en.setMyPK(specFrmID + "_" + en.GetValByKey("NoOfObj"));
try
{
en.Insert();
}
catch
{
}
}
break;
case "Sys_MapFrame":
foreach (DataRow dr in dt.Rows)
{
idx++;
MapFrame en = new MapFrame();
foreach (DataColumn dc in dt.Columns)
{
object val = dr[dc.ColumnName] as object;
if (val == null)
continue;
en.SetValByKey(dc.ColumnName, val.ToString().Replace(oldMapID, specFrmID));
}
en.DirectInsert();
}
break;
case "Sys_MapExt":
foreach (DataRow dr in dt.Rows)
{
idx++;
MapExt en = new MapExt();
string text = "";
foreach (DataColumn dc in dt.Columns)
{
object val = dr[dc.ColumnName] as object;
if (val == null)
continue;
if (dc.ColumnName.Equals("HtmlText") == true)
{
text = dr[dc.ColumnName] as string;
continue;
}
if (DataType.IsNullOrEmpty(val.ToString()) == true)
continue;
en.SetValByKey(dc.ColumnName, val.ToString().Replace(oldMapID, specFrmID));
}
//执行保存,并统一生成PK的规则.
en.InitPK();
en.DirectSave();
if (en.ExtType.Equals("HtmlText") == true && DataType.IsNullOrEmpty(text) == false)
en.SaveBigNoteHtmlText(text);
}
break;
case "Sys_MapAttr":
foreach (DataRow dr in dt.Rows)
{
MapAttr en = new MapAttr();
foreach (DataColumn dc in dt.Columns)
{
object val = dr[dc.ColumnName] as object;
if (val == null)
continue;
en.SetValByKey(dc.ColumnName, val.ToString().Replace(oldMapID, specFrmID));
}
en.setMyPK(en.FrmID + "_" + en.KeyOfEn);
//直接插入.
try
{
en.DirectInsert();
//判断该字段是否是大文本 例如注释、说明
if (en.UIContralType == UIContralType.BigText)
{
//判断原文件是否存在
string file = BP.Difference.SystemConfig.PathOfDataUser + "CCForm/BigNoteHtmlText/" + oldMapID + ".htm";
//若文件存在,则复制
if (System.IO.File.Exists(file) == true)
{
string newFile = BP.Difference.SystemConfig.PathOfDataUser + "CCForm/BigNoteHtmlText/" + specFrmID + ".htm";
if (System.IO.File.Exists(newFile) == true)
System.IO.File.Delete(newFile);
System.IO.File.Copy(file, newFile);
}
}
}
catch
{
}
}
break;
case "Sys_GroupField":
foreach (DataRow dr in dt.Rows)
{
idx++;
GroupField en = new GroupField();
foreach (DataColumn dc in dt.Columns)
{
object val = dr[dc.ColumnName] as object;
if (val == null)
continue;
try
{
en.SetValByKey(dc.ColumnName, val.ToString().Replace(oldMapID, specFrmID));
}
catch
{
throw new Exception("val:" + val.ToString() + "oldMapID:" + oldMapID + "fk_mapdata:" + specFrmID);
}
}
int beforeID = en.OID;
en.OID = 0;
en.DirectInsert();
endDoSQL += "@UPDATE Sys_MapAttr SET GroupID=" + en.OID + " WHERE FK_MapData='" + specFrmID + "' AND GroupID='" + beforeID + "'";
}
break;
case "Sys_Enum":
case "Sys_Enums":
foreach (DataRow dr in dt.Rows)
{
SysEnum se = new Sys.SysEnum();
foreach (DataColumn dc in dt.Columns)
{
string val = dr[dc.ColumnName].ToString();// as string;
se.SetValByKey(dc.ColumnName, val);
}
if (BP.Difference.SystemConfig.CCBPMRunModel == CCBPMRunModel.SAAS)
{
se.OrgNo = BP.Web.WebUser.OrgNo;
// se.RefPK = se.OrgNo + "_" + se.EnumKey;
se.setMyPK(se.EnumKey + "_" + se.Lang + "_" + se.IntKey + "_" + se.OrgNo);
if (se.IsExits)
continue;
}
else
{
se.setMyPK(se.EnumKey + "_" + se.Lang + "_" + se.IntKey);
if (se.IsExits)
continue;
}
se.Insert();
}
break;
case "Sys_EnumMain":
foreach (DataRow dr in dt.Rows)
{
SysEnumMain sem = new Sys.SysEnumMain();
foreach (DataColumn dc in dt.Columns)
{
string val = dr[dc.ColumnName].ToString();// as string;
if (val == null)
continue;
sem.SetValByKey(dc.ColumnName, val);
}
if (BP.Difference.SystemConfig.CCBPMRunModel == CCBPMRunModel.SAAS)
{
sem.OrgNo = BP.Web.WebUser.OrgNo;
sem.No = sem.OrgNo + "_" + sem.EnumKey;
if (sem.IsExits)
continue;
}
else
{
if (sem.IsExits)
continue;
}
sem.Insert();
}
break;
case "WF_Node":
if (dt.Rows.Count > 0)
{
endDoSQL += "@UPDATE WF_Node SET FWCSta=2"
+ ",FWC_X=" + dt.Rows[0]["FWC_X"]
+ ",FWC_Y=" + dt.Rows[0]["FWC_Y"]
+ ",FWC_H=" + dt.Rows[0]["FWC_H"]
+ ",FWC_W=" + dt.Rows[0]["FWC_W"]
+ ",FWCType=" + dt.Rows[0]["FWCType"]
+ " WHERE NodeID=" + specFrmID.Replace("ND", "");
}
break;
default:
break;
}
}
#endregion
//执行最后结束的sql.
DBAccess.RunSQLs(endDoSQL);
MapData mdNew = new MapData(specFrmID);
mdNew.RepairMap();
if (mdNew.No.IndexOf("ND") == 0)
{
mdNew.FormTreeNo = "";
}
mdNew.Update();
return mdNew;
}
///
/// 修复map.
///
public void RepairMap()
{
GroupFields gfs = new GroupFields(this.No);
if (gfs.Count == 0)
{
GroupField gf = new GroupField();
gf.FrmID = this.No;
gf.Lab = this.Name;
gf.Insert();
string sqls = "";
sqls += "@UPDATE Sys_MapDtl SET GroupID=" + gf.OID + " WHERE FK_MapData='" + this.No + "'";
sqls += "@UPDATE Sys_MapAttr SET GroupID=" + gf.OID + " WHERE FK_MapData='" + this.No + "'";
//sqls += "@UPDATE Sys_MapFrame SET GroupID=" + gf.OID + " WHERE FK_MapData='" + this.No + "'";
sqls += "@UPDATE Sys_FrmAttachment SET GroupID=" + gf.OID + " WHERE FK_MapData='" + this.No + "'";
DBAccess.RunSQLs(sqls);
}
else
{
if (BP.Difference.SystemConfig.AppCenterDBType != DBType.Oracle)
{
GroupField gfFirst = gfs[0] as GroupField;
string sqls = "";
// sqls += "@UPDATE Sys_MapAttr SET GroupID=" + gfFirst.OID + " WHERE MyPK IN (SELECT X.MyPK FROM (SELECT MyPK FROM Sys_MapAttr WHERE GroupID NOT IN (SELECT OID FROM Sys_GroupField WHERE FrmID='" + this.No + "') or GroupID is null) AS X) AND FK_MapData='" + this.No + "' ";
sqls += "@UPDATE Sys_FrmAttachment SET GroupID=" + gfFirst.OID + " WHERE MyPK IN (SELECT X.MyPK FROM (SELECT MyPK FROM Sys_FrmAttachment WHERE GroupID NOT IN (SELECT OID FROM Sys_GroupField WHERE FrmID='" + this.No + "')) AS X) AND FK_MapData='" + this.No + "' ";
#warning 这些sql 对于Oracle 有问题,但是不影响使用.
try
{
DBAccess.RunSQLs(sqls);
}
catch
{
}
}
}
BP.Sys.MapAttr attr = new BP.Sys.MapAttr();
if (this.EnPK.Equals("OID"))
{
if (attr.IsExit(MapAttrAttr.KeyOfEn, "OID", MapAttrAttr.FK_MapData, this.No) == false)
{
attr.FrmID =this.No;
attr.setKeyOfEn("OID");
attr.setName("OID");
attr.setMyDataType(DataType.AppInt);
attr.setUIContralType(UIContralType.TB);
attr.setLGType(FieldTypeS.Normal);
attr.SetValByKey(MapAttrAttr.UIVisible, false);
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.DefVal = "0";
attr.HisEditType = BP.En.EditType.Readonly;
attr.Insert();
}
}
if (this.EnPK.Equals("No") || this.EnPK.Equals("MyPK"))
{
if (attr.IsExit(MapAttrAttr.KeyOfEn, this.EnPK, MapAttrAttr.FK_MapData, this.No) == false)
{
attr.FrmID =this.No;
attr.setKeyOfEn(this.EnPK);
attr.Name = this.EnPK;
attr.setMyDataType(DataType.AppInt);
attr.setUIContralType(UIContralType.TB);
attr.setLGType(FieldTypeS.Normal);
attr.SetValByKey(MapAttrAttr.UIVisible, false);
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.DefVal = "0";
attr.HisEditType = BP.En.EditType.Readonly;
attr.Insert();
}
}
if (attr.IsExit(MapAttrAttr.KeyOfEn, "RDT", MapAttrAttr.FK_MapData, this.No) == false)
{
attr = new BP.Sys.MapAttr();
attr.FrmID =this.No;
attr.setEditType(EditType.UnDel);
attr.setKeyOfEn("RDT");
attr.setName("更新时间");
attr.setGroupID(0);
attr.setMyDataType(DataType.AppDateTime);
attr.setUIContralType(UIContralType.TB);
attr.setLGType(FieldTypeS.Normal);
attr.SetValByKey(MapAttrAttr.UIVisible, false);
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.DefVal = "@RDT";
attr.Tag = "1";
attr.Insert();
}
//检查特殊UIBindkey丢失的问题.
MapAttrs attrs = new MapAttrs();
attrs.Retrieve(MapAttrAttr.FK_MapData, this.No);
foreach (MapAttr item in attrs)
{
if (item.LGType == FieldTypeS.Enum || item.LGType == FieldTypeS.FK)
{
if (DataType.IsNullOrEmpty(item.UIBindKey) == true)
{
item.setLGType(FieldTypeS.Normal);
item.setUIContralType(UIContralType.TB);
item.Update();
}
}
}
}
protected override bool beforeInsert()
{
if (this.HisFrmType == FrmType.Url || this.HisFrmType == FrmType.Entity)
{
}
else
{
this.PTable = BP.Pub.PubClass.DealToFieldOrTableNames(this.PTable);
}
//写入日志.
if (this.No.StartsWith("ND") == false)
BP.Sys.Base.Glo.WriteUserLog("新建表单:" + this.No + " - " + this.Name);
this.Ver2022 = 1;
return base.beforeInsert();
}
///
/// 创建MapData后插入一条版本数据
///
protected override void afterInsert()
{
if (DataType.IsNullOrEmpty(this.FormTreeNo) == true)
{
base.afterInsert();
return;
}
MapDataVer ver = new MapDataVer();
ver.MyPK = this.No + ".1";
ver.Ver = 1; //设置当前为主版本.
ver.FrmID = this.No; //设置表单ID.
ver.ItIsRel = 1; //设置为主版本.
ver.Rec = WebUser.No;
ver.RecName = WebUser.Name;
ver.RDT = DataType.CurrentDateTime;
//设置数量.
ver.AttrsNum = 0;
ver.AthsNum = 0;
ver.DtlsNum = 0;
ver.ExtsNum = 0;
ver.Insert();
base.afterInsert();
}
protected override bool beforeUpdateInsertAction()
{
if (this.HisFrmType == FrmType.Url || this.HisFrmType == FrmType.Entity)
return base.beforeUpdateInsertAction();
//clear外键实体数量的缓存.
this.ClearAutoNumCache(false);
this.PTable = PubClass.DealToFieldOrTableNames(this.PTable);
//修改2021-09-04 注释,不知道这个代码的作用
//MapAttrs.Retrieve(MapAttrAttr.FK_MapData, PTable);
//设置OrgNo. 如果是管理员,就设置他所在的部门编号。
if (BP.Difference.SystemConfig.CCBPMRunModel != CCBPMRunModel.Single)
this.OrgNo = BP.Web.WebUser.OrgNo;
//判断是否有多个主键字段?
// string sql = "SELECT ";
//检查主键.
CheckPKFields(this.No, this.Name);
//清除缓存.
this.ClearCache();
return base.beforeUpdateInsertAction();
}
public static string CheckPKFields(string frmID, string name)
{
string sql = "SELECT KeyOfEn, Name FROM Sys_MapAttr WHERE FK_MapData='" + frmID + "' ";
sql += " AND ( ";
sql += " KeyOfEn='OID' ";
sql += " OR KeyOfEn='No' ";
sql += " OR KeyOfEn='MyPK' ";
sql += " OR KeyOfEn='NodeID' ";
sql += " OR KeyOfEn='WorkID' ";
sql += " ) ";
DataTable dt = DBAccess.RunSQLReturnTable(sql);
if (dt.Rows.Count == 1)
return "数据正确.";
if (dt.Rows.Count == 0)
return "err@表单缺少主键." + frmID + "," + name;
string msg = "err@FrmID=" + frmID + name + "主键不明确.";
foreach (DataRow dr in dt.Rows)
{
msg += "@" + dr[0] + "," + dr[1].ToString();
}
return msg;
}
///
/// 更新版本
///
public void UpdateVer()
{
string sql = "UPDATE Sys_MapData SET VER='" + DataType.CurrentDateTimess + "' WHERE No='" + this.No + "'";
DBAccess.RunSQL(sql);
}
protected override bool beforeDelete()
{
#region 判断是否是节点表单?如果是,判断节点是否被删除了.
//if (this.No.StartsWith("ND") == true)
//{
// string frmID = this.No.Replace("ND", "");
// if (BP.DA.DataType.IsNumStr(frmID) == true)
// {
// int nodeID = int.Parse(frmID);
// int count = DBAccess.RunSQLReturnValInt("SELECT COUNT(*) as NUM FROM WF_Node WHERE NodeID=" + nodeID);
// if (count == 1)
// throw new Exception("err@删除节点表单前,需要删除节点数据."+this.No+" - " +this.Name);
// }
//}
#endregion 判断是否是节点表单?如果是,判断节点是否被删除了.
#region 检查完整性.
string sql = "";
//如果存在版本就不能删除
sql = "SELECT count(*) From Sys_MapDataVer Where FrmID='" + this.No + "' AND Ver!=" + this.Ver2022;
try
{
if (DBAccess.RunSQLReturnValInt(sql) > 0)
{
throw new Exception("表单存在其他的版本,请删除其他版本后再删除表单");
//return false;
}
}
catch (Exception ex)
{
MapDataVer mv = new MapDataVer();
mv.CheckPhysicsTable();
if (DBAccess.RunSQLReturnValInt(sql) > 0)
{
throw new Exception("表单存在其他的版本,请删除其他版本后再删除表单");
//return false;
}
}
//如果当前版本是主版本,需要删除主版本的信息
sql = "SELECT Ver From Sys_MapDataVer WHERE FrmID='" + this.No + "' AND IsRel=1";
int ver = DBAccess.RunSQLReturnValInt(sql, 0);
if (ver == this.Ver2022)
{
//删除主版本的信息
MapData md = new MapData();
md.No = this.No + "." + ver;
if (md.RetrieveFromDBSources() == 1)
md.Delete();
DBAccess.RunSQL("DELETE FROM Sys_MapDataVer WHERE MyPK='" + md.No + "'");
}
sql = "";
sql = "SELECT * FROM Sys_MapDtl WHERE FK_MapData ='" + this.No + "'";
DataTable Sys_MapDtl = DBAccess.RunSQLReturnTable(sql);
string whereFK_MapData = "FK_MapData= '" + this.No + "' ";
string whereEnsName = "FrmID= '" + this.No + "' ";
string whereNo = "No='" + this.No + "' ";
foreach (DataRow dr in Sys_MapDtl.Rows)
{
// ids += ",'" + dr["No"] + "'";
whereFK_MapData += " OR FK_MapData='" + dr["No"] + "' ";
whereEnsName += " OR FrmID='" + dr["No"] + "' ";
whereNo += " OR No='" + dr["No"] + "' ";
}
#endregion 检查完整性.
#region 删除相关的数据。
sql = "DELETE FROM Sys_MapDtl WHERE FK_MapData='" + this.No + "'";
// sql += "@DELETE FROM Sys_FrmLine WHERE " + whereFK_MapData;
//@hongyan.
if (DBAccess.IsExitsTableCol("Sys_FrmEvent", "FrmID"))
DBAccess.RunSQL("DELETE FROM Sys_FrmEvent WHERE " + whereEnsName);
if (DBAccess.IsExitsTableCol("Sys_FrmEvent", "FK_MapData"))
DBAccess.RunSQL("DELETE FROM Sys_FrmEvent WHERE " + whereFK_MapData);
sql += "@DELETE FROM Sys_FrmBtn WHERE " + whereFK_MapData;
// sql += "@DELETE FROM Sys_FrmLab WHERE " + whereFK_MapData;
//sql += "@DELETE FROM Sys_FrmLink WHERE " + whereFK_MapData;
sql += "@DELETE FROM Sys_FrmImg WHERE " + whereFK_MapData;
sql += "@DELETE FROM Sys_FrmImgAth WHERE " + whereFK_MapData;
sql += "@DELETE FROM Sys_FrmRB WHERE " + whereFK_MapData;
sql += "@DELETE FROM Sys_FrmAttachment WHERE " + whereFK_MapData;
sql += "@DELETE FROM Sys_MapFrame WHERE " + whereFK_MapData;
if (this.No.Contains("BP.") == false)
sql += "@DELETE FROM Sys_MapExt WHERE " + whereFK_MapData;
sql += "@DELETE FROM Sys_MapAttr WHERE " + whereFK_MapData;
sql += "@DELETE FROM Sys_GroupField WHERE " + whereEnsName;
sql += "@DELETE FROM Sys_MapData WHERE " + whereNo;
// sql += "@DELETE FROM Sys_M2M WHERE " + whereFK_MapData;
sql += "@DELETE FROM WF_FrmNode WHERE FK_Frm='" + this.No + "'";
sql += "@DELETE FROM Sys_FrmSln WHERE " + whereFK_MapData;
//sql += "@DELETE FROM Sys_MapDataVer WHERE " + whereFK_MapData;
DBAccess.RunSQLs(sql);
#endregion 删除相关的数据。
#region 删除物理表。
//如果存在物理表.
if (DBAccess.IsExitsObject(this.PTable) && this.PTable.IndexOf("ND") == 0)
{
//如果其他表单引用了该表,就不能删除它.
sql = "SELECT COUNT(No) AS NUM FROM Sys_MapData WHERE PTable='" + this.PTable + "' OR ( PTable='' AND No='" + this.PTable + "')";
if (DBAccess.RunSQLReturnValInt(sql, 0) > 1)
{
/*说明有多个表单在引用.*/
}
else
{
// edit by zhoupeng 误删已经有数据的表.
if (DBAccess.RunSQLReturnValInt("SELECT COUNT(*) FROM " + this.PTable + " WHERE 1=1 ") == 0)
DBAccess.RunSQL("DROP TABLE " + this.PTable);
}
}
MapDtls dtls = new MapDtls(this.No);
foreach (MapDtl dtl in dtls)
dtl.Delete();
#endregion
#region 删除注册到的外检表.
SFTables sfs = new SFTables();
sfs.Retrieve(SFTableAttr.SrcTable, this.PTable);
foreach (SFTable item in sfs)
{
if (item.IsCanDelete() == null)
item.Delete();
}
#endregion 删除注册到的外检表.
#region 属性.
#endregion 属性.
//写入日志.
if (this.No.StartsWith("ND") == false)
BP.Sys.Base.Glo.WriteUserLog("删除表单:" + this.No + " - " + this.Name);
return base.beforeDelete();
}
#endregion 常用方法.
#region 与Excel相关的操作 .
///
/// 获得Excel文件流
///
///
///
public bool ExcelGenerFile(string pkValue, ref byte[] bytes, string saveTo)
{
try
{
byte[] by = DBAccess.GetByteFromDB(this.PTable, this.EnPK, pkValue, saveTo);
if (by != null)
{
bytes = by;
return true;
}
else //说明当前excel文件没有生成.
{
string tempExcel = BP.Difference.SystemConfig.PathOfDataUser + "FrmVSTOTemplate/" + this.No + ".xlsx";
if (System.IO.File.Exists(tempExcel) == true)
{
bytes = DataType.ConvertFileToByte(tempExcel);
return false;
}
else //模板文件也不存在时
{
throw new Exception("@没有找到模版文件." + tempExcel + " 请确认表单配置.");
}
}
}
catch (Exception ex)
{
BP.DA.Log.DebugWriteError("读取excel失败:" + ex.Message);
return false;
}
}
///
/// 保存excel文件
///
///
///
///
public void ExcelSaveFile(string pkValue, byte[] bty, string saveTo)
{
DBAccess.SaveBytesToDB(bty, this.PTable, this.EnPK, pkValue, saveTo);
}
#endregion 与Excel相关的操作 .
#region 与Word相关的操作 .
///
/// 获得Excel文件流
///
///
///
public void WordGenerFile(string pkValue, ref byte[] bytes, string saveTo)
{
byte[] by = DBAccess.GetByteFromDB(this.PTable, this.EnPK, pkValue, saveTo);
if (by != null)
{
bytes = by;
return;
}
else //说明当前excel文件没有生成.
{
string tempExcel = BP.Difference.SystemConfig.PathOfDataUser + "FrmVSTOTemplate/" + this.No + ".docx";
if (System.IO.File.Exists(tempExcel) == false)
tempExcel = BP.Difference.SystemConfig.PathOfDataUser + "FrmVSTOTemplate/NDxxxRpt.docx";
bytes = DataType.ConvertFileToByte(tempExcel);
return;
}
}
///
/// 保存excel文件
///
///
///
public void WordSaveFile(string pkValue, byte[] bty, string saveTo)
{
DBAccess.SaveBytesToDB(bty, this.PTable, this.EnPK, pkValue, saveTo);
}
#endregion 与Excel相关的操作 .
///
/// 创建版本
///
public string CreateMapDataVer()
{
//创建版本之前先判断当前版本是不是有数据
if (BP.DA.DBAccess.IsExitsObject(this.PTable) == false)
{
//MapData md = new MapData(this.No);
GEEntity ge = new GEEntity(this.No);
ge.CheckPhysicsTable();
}
//获得最大的版本数.
int count = DBAccess.RunSQLReturnValInt("SELECT COUNT(*) From " + this.PTable + " WHERE AtPara NOT LIKE '%@FrmVer=%'");
if (count == 0)
return "表单" + this.Name + "版本" + this.Ver2022 + "还没有使用,不用创建新的版本。";
MapDataVer ver = new MapDataVer();
MapDataVers vers = new MapDataVers();
vers.Retrieve("FrmID", this.No);
if (vers.Count == 0)
{
ver.MyPK = this.No + ".1";
ver.Ver = 1; //设置当前为主版本.
ver.FrmID = this.No; //设置表单ID.
ver.ItIsRel = 1; //设置为主版本.
ver.Rec = WebUser.No;
ver.RecName = WebUser.Name;
ver.RDT = DataType.CurrentDateTime;
//设置数量.
ver.AttrsNum = DBAccess.RunSQLReturnValInt("SELECT COUNT(*) FROM Sys_MapAttr WHERE FK_MapData='" + this.No + "'");
ver.AthsNum = DBAccess.RunSQLReturnValInt("SELECT COUNT(*) FROM Sys_Frmattachment WHERE FK_MapData='" + this.No + "'");
ver.DtlsNum = DBAccess.RunSQLReturnValInt("SELECT COUNT(*) FROM Sys_MapDtl WHERE FK_MapData='" + this.No + "'");
ver.ExtsNum = DBAccess.RunSQLReturnValInt("SELECT COUNT(*) FROM Sys_MapExt WHERE FK_MapData='" + this.No + "'");
ver.Insert();
this.Ver2022 = ver.Ver; //更新当前的版本.
this.Update();
//执行复制,表单.
BP.Sys.CCFormAPI.CopyFrm(this.No, this.No + "." + this.Ver2022, this.Name + "." + ver.Ver, this.FormTreeNo);
return "创建成功." + ver.GetValByKey(MapDataVerAttr.Ver);
}
//缺少AtPara字段
MapAttr mattr = new MapAttr();
mattr.setMyPK(this.No + "_AtPara");
if (mattr.RetrieveFromDBSources() == 0)
{
mattr.FrmID =this.No;
mattr.HisEditType = EditType.UnDel;
mattr.setKeyOfEn("AtPara");
mattr.setName("参数"); // 单据编号
mattr.setMyDataType(DataType.AppString);
mattr.setUIContralType(UIContralType.TB);
mattr.setLGType(FieldTypeS.Normal);
mattr.setUIVisible(false);
mattr.setUIIsEnable(false);
mattr.UIIsLine = false;
mattr.setMinLen(0);
mattr.setMaxLen(4000);
mattr.Idx = -100;
mattr.Insert();
GEEntity en = new GEEntity(this.No);
en.CheckPhysicsTable();
}
//设置所有的版本为 0 .
string sql = "UPDATE Sys_MapDataVer SET IsRel=0 WHERE FrmID='" + this.No + "'";
DBAccess.RunSQL(sql);
#region 1. 创建新版本 执行复制,表单.
int maxVer = DBAccess.RunSQLReturnValInt("SELECT MAX(ver) FROM Sys_MapDataVer WHERE FrmID='" + this.No + "'", 0);
//执行复制,表单,创建新版本.
ver.Ver = maxVer + 1;
ver.MyPK = this.No + "." + ver.Ver;
ver.FrmID = this.No; //设置表单ID.
ver.ItIsRel = 1; //设置为主版本.
ver.Rec = WebUser.No;
ver.RecName = WebUser.Name;
ver.RDT = DataType.CurrentDateTime;
//设置数量.
ver.AttrsNum = DBAccess.RunSQLReturnValInt("SELECT COUNT(*) FROM Sys_MapAttr WHERE FK_MapData='" + this.No + "'");
ver.AthsNum = DBAccess.RunSQLReturnValInt("SELECT COUNT(*) FROM Sys_Frmattachment WHERE FK_MapData='" + this.No + "'");
ver.DtlsNum = DBAccess.RunSQLReturnValInt("SELECT COUNT(*) FROM Sys_MapDtl WHERE FK_MapData='" + this.No + "'");
ver.ExtsNum = DBAccess.RunSQLReturnValInt("SELECT COUNT(*) FROM Sys_MapExt WHERE FK_MapData='" + this.No + "'");
ver.Insert(); //创建新版本.
//生成新的表单.
BP.Sys.CCFormAPI.CopyFrm(this.No, this.No + "." + ver.Ver, this.Name + "(Ver" + ver.Ver + ".0)", this.FormTreeNo);
//把版本的FK_FormTree清空
MapData md = new MapData(this.No + "." + ver.Ver);
md.FormTreeNo = "";
md.Update();
#endregion 1. 创建新版本 执行复制,表单.
#region 2. 覆盖旧版本.
string currVer = this.No + "." + this.Ver2022.ToString(); // this.No + "." + vers.Count;
md = new MapData();
md.No = currVer;
if (md.RetrieveFromDBSources() == 1)
md.Delete();
//把表单属性的FK_FormTree清空
BP.Sys.CCFormAPI.CopyFrm(this.No, currVer, this.Name + "(Ver" + this.Ver2022.ToString() + ".0)", this.FormTreeNo);
md.Retrieve();
md.FormTreeNo = "";
md.PTable = this.PTable;
md.Update();
//修改从表的存储表
MapDtls dtls = md.MapDtls;
foreach (MapDtl dtl in dtls)
{
if (dtl.PTable.Equals(dtl.No) == true)
{
dtl.PTable = dtl.PTable.Replace(currVer, this.No);
dtl.Update();
continue;
}
}
//把当前表单对应数据改成当前的版本
DBAccess.RunSQL("UPDATE " + md.PTable + " SET AtPara=CONCAT(AtPara,'@FrmVer=" + this.Ver2022 + "') WHERE AtPara NOT LIKE '%@FrmVer=%'");
#endregion 2. 覆盖旧版本.
#region 3. 更新当前版本号.
this.Ver2022 = ver.Ver; //更新当前的版本.
this.Update();
#endregion 3. 更新当前版本号.
return "创建成功,版本号:" + ver.Ver;
}
}
///
/// 映射基础s
///
public class MapDatas : EntitiesNoName
{
#region 构造
///
/// 映射基础s
///
public MapDatas()
{
}
///
/// 得到它的 Entity
///
public override Entity GetNewEntity
{
get
{
return new MapData();
}
}
#endregion
#region 为了适应自动翻译成java的需要,把实体转换成List.
///
/// 转化成 java list,C#不能调用.
///
/// List
public System.Collections.Generic.IList ToJavaList()
{
return (System.Collections.Generic.IList)this;
}
///
/// 转化成list
///
/// List
public System.Collections.Generic.List Tolist()
{
System.Collections.Generic.List list = new System.Collections.Generic.List();
for (int i = 0; i < this.Count; i++)
{
list.Add((MapData)this[i]);
}
return list;
}
#endregion 为了适应自动翻译成java的需要,把实体转换成List.
}
}