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.

930 lines
28 KiB
Plaintext

11 months ago
using System;
using System.Collections;
using System.IO;
using System.Text;
using BP.En;
using BP.Pub;
using BP.Sys;
using BP.Web;
using BP.Difference;
namespace BP.DA
{
/// <summary>
/// Cash 的摘要说明。
/// </summary>
public class Cash
{
public static void ClearCash(string enName)
{
if (_BS_Cash != null)
{
if (_BS_Cash.ContainsKey(enName) == true)
_BS_Cash.Remove(enName);
}
if (_SQL_Cash != null)
{
if (_SQL_Cash.ContainsKey(enName) == true)
_SQL_Cash.Remove(enName);
}
if (_EnsData_Cash != null)
{
if (_EnsData_Cash.ContainsKey(enName) == true)
_EnsData_Cash.Remove(enName);
}
if (_Map_Cash != null)
{
if (_Map_Cash.ContainsKey(enName) == true)
_Map_Cash.Remove(enName);
}
if (_EnsData_Cash_Ext != null)
{
if (_EnsData_Cash_Ext.ContainsKey(enName) == true)
_EnsData_Cash_Ext.Remove(enName);
}
if (_Bill_Cash != null)
{
if (_Bill_Cash.ContainsKey(enName) == true)
_Bill_Cash.Remove(enName);
}
if (_Row_Cash != null)
{
if (_Row_Cash.ContainsKey(enName) == true)
_Row_Cash.Remove(enName);
}
//清除
// Cash2019.ClearCash();
}
/// <summary>
/// 清空缓存.
/// </summary>
public static void ClearCash()
{
if (_BS_Cash != null)
_BS_Cash.Clear();
if (_SQL_Cash != null)
_SQL_Cash.Clear();
if (_EnsData_Cash != null)
_EnsData_Cash.Clear();
if (_Map_Cash != null)
_Map_Cash.Clear();
if (_EnsData_Cash_Ext != null)
_EnsData_Cash_Ext.Clear();
if (_Bill_Cash != null)
_Bill_Cash.Clear();
if (_Row_Cash != null)
_Row_Cash.Clear();
//清除
Cash2019.ClearCash();
}
static Cash()
{
if (BP.Difference.SystemConfig.IsBSsystem == false)
{
CS_Cash = new Hashtable();
}
}
public static readonly Hashtable CS_Cash;
#region Bill_Cash 单据模板cash.
private static Hashtable _Bill_Cash;
public static Hashtable Bill_Cash
{
get
{
if (_Bill_Cash == null)
_Bill_Cash = new Hashtable();
return _Bill_Cash;
}
}
public static string GetBillStr(string cfile, bool isCheckCash)
{
cfile = cfile.Replace(".rtf.rtf", ".rtf");
string val = Bill_Cash[cfile] as string;
if (isCheckCash == true)
val = null;
if (val == null)
{
string file = null;
if (cfile.Contains(":"))
file = cfile;
else
file = BP.Difference.SystemConfig.PathOfDataUser + "CyclostyleFile/" + cfile;
try
{
StreamReader read = new StreamReader(file, System.Text.Encoding.ASCII); // 文件流.
val = read.ReadToEnd(); //读取完毕。
read.Close(); // 关闭。
}
catch (Exception ex)
{
throw new Exception("@读取单据模板时出现错误。cfile=" + cfile + " @Ex=" + ex.Message);
}
_Bill_Cash[cfile] = val;
}
return val.Substring(0);
}
public static string[] GetBillParas(string cfile, string ensStrs, Entities ens)
{
string[] paras = Bill_Cash[cfile + "Para"] as string[];
if (paras != null)
return paras;
Attrs attrs = new Attrs();
foreach (Entity en in ens)
{
string perKey = en.ToString();
Attrs enAttrs = en.EnMap.Attrs;
foreach (Attr attr in enAttrs)
{
Attr attrN = new Attr();
attrN.Key = perKey + "." + attr.Key;
if (attr.IsRefAttr)
{
attrN.Field = perKey + "." + attr.Key + "Text";
}
attrN.MyDataType = attr.MyDataType;
attrN.MyFieldType = attr.MyFieldType;
attrN.UIBindKey = attr.UIBindKey;
attrN.Field = attr.Field;
attrs.Add(attrN);
}
}
paras = Cash.GetBillParas_Gener(cfile, attrs);
_Bill_Cash[cfile + "Para"] = paras;
return paras;
}
public static string[] GetBillParas(string cfile, string ensStrs, Entity en)
{
string[] paras = Bill_Cash[cfile + "Para"] as string[];
if (paras != null)
return paras;
paras = Cash.GetBillParas_Gener(cfile, en.EnMap.Attrs);
_Bill_Cash[cfile + "Para"] = paras;
return paras;
}
public static string[] GetBillParas_Gener(string cfile, Attrs attrs)
{
cfile = cfile.Replace(".rtf.rtf", ".rtf");
// Attrs attrs = en.EnMap.Attrs;
string[] paras = new string[300];
string Billstr = Cash.GetBillStr(cfile, true);
char[] chars = Billstr.ToCharArray();
string para = "";
int i = 0;
bool haveError = false;
string msg = "";
foreach (char c in chars)
{
if (c == '>')
{
#region 首先解决空格的问题.
string real = para.Clone().ToString();
if (attrs != null && real.Contains(" "))
{
real = real.Replace(" ", "");
Billstr = Billstr.Replace(para, real);
para = real;
haveError = true;
}
#endregion 首先解决空格的问题.
#region 解决特殊符号
if (attrs != null && real.Contains("/") && real.Contains("ND") == false)
{
haveError = true;
string findKey = null;
int keyLen = 0;
foreach (Attr attr in attrs)
{
if (real.Contains(attr.Key))
{
if (keyLen <= attr.Key.Length)
{
keyLen = attr.Key.Length;
findKey = attr.Key;
}
}
}
if (findKey == null)
{
msg += "@参数:<font color=red><b>[" + real + "]</b></font>可能拼写错误。";
continue;
}
if (real.Contains(findKey + ".NYR") == true)
{
real = findKey + ".NYR";
}
else if (real.Contains(findKey + ".RMB") == true)
{
real = findKey + ".RMB";
}
else if (real.Contains(findKey + ".RMBDX") == true)
{
real = findKey + ".RMBDX";
}
else if (real.Contains(findKey + ".Year") == true)
{
real = findKey + ".Year";
}
else if (real.Contains(findKey + ".Month") == true)
{
real = findKey + ".Month";
}
else if (real.Contains(findKey + ".Day") == true)
{
real = findKey + ".Day";
}
else
{
real = findKey;
}
Billstr = Billstr.Replace(para, real);
// msg += "@参数:<font color=red><b>[" + para + "]</b></font>不符合规范。";
//continue;
}
#endregion 首先解决空格的问题.
paras.SetValue(para, i);
i++;
}
if (c == '<')
{
para = ""; // 如果遇到了 '<' 开始记录
}
else
{
if (DataType.IsNullOrEmpty(c.ToString()))
continue;
para += c.ToString();
}
}
if (msg != "")
{
string s = "@帮助信息:用记事本打开它模板,找到红色的字体. 把尖括号内部的非法字符去了,例如:《|f0|fs20RDT.NYR|lang1033|kerning2》修改后事例《RDT.NYR》。@注意把双引号代替单引号,竖线代替反斜线。";
//throw new Exception("@单据模板("+cfile+")如下标记出现错误,系统无法修复它,需要您手工的删除标记或者用记事本打开查找到这写标记修复他们.@" + msg + s);
}
return paras;
}
#endregion
#region Conn cash
private static Hashtable _Conn_Cash;
public static Hashtable Conn_Cash
{
get
{
if (_Conn_Cash == null)
_Conn_Cash = new Hashtable();
return _Conn_Cash;
}
}
public static object GetConn(string fk_emp)
{
return Conn_Cash[fk_emp];
}
public static void SetConn(string fk_emp, object csh)
{
if (fk_emp == null)
throw new Exception("fk_emp. csh 参数有一个为空。");
Conn_Cash[fk_emp] = csh;
}
#endregion
#region BS_Cash
private static Hashtable _BS_Cash;
public static Hashtable BS_Cash
{
get
{
if (_BS_Cash == null)
_BS_Cash = new Hashtable();
return _BS_Cash;
}
}
#endregion
#region SQL cash
private static Hashtable _SQL_Cash;
public static Hashtable SQL_Cash
{
get
{
if (_SQL_Cash == null)
_SQL_Cash = new Hashtable();
return _SQL_Cash;
}
}
public static SQLCash GetSQL(string clName)
{
return SQL_Cash[clName] as BP.En.SQLCash;
}
public static void SetSQL(string clName, BP.En.SQLCash csh)
{
if (clName == null || csh == null)
throw new Exception("clName. csh 参数有一个为空。");
SQL_Cash[clName] = csh;
}
/// <summary>
/// 清除缓存
/// </summary>
/// <param name="clName"></param>
public static void ClearSQL(string clName)
{
SQL_Cash.Remove(clName);
}
#endregion
#region EnsData cash
private static Hashtable _EnsData_Cash;
public static Hashtable EnsData_Cash
{
get
{
if (_EnsData_Cash == null)
_EnsData_Cash = new Hashtable();
return _EnsData_Cash;
}
}
public static BP.En.Entities GetEnsData(string clName)
{
Entities ens = EnsData_Cash[clName] as BP.En.Entities;
if (ens == null)
return null;
if (ens.Count == 0)
return null;
//throw new Exception(clName + "个数为0");
return ens;
}
public static void EnsDataSet(string clName, BP.En.Entities obj)
{
if (obj.Count == 0)
{
///obj.RetrieveAll();
#warning 设置个数为
// throw new Exception(clName + "设置个数为0 请确定这个缓存实体是否有数据sq=select * from " + obj.GetNewEntity.EnMap.PhysicsTable);
}
EnsData_Cash[clName] = obj;
}
public static void Remove(string clName)
{
EnsData_Cash.Remove(clName);
}
#endregion
#region EnsData cash 扩展 临时的cash 文件。
private static Hashtable _EnsData_Cash_Ext;
public static Hashtable EnsData_Cash_Ext
{
get
{
if (_EnsData_Cash_Ext == null)
_EnsData_Cash_Ext = new Hashtable();
return _EnsData_Cash_Ext;
}
}
/// <summary>
/// 为部分数据做的缓冲处理
/// </summary>
/// <param name="clName"></param>
/// <returns></returns>
public static BP.En.Entities GetEnsDataExt(string clName)
{
// 判断是否失效了。
if (BP.Difference.SystemConfig.IsTempCashFail)
{
EnsData_Cash_Ext.Clear();
return null;
}
try
{
BP.En.Entities ens;
ens = EnsData_Cash_Ext[clName] as BP.En.Entities;
return ens;
}
catch
{
return null;
}
}
/// <summary>
/// 为部分数据做的缓冲处理
/// </summary>
/// <param name="clName"></param>
/// <param name="obj"></param>
public static void SetEnsDataExt(string clName, BP.En.Entities obj)
{
if (clName == null || obj == null)
throw new Exception("clName. obj 参数有一个为空。");
EnsData_Cash_Ext[clName] = obj;
}
#endregion
#region TSmap cash
private static Hashtable _Map_CashTS;
public static Hashtable Map_CashTS
{
get
{
if (_Map_CashTS == null)
_Map_CashTS = new Hashtable();
return _Map_CashTS;
}
}
public static BP.En.Map GetMapTS(string clName)
{
try
{
return Map_CashTS[clName] as BP.En.Map;
}
catch
{
return null;
}
}
public static void SetMapTS(string clName, BP.En.Map map)
{
if (clName == null)
return;
// throw new Exception("clName.不能为空。");
if (map == null)
{
Map_CashTS.Remove(clName);
return;
}
Map_CashTS[clName] = map;
}
/// <summary>
/// 是否存map.
/// </summary>
/// <param name="clName"></param>
/// <returns></returns>
public static bool IsExitMapTS(string clName)
{
if (clName == null)
throw new Exception("clName.不能为空。");
return Map_CashTS.ContainsKey(clName);
}
#endregion
#region map cash
private static Hashtable _Map_Cash;
public static Hashtable Map_Cash
{
get
{
if (_Map_Cash == null)
_Map_Cash = new Hashtable();
return _Map_Cash;
}
}
public static BP.En.Map GetMap(string clName)
{
try
{
return Map_Cash[clName] as BP.En.Map;
}
catch
{
return null;
}
}
public static void SetMap(string clName, BP.En.Map map)
{
if (clName == null)
return;
// throw new Exception("clName.不能为空。");
if (map == null)
{
Map_Cash.Remove(clName);
return;
}
Map_Cash[clName] = map;
}
/// <summary>
/// 是否存map.
/// </summary>
/// <param name="clName"></param>
/// <returns></returns>
public static bool IsExitMap(string clName)
{
if (clName == null)
throw new Exception("clName.不能为空。");
return Map_Cash.ContainsKey(clName);
}
#endregion
#region row cash
private static Hashtable _Row_Cash;
public static Hashtable Row_Cash
{
get
{
if (_Row_Cash == null)
_Row_Cash = new Hashtable();
return _Row_Cash;
}
}
public static BP.En.Row GetRow(string clName)
{
var row = Row_Cash[clName] as BP.En.Row;
if (row == null)
return null;
return (BP.En.Row)row.Clone();
}
public static void SetRow(string clName, BP.En.Row map)
{
if (clName == null)
return;
// throw new Exception("clName.不能为空。");
if (map == null)
{
Row_Cash.Remove(clName);
return;
}
Row_Cash[clName] = map;
}
/// <summary>
/// 是否存map.
/// </summary>
/// <param name="clName"></param>
/// <returns></returns>
public static bool IsExitRow(string clName)
{
if (clName == null)
throw new Exception("clName.不能为空。");
return Row_Cash.ContainsKey(clName);
}
#endregion
#region 取出对象
/// <summary>
/// 从 Cash 里面取出对象.
/// </summary>
public static object GetObj(string key, Depositary where)
{
#if DEBUG
if (where == Depositary.None)
throw new Exception("您没有把[" + key + "]放到session or application 里面不能找出他们.");
#endif
if (BP.Difference.SystemConfig.IsBSsystem)
{
if (where == Depositary.Application)
// return System.Web.HttpContext.Current.Cache[key];
return BS_Cash[key]; // System.Web.HttpContext.Current.Cache[key];
else
return HttpContextHelper.SessionGet(key);
}
else
{
return CS_Cash[key];
}
}
public static object GetObj(string key)
{
if (BP.Difference.SystemConfig.IsBSsystem)
{
object obj = BS_Cash[key]; // Cash.GetObjFormApplication(key, null);
if (obj == null)
obj = Cash.GetObjFormSession(key);
return obj;
}
else
{
return CS_Cash[key];
}
}
/// <summary>
/// 删除 like 名称的缓存对象。
/// </summary>
/// <param name="likeKey"></param>
/// <returns></returns>
public static int DelObjFormApplication(string likeKey)
{
int i = 0;
if (BP.Difference.SystemConfig.IsBSsystem)
{
string willDelKeys = "";
foreach (string key in BS_Cash.Keys)
{
if (key.Contains(likeKey) == false)
continue;
willDelKeys += "@" + key;
}
string[] strs = willDelKeys.Split('@');
foreach (string s in strs)
{
if (DataType.IsNullOrEmpty(s) == true)
continue;
BS_Cash.Remove(s);
i++;
}
}
else
{
string willDelKeys = "";
foreach (string key in CS_Cash.Keys)
{
if (key.Contains(likeKey) == false)
continue;
willDelKeys += "@" + key;
}
string[] strs = willDelKeys.Split('@');
foreach (string s in strs)
{
if (DataType.IsNullOrEmpty(s) == true)
continue;
CS_Cash.Remove(s);
i++;
}
}
return i;
}
public static object GetObjFormApplication(string key, object isNullAsVal)
{
if (BP.Difference.SystemConfig.IsBSsystem)
{
object obj = BS_Cash[key]; // System.Web.HttpContext.Current.Cache[key];
if (obj == null)
return isNullAsVal;
else
return obj;
}
else
{
object obj = CS_Cash[key];
if (obj == null)
return isNullAsVal;
else
return obj;
}
}
public static object GetObjFormSession(string key)
{
if (BP.Difference.SystemConfig.IsBSsystem)
{
try
{
return HttpContextHelper.SessionGet(key);
}
catch
{
return null;
}
}
else
{
return CS_Cash[key];
}
}
#endregion
#region Remove Obj
/// <summary>
/// RemoveObj
/// </summary>
/// <param name="key"></param>
/// <param name="where"></param>
public static void RemoveObj(string key, Depositary where)
{
if (Cash.IsExits(key, where) == false)
return;
if (BP.Difference.SystemConfig.IsBSsystem)
{
if (where == Depositary.Application)
CacheHelper.Remove(key);
else
HttpContextHelper.Session.Remove(key);
}
else
{
CS_Cash.Remove(key);
}
}
#endregion
#region 放入对象
public static void RemoveObj(string key)
{
BS_Cash.Remove(key);
}
public static void AddObj(string key, Depositary where, object obj)
{
if (key == null)
throw new Exception("您需要为obj=" + obj.ToString() + ",设置为主键值。key");
if (obj == null)
throw new Exception("您需要为obj=null 设置为主键值。key=" + key);
#if DEBUG
if (where == Depositary.None)
throw new Exception("您没有把[" + key + "]放到 session or application 里面设置他们.");
#endif
//if (Cash.IsExits(key, where))
// return;
if (BP.Difference.SystemConfig.IsBSsystem)
{
if (where == Depositary.Application)
{
BS_Cash[key] = obj;
}
else
{
HttpContextHelper.SessionSet(key, obj);
}
}
else
{
if (CS_Cash.ContainsKey(key))
CS_Cash[key] = obj;
else
CS_Cash.Add(key, obj);
}
}
#endregion
#region 判断对象是不是存在
/// <summary>
/// 判断对象是不是存在
/// </summary>
public static bool IsExits(string key, Depositary where)
{
if (BP.Difference.SystemConfig.IsBSsystem)
{
if (where == Depositary.Application)
{
return CacheHelper.Contains(key);
}
else
{
return HttpContextHelper.SessionGet(key) != null;
}
}
else
{
return CS_Cash.ContainsKey(key);
}
}
#endregion
}
public class CashEntity
{
#region Hashtable 属性
private static Hashtable _Cash;
public static Hashtable DCash
{
get
{
if (_Cash == null)
_Cash = new Hashtable();
return _Cash;
}
}
#endregion
/// <summary>
/// 把实体放入缓存里面
/// </summary>
/// <param name="enName"></param>
/// <param name="ens"></param>
/// <param name="enPK"></param>
public static void PubEns(string enName, Entities ens, string enPK)
{
Hashtable ht = CashEntity.DCash[enName] as Hashtable;
if (ht == null)
ht = new Hashtable();
ht.Clear();
foreach (Entity en in ens)
ht.Add(en.GetValStrByKey(enPK), en);
// 把实体集合放入.
CashEntity.DCash[enName + "Ens"] = ens;
}
public static Entities GetEns(string enName)
{
Entities ens = CashEntity.DCash[enName + "Ens"] as Entities;
return ens;
}
/// <summary>
/// 更新对象
/// </summary>
/// <param name="enName"></param>
/// <param name="key"></param>
/// <param name="en"></param>
public static void Update(string enName, string key, Entity en)
{
Hashtable ht = CashEntity.DCash[enName] as Hashtable;
if (ht == null)
{
ht = new Hashtable();
CashEntity.DCash[enName] = ht;
}
ht[key] = en;
//清除集合.
CashEntity.DCash.Remove(enName + "Ens");
}
/// <summary>
/// 获取一个实体
/// </summary>
/// <param name="enName">实体Name</param>
/// <param name="pkVal">主键值</param>
/// <returns>返回这个实体</returns>
public static Entity Select(string enName, string pkVal)
{
Hashtable ht = CashEntity.DCash[enName] as Hashtable;
if (ht == null)
return null;
return ht[pkVal] as Entity;
}
/// <summary>
/// 删除
/// </summary>
/// <param name="enName"></param>
/// <param name="pkVal"></param>
public static void Delete(string enName, string pkVal)
{
Hashtable ht = CashEntity.DCash[enName] as Hashtable;
if (ht == null)
return;
ht.Remove(pkVal);
//清除集合.
CashEntity.DCash.Remove(enName + "Ens");
}
/// <summary>
/// 插入
/// </summary>
/// <param name="enName"></param>
/// <param name="en"></param>
/// <param name="pkVal"></param>
public static void Insert(string enName, string pkVal, Entity en)
{
Hashtable ht = CashEntity.DCash[enName] as Hashtable;
if (ht == null)
return;
//edited by liuxc,2014-8-21 17:21
if (ht.ContainsKey(pkVal))
ht[pkVal] = en;
else
ht.Add(pkVal, en);
//清除集合.
CashEntity.DCash.Remove(enName + "Ens");
}
}
}