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

425 lines
12 KiB
Plaintext

This file contains ambiguous Unicode characters!

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

using System;
using System.Collections;
using System.Data;
using BP.DA;
using BP.En;
using BP.Sys;
using BP.Port;
using System.Security.Cryptography;
using System.Text;
using BP.WF.XML;
using BP.WF.Template;
namespace BP.WF
{
/// <summary>
/// 系统约定字段列表
/// </summary>
public class WorkSysFieldAttr
{
/// <summary>
/// 发送人员字段
/// 用在节点发送时确定下一个节点接受人员, 类似与发送邮件来选择接受人.
/// 并且在下一个节点属性的 访问规则中选择【按表单SysSendEmps字段计算】有效。
/// </summary>
public const string SysSendEmps = "SysSendEmps";
/// <summary>
/// 抄送人员字段
/// 当前的工作需要抄送时, 就需要在当前节点表单中,增加此字段。
/// 并且在节点属性的抄送规则中选择【按表单SysCCEmps字段计算】有效。
/// 如果有多个操作人员,字段的接受值用逗号分开。比如: zhangsan,lisi,wangwu
/// </summary>
public const string SysCCEmps = "SysCCEmps";
/// <summary>
/// 流程应完成日期
/// 说明:在开始节点表单中增加此字段,用来标记此流程应当完成的日期.
/// 用户在发送后就会把此值记录在WF_GenerWorkFlow 的 SDTOfFlow 中.
/// 此字段显示在待办,发起,在途,删除,挂起列表里.
/// </summary>
public const string SysSDTOfFlow = "SysSDTOfFlow";
/// <summary>
/// 节点应完成时间
/// 说明:在开始节点表单中增加此字段,用来标记此节点的下一个节点应该完成的日期.
/// </summary>
public const string SysSDTOfNode = "SysSDTOfNode";
/// <summary>
/// PWorkID 调用
/// </summary>
public const string PWorkID = "PWorkID";
/// <summary>
/// FromNode
/// </summary>
public const string FromNode = "FromNode";
/// <summary>
/// 是否需要已读回执
/// </summary>
public const string SysIsReadReceipts = "SysIsReadReceipts";
#region 与质量考核相关的字段
/// <summary>
/// 编号
/// </summary>
public const string EvalEmpNo = "EvalEmpNo";
/// <summary>
/// 名称
/// </summary>
public const string EvalEmpName = "EvalEmpName";
/// <summary>
/// 分值
/// </summary>
public const string EvalCent = "EvalCent";
/// <summary>
/// 内容
/// </summary>
public const string EvalNote = "EvalNote";
#endregion 与质量考核相关的字段
}
/// <summary>
/// 工作属性
/// </summary>
public class WorkAttr
{
#region 基本属性
/// <summary>
/// 工作ID
/// </summary>
public const string OID = "OID";
/// <summary>
/// 记录人
/// </summary>
public const string Rec = "Rec";
/// <summary>
/// 记录人Text
/// </summary>
public const string RecText = "RecText";
/// <summary>
/// Emps
/// </summary>
public const string Emps = "Emps";
/// <summary>
/// 流程ID
/// </summary>
public const string FID = "FID";
/// <summary>
/// MD5
/// </summary>
public const string MD5 = "MD5";
#endregion
}
/// <summary>
/// WorkBase 的摘要说明。
/// 工作
/// </summary>
abstract public class Work : Entity
{
/// <summary>
/// 检查MD5值是否通过
/// </summary>
/// <returns>true/false</returns>
public bool ItIsPassCheckMD5()
{
string md51 = this.GetValStringByKey(WorkAttr.MD5);
string md52 = Glo.GenerMD5(this);
if (md51 != md52)
return false;
return true;
}
#region 基本属性(必须的属性)
/// <summary>
/// 主键
/// </summary>
public override string PK
{
get
{
return "OID";
}
}
/// <summary>
/// classID
/// </summary>
public override string ClassID
{
get
{
return "ND"+this.HisNode.NodeID;
}
}
/// <summary>
/// 流程ID
/// </summary>
public virtual Int64 FID
{
get
{
if (this.HisNode.ItIsSubThread == false)
return 0;
return this.GetValInt64ByKey(WorkAttr.FID);
}
set
{
if (this.HisNode.ItIsSubThread == false)
this.SetValByKey(WorkAttr.FID, 0);
else
this.SetValByKey(WorkAttr.FID, value);
}
}
/// <summary>
/// workid,如果是空的就返回 0 .
/// </summary>
public virtual Int64 OID
{
get
{
return this.GetValInt64ByKey(WorkAttr.OID);
}
set
{
this.SetValByKey(WorkAttr.OID, value);
}
}
/// <summary>
/// 人员emps
/// </summary>
public string Emps
{
get
{
return this.GetValStringByKey(WorkAttr.Emps);
}
set
{
this.SetValByKey(WorkAttr.Emps, value);
}
}
public int RetrieveFID()
{
QueryObject qo = new QueryObject(this);
qo.AddWhereIn(WorkAttr.OID, "(" + this.FID + "," + this.OID + ")");
int i = qo.DoQuery();
if (i == 0)
{
if (BP.Difference.SystemConfig.isDebug == false)
{
this.CheckPhysicsTable();
throw new Exception("@节点[" + this.EnDesc + "]数据丢失WorkID=" + this.OID + " FID=" + this.FID + " sql=" + qo.SQL);
}
}
return i;
}
/// <summary>
/// 记录人
/// </summary>
public string Rec
{
get
{
string str = this.GetValStringByKey(WorkAttr.Rec);
if (str == "")
this.SetValByKey(WorkAttr.Rec, BP.Web.WebUser.No);
return this.GetValStringByKey(WorkAttr.Rec);
}
set
{
this.SetValByKey(WorkAttr.Rec, value);
}
}
public int FrmVer
{
get
{
return this.GetParaInt("FrmVer");
}
}
private Node _HisNode = null;
/// <summary>
/// 工作的节点.
/// </summary>
public Node HisNode
{
get
{
if (this._HisNode == null)
{
this._HisNode = new Node(this.NodeID);
}
return _HisNode;
}
set
{
_HisNode = value;
}
}
/// <summary>
/// 从表.
/// </summary>
public MapDtls HisMapDtls
{
get
{
return this.HisNode.MapData.MapDtls;
}
}
/// <summary>
/// 附件.
/// </summary>
public FrmAttachments HisFrmAttachments
{
get
{
return this.HisNode.MapData.FrmAttachments;
}
}
#endregion
#region 构造函数
/// <summary>
/// 工作
/// </summary>
protected Work()
{
}
/// <summary>
/// 工作
/// </summary>
/// <param name="oid">WFOID</param>
protected Work(Int64 oid)
{
this.SetValByKey(EntityOIDAttr.OID, oid);
this.Retrieve();
}
#endregion
#region 重写基类的方法。
/// <summary>
/// 按照指定的OID Insert.
/// </summary>
public void InsertAsOID(Int64 oid)
{
this.SetValByKey("OID", oid);
this.RunSQL(SqlBuilder.Insert(this));
}
/// <summary>
/// 按照指定的OID 保存
/// </summary>
/// <param name="oid"></param>
public void SaveAsOID(Int64 oid)
{
this.SetValByKey("OID", oid);
if (this.IsExits==false)
this.InsertAsOID(oid);
this.Update();
}
/// <summary>
/// 保存实体信息
/// </summary>
public new int Save()
{
if (this.OID <= 10)
throw new Exception("@没有给WorkID赋值,不能保存.");
if (this.Update() == 0)
{
this.InsertAsOID(this.OID);
return 0;
}
return 1;
}
public override void Copy(DataRow dr) {
foreach (Attr attr in this.EnMap.Attrs)
{
if ( attr.Key == WorkAttr.Rec
|| attr.Key == WorkAttr.FID
|| attr.Key == WorkAttr.OID
|| attr.Key == "No"
|| attr.Key == "Name")
continue;
try
{
this.SetValByKey(attr.Key, dr[attr.Key]);
}
catch
{
}
}
}
public override void Copy(Entity fromEn)
{
if (fromEn == null)
return;
Attrs attrs = fromEn.EnMap.Attrs;
foreach (Attr attr in attrs)
{
if ( attr.Key == WorkAttr.Rec
|| attr.Key == WorkAttr.FID
|| attr.Key == WorkAttr.OID
|| attr.Key == WorkAttr.Emps
|| attr.Key == "No"
|| attr.Key == "Name")
continue;
this.SetValByKey(attr.Key, fromEn.GetValByKey(attr.Key));
}
}
#endregion
#region 公共方法
/// <summary>
/// 直接的保存
/// </summary>
public new void DirectSave()
{
this.beforeUpdateInsertAction();
if (this.DirectUpdate() == 0)
this.DirectInsert();
}
public string NodeFrmID = "";
protected int _nodeID = 0;
public int NodeID
{
get
{
if (_nodeID == 0)
throw new Exception("您没有给_Node给值。");
return this._nodeID;
}
set
{
if (this._nodeID != value)
{
this._nodeID = value;
this._enMap = null;
}
this._nodeID = value;
}
}
/// <summary>
/// 已经路过的节点
/// </summary>
public string HisPassedFrmIDs = "";
#endregion
}
/// <summary>
/// 工作 集合
/// </summary>
abstract public class Works : EntitiesOID
{
#region 构造方法
/// <summary>
/// 信息采集基类
/// </summary>
public Works()
{
}
#endregion
}
}