using System; using System.Data; using BP.DA; using BP.En; using BP.Port; namespace BP.WF.Template.CCEn { /// /// 抄送属性 /// public class CCAttr { #region 基本属性 /// /// 标题 /// public const string CCTitle = "CCTitle"; /// /// 抄送内容 /// public const string CCDoc = "CCDoc"; /// /// 按表单字段抄送 /// public const string CCIsAttr = "CCIsAttr"; /// /// 表单字段 /// public const string CCFormAttr = "CCFormAttr"; /// /// 是否启用抄送到角色 /// public const string CCIsStations = "CCIsStations"; /// /// 按照角色计算方式 /// public const string CCStaWay = "CCStaWay"; /// /// 是否抄送到部门 /// public const string CCIsDepts = "CCIsDepts"; /// /// 是否抄送到人员 /// public const string CCIsEmps = "CCIsEmps"; /// /// 是否启用按照SQL抄送. /// public const string CCIsSQLs = "CCIsSQLs"; /// /// 要抄送的SQL /// public const string CCSQL = "CCSQL"; #endregion } /// /// 抄送 /// public class CC : Entity { #region 属性 /// /// 抄送 /// /// /// public DataTable GenerCCers(Entity rpt, Int64 workid) { DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn("No", typeof(string))); dt.Columns.Add(new DataColumn("Name", typeof(string))); DataTable mydt = new DataTable(); string sql = ""; if (this.CCIsDepts == true) { /*如果抄送到部门. */ sql = "SELECT A." + BP.Sys.Base.Glo.UserNo + ", A.Name FROM Port_Emp A, WF_CCDept B WHERE B.FK_Dept=A.FK_Dept AND B.FK_Node=" + this.NodeID; mydt = DBAccess.RunSQLReturnTable(sql); foreach (DataRow mydr in mydt.Rows) { DataRow dr = dt.NewRow(); dr["No"] = mydr["No"]; dr["Name"] = mydr["Name"]; dt.Rows.Add(dr); } } if (this.CCIsEmps == true) { /*如果抄送到人员. */ sql = "SELECT A." +BP.Sys.Base.Glo.UserNo + ", A.Name FROM Port_Emp A, WF_CCEmp B WHERE A." + BP.Sys.Base.Glo.UserNoWhitOutAS + "=B.FK_Emp AND B.FK_Node=" + this.NodeID; mydt = DBAccess.RunSQLReturnTable(sql); foreach (DataRow mydr in mydt.Rows) { DataRow dr = dt.NewRow(); dr["No"] = mydr["No"]; dr["Name"] = mydr["Name"]; dt.Rows.Add(dr); } } if (this.CCIsStations == true) { if (this.CCStaWay == WF.CCStaWay.StationOnly) { sql = "SELECT " + BP.Sys.Base.Glo.UserNo+",Name FROM Port_Emp A, Port_DeptEmpStation B, WF_CCStation C WHERE A.No= B.FK_Emp AND B.FK_Station=C.FK_Station AND C.FK_Node=" + this.NodeID; mydt = DBAccess.RunSQLReturnTable(sql); foreach (DataRow mydr in mydt.Rows) { DataRow dr = dt.NewRow(); dr["No"] = mydr["No"]; dr["Name"] = mydr["Name"]; dt.Rows.Add(dr); } } if (this.CCStaWay == WF.CCStaWay.StationSmartCurrNodeWorker || this.CCStaWay == WF.CCStaWay.StationSmartNextNodeWorker) { /*按角色智能计算*/ string deptNo = ""; if (this.CCStaWay == WF.CCStaWay.StationSmartCurrNodeWorker) deptNo = BP.Web.WebUser.FK_Dept; else deptNo = DBAccess.RunSQLReturnStringIsNull("SELECT FK_Dept FROM WF_GenerWorkerlist WHERE WorkID=" + workid + " AND IsEnable=1 AND IsPass=0", BP.Web.WebUser.FK_Dept); sql = "SELECT " + BP.Sys.Base.Glo.UserNo + ",Name FROM Port_Emp A, Port_DeptEmpStation B, WF_CCStation C WHERE A.No=B.FK_Emp AND B.FK_Station=C.FK_Station AND C.FK_Node=" + this.NodeID + " AND B.FK_Dept='" + deptNo + "'"; mydt = DBAccess.RunSQLReturnTable(sql); foreach (DataRow mydr in mydt.Rows) { DataRow dr = dt.NewRow(); dr["No"] = mydr["No"]; dr["Name"] = mydr["Name"]; dt.Rows.Add(dr); } } if (this.CCStaWay == WF.CCStaWay.StationAndDept) { sql = "SELECT " + BP.Sys.Base.Glo.UserNo + ",Name FROM Port_Emp A, Port_DeptEmpStation B, WF_CCStation C, WF_CCDept D WHERE A.No=B.FK_Emp AND B.FK_Station=C.FK_Station AND A.FK_Dept=D.FK_Dept AND B.FK_Dept=D.FK_Dept AND C.FK_Node=" + this.NodeID+" AND D.FK_Node="+this.NodeID; mydt = DBAccess.RunSQLReturnTable(sql); foreach (DataRow mydr in mydt.Rows) { DataRow dr = dt.NewRow(); dr["No"] = mydr["No"]; dr["Name"] = mydr["Name"]; dt.Rows.Add(dr); } } if (this.CCStaWay == CCStaWay.StationDeptUpLevelCurrNodeWorker || this.CCStaWay == CCStaWay.StationDeptUpLevelNextNodeWorker ) { // 求当事人的部门编号. string deptNo = ""; if (this.CCStaWay == CCStaWay.StationDeptUpLevelCurrNodeWorker) deptNo = BP.Web.WebUser.FK_Dept; if (this.CCStaWay == CCStaWay.StationDeptUpLevelNextNodeWorker) deptNo = DBAccess.RunSQLReturnStringIsNull("SELECT FK_Dept FROM WF_GenerWorkerlist WHERE WorkID="+workid+" AND IsEnable=1 AND IsPass=0", BP.Web.WebUser.FK_Dept); while (true) { BP.Port.Dept dept = new Dept(deptNo); sql = "SELECT " + BP.Sys.Base.Glo.UserNo + ",Name FROM Port_Emp A, Port_DeptEmpStation B, WF_CCStation C WHERE A.No=B.FK_Emp AND B.FK_Station=C.FK_Station AND C.FK_Node=" + this.NodeID+" AND B.FK_Dept='"+deptNo+"'"; mydt = DBAccess.RunSQLReturnTable(sql); foreach (DataRow mydr in mydt.Rows) { DataRow dr = dt.NewRow(); dr["No"] = mydr["No"]; dr["Name"] = mydr["Name"]; dt.Rows.Add(dr); } if (dept.ParentNo == "0") break; deptNo = dept.ParentNo; } } } if (this.CCIsSQLs == true) { sql = this.CCSQL.Clone() as string; sql = sql.Replace("@WebUser.No", BP.Web.WebUser.No); sql = sql.Replace("@WebUser.Name", BP.Web.WebUser.Name); sql = sql.Replace("@WebUser.FK_Dept", BP.Web.WebUser.FK_Dept); if (sql.Contains("@") == true) sql = BP.WF.Glo.DealExp(sql, rpt, null); /*按照SQL抄送. */ mydt = DBAccess.RunSQLReturnTable(sql); foreach (DataRow mydr in mydt.Rows) { DataRow dr = dt.NewRow(); dr["No"] = mydr["No"]; dr["Name"] = mydr["Name"]; dt.Rows.Add(dr); } } /**按照表单字段抄送*/ if (this.CCIsAttr == true) { if (DataType.IsNullOrEmpty(this.CCFormAttr) == true) throw new Exception("抄送规则自动抄送选择按照表单字段抄送没有设置抄送人员字段"); string[] attrs = this.CCFormAttr.Split(','); foreach (string attr in attrs) { string ccers = rpt.GetValStrByKey(attr); if (DataType.IsNullOrEmpty(ccers) == false) { //判断该字段是否启用了pop返回值? sql = "SELECT Tag1 AS VAL FROM Sys_FrmEleDB WHERE RefPKVal=" + workid + " AND EleID='" + attr + "'"; DataTable dtVals = DBAccess.RunSQLReturnTable(sql); string emps = ""; //获取接受人并格式化接受人, if (dtVals.Rows.Count > 0) { foreach (DataRow dr in dtVals.Rows) emps += dr[0].ToString() + ","; } else { emps = ccers; } //end判断该字段是否启用了pop返回值 emps = emps.Replace(" ", ""); //去掉空格. if (DataType.IsNullOrEmpty(emps) == false) { /*如果包含,; 例如 zhangsan,张三;lisi,李四;*/ string[] ccemp = emps.Split(','); foreach (string empNo in ccemp) { if (DataType.IsNullOrEmpty(empNo) == true) continue; Emp emp = new Emp(); emp.UserID = empNo; if (emp.RetrieveFromDBSources() == 1) { DataRow dr = dt.NewRow(); dr["No"] = empNo; dr["Name"] = emp.Name; dt.Rows.Add(dr); } } } } } } //将dt中的重复数据过滤掉 DataView myDataView = new DataView(dt); //此处可加任意数据项组合 string[] strComuns = { "No","Name" }; dt = myDataView.ToTable(true, strComuns); return dt; } /// ///节点ID /// public int NodeID { get { return this.GetValIntByKey(NodeAttr.NodeID); } set { this.SetValByKey(NodeAttr.NodeID, value); } } /// /// UI界面上的访问控制 /// public override UAC HisUAC { get { UAC uac = new UAC(); if (BP.Web.WebUser.IsAdmin==false ) { uac.IsView = false; return uac; } uac.IsDelete = false; uac.IsInsert = false; uac.IsUpdate = true; return uac; } } /// /// 抄送标题 /// public string CCTitle { get { string s= this.GetValStringByKey(CCAttr.CCTitle); if (DataType.IsNullOrEmpty(s)) s = "@Title"; return s; } set { this.SetValByKey(CCAttr.CCTitle, value); } } /// /// 抄送内容 /// public string CCDoc { get { string s = this.GetValStringByKey(CCAttr.CCDoc); if (DataType.IsNullOrEmpty(s)) s = "{@Title}"; return s; } set { this.SetValByKey(CCAttr.CCDoc, value); } } /// /// 抄送对象 /// public string CCSQL { get { string sql= this.GetValStringByKey(CCAttr.CCSQL); sql = sql.Replace("~", "'"); sql = sql.Replace("‘", "'"); sql = sql.Replace("’", "'"); sql = sql.Replace("''", "'"); return sql; } set { this.SetValByKey(CCAttr.CCSQL, value); } } /// /// 是否启用按照角色抄送 /// public bool CCIsStations { get { return this.GetValBooleanByKey(CCAttr.CCIsStations); } set { this.SetValByKey(CCAttr.CCIsStations, value); } } /// /// 抄送到角色计算方式. /// public CCStaWay CCStaWay { get { return (CCStaWay)this.GetValIntByKey(CCAttr.CCStaWay); } set { this.SetValByKey(CCAttr.CCStaWay, (int)value); } } /// /// 是否启用按照部门抄送 /// public bool CCIsDepts { get { return this.GetValBooleanByKey(CCAttr.CCIsDepts); } set { this.SetValByKey(CCAttr.CCIsDepts, value); } } /// /// 是否启用按照人员抄送 /// public bool CCIsEmps { get { return this.GetValBooleanByKey(CCAttr.CCIsEmps); } set { this.SetValByKey(CCAttr.CCIsEmps, value); } } /// /// 是否启用按照SQL抄送 /// public bool CCIsSQLs { get { return this.GetValBooleanByKey(CCAttr.CCIsSQLs); } set { this.SetValByKey(CCAttr.CCIsSQLs, value); } } /// /// 是否按照表单字段抄送 /// public bool CCIsAttr { get { return this.GetValBooleanByKey(CCAttr.CCIsAttr); } set { this.SetValByKey(CCAttr.CCIsAttr, value); } } public string CCFormAttr { get { return this.GetValStringByKey(CCAttr.CCFormAttr); } set { this.SetValByKey(CCAttr.CCFormAttr, value); } } #endregion #region 构造函数 /// /// 抄送设置 /// public CC() { } /// /// 抄送设置 /// /// public CC(int nodeid) { this.NodeID = nodeid; this.Retrieve(); } /// /// 重写基类方法 /// public override Map EnMap { get { if (this._enMap != null) return this._enMap; Map map = new Map("WF_Node", "抄送规则"); map.AddTBIntPK(NodeAttr.NodeID, 0, "节点ID", true, true); map.AddTBString(NodeAttr.Name, null, "节点名称", true, true, 0, 100, 10, false); map.AddTBString(NodeAttr.FK_Flow, null, "FK_Flow", false, false, 0, 4, 10); map.AddDDLSysEnum(NodeAttr.CCWriteTo, 0, "抄送数据写入规则", true, true, NodeAttr.CCWriteTo,"@0=写入抄送列表@1=写入待办@2=写入待办与抄送列表"); map.SetHelperUrl(NodeAttr.CCWriteTo, "https://gitee.com/opencc/JFlow/wikis/pages/preview?sort_id=3580017&doc_id=31094"); //增加帮助. map.AddBoolean(CCAttr.CCIsAttr, false, "按表单字段抄送", true, true, true); map.AddTBString(CCAttr.CCFormAttr, null, "抄送人员字段", true, false, 0, 100, 10, true); map.AddBoolean(CCAttr.CCIsStations, false, "是否启用?-按照角色抄送", true, true, false); map.AddDDLSysEnum(CCAttr.CCStaWay, 0, "抄送角色计算方式", true, true, CCAttr.CCStaWay, "@0=仅按角色计算@1=按角色智能计算(当前节点)@2=按角色智能计算(发送到节点)@3=按角色与部门的交集@4=按直线上级部门找角色下的人员(当前节点)@5=按直线上级部门找角色下的人员(接受节点)"); map.AddBoolean(CCAttr.CCIsDepts, false, "是否启用?-按照部门抄送", true, true, false); map.AddBoolean(CCAttr.CCIsEmps, false, "是否启用?-按照人员抄送", true, true, false); map.AddBoolean(CCAttr.CCIsSQLs, false, "是否启用?-按照SQL抄送", true, true, true); map.AddTBString(CCAttr.CCSQL, null, "SQL表达式", true, false, 0, 500, 10, true); map.AddTBString(CCAttr.CCTitle, null, "抄送标题", true, false, 0, 100, 10, true); map.AddTBStringDoc(CCAttr.CCDoc, null, "抄送内容(标题与内容支持变量)", true, false, true); #region 对应关系 // 相关功能。 //平铺模式. map.AttrsOfOneVSM.AddGroupPanelModel(new BP.WF.Template.CCEn.CCStations(), new BP.Port.Stations(), BP.WF.Template.NodeStationAttr.FK_Node, BP.WF.Template.NodeStationAttr.FK_Station, "抄送角色(分组模式)", StationAttr.FK_StationType); map.AttrsOfOneVSM.AddGroupListModel(new BP.WF.Template.CCEn.CCStations(), new BP.Port.Stations(), BP.WF.Template.NodeStationAttr.FK_Node, BP.WF.Template.NodeStationAttr.FK_Station, "抄送角色(分组列表模式)", StationAttr.FK_StationType); //节点绑定人员. 使用树杆与叶子的模式绑定. map.AttrsOfOneVSM.AddBranches(new BP.WF.Template.CCEn.CCDepts(), new BP.Port.Depts(), BP.WF.Template.NodeDeptAttr.FK_Node, BP.WF.Template.NodeDeptAttr.FK_Dept, "抄送部门(树模式)", EmpAttr.Name, EmpAttr.No, "@WebUser.FK_Dept"); //节点绑定人员. 使用树杆与叶子的模式绑定. map.AttrsOfOneVSM.AddBranchesAndLeaf(new BP.WF.Template.CCEn.CCEmps(), new BP.Port.Emps(), BP.WF.Template.NodeEmpAttr.FK_Node, BP.WF.Template.NodeEmpAttr.FK_Emp, "抄送接受人(树干叶子模式)", EmpAttr.FK_Dept, EmpAttr.Name, EmpAttr.No, "@WebUser.FK_Dept"); #endregion 对应关系 //// 相关功能。 //map.AttrsOfOneVSM.Add(new BP.WF.Template.CCStations(), new BP.Port.Stations(), // NodeStationAttr.FK_Node, NodeStationAttr.FK_Station, // DeptAttr.Name, DeptAttr.No, "抄送角色"); //map.AttrsOfOneVSM.Add(new BP.WF.Template.CCDepts(), new BP.Port.Depts(), NodeDeptAttr.FK_Node, NodeDeptAttr.FK_Dept, DeptAttr.Name, //DeptAttr.No, "抄送部门" ); //map.AttrsOfOneVSM.Add(new BP.WF.Template.CCEmps(), new BP.WF.Port.Emps(), NodeEmpAttr.FK_Node, NodeEmpAttr.FK_Emp, DeptAttr.Name, // DeptAttr.No, "抄送人员"); this._enMap = map; return this._enMap; } } #endregion } /// /// 抄送s /// public class CCs: Entities { #region 方法 /// /// 得到它的 Entity /// public override Entity GetNewEntity { get { return new CC(); } } /// /// 抄送 /// public CCs(){} public CCs(string fk_flow) { this.Retrieve(NodeAttr.FK_Flow, fk_flow, NodeAttr.Step); return; } #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((CC)this[i]); } return list; } #endregion 为了适应自动翻译成java的需要,把实体转换成List. } }