using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
using BP.WF.Template;
using BP.WF.Data;
using BP.DA;
using BP.En;
using BP.Sys;
using BP.WF.Template.SFlow;
namespace BP.WF
{
///
/// 流程检查类
/// 1. 创建修复数据表.
/// 2. 检查流程设计的合法性.
///
public class FlowCheckError
{
#region 构造方法与属性.
public DataTable dt = null;
///
/// 流程
///
public Flow flow = null;
///
/// 节点s
///
public Nodes nds = null;
///
/// 通用的
///
public GERpt HisGERpt
{
get
{
return this.flow.HisGERpt;
}
}
///
/// 流程检查
///
/// 流程实体
public FlowCheckError(Flow fl)
{
this.flow = fl;
this.nds = new Nodes(fl.No);
//构造消息存储.
dt = new DataTable();
dt.Columns.Add("InfoType");
dt.Columns.Add("Msg");
dt.Columns.Add("NodeID");
dt.Columns.Add("NodeName");
}
///
/// 流程检查
///
/// 流程编号
public FlowCheckError(string flNo)
{
this.flow = new Flow(flNo);
this.nds = new Nodes(this.flow.No);
//构造消息存储.
dt = new DataTable();
dt.Columns.Add("InfoType");
dt.Columns.Add("Msg");
dt.Columns.Add("NodeID");
dt.Columns.Add("NodeName");
}
///
/// 信息
///
///
///
private void AddMsgInfo(string info, Node nd = null)
{
AddMsg("信息", info, nd);
}
///
/// 警告
///
///
///
private void AddMsgWarning(string info, Node nd = null)
{
AddMsg("警告", info, nd);
}
private void AddMsgError(string info, Node nd = null)
{
AddMsg("错误", info, nd);
}
///
/// 增加审核信息
///
/// 类型
/// 消息
/// 节点
///
private void AddMsg(string type, string info, Node nd = null)
{
DataRow dr = this.dt.NewRow();
dr[0] = type;
dr[1] = info;
if (nd != null)
{
dr[2] = nd.NodeID;
dr[3] = nd.Name;
}
this.dt.Rows.Add(dr);
}
#endregion 构造方法与属性.
///
/// 校验流程
///
///
public void DoCheck()
{
Cache.ClearCache();
try
{
//设置自动计算.
CheckMode_Auto();
///检查独立表单的完整性.
CheckMode_Frms();
//通用检查.
CheckMode_Gener();
//检查数据合并模式.
CheckMode_SpecTable();
//节点表单字段数据类型检查
CheckModel_FormFields();
//检查越轨流程,子流程发起.
CheckModel_SubFlowYanXus();
//检查报表.
this.DoCheck_CheckRpt(this.nds);
//检查焦点字段设置是否还有效.
CheckMode_FocusField();
//检查质量考核点.
CheckMode_EvalModel();
//检查如果是合流节点必须不能是由上一个节点指定接受人员.
CheckMode_HeliuAccpterRole();
//创建track.
Track.CreateOrRepairTrackTable(this.flow.No);
//如果是引用的表单库的表单,就要检查该表单是否有FID字段,没有就自动增加.
CheckMode_Ref();
}
catch (Exception ex)
{
this.AddMsgError("err@" + ex.Message + " " + ex.StackTrace);
}
}
///
/// 通用的检查.
///
public void CheckMode_Gener()
{
//条件集合.
Conds conds = new Conds(this.flow.No);
foreach (Node nd in nds)
{
//设置它的位置类型.
nd.SetValByKey(NodeAttr.NodePosType, (int)nd.GetHisNodePosType());
this.AddMsgInfo("修复&检查节点信息", nd);
nd.RepareMap(this.flow);
// 从表检查。
Sys.MapDtls dtls = new BP.Sys.MapDtls("ND" + nd.NodeID);
foreach (BP.Sys.MapDtl dtl in dtls)
{
this.AddMsgInfo("检查明细表" + dtl.Name, nd);
dtl.HisGEDtl.CheckPhysicsTable();
}
MapAttrs mattrs = new MapAttrs("ND" + nd.NodeID);
#region 对节点的访问规则进行检查
this.AddMsgInfo("开始对节点的访问规则进行检查", nd);
switch (nd.HisDeliveryWay)
{
case DeliveryWay.ByStation:
case DeliveryWay.FindSpecDeptEmpsInStationlist:
if (nd.NodeStations.Count == 0)
this.AddMsgInfo("错误:您设置了该节点的访问规则是按角色,但是您没有为节点绑定角色。", nd);
break;
case DeliveryWay.ByDept:
if (nd.NodeDepts.Count == 0)
this.AddMsgInfo("设置了该节点的访问规则是按部门,但是您没有为节点绑定部门", nd);
break;
case DeliveryWay.ByBindEmp:
if (nd.NodeEmps.Count == 0)
this.AddMsgInfo("您设置了该节点的访问规则是按人员,但是您没有为节点绑定人员。", nd);
break;
case DeliveryWay.BySpecNodeEmp: /*按指定的角色计算.*/
case DeliveryWay.BySpecNodeEmpStation: /*按指定的角色计算.*/
if (nd.DeliveryParas.Trim().Length == 0)
{
this.AddMsgInfo("您设置了该节点的访问规则是按指定的角色计算,但是您没有设置节点编号。", nd);
}
else
{
if (DataType.IsNumStr(nd.DeliveryParas) == false)
{
this.AddMsgInfo("您没有设置指定角色的节点编号,目前设置的为{" + nd.DeliveryParas + "}", nd);
}
}
break;
case DeliveryWay.ByDeptAndStation: /*按部门与角色的交集计算.*/
string mysql = string.Empty;
//added by liuxc,2015.6.30.
//区别集成与BPM模式
mysql = "SELECT pdes.EmpNo AS No"
+ " FROM Port_DeptEmpStation pdes"
+ " INNER JOIN WF_NodeDept wnd"
+ " ON wnd.DeptNo = pdes.DeptNo"
+ " AND wnd.NodeID = " + nd.NodeID
+ " INNER JOIN WF_NodeStation wns"
+ " ON wns.FK_Station = pdes.StationNo"
+ " AND wnd.NodeID =" + nd.NodeID
+ " ORDER BY"
+ " pdes.EmpNo";
DataTable mydt = DBAccess.RunSQLReturnTable(mysql);
if (mydt.Rows.Count == 0)
this.AddMsgInfo("按照角色与部门的交集计算错误,没有人员集合{" + mysql + "}", nd);
break;
case DeliveryWay.BySQL:
case DeliveryWay.BySQLAsSubThreadEmpsAndData:
if (nd.DeliveryParas.Trim().Length <= 5)
{
this.AddMsgInfo("您设置了该节点的访问规则是按SQL查询,但是您没有在节点属性里设置查询sql,此sql的要求是查询必须包含No,Name两个列,sql表达式里支持@+字段变量,详细参考开发手册.", nd);
continue;
}
string sql = nd.DeliveryParas;
foreach (MapAttr item in mattrs)
{
if (item.ItIsNum)
sql = sql.Replace("@" + item.KeyOfEn, "0");
else
sql = sql.Replace("@" + item.KeyOfEn, "'0'");
}
sql = sql.Replace("@WebUser.No", "'ss'");
sql = sql.Replace("@WebUser.Name", "'ss'");
sql = sql.Replace("@WebUser.FK_DeptName", "'ss'");
sql = sql.Replace("@WebUser.FK_Dept", "'ss'");
sql = sql.Replace("''''", "''"); //出现双引号的问题.
if (sql.Contains("@"))
{
this.AddMsgError("您编写的sql变量填写不正确,实际执行中,没有被完全替换下来" + sql, nd);
continue;
}
DataTable testDB = null;
try
{
testDB = DBAccess.RunSQLReturnTable(sql);
}
catch (Exception ex)
{
this.AddMsgError("您设置了该节点的访问规则是按SQL查询,执行此语句错误." + sql + " err:" + ex.Message, nd);
break;
}
if (testDB.Columns.Contains("no") == false
|| testDB.Columns.Contains("name") == false)
{
this.AddMsgError("您设置了该节点的访问规则是按SQL查询,设置的sql不符合规则,此sql的要求是查询必须包含No,Name两个列,sql表达式里支持@+字段变量,详细参考开发手册.", nd);
}
break;
case DeliveryWay.ByPreviousNodeFormEmpsField:
case DeliveryWay.ByPreviousNodeFormStationsAI:
case DeliveryWay.ByPreviousNodeFormStationsOnly:
case DeliveryWay.ByPreviousNodeFormDepts:
//去rpt表中,查询是否有这个字段
string str = nd.NodeID.ToString().Substring(0, nd.NodeID.ToString().Length - 2);
MapAttrs rptAttrs = new BP.Sys.MapAttrs();
rptAttrs.Retrieve(MapAttrAttr.FK_MapData, "ND" + str + "Rpt", MapAttrAttr.KeyOfEn);
if (rptAttrs.Contains(BP.Sys.MapAttrAttr.KeyOfEn, nd.DeliveryParas) == false)
{
/*检查节点字段是否有FK_Emp字段*/
this.AddMsgError("您设置了该节点的访问规则是[06.按上一节点表单指定的字段值作为本步骤的接受人],但是您没有在节点属性的[访问规则设置内容]里设置指定的表单字段,详细参考开发手册.", nd);
}
break;
case DeliveryWay.BySelected: /* 由上一步发送人员选择 */
break;
case DeliveryWay.ByPreviousNodeEmp: /* 与上一个节点人员相同. */
break;
default:
break;
}
#endregion
#region 检查节点完成条件,方向条件的定义.
if (conds.Count != 0)
{
this.AddMsgInfo("开始检查(" + nd.Name + ")方向条件:", nd);
foreach (Cond cond in conds)
{
Node ndOfCond = new Node();
ndOfCond.NodeID = ndOfCond.NodeID;
if (ndOfCond.RetrieveFromDBSources() == 0)
continue;
if (cond.AttrKey.Length < 2)
continue;
if (ndOfCond.HisWork.EnMap.Attrs.Contains(cond.AttrKey) == false)
{
this.AddMsgError("@错误:属性:" + cond.AttrKey + " , " + cond.AttrName + " 不存在。", nd);
continue;
}
}
}
#endregion 检查节点完成条件的定义.
}
}
///
/// 流程属性的预先计算与基础的更新
///
public void CheckMode_Auto()
{
// 设置流程名称.
DBAccess.RunSQL("UPDATE WF_Node SET FlowName = (SELECT Name FROM WF_Flow WHERE NO=WF_Node.FK_Flow)");
//设置单据编号只读格式.
DBAccess.RunSQL("UPDATE Sys_MapAttr SET UIIsEnable=0 WHERE KeyOfEn='BillNo' AND UIIsEnable=1");
//开始节点不能有会签.
DBAccess.RunSQL("UPDATE WF_Node SET HuiQianRole=0 WHERE NodePosType=0 AND HuiQianRole !=0");
//开始节点不能有退回.
DBAccess.RunSQL("UPDATE WF_Node SET ReturnRole=0 WHERE NodePosType=0 AND ReturnRole !=0");
//删除垃圾,非法数据.
string sqls = "DELETE FROM Sys_FrmSln WHERE FK_MapData NOT IN (SELECT No from Sys_MapData)";
sqls += "@ DELETE FROM WF_Direction WHERE Node=ToNode";
DBAccess.RunSQLs(sqls);
//更新计算数据.
this.flow.NumOfBill = DBAccess.RunSQLReturnValInt("SELECT count(*) FROM Sys_FrmPrintTemplate WHERE NodeID IN (SELECT NodeID FROM WF_Flow WHERE No='" + this.flow.No + "')");
this.flow.NumOfDtl = DBAccess.RunSQLReturnValInt("SELECT count(*) FROM Sys_MapDtl WHERE FK_MapData='ND" + int.Parse(this.flow.No) + "Rpt'");
this.flow.DirectUpdate();
//一直没有找到设置3列,自动回到四列的情况.
DBAccess.RunSQL("UPDATE Sys_MapAttr SET ColSpan=3 WHERE UIHeight<=23 AND ColSpan=4");
}
///
/// 检查独立表单的完整性.
///
public void CheckMode_Frms()
{
FrmNodes fns = new FrmNodes();
fns.Retrieve(FrmNodeAttr.FK_Flow, this.flow.No);
string frms = "";
string err = "";
foreach (FrmNode item in fns)
{
if (frms.Contains(item.FK_Frm + ","))
continue;
frms += item.FK_Frm + ",";
MapData md = new MapData();
md.No = item.FK_Frm;
if (md.RetrieveFromDBSources() == 0)
{
this.AddMsgError("节点绑定的表单ID=" + item.FK_Frm + ",但该表单已经不存在.", new Node(item.NodeID));
continue;
}
}
}
///
/// 如果是引用的表单库的表单,就要检查该表单是否有FID字段,没有就自动增加.
///
public void CheckMode_Ref()
{
foreach (Node nd in nds)
{
if (nd.HisFormType == NodeFormType.RefOneFrmTree)
{
MapAttr mattr = new MapAttr();
mattr.setMyPK(nd.NodeFrmID + "_FID");
if (mattr.RetrieveFromDBSources() == 0)
{
mattr.SetValByKey(MapAttrAttr.KeyOfEn,"FID");
mattr.SetValByKey(MapAttrAttr.FK_MapData, nd.NodeFrmID);
mattr.SetValByKey(MapAttrAttr.MyDataType, DataType.AppInt);
mattr.SetValByKey(MapAttrAttr.UIVisible, false);
mattr.SetValByKey(MapAttrAttr.Name, "FID(自动增加)");
mattr.Insert();
GEEntity en = new GEEntity(nd.NodeFrmID);
en.CheckPhysicsTable();
}
}
}
}
///
/// 检查是否是数据合并模式
///
public void CheckMode_SpecTable()
{
foreach (Node nd in nds)
{
MapData md = new MapData();
md.No = "ND" + nd.NodeID;
if (md.RetrieveFromDBSources() == 1)
{
if (md.PTable != this.flow.PTable)
{
md.PTable = this.flow.PTable;
md.Update();
}
}
}
}
///
/// 检查越轨流程,子流程发起.
///
public void CheckModel_SubFlowYanXus()
{
string msg = "";
SubFlowYanXus yanxuFlows = new SubFlowYanXus();
yanxuFlows.Retrieve(SubFlowYanXuAttr.SubFlowNo, this.flow.No);
foreach (SubFlowYanXu flow in yanxuFlows)
{
Flow fl = new Flow(flow.SubFlowNo);
}
}
///
/// 检查焦点字段设置是否还有效
///
public void CheckMode_FocusField()
{
string msg = "";
//获得gerpt字段.
GERpt rpt = this.flow.HisGERpt;
foreach (Node nd in nds)
{
if (nd.FocusField.Trim() == "")
{
Work wk = nd.HisWork;
string attrKey = "";
foreach (Attr attr in wk.EnMap.Attrs)
{
if (attr.UIVisible == true && attr.UIIsDoc && attr.UIIsReadonly == false)
attrKey = attr.Desc + ":@" + attr.Key;
}
if (attrKey == "")
{
msg = "@警告:节点ID:" + nd.NodeID + " 名称:" + nd.Name + "属性里没有设置焦点字段,会导致信息写入轨迹表空白,为了能够保证流程轨迹是可读的请设置焦点字段.";
this.AddMsgWarning(msg, nd);
}
else
{
msg = "@信息:节点ID:" + nd.NodeID + " 名称:" + nd.Name + "属性里没有设置焦点字段,会导致信息写入轨迹表空白,为了能够保证流程轨迹是可读的系统自动设置了焦点字段为" + attrKey + ".";
this.AddMsgInfo(msg, nd);
nd.FocusField = attrKey;
nd.DirectUpdate();
}
continue;
}
string strs = nd.FocusField.Clone() as string;
strs = Glo.DealExp(strs, rpt, "err");
if (strs.Contains("@") == true)
{
msg = "@警告:焦点字段(" + nd.FocusField + ")在节点(step:" + nd.Step + " 名称:" + nd.Name + ")属性里的设置已无效,表单里不存在该字段.";
this.AddMsgError(msg, nd);
}
if (this.flow.ItIsMD5)
{
if (nd.HisWork.EnMap.Attrs.Contains(WorkAttr.MD5) == false)
nd.RepareMap(this.flow);
}
}
}
///
/// 检查质量考核点
///
public void CheckMode_EvalModel()
{
string msg = "";
foreach (Node nd in nds)
{
if (nd.ItIsEval)
{
/*如果是质量考核点,检查节点表单是否具别质量考核的特别字段?*/
string sql = "SELECT COUNT(*) FROM Sys_MapAttr WHERE FK_MapData='ND" + nd.NodeID + "' AND KeyOfEn IN ('EvalEmpNo','EvalEmpName','EvalEmpCent')";
if (DBAccess.RunSQLReturnValInt(sql) != 3)
{
msg = "@信息:您设置了节点(" + nd.NodeID + "," + nd.Name + ")为质量考核节点,但是您没有在该节点表单中设置必要的节点考核字段.";
this.AddMsgError(msg, nd);
}
}
}
}
///
/// 检查如果是合流节点必须不能是由上一个节点指定接受人员.
///
///
public void CheckMode_HeliuAccpterRole()
{
string msg = "";
foreach (Node nd in nds)
{
//如果是合流节点.
if (nd.HisNodeWorkType == NodeWorkType.WorkHL || nd.HisNodeWorkType == NodeWorkType.WorkFHL)
{
if (nd.HisDeliveryWay == DeliveryWay.BySelected)
{
msg = "@错误:节点ID:" + nd.NodeID + " 名称:" + nd.Name + "是合流或者分合流节点,但是该节点设置的接收人规则为由上一步指定,这是错误的,应该为自动计算而非每个子线程人为的选择.";
this.AddMsgError(msg, nd);
}
}
//子线程节点
if (nd.HisNodeWorkType == NodeWorkType.SubThreadWork)
{
if (nd.CondModel != DirCondModel.ByLineCond)
{
Nodes toNodes = nd.HisToNodes;
if (toNodes.Count == 1)
{
//msg += "@错误:节点ID:" + nd.NodeID + " 名称:" + nd.Name + " 错误当前节点为子线程,但是该节点的到达.";
}
}
}
}
}
///
/// 节点表单字段数据类型检查,名字相同的字段出现类型不同的处理方法:依照不同于NDxxRpt表中同名字段类型为基准
///
/// 检查结果
private string CheckModel_FormFields()
{
StringBuilder errorAppend = new StringBuilder();
errorAppend.Append("@信息: -------- 流程节点表单的字段类型检查: ------ ");
try
{
Nodes nds = new Nodes(this.flow.No);
string fk_mapdatas = "'ND" + int.Parse(this.flow.No) + "Rpt'";
foreach (Node nd in nds)
{
fk_mapdatas += ",'ND" + nd.NodeID + "'";
}
//筛选出类型不同的字段
string checkSQL = "SELECT AA.KEYOFEN, COUNT(*) AS MYNUM FROM ("
+ " SELECT A.KEYOFEN, MYDATATYPE, COUNT(*) AS MYNUM"
+ " FROM SYS_MAPATTR A WHERE FK_MAPDATA IN (" + fk_mapdatas + ") GROUP BY KEYOFEN, MYDATATYPE"
+ ") AA GROUP BY AA.KEYOFEN HAVING COUNT(*) > 1";
DataTable dt_Fields = DBAccess.RunSQLReturnTable(checkSQL);
foreach (DataRow row in dt_Fields.Rows)
{
string keyOfEn = row["KEYOFEN"].ToString();
string myNum = row["MYNUM"].ToString();
int iMyNum = 0;
int.TryParse(myNum, out iMyNum);
//存在2种以上数据类型,有手动进行调整
if (iMyNum > 2)
{
errorAppend.Append("@错误:字段名" + keyOfEn + "在此流程表(" + fk_mapdatas + ")中存在2种以上数据类型(如:int,float,varchar,datetime),请手动修改。");
return errorAppend.ToString();
}
//存在2种数据类型,以不同于NDxxRpt字段类型为主
MapAttr baseMapAttr = new MapAttr();
MapAttr rptMapAttr = new MapAttr("ND" + int.Parse(this.flow.No) + "Rpt", keyOfEn);
//Rpt表中不存在此字段
if (rptMapAttr == null || rptMapAttr.MyPK == "")
{
this.DoCheck_CheckRpt(this.nds);
rptMapAttr = new MapAttr("ND" + int.Parse(this.flow.No) + "Rpt", keyOfEn);
this.HisGERpt.CheckPhysicsTable();
}
//Rpt表中不存在此字段,直接结束
if (rptMapAttr == null || rptMapAttr.MyPK == "")
continue;
foreach (Node nd in nds)
{
MapAttr ndMapAttr = new MapAttr("ND" + nd.NodeID, keyOfEn);
if (ndMapAttr == null || ndMapAttr.MyPK == "")
continue;
//找出与NDxxRpt表中字段数据类型不同的表单
if (rptMapAttr.MyDataType != ndMapAttr.MyDataType)
{
baseMapAttr = ndMapAttr;
break;
}
}
errorAppend.Append("@基础表" + baseMapAttr.FrmID + ",字段" + keyOfEn + "数据类型为:" + baseMapAttr.MyDataTypeStr);
//根据基础属性类修改数据类型不同的表单
foreach (Node nd in nds)
{
MapAttr ndMapAttr = new MapAttr("ND" + nd.NodeID, keyOfEn);
//不包含此字段的进行返回,类型相同的进行返回
if (ndMapAttr == null || ndMapAttr.MyPK == "" || baseMapAttr.MyPK == ndMapAttr.MyPK || baseMapAttr.MyDataType == ndMapAttr.MyDataType)
continue;
ndMapAttr.SetValByKey(MapAttrAttr.Name, baseMapAttr.Name);
ndMapAttr.SetValByKey(MapAttrAttr.MyDataType, baseMapAttr.MyDataType);
ndMapAttr.SetValByKey(MapAttrAttr.UIWidth, baseMapAttr.UIWidth);
ndMapAttr.SetValByKey(MapAttrAttr.UIHeight, baseMapAttr.UIHeight);
ndMapAttr.SetValByKey(MapAttrAttr.MinLen, baseMapAttr.MinLen);
ndMapAttr.SetValByKey(MapAttrAttr.MaxLen, baseMapAttr.MaxLen);
if (ndMapAttr.Update() > 0)
errorAppend.Append("@修改了" + "ND" + nd.NodeID + " 表,字段" + keyOfEn + "修改为:" + baseMapAttr.MyDataTypeStr);
else
errorAppend.Append("@错误:修改" + "ND" + nd.NodeID + " 表,字段" + keyOfEn + "修改为:" + baseMapAttr.MyDataTypeStr + "失败。");
}
//修改NDxxRpt
rptMapAttr.SetValByKey(MapAttrAttr.Name,baseMapAttr.Name);
rptMapAttr.SetValByKey(MapAttrAttr.MyDataType, baseMapAttr.MyDataType);
rptMapAttr.SetValByKey(MapAttrAttr.UIWidth , baseMapAttr.UIWidth);
rptMapAttr.SetValByKey(MapAttrAttr.UIHeight , baseMapAttr.UIHeight);
rptMapAttr.SetValByKey(MapAttrAttr.MinLen , baseMapAttr.MinLen);
rptMapAttr.SetValByKey(MapAttrAttr.MaxLen ,baseMapAttr.MaxLen);
if (rptMapAttr.Update() > 0)
errorAppend.Append("@修改了" + "ND" + int.Parse(this.flow.No) + "Rpt 表,字段" + keyOfEn + "修改为:" + baseMapAttr.MyDataTypeStr);
else
errorAppend.Append("@错误:修改" + "ND" + int.Parse(this.flow.No) + "Rpt 表,字段" + keyOfEn + "修改为:" + baseMapAttr.MyDataTypeStr + "失败。");
}
}
catch (Exception ex)
{
errorAppend.Append("@错误:" + ex.Message);
}
return errorAppend.ToString();
}
///
/// 检查数据报表.
///
///
private void DoCheck_CheckRpt(Nodes nds)
{
string fk_mapData = "ND" + int.Parse(this.flow.No) + "Rpt";
string flowId = int.Parse(this.flow.No).ToString();
//生成该节点的 nds 比如 "'ND101','ND102','ND103'"
string ndsstrs = "";
foreach (BP.WF.Node nd in nds)
{
ndsstrs += "'ND" + nd.NodeID + "',";
}
ndsstrs = ndsstrs.Substring(0, ndsstrs.Length - 1);
#region 插入字段。
string sql = "SELECT distinct KeyOfEn FROM Sys_MapAttr WHERE FK_MapData IN (" + ndsstrs + ")";
if (BP.Difference.SystemConfig.AppCenterDBType == DBType.MySQL)
{
sql = "SELECT A.* FROM (" + sql + ") AS A ";
string sql3 = "DELETE FROM Sys_MapAttr WHERE KeyOfEn NOT IN (" + sql + ") AND FK_MapData='" + fk_mapData + "' ";
DBAccess.RunSQL(sql3); // 删除不存在的字段.
}
else
{
string sql2 = "DELETE FROM Sys_MapAttr WHERE KeyOfEn NOT IN (" + sql + ") AND FK_MapData='" + fk_mapData + "' ";
DBAccess.RunSQL(sql2); // 删除不存在的字段.
}
//所有节点表单字段的合集.
sql = "SELECT MyPK, KeyOfEn FROM Sys_MapAttr WHERE FK_MapData IN (" + ndsstrs + ")";
DataTable dt = DBAccess.RunSQLReturnTable(sql);
//求已经存在的字段集合。
sql = "SELECT KeyOfEn FROM Sys_MapAttr WHERE FK_MapData='ND" + flowId + "Rpt'";
DataTable dtExits = DBAccess.RunSQLReturnTable(sql);
string pks = "@";
foreach (DataRow dr in dtExits.Rows)
pks += dr[0] + "@";
//遍历 - 所有节点表单字段的合集
foreach (DataRow dr in dt.Rows)
{
if (pks.Contains("@" + dr["KeyOfEn"].ToString() + "@") == true)
continue;
string mypk = dr["MyPK"].ToString();
pks += dr["KeyOfEn"].ToString() + "@";
//找到这个属性.
BP.Sys.MapAttr ma = new BP.Sys.MapAttr(mypk);
ma.setMyPK("ND" + flowId + "Rpt_" + ma.KeyOfEn);
ma.FrmID ="ND" + flowId + "Rpt";
ma.setUIIsEnable(false);
if (ma.DefValReal.Contains("@"))
{
/*如果是一个有变量的参数.*/
ma.DefVal = "";
}
// 如果不存在.
if (ma.IsExits == false)
ma.Insert();
}
MapAttrs attrs = new MapAttrs(fk_mapData);
// 创建mapData.
BP.Sys.MapData md = new BP.Sys.MapData();
md.No = "ND" + flowId + "Rpt";
if (md.RetrieveFromDBSources() == 0)
{
md.Name = this.flow.Name;
md.PTable = this.flow.PTable;
md.Insert();
}
else
{
md.Name = this.flow.Name;
md.PTable = this.flow.PTable;
md.Update();
}
#endregion 插入字段。
#region 补充上流程字段到NDxxxRpt.
int groupID = 0;
foreach (MapAttr attr in attrs)
{
switch (attr.KeyOfEn)
{
case GERptAttr.FK_Dept:
attr.SetValByKey(MapAttrAttr.UIContralType,(int)UIContralType.TB);
attr.setLGType(FieldTypeS.Normal);
attr.SetValByKey(MapAttrAttr.UIVisible, true);
attr.SetValByKey(MapAttrAttr.GroupID, groupID);
attr.SetValByKey(MapAttrAttr.DefVal, "");
attr.SetValByKey(MapAttrAttr.MaxLen, 100);
attr.Update();
break;
case "FK_NY":
attr.setUIContralType(UIContralType.TB);
attr.setLGType(FieldTypeS.Normal);
attr.SetValByKey(MapAttrAttr.UIVisible, true);
attr.SetValByKey(MapAttrAttr.GroupID, groupID);
attr.SetValByKey(MapAttrAttr.DefVal, "");
attr.SetValByKey(MapAttrAttr.MaxLen, 100);
//// attr.UIBindKey = "BP.Pub.NYs";
//attr.setUIContralType(UIContralType.TB);
//attr.setLGType(FieldTypeS.Normal);
//attr.setUIVisible(true);
//attr.setUIIsEnable(false);
//attr.GroupID = groupID;
attr.Update();
break;
case "FK_Emp":
break;
default:
break;
}
}
if (attrs.Contains(md.No + "_" + GERptAttr.Title) == false)
{
/* 标题 */
MapAttr attr = new BP.Sys.MapAttr();
attr.SetValByKey(MapAttrAttr.FK_MapData, md.No);
attr.SetValByKey(MapAttrAttr.EditType, (int)EditType.UnDel);
attr.SetValByKey(MapAttrAttr.KeyOfEn, GERptAttr.Title);
attr.SetValByKey(MapAttrAttr.Name, "Title");
attr.SetValByKey(MapAttrAttr.MyDataType, DataType.AppString);
attr.setUIContralType(UIContralType.TB);
attr.setLGType(FieldTypeS.Normal);
attr.SetValByKey(MapAttrAttr.UIVisible, true);
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.SetValByKey(MapAttrAttr.UIIsLine, false);
attr.SetValByKey(MapAttrAttr.MinLen, 0);
attr.SetValByKey(MapAttrAttr.MaxLen, 300);
attr.SetValByKey(MapAttrAttr.Idx, -100);
attr.Insert();
}
if (attrs.Contains(md.No + "_" + GERptAttr.OID) == false)
{
/* WorkID */
MapAttr attr = new BP.Sys.MapAttr();
attr.SetValByKey(MapAttrAttr.FK_MapData, md.No);
attr.SetValByKey(MapAttrAttr.EditType, (int)EditType.UnDel);
attr.SetValByKey(MapAttrAttr.KeyOfEn, GERptAttr.OID);
attr.SetValByKey(MapAttrAttr.Name, "WorkID");
attr.SetValByKey(MapAttrAttr.MyDataType, DataType.AppInt);
attr.setUIContralType(UIContralType.TB);
attr.setLGType(FieldTypeS.Normal);
attr.SetValByKey(MapAttrAttr.UIVisible, false);
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.SetValByKey(MapAttrAttr.UIIsLine, false);
attr.SetValByKey(MapAttrAttr.MinLen, 0);
attr.SetValByKey(MapAttrAttr.MaxLen, 1);
attr.SetValByKey(MapAttrAttr.Idx, -100);
attr.Insert();
}
if (attrs.Contains(md.No + "_" + GERptAttr.FID) == false)
{
/* FID */
MapAttr attr = new BP.Sys.MapAttr();
attr.SetValByKey(MapAttrAttr.FK_MapData, md.No);
attr.SetValByKey(MapAttrAttr.EditType, (int)EditType.UnDel);
attr.SetValByKey(MapAttrAttr.KeyOfEn, GERptAttr.FID);
attr.SetValByKey(MapAttrAttr.Name, "FID");
attr.SetValByKey(MapAttrAttr.MyDataType, DataType.AppInt);
attr.setUIContralType(UIContralType.TB);
attr.setLGType(FieldTypeS.Normal);
attr.SetValByKey(MapAttrAttr.UIVisible, false);
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.SetValByKey(MapAttrAttr.UIIsLine, false);
attr.SetValByKey(MapAttrAttr.MinLen, 0);
attr.SetValByKey(MapAttrAttr.MaxLen, 1);
attr.SetValByKey(MapAttrAttr.Idx, -100);
attr.Insert();
}
if (attrs.Contains(md.No + "_" + GERptAttr.WFState) == false)
{
/* 流程状态 */
MapAttr attr = new BP.Sys.MapAttr();
attr.SetValByKey(MapAttrAttr.FK_MapData, md.No);
attr.SetValByKey(MapAttrAttr.EditType, (int)EditType.UnDel);
attr.SetValByKey(MapAttrAttr.KeyOfEn, GERptAttr.WFState);
attr.SetValByKey(MapAttrAttr.Name, "流程状态");
attr.SetValByKey(MapAttrAttr.MyDataType, DataType.AppInt);
attr.setUIContralType(UIContralType.DDL);
attr.setLGType(FieldTypeS.Enum);
attr.SetValByKey(MapAttrAttr.UIVisible, true);
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.SetValByKey(MapAttrAttr.UIIsLine, false);
attr.SetValByKey(MapAttrAttr.MinLen, 0);
attr.SetValByKey(MapAttrAttr.MaxLen, 1);
attr.SetValByKey(MapAttrAttr.Idx, -100);
//attr.FrmID =md.No;
//attr.HisEditType = EditType.UnDel;
//attr.setKeyOfEn(GERptAttr.WFState;
//attr.setName("流程状态"; //
//attr.setMyDataType(DataType.AppInt);
//attr.UIBindKey = GERptAttr.WFState;
//attr.setUIContralType(UIContralType.DDL);
//attr.setLGType(FieldTypeS.Enum);
//attr.setUIVisible(true);
//attr.setUIIsEnable(false);
//attr.setMinLen(0);
//attr.setMaxLen(1000;
//attr.Idx = -1;
attr.Insert();
}
if (attrs.Contains(md.No + "_" + GERptAttr.WFSta) == false)
{
/* 流程状态Ext */
MapAttr attr = new BP.Sys.MapAttr();
attr.SetValByKey(MapAttrAttr.FK_MapData, md.No);
attr.SetValByKey(MapAttrAttr.EditType, (int)EditType.UnDel);
attr.SetValByKey(MapAttrAttr.KeyOfEn, GERptAttr.WFSta);
attr.SetValByKey(MapAttrAttr.Name, "状态");
attr.SetValByKey(MapAttrAttr.MyDataType, DataType.AppInt);
attr.setUIContralType(UIContralType.DDL);
attr.setLGType(FieldTypeS.Enum);
attr.SetValByKey(MapAttrAttr.UIVisible, true);
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.SetValByKey(MapAttrAttr.UIIsLine, false);
attr.SetValByKey(MapAttrAttr.MinLen, 0);
attr.SetValByKey(MapAttrAttr.MaxLen, 1);
attr.SetValByKey(MapAttrAttr.Idx, -100);
attr.Insert();
}
if (attrs.Contains(md.No + "_" + GERptAttr.FlowEmps) == false)
{
/* 参与人 */
MapAttr attr = new BP.Sys.MapAttr();
attr.SetValByKey(MapAttrAttr.FK_MapData, md.No);
attr.SetValByKey(MapAttrAttr.EditType, (int)EditType.UnDel);
attr.SetValByKey(MapAttrAttr.KeyOfEn, GERptAttr.FlowEmps);
attr.SetValByKey(MapAttrAttr.Name, "参与人");
attr.SetValByKey(MapAttrAttr.MyDataType, DataType.AppString);
attr.setUIContralType(UIContralType.TB);
attr.setLGType(FieldTypeS.Normal);
attr.SetValByKey(MapAttrAttr.UIVisible, false);
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.SetValByKey(MapAttrAttr.UIIsLine, false);
attr.SetValByKey(MapAttrAttr.MinLen, 0);
attr.SetValByKey(MapAttrAttr.MaxLen, 1000);
attr.SetValByKey(MapAttrAttr.Idx, -100);
attr.Insert();
}
if (attrs.Contains(md.No + "_" + GERptAttr.FlowStarter) == false)
{
/* 发起人 */
MapAttr attr = new BP.Sys.MapAttr();
attr.SetValByKey(MapAttrAttr.FK_MapData, md.No);
attr.SetValByKey(MapAttrAttr.EditType, (int)EditType.UnDel);
attr.SetValByKey(MapAttrAttr.KeyOfEn, GERptAttr.FlowStarter);
attr.SetValByKey(MapAttrAttr.Name, "发起人");
attr.SetValByKey(MapAttrAttr.MyDataType, DataType.AppString);
attr.setUIContralType(UIContralType.TB);
attr.setLGType(FieldTypeS.Normal);
attr.SetValByKey(MapAttrAttr.UIVisible, true);
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.SetValByKey(MapAttrAttr.UIIsLine, false);
attr.SetValByKey(MapAttrAttr.MinLen, 0);
attr.SetValByKey(MapAttrAttr.MaxLen, 20);
attr.SetValByKey(MapAttrAttr.Idx, -100);
attr.Insert();
}
if (attrs.Contains(md.No + "_" + GERptAttr.FlowStartRDT) == false)
{
MapAttr attr = new BP.Sys.MapAttr();
attr.SetValByKey(MapAttrAttr.FK_MapData, md.No);
attr.SetValByKey(MapAttrAttr.EditType, (int)EditType.UnDel);
attr.SetValByKey(MapAttrAttr.KeyOfEn, GERptAttr.FlowStartRDT);
attr.SetValByKey(MapAttrAttr.Name, "发起时间");
attr.SetValByKey(MapAttrAttr.MyDataType, DataType.AppDateTime);
attr.setUIContralType(UIContralType.TB);
attr.setLGType(FieldTypeS.Normal);
attr.SetValByKey(MapAttrAttr.UIVisible, true);
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.SetValByKey(MapAttrAttr.UIIsLine, false);
attr.SetValByKey(MapAttrAttr.MinLen, 0);
attr.SetValByKey(MapAttrAttr.MaxLen, 20);
attr.SetValByKey(MapAttrAttr.Idx, -100);
attr.Insert();
}
if (attrs.Contains(md.No + "_" + GERptAttr.FlowEnder) == false)
{
/* 发起人 */
MapAttr attr = new BP.Sys.MapAttr();
attr.SetValByKey(MapAttrAttr.FK_MapData, md.No);
attr.SetValByKey(MapAttrAttr.EditType, (int)EditType.UnDel);
attr.SetValByKey(MapAttrAttr.KeyOfEn, GERptAttr.FlowEnder);
attr.SetValByKey(MapAttrAttr.Name, "结束人");
attr.SetValByKey(MapAttrAttr.MyDataType, DataType.AppString);
attr.setUIContralType(UIContralType.TB);
attr.setLGType(FieldTypeS.Normal);
attr.SetValByKey(MapAttrAttr.UIVisible, true);
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.SetValByKey(MapAttrAttr.UIIsLine, false);
attr.SetValByKey(MapAttrAttr.MinLen, 0);
attr.SetValByKey(MapAttrAttr.MaxLen, 20);
attr.SetValByKey(MapAttrAttr.Idx, -100);
//attr.FrmID =md.No;
//attr.HisEditType = EditType.UnDel;
//attr.setKeyOfEn(GERptAttr.FlowEnder;
//attr.setName("结束人"; //
//attr.setMyDataType(DataType.AppString);
//// attr.UIBindKey = "BP.Port.Emps";
//attr.setUIContralType(UIContralType.TB);
//attr.setLGType(FieldTypeS.Normal);
//attr.setUIVisible(true);
//attr.setUIIsEnable(false);
//attr.setMinLen(0);
//attr.setMaxLen(32);
//attr.Idx = -1;
attr.Insert();
}
if (attrs.Contains(md.No + "_" + GERptAttr.FlowEnderRDT) == false)
{
MapAttr attr = new BP.Sys.MapAttr();
attr.SetValByKey(MapAttrAttr.FK_MapData, md.No);
attr.SetValByKey(MapAttrAttr.EditType, (int)EditType.UnDel);
attr.SetValByKey(MapAttrAttr.KeyOfEn, GERptAttr.FlowEnderRDT);
attr.SetValByKey(MapAttrAttr.Name, "结束时间");
attr.SetValByKey(MapAttrAttr.MyDataType, DataType.AppDateTime);
attr.setUIContralType(UIContralType.TB);
attr.setLGType(FieldTypeS.Normal);
attr.SetValByKey(MapAttrAttr.UIVisible, true);
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.SetValByKey(MapAttrAttr.UIIsLine, false);
attr.SetValByKey(MapAttrAttr.MinLen, 0);
attr.SetValByKey(MapAttrAttr.MaxLen, 20);
attr.SetValByKey(MapAttrAttr.Idx, -100);
attr.Insert();
}
if (attrs.Contains(md.No + "_" + GERptAttr.FlowEndNode) == false)
{
/* 结束节点 */
MapAttr attr = new BP.Sys.MapAttr();
attr.SetValByKey(MapAttrAttr.FK_MapData, md.No);
attr.SetValByKey(MapAttrAttr.EditType, (int)EditType.UnDel);
attr.SetValByKey(MapAttrAttr.KeyOfEn, GERptAttr.FlowEndNode);
attr.SetValByKey(MapAttrAttr.Name, "结束节点");
attr.SetValByKey(MapAttrAttr.MyDataType, DataType.AppInt);
attr.setUIContralType(UIContralType.TB);
attr.setLGType(FieldTypeS.Normal);
attr.SetValByKey(MapAttrAttr.UIVisible, true);
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.SetValByKey(MapAttrAttr.UIIsLine, false);
attr.SetValByKey(MapAttrAttr.MinLen, 0);
attr.SetValByKey(MapAttrAttr.MaxLen, 10);
attr.SetValByKey(MapAttrAttr.Idx, -100);
attr.Insert();
}
if (attrs.Contains(md.No + "_" + GERptAttr.FlowDaySpan) == false)
{
/* FlowDaySpan */
MapAttr attr = new BP.Sys.MapAttr();
attr.SetValByKey(MapAttrAttr.FK_MapData, md.No);
attr.SetValByKey(MapAttrAttr.EditType, (int)EditType.UnDel);
attr.SetValByKey(MapAttrAttr.KeyOfEn, GERptAttr.FlowDaySpan);
attr.SetValByKey(MapAttrAttr.Name, "流程时长(天)");
attr.SetValByKey(MapAttrAttr.MyDataType, DataType.AppInt);
attr.setUIContralType(UIContralType.TB);
attr.setLGType(FieldTypeS.Normal);
attr.SetValByKey(MapAttrAttr.UIVisible, true);
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.SetValByKey(MapAttrAttr.UIIsLine, false);
attr.SetValByKey(MapAttrAttr.MinLen, 0);
attr.SetValByKey(MapAttrAttr.MaxLen, 10);
attr.SetValByKey(MapAttrAttr.Idx, -100);
attr.Insert();
}
if (attrs.Contains(md.No + "_" + GERptAttr.PFlowNo) == false)
{
/* 父流程 流程编号 */
MapAttr attr = new BP.Sys.MapAttr();
attr.SetValByKey(MapAttrAttr.FK_MapData, md.No);
attr.SetValByKey(MapAttrAttr.EditType, (int)EditType.UnDel);
attr.SetValByKey(MapAttrAttr.KeyOfEn, GERptAttr.PFlowNo);
attr.SetValByKey(MapAttrAttr.Name, "父流程编号");
attr.SetValByKey(MapAttrAttr.MyDataType, DataType.AppString);
attr.setUIContralType(UIContralType.TB);
attr.setLGType(FieldTypeS.Normal);
attr.SetValByKey(MapAttrAttr.UIVisible, true);
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.SetValByKey(MapAttrAttr.UIIsLine, false);
attr.SetValByKey(MapAttrAttr.MinLen, 0);
attr.SetValByKey(MapAttrAttr.MaxLen, 30);
attr.SetValByKey(MapAttrAttr.Idx, -100);
attr.Insert();
}
if (attrs.Contains(md.No + "_" + GERptAttr.PNodeID) == false)
{
/* 父流程WorkID */
MapAttr attr = new BP.Sys.MapAttr();
attr.SetValByKey(MapAttrAttr.FK_MapData, md.No);
attr.SetValByKey(MapAttrAttr.EditType, (int)EditType.UnDel);
attr.SetValByKey(MapAttrAttr.KeyOfEn, GERptAttr.PNodeID);
attr.SetValByKey(MapAttrAttr.Name, "父流程启动的节点");
attr.SetValByKey(MapAttrAttr.MyDataType, DataType.AppInt);
attr.setUIContralType(UIContralType.TB);
attr.setLGType(FieldTypeS.Normal);
attr.SetValByKey(MapAttrAttr.UIVisible, true);
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.SetValByKey(MapAttrAttr.UIIsLine, false);
attr.SetValByKey(MapAttrAttr.MinLen, 0);
attr.SetValByKey(MapAttrAttr.MaxLen, 50);
attr.SetValByKey(MapAttrAttr.Idx, -100);
attr.Insert();
}
if (attrs.Contains(md.No + "_" + GERptAttr.PWorkID) == false)
{
/* 父流程WorkID */
MapAttr attr = new BP.Sys.MapAttr();
attr.SetValByKey(MapAttrAttr.FK_MapData, md.No);
attr.SetValByKey(MapAttrAttr.EditType, (int)EditType.UnDel);
attr.SetValByKey(MapAttrAttr.KeyOfEn, GERptAttr.PWorkID);
attr.SetValByKey(MapAttrAttr.Name, "父流程WorkID");
attr.SetValByKey(MapAttrAttr.MyDataType, DataType.AppInt);
attr.setUIContralType(UIContralType.TB);
attr.setLGType(FieldTypeS.Normal);
attr.SetValByKey(MapAttrAttr.UIVisible, true);
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.SetValByKey(MapAttrAttr.UIIsLine, false);
attr.SetValByKey(MapAttrAttr.MinLen, 0);
attr.SetValByKey(MapAttrAttr.MaxLen, 50);
attr.SetValByKey(MapAttrAttr.Idx, -100);
attr.Insert();
}
if (attrs.Contains(md.No + "_" + GERptAttr.PEmp) == false)
{
/* 调起子流程的人员 */
MapAttr attr = new BP.Sys.MapAttr();
attr.SetValByKey(MapAttrAttr.FK_MapData, md.No);
attr.SetValByKey(MapAttrAttr.EditType, (int)EditType.UnDel);
attr.SetValByKey(MapAttrAttr.KeyOfEn, GERptAttr.PEmp);
attr.SetValByKey(MapAttrAttr.Name, "调起子流程的人员");
attr.SetValByKey(MapAttrAttr.MyDataType, DataType.AppString);
attr.setUIContralType(UIContralType.TB);
attr.setLGType(FieldTypeS.Normal);
attr.SetValByKey(MapAttrAttr.UIVisible, true);
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.SetValByKey(MapAttrAttr.UIIsLine, false);
attr.SetValByKey(MapAttrAttr.MinLen, 0);
attr.SetValByKey(MapAttrAttr.MaxLen, 50);
attr.SetValByKey(MapAttrAttr.Idx, -100);
attr.Insert();
}
if (attrs.Contains(md.No + "_" + GERptAttr.BillNo) == false)
{
/* 父流程 流程编号 */
MapAttr attr = new BP.Sys.MapAttr();
attr.SetValByKey(MapAttrAttr.FK_MapData, md.No);
attr.SetValByKey(MapAttrAttr.EditType, (int)EditType.UnDel);
attr.SetValByKey(MapAttrAttr.KeyOfEn, GERptAttr.BillNo);
attr.SetValByKey(MapAttrAttr.Name, "单据编号");
attr.SetValByKey(MapAttrAttr.MyDataType, DataType.AppString);
attr.setUIContralType(UIContralType.TB);
attr.setLGType(FieldTypeS.Normal);
attr.SetValByKey(MapAttrAttr.UIVisible, true);
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.SetValByKey(MapAttrAttr.UIIsLine, false);
attr.SetValByKey(MapAttrAttr.MinLen, 0);
attr.SetValByKey(MapAttrAttr.MaxLen, 500);
attr.SetValByKey(MapAttrAttr.Idx, -100);
attr.Insert();
}
if (attrs.Contains(md.No + "_" + GERptAttr.AtPara) == false)
{
/* 父流程 流程编号 */
MapAttr attr = new BP.Sys.MapAttr();
attr.SetValByKey(MapAttrAttr.FK_MapData, md.No);
attr.SetValByKey(MapAttrAttr.EditType, (int)EditType.UnDel);
attr.SetValByKey(MapAttrAttr.KeyOfEn, GERptAttr.AtPara);
attr.SetValByKey(MapAttrAttr.Name, "参数");
attr.SetValByKey(MapAttrAttr.MyDataType, DataType.AppString);
attr.setUIContralType(UIContralType.TB);
attr.setLGType(FieldTypeS.Normal);
attr.SetValByKey(MapAttrAttr.UIVisible, true);
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.SetValByKey(MapAttrAttr.UIIsLine, false);
attr.SetValByKey(MapAttrAttr.MinLen, 0);
attr.SetValByKey(MapAttrAttr.MaxLen, 500);
attr.SetValByKey(MapAttrAttr.Idx, -100);
attr.Insert();
}
if (attrs.Contains(md.No + "_" + GERptAttr.GUID) == false)
{
/* GUID */
MapAttr attr = new BP.Sys.MapAttr();
attr.SetValByKey(MapAttrAttr.FK_MapData, md.No);
attr.SetValByKey(MapAttrAttr.EditType, (int)EditType.UnDel);
attr.SetValByKey(MapAttrAttr.KeyOfEn, GERptAttr.GUID);
attr.SetValByKey(MapAttrAttr.Name, "GUID");
attr.SetValByKey(MapAttrAttr.MyDataType, DataType.AppString);
attr.setUIContralType(UIContralType.TB);
attr.setLGType(FieldTypeS.Normal);
attr.SetValByKey(MapAttrAttr.UIVisible, true);
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.SetValByKey(MapAttrAttr.UIIsLine, false);
attr.SetValByKey(MapAttrAttr.MinLen, 0);
attr.SetValByKey(MapAttrAttr.MaxLen, 40);
attr.SetValByKey(MapAttrAttr.Idx, -100);
attr.Insert();
}
if (attrs.Contains(md.No + "_" + GERptAttr.PrjNo) == false)
{
/* 项目编号 */
MapAttr attr = new BP.Sys.MapAttr();
attr.SetValByKey(MapAttrAttr.FK_MapData, md.No);
attr.SetValByKey(MapAttrAttr.EditType, (int)EditType.UnDel);
attr.SetValByKey(MapAttrAttr.KeyOfEn, GERptAttr.PrjNo);
attr.SetValByKey(MapAttrAttr.Name, "项目编号");
attr.SetValByKey(MapAttrAttr.MyDataType, DataType.AppString);
attr.setUIContralType(UIContralType.TB);
attr.setLGType(FieldTypeS.Normal);
attr.SetValByKey(MapAttrAttr.UIVisible, true);
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.SetValByKey(MapAttrAttr.UIIsLine, false);
attr.SetValByKey(MapAttrAttr.MinLen, 0);
attr.SetValByKey(MapAttrAttr.MaxLen, 100);
attr.SetValByKey(MapAttrAttr.Idx, -100);
attr.Insert();
}
if (attrs.Contains(md.No + "_" + GERptAttr.PrjName) == false)
{
/* 项目名称 */
MapAttr attr = new BP.Sys.MapAttr();
attr.SetValByKey(MapAttrAttr.FK_MapData, md.No);
attr.SetValByKey(MapAttrAttr.EditType, (int)EditType.UnDel);
attr.SetValByKey(MapAttrAttr.KeyOfEn, GERptAttr.PrjName);
attr.SetValByKey(MapAttrAttr.Name, "项目名称");
attr.SetValByKey(MapAttrAttr.MyDataType, DataType.AppString);
attr.setUIContralType(UIContralType.TB);
attr.setLGType(FieldTypeS.Normal);
attr.SetValByKey(MapAttrAttr.UIVisible, true);
attr.SetValByKey(MapAttrAttr.UIIsEnable, false);
attr.SetValByKey(MapAttrAttr.UIIsLine, false);
attr.SetValByKey(MapAttrAttr.MinLen, 0);
attr.SetValByKey(MapAttrAttr.MaxLen, 100);
attr.SetValByKey(MapAttrAttr.Idx, -100);
}
#endregion 补充上流程字段。
#region 为流程字段设置分组。
try
{
string flowInfo = "流程信息";
GroupField flowGF = new GroupField();
int num = flowGF.Retrieve(GroupFieldAttr.FrmID, fk_mapData, GroupFieldAttr.Lab, "流程信息");
if (num == 0)
{
flowGF = new GroupField();
flowGF.Lab = flowInfo;
flowGF.FrmID = fk_mapData;
flowGF.Idx = -1;
flowGF.Insert();
}
sql = "UPDATE Sys_MapAttr SET GroupID='" + flowGF.OID + "' WHERE FK_MapData='" + fk_mapData + "' AND KeyOfEn IN('" + GERptAttr.PFlowNo + "','" + GERptAttr.PWorkID + "','" + GERptAttr.FK_Dept + "','" + GERptAttr.FK_NY + "','" + GERptAttr.FlowDaySpan + "','" + GERptAttr.FlowEmps + "','" + GERptAttr.FlowEnder + "','" + GERptAttr.FlowEnderRDT + "','" + GERptAttr.FlowEndNode + "','" + GERptAttr.FlowStarter + "','" + GERptAttr.FlowStartRDT + "','" + GERptAttr.WFState + "')";
DBAccess.RunSQL(sql);
}
catch (Exception ex)
{
BP.DA.Log.DebugWriteError(ex.Message);
}
#endregion 为流程字段设置分组
#region 尾后处理.
GERpt gerpt = this.HisGERpt;
gerpt.CheckPhysicsTable(); //让报表重新生成.
if (DBAccess.AppCenterDBType == DBType.PostgreSQL || BP.Difference.SystemConfig.AppCenterDBType == DBType.HGDB || DBAccess.AppCenterDBType == DBType.UX)
DBAccess.RunSQL("DELETE FROM Sys_GroupField WHERE FrmID='" + fk_mapData + "' AND ''||OID NOT IN (SELECT GroupID FROM Sys_MapAttr WHERE FK_MapData = '" + fk_mapData + "')");
else
DBAccess.RunSQL("DELETE FROM Sys_GroupField WHERE FrmID='" + fk_mapData + "' AND OID NOT IN (SELECT GroupID FROM Sys_MapAttr WHERE FK_MapData = '" + fk_mapData + "')");
DBAccess.RunSQL("UPDATE Sys_MapAttr SET Name='活动时间' WHERE FK_MapData='ND" + flowId + "Rpt' AND KeyOfEn='CDT'");
DBAccess.RunSQL("UPDATE Sys_MapAttr SET Name='参与者' WHERE FK_MapData='ND" + flowId + "Rpt' AND KeyOfEn='Emps'");
#endregion 尾后处理.
}
}
}