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

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;
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");
}
}
}