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.

989 lines
31 KiB
C#

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.IO;
using System.Text;
using BP.En;
using BP.Pub;
using BP.Sys;
using BP.Web;
using BP.Difference;
using System.Collections.Generic;
namespace BP.DA
{
/// <summary>
/// Cache 的摘要说明。
/// </summary>
public class Cache
{
public static void ClearCache(string enName)
{
if (_BS_Cache != null)
{
if (_BS_Cache.ContainsKey(enName) == true)
_BS_Cache.Remove(enName);
}
if (_SQL_Cache != null)
{
if (_SQL_Cache.ContainsKey(enName) == true)
_SQL_Cache.Remove(enName);
}
if (_EnsData_Cache != null)
{
if (_EnsData_Cache.ContainsKey(enName) == true)
_EnsData_Cache.Remove(enName);
}
if (_Map_Cache != null)
{
if (_Map_Cache.ContainsKey(enName) == true)
_Map_Cache.Remove(enName);
}
if (_EnsData_Cache_Ext != null)
{
if (_EnsData_Cache_Ext.ContainsKey(enName) == true)
_EnsData_Cache_Ext.Remove(enName);
}
if (_Bill_Cache != null)
{
if (_Bill_Cache.ContainsKey(enName) == true)
_Bill_Cache.Remove(enName);
}
if (_Row_Cache != null)
{
if (_Row_Cache.ContainsKey(enName) == true)
_Row_Cache.Remove(enName);
}
//清除
// Cache2019.ClearCache();
}
/// <summary>
/// 清空缓存.
/// </summary>
public static void ClearCache()
{
if (_BS_Cache != null)
_BS_Cache.Clear();
if (_SQL_Cache != null)
_SQL_Cache.Clear();
if (_EnsData_Cache != null)
_EnsData_Cache.Clear();
if (_Map_Cache != null)
_Map_Cache.Clear();
if (_EnsData_Cache_Ext != null)
_EnsData_Cache_Ext.Clear();
if (_Bill_Cache != null)
_Bill_Cache.Clear();
if (_Row_Cache != null)
_Row_Cache.Clear();
//清除
Cache2019.ClearCache();
}
static Cache()
{
if (BP.Difference.SystemConfig.isBSsystem == false)
{
CS_Cache = new Hashtable();
}
}
public static readonly Hashtable CS_Cache;
#region Bill_Cache 单据模板Cache.
private static Hashtable _Bill_Cache;
public static Hashtable Bill_Cache
{
get
{
if (_Bill_Cache == null)
_Bill_Cache = new Hashtable();
return _Bill_Cache;
}
}
public static string GetBillStr(string cfile, bool isCheckCache)
{
cfile = cfile.Replace(".rtf.rtf", ".rtf");
string val = Bill_Cache[cfile] as string;
if (isCheckCache == 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_Cache[cfile] = val;
}
return val.Substring(0);
}
public static string[] GetBillParas(string cfile, string ensStrs, Entities ens)
{
string[] paras = Bill_Cache[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.ItIsRefAttr)
{
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 = Cache.GetBillParas_Gener(cfile, attrs);
_Bill_Cache[cfile + "Para"] = paras;
return paras;
}
public static string[] GetBillParas(string cfile, string ensStrs, Entity en)
{
string[] paras = Bill_Cache[cfile + "Para"] as string[];
if (paras != null)
return paras;
paras = Cache.GetBillParas_Gener(cfile, en.EnMap.Attrs);
_Bill_Cache[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 = Cache.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 Cache
private static Hashtable _Conn_Cache;
public static Hashtable Conn_Cache
{
get
{
if (_Conn_Cache == null)
_Conn_Cache = new Hashtable();
return _Conn_Cache;
}
}
public static object GetConn(string fk_emp)
{
return Conn_Cache[fk_emp];
}
public static void SetConn(string fk_emp, object csh)
{
if (fk_emp == null)
throw new Exception("fk_emp. csh 参数有一个为空。");
Conn_Cache[fk_emp] = csh;
}
#endregion
#region BS_Cache
private static String bsCacheKey = SystemConfig.RedisCacheKey("BSCache");
private static Hashtable _BS_Cache = new Hashtable();
public static Hashtable BS_Cache
{
get
{
if (SystemConfig.RedisIsEnable())
{
List<Hashtable> list = HttpContextHelper.RedisUtils.GetAllHashValues<Hashtable>(bsCacheKey);
if (list == null || list.Count==0)
_BS_Cache = null;
else
_BS_Cache = list[0];
}
if (_BS_Cache == null)
_BS_Cache = new Hashtable();
return _BS_Cache;
}
}
#endregion
#region SQL Cache
private static String sqlCacheKey = SystemConfig.RedisCacheKey("SQLCache");
private static Hashtable _SQL_Cache = new Hashtable();
public static Hashtable SQL_Cache
{
get
{
if (SystemConfig.RedisIsEnable())
{
List<Hashtable> list = HttpContextHelper.RedisUtils.GetAllHashValues<Hashtable>(sqlCacheKey);
if (list == null || list.Count == 0)
_SQL_Cache = null;
else
_SQL_Cache = list[0];
}
if (_SQL_Cache == null)
_SQL_Cache = new Hashtable();
return _SQL_Cache;
}
}
public static SQLCache GetSQL(string clName)
{
return SQL_Cache[clName] as BP.En.SQLCache;
}
public static void SetSQL(string clName, BP.En.SQLCache csh)
{
if (clName == null || csh == null)
throw new Exception("clName. csh 参数有一个为空。");
SQL_Cache[clName] = csh;
if (SystemConfig.RedisIsEnable())
HttpContextHelper.RedisUtils.SetInHash(sqlCacheKey, clName, csh);
}
/// <summary>
/// 清除缓存
/// </summary>
/// <param name="clName"></param>
public static void ClearSQL(string clName)
{
SQL_Cache.Remove(clName);
if (SystemConfig.RedisIsEnable())
HttpContextHelper.RedisUtils.RemoveHash(sqlCacheKey);
}
#endregion
#region EnsData Cache
private static String ensDataCacheKey = SystemConfig.RedisCacheKey("EnsDataCache");
private static Hashtable _EnsData_Cache;
public static Hashtable EnsData_Cache
{
get
{
if (SystemConfig.RedisIsEnable())
{
List<Hashtable> list = HttpContextHelper.RedisUtils.GetAllHashValues<Hashtable>(ensDataCacheKey);
if (list == null || list.Count == 0)
_EnsData_Cache = null;
else
_EnsData_Cache = list[0];
}
if (_EnsData_Cache == null)
_EnsData_Cache = new Hashtable();
return _EnsData_Cache;
}
}
public static BP.En.Entities GetEnsData(string clName)
{
Entities ens = EnsData_Cache[clName] as BP.En.Entities;
if (ens == null)
return null;
if (ens.Count == 0)
return null;
return ens;
}
public static void EnsDataSet(string clName, BP.En.Entities obj)
{
EnsData_Cache[clName] = obj;
if (SystemConfig.RedisIsEnable())
HttpContextHelper.RedisUtils.SetInHash(ensDataCacheKey, clName, obj);
}
public static void Remove(string clName)
{
EnsData_Cache.Remove(clName);
}
#endregion
#region EnsData Cache 扩展 临时的Cache 文件。
private static String ensCacheExtKey = SystemConfig.RedisCacheKey("EnsDataCacheExt");
private static Hashtable _EnsData_Cache_Ext;
public static Hashtable EnsData_Cache_Ext
{
get
{
if (SystemConfig.RedisIsEnable())
{
List<Hashtable> list = HttpContextHelper.RedisUtils.GetAllHashValues<Hashtable>(ensCacheExtKey);
if (list == null || list.Count == 0)
_EnsData_Cache_Ext = null;
else
_EnsData_Cache_Ext = list[0];
}
if (_EnsData_Cache_Ext == null)
_EnsData_Cache_Ext = new Hashtable();
return _EnsData_Cache_Ext;
}
}
/// <summary>
/// 为部分数据做的缓冲处理
/// </summary>
/// <param name="clName"></param>
/// <returns></returns>
public static BP.En.Entities GetEnsDataExt(string clName)
{
// 判断是否失效了。
if (BP.Difference.SystemConfig.isTempCacheFail)
{
EnsData_Cache_Ext.Clear();
return null;
}
try
{
BP.En.Entities ens;
ens = EnsData_Cache_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_Cache_Ext[clName] = obj;
if (SystemConfig.RedisIsEnable())
HttpContextHelper.RedisUtils.SetInHash(ensCacheExtKey, clName, obj);
}
#endregion
#region TSmap Cache
private static String mapCacheTSKey = SystemConfig.RedisCacheKey("MapCacheTS");
private static Hashtable _Map_CacheTS;
public static Hashtable Map_CacheTS
{
get
{
if (SystemConfig.RedisIsEnable())
{
List<Hashtable> list = HttpContextHelper.RedisUtils.GetAllHashValues<Hashtable>(mapCacheTSKey);
if (list == null || list.Count == 0)
_Map_CacheTS = null;
else
_Map_CacheTS = list[0];
}
if (_Map_CacheTS == null)
_Map_CacheTS = new Hashtable();
return _Map_CacheTS;
}
}
public static BP.En.Map GetMapTS(string clName)
{
try
{
return Map_CacheTS[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_CacheTS.Remove(clName);
return;
}
Map_CacheTS[clName] = map;
if (SystemConfig.RedisIsEnable())
HttpContextHelper.RedisUtils.SetInHash(mapCacheTSKey, 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_CacheTS.ContainsKey(clName);
}
#endregion
#region map Cache
private static String mapCacheKey = SystemConfig.RedisCacheKey("MapCache");
private static Hashtable _Map_Cache;
public static Hashtable Map_Cache
{
get
{
if (SystemConfig.RedisIsEnable())
{
List<Hashtable> list = HttpContextHelper.RedisUtils.GetAllHashValues<Hashtable>(mapCacheKey);
if (list == null || list.Count == 0)
_Map_Cache = null;
else
_Map_Cache = list[0];
}
if (_Map_Cache == null)
_Map_Cache = new Hashtable();
return _Map_Cache;
}
}
public static BP.En.Map GetMap(string clName)
{
try
{
return Map_Cache[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_Cache.Remove(clName);
return;
}
Map_Cache[clName] = map;
if (SystemConfig.RedisIsEnable())
HttpContextHelper.RedisUtils.SetInHash(mapCacheKey, 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_Cache.ContainsKey(clName);
}
#endregion
#region row Cache
private static Hashtable _Row_Cache;
public static Hashtable Row_Cache
{
get
{
if (SystemConfig.RedisIsEnable())
{
List<Hashtable> list = HttpContextHelper.RedisUtils.GetAllHashValues<Hashtable>(mapCacheKey);
if (list == null || list.Count == 0)
_Map_Cache = null;
else
_Map_Cache = list[0];
}
if (_Row_Cache == null)
_Row_Cache = new Hashtable();
return _Row_Cache;
}
}
public static BP.En.Row GetRow(string clName)
{
BP.En.Row row = Row_Cache[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_Cache.Remove(clName);
return;
}
Row_Cache[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_Cache.ContainsKey(clName);
}
#endregion
#region 取出对象
/// <summary>
/// 从 Cache 里面取出对象.
/// </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_Cache[key]; // System.Web.HttpContext.Current.Cache[key];
else
return HttpContextHelper.SessionGet(key);
}
else
{
return CS_Cache[key];
}
}
public static object GetObj(string key)
{
if (BP.Difference.SystemConfig.isBSsystem)
{
object obj = BS_Cache[key]; // Cache.GetObjFormApplication(key, null);
if (obj == null)
obj = Cache.GetObjFormSession(key);
return obj;
}
else
{
return CS_Cache[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_Cache.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_Cache.Remove(s);
i++;
}
}
else
{
string willDelKeys = "";
foreach (string key in CS_Cache.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_Cache.Remove(s);
i++;
}
}
return i;
}
public static object GetObjFormApplication(string key, object isNullAsVal)
{
if (BP.Difference.SystemConfig.isBSsystem)
{
object obj = BS_Cache[key]; // System.Web.HttpContext.Current.Cache[key];
if (obj == null)
return isNullAsVal;
else
return obj;
}
else
{
object obj = CS_Cache[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_Cache[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 (Cache.IsExits(key, where) == false)
return;
if (BP.Difference.SystemConfig.isBSsystem)
{
if (where == Depositary.Application)
CacheHelper.Remove(key);
else
HttpContextHelper.Session.Remove(key);
}
else
{
CS_Cache.Remove(key);
}
}
#endregion
#region 放入对象
public static void RemoveObj(string key)
{
BS_Cache.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 (Cache.IsExits(key, where))
// return;
if (BP.Difference.SystemConfig.isBSsystem)
{
if (where == Depositary.Application)
{
BS_Cache[key] = obj;
}
else
{
HttpContextHelper.SessionSet(key, obj);
}
}
else
{
if (CS_Cache.ContainsKey(key))
CS_Cache[key] = obj;
else
CS_Cache.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_Cache.ContainsKey(key);
}
}
#endregion
}
public class CacheEntity
{
#region Hashtable 属性
private static String dCacheKey = SystemConfig.RedisCacheKey("DCache");
private static Hashtable _Cache=new Hashtable();
public static Hashtable DCache
{
get
{
if (SystemConfig.RedisIsEnable())
{
List<Hashtable> list = HttpContextHelper.RedisUtils.GetAllHashValues<Hashtable>(dCacheKey);
if (list == null || list.Count == 0)
_Cache = null;
else
_Cache = list[0];
}
if (_Cache == null)
_Cache = new Hashtable();
return _Cache;
}
}
#endregion
/// <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 = CacheEntity.DCache[enName] as Hashtable;
if (ht == null)
{
ht = new Hashtable();
CacheEntity.DCache[enName] = ht;
}
ht[key] = en;
//清除集合.
CacheEntity.DCache.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 = CacheEntity.DCache[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 = CacheEntity.DCache[enName] as Hashtable;
if (ht == null)
return;
ht.Remove(pkVal);
//清除集合.
CacheEntity.DCache.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 = CacheEntity.DCache[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);
//清除集合.
CacheEntity.DCache.Remove(enName + "Ens");
}
}
}