peopleSoft 带生效日期结构缓存工具类

此工具类可以将PS生效日期结构数据全部加载后按照日期快速从内存中读取,避免单条查询占用数据库及系统资源。

/*==========================================================
  说明: 带生效日期结构缓存工具类父类
  ----------------------------------------------------------  
===========================================================*/
class EffdtCacheSuper
   method EffdtCacheSuper();
   property integer len get;
   property integer keyLen get;
   /* 获取key下所有生效日期行数据 */
   method getRowAllEffdtDataByKey(&key As string) Returns array of any;
protected
   property JavaObject mapData;
   
   property integer _len;
   property integer _keyLen;
   
   /* 添加一行数据 */
   method addRowData(&key As string, &effdt As date, &effStatus As string, &rowData As any);
   /* 根据key获取date日最新有效数据行的第index位,并转为字符串(仅当addRowData方法添加的&rowData为数组时有效,否则会报错)(如果想要无效数据,在addRowData时&effStatus固定传入A即可,实际生效状态可以放在&rowData中) */
   method getStrByDate(&key As string, &date As date, &index As integer) Returns string;
   /* 根据key获取date日最新有效数据行(如果想要无效数据,在addRowData时&effStatus固定传入A即可,实际生效状态可以放在&rowData中) */
   method getRowByDate(&key As string, &date As date) Returns any;
   /* 是否包含key对应date日的数据 */
   method containsCodeByDate(&key As string, &date As date) Returns boolean;
   
   /* 获取所有key */
   method getAllKey() Returns array of string;
   
   method loading();
   method clean();
private
   method getRowByDateFromRowSet(&rowSet As array of array of any, &date As date) Returns array of any;
   instance string &lastKey;
   instance array of array of any &lastRowSet;
   instance array of string &rowNull;
   instance array of string &allKey;
end-class;

method EffdtCacheSuper
   %This.rowNull = CreateArrayRept("", 0);
   %This.allKey = CreateArrayRept("", 0);
end-method;

get len
   /+ Returns Integer +/
   Return %This._len;
end-get;

get keyLen
   /+ Returns Integer +/
   Return %This._keyLen;
end-get;

method addRowData
   /+ &key as String, +/
   /+ &effdt as Date, +/
   /+ &effStatus as String, +/
   /+ &rowData as Any +/
   Local array of any &dataCP = &rowData.Clone();
   %This.mapData.put(&key | &effdt, &dataCP);
   Local string &lk = %This.lastKey;
   If None(&lk) Or
         &lk <> &key Then
      %This.lastKey = &key;
      Local array of array of any &rowSet = %This.mapData.get(&key);
      If &rowSet = Null Then
         &rowSet = CreateArrayRept(&dataCP, 0);
         %This.allKey.Push(&key);
         %This.mapData.put(&key, &rowSet);
         %This._keyLen = %This._keyLen + 1;
      End-If;
      %This.lastRowSet = &rowSet;
   End-If;
   %This.lastRowSet.Push(CreateArrayAny(0, 0));
   %This.lastRowSet [%This.lastRowSet.Len][1] = &effdt;
   %This.lastRowSet [%This.lastRowSet.Len][2] = &effStatus;
   %This.lastRowSet [%This.lastRowSet.Len][3] = &dataCP;
   If %This.lastRowSet [1].Len < 4 Then
      %This.lastRowSet [1][4] = CreateArrayRept(&dataCP, 0);
   End-If;
   %This.lastRowSet [1][4].push(&dataCP);
   %This._len = %This._len + 1;
end-method;

method getStrByDate
   /+ &key as String, +/
   /+ &date as Date, +/
   /+ &index as Integer +/
   /+ Returns String +/
   Local array of any &value = %This.getRowByDate(&key, &date);
   If &value = Null Then
      Return "";
   Else
      Return String(&value [&index]);
   End-If;
end-method;

method getRowByDate
   /+ &key as String, +/
   /+ &date as Date +/
   /+ Returns Any +/
   If %This.mapData = Null Then
      %This.loading();
   End-If;
   
   Local any &value = %This.mapData.get(&key | &date);
   If &value = Null Then /* 带日期的缓存中没有,按日期查找 */
      Local array of array of any &rowSet;
      &rowSet = %This.mapData.get(&key);
      If &rowSet = Null Then /* 没有此&key */
         %This.mapData.put(&key | &date, %This.rowNull);
      Else
         &value = %This.getRowByDateFromRowSet(&rowSet, &date);
         If &value = Null Then /* 无此&key对应日期的数据 */
            %This.mapData.put(&key | &date, %This.rowNull);
         End-If;
      End-If;
   Else
      If &value.len = 0 Then /* 带日期缓存标记为空行 */
         &value = Null;
      End-If;
   End-If;
   Return &value;
end-method;

method containsCodeByDate
   /+ &key as String, +/
   /+ &date as Date +/
   /+ Returns Boolean +/
   Local array of any &value = %This.getRowByDate(&key, &date);
   Return (&value <> Null);
end-method;

method getAllKey
   /+ Returns Array of String +/
   Return %This.allKey;
end-method;

method getRowAllEffdtDataByKey
   /+ &key as String +/
   /+ Returns Array of Any +/
   Local array of array of any &rowSet = %This.mapData.get(&key);
   If &rowSet = Null Then
      Return Null;
   Else
      Return &rowSet [1][4];
   End-If;
end-method;

method getRowByDateFromRowSet
   /+ &rowSet as Array2 of Any, +/
   /+ &date as Date +/
   /+ Returns Array of Any +/
   Local integer &i;
   For &i = 1 To &rowSet.Len
      If &date >= &rowSet [&i][1] Then
         If &rowSet [&i][2] = "A" Then
            Return &rowSet [&i][3];
         Else
            Return Null;
         End-If;
      End-If;
   End-For;
   Return Null;
end-method;

method loading
end-method;

method clean
   %This.mapData = Null;
end-method;

部门数据应用代码:

/*==========================================================
  说明: 部门缓存工具类
  ---------------------------------------------------------- 
===========================================================*/
import COMMON:cacheUtil:EffdtCacheSuper;
import COMMON:UTIL:TreeDataManager;
import COMMON:UTIL:entity:TreeDataEntity;

class DeptCache extends COMMON:cacheUtil:EffdtCacheSuper
   method DeptCache(&loading As boolean);
   
   method getDescr(&setId As string, &deptId As string) Returns string;
   method getDescrShort(&setId As string, &deptId As string) Returns string;
   
   method getDescrByDate(&setId As string, &deptId As string, &date As date) Returns string;
   method getCompanyCodeByDate(&setId As string, &deptId As string, &date As date) Returns string;
   method getDeptAttrCodeByDate(&setId As string, &deptId As string, &date As date) Returns string;
   
   method getIsCompanyByDate(&setId As string, &deptId As string, &date As date) Returns boolean;
   method getIsVirtualCompanyByDate(&setId As string, &deptId As string, &date As date) Returns boolean;
   method getIsShellCompanyByDate(&setId As string, &deptId As string, &date As date) Returns boolean;
   method getIsVirtualDeptByDate(&setId As string, &deptId As string, &date As date) Returns boolean;
   
   /* 获取部门全称(全部门路径描述),实时数据 */
   method getRealTimePathDescrByDate(&setId As string, &deptId As string, &date As date) Returns string;
   method getRealTimePathDescrShortByDate(&setId As string, &deptId As string, &date As date) Returns string;
   /* 获取全部门路径代码,实时数据 */
   method getRealTimePathCodeByDate(&setId As string, &deptId As string, &date As date) Returns string;
   /* 获取部门排序字符串(从顶级节点向下拼接的结果) */
   method getSortStrByDate(&setId As string, &deptId As string, &date As date) Returns string;
   
   method containsCode(&setId As string, &deptId As string) Returns boolean;
   method containsCodeByDate(&setId As string, &deptId As string, &date As date) Returns boolean;
   
   /* 获取对应日期的树管理器,树内节点ID为&setId|&deptId,父节点ID同理 */
   method getTreeDataManagerByDate(&date As date) Returns COMMON:UTIL:TreeDataManager;
   method getDescrByTreeDataEntity(&tde As COMMON:UTIL:entity:TreeDataEntity) Returns string;
   method getCompanyCodeByTreeDataEntity(&tde As COMMON:UTIL:entity:TreeDataEntity) Returns string;
   method getDeptAttrCodeByTreeDataEntity(&tde As COMMON:UTIL:entity:TreeDataEntity) Returns string;
   method getIsCompanyByTreeDataEntity(&tde As COMMON:UTIL:entity:TreeDataEntity) Returns boolean;
   method getIsVirtualCompanyByTreeDataEntity(&tde As COMMON:UTIL:entity:TreeDataEntity) Returns boolean;
   method getIsShellCompanyByTreeDataEntity(&tde As COMMON:UTIL:entity:TreeDataEntity) Returns boolean;
   method getIsVirtualDeptByTreeDataEntity(&tde As COMMON:UTIL:entity:TreeDataEntity) Returns boolean;
   
   method clean();
private
   method loading();
   method loadingSortStr();
   instance JavaObject &sortData;
   instance JavaObject &tempMap;
   instance array of any &treeDataManagerArray;
end-class;

method DeptCache
   /+ &loading as Boolean +/
   %Super = create COMMON:cacheUtil:EffdtCacheSuper();
   %This.treeDataManagerArray = CreateArrayAny();
   If &loading Then
      %This.loading();
   End-If;
end-method;

method getDescr
   /+ &setId as String, +/
   /+ &deptId as String +/
   /+ Returns String +/
   Return %Super.getStrByDate(&setId | &deptId, %Date, 5);
end-method;

method getDescrShort
   /+ &setId as String, +/
   /+ &deptId as String +/
   /+ Returns String +/
   Return %Super.getStrByDate(&setId | &deptId, %Date, 6);
end-method;

method getDescrByDate
   /+ &setId as String, +/
   /+ &deptId as String, +/
   /+ &date as Date +/
   /+ Returns String +/
   Return %Super.getStrByDate(&setId | &deptId, &date, 5);
end-method;

method getCompanyCodeByDate
   /+ &setId as String, +/
   /+ &deptId as String, +/
   /+ &date as Date +/
   /+ Returns String +/
   Return %Super.getStrByDate(&setId | &deptId, &date, 8);
end-method;

method getDeptAttrCodeByDate
   /+ &setId as String, +/
   /+ &deptId as String, +/
   /+ &date as Date +/
   /+ Returns String +/
   Return %Super.getStrByDate(&setId | &deptId, &date, 13);
end-method;

method getIsCompanyByDate
   /+ &setId as String, +/
   /+ &deptId as String, +/
   /+ &date as Date +/
   /+ Returns Boolean +/
   Return (%Super.getStrByDate(&setId | &deptId, &date, 9) = "Y");
end-method;

method getIsVirtualCompanyByDate
   /+ &setId as String, +/
   /+ &deptId as String, +/
   /+ &date as Date +/
   /+ Returns Boolean +/
   Return (%Super.getStrByDate(&setId | &deptId, &date, 11) = "Y");
end-method;

method getIsShellCompanyByDate
   /+ &setId as String, +/
   /+ &deptId as String, +/
   /+ &date as Date +/
   /+ Returns Boolean +/
   Return (%Super.getStrByDate(&setId | &deptId, &date, 12) = "Y");
end-method;

method getIsVirtualDeptByDate
   /+ &setId as String, +/
   /+ &deptId as String, +/
   /+ &date as Date +/
   /+ Returns Boolean +/
   Return (%Super.getStrByDate(&setId | &deptId, &date, 10) = "Y");
end-method;

method containsCode
   /+ &setId as String, +/
   /+ &deptId as String +/
   /+ Returns Boolean +/
   Return %This.containsCodeByDate(&setId, &deptId, %Date);
end-method;

method containsCodeByDate
   /+ &setId as String, +/
   /+ &deptId as String, +/
   /+ &date as Date +/
   /+ Returns Boolean +/
   Return %Super.containsCodeByDate(&setId | &deptId, %Date);
end-method;

method getRealTimePathDescrByDate
   /+ &setId as String, +/
   /+ &deptId as String, +/
   /+ &date as Date +/
   /+ Returns String +/
   /* getRowByDate */
   If %Super.mapData = Null Then
      %This.loading();
   End-If;
   Local array of any &pd = %Super.mapData.get(&setId | &deptId | &date | "PATH");
   If &pd = Null Or
         &pd [1] Then
      If &pd = Null Then
         &pd = CreateArrayAny( False, 0, True, 0, True, 0);
         %Super.mapData.put(&setId | &deptId | &date | "PATH", &pd);
      Else
         &pd [1] = False;
      End-If;
      
      Local string &path, &superId;
      If %This.tempMap = Null Then
         %This.tempMap = CreateJavaObject("java.util.HashMap");
      Else
         If %This.tempMap.containsKey(&deptId) Then /* 防止树结构死循环 */
            %This.tempMap = Null;
            Return "";
         End-If;
      End-If;
      
      &path = %Super.getStrByDate(&setId | &deptId, %Date, 5);
      &superId = %Super.getStrByDate(&setId | &deptId, %Date, 7);
      
      If None(&superId) Then
         &pd [2] = &path;
         %This.tempMap = Null;
      Else
         &pd [2] = %This.getRealTimePathDescrByDate(&setId, &superId, &date) | "/" | &path;
      End-If;
   End-If;
   Return &pd [2];
end-method;

method getRealTimePathDescrShortByDate
   /+ &setId as String, +/
   /+ &deptId as String, +/
   /+ &date as Date +/
   /+ Returns String +/
   /* getRowByDate */
   If %Super.mapData = Null Then
      %This.loading();
   End-If;
   Local array of any &pd = %Super.mapData.get(&setId | &deptId | &date | "PATH");
   If &pd = Null Or
         &pd [3] Then
      If &pd = Null Then
         &pd = CreateArrayAny( True, 0, False, 0, True, 0);
         %Super.mapData.put(&setId | &deptId | &date | "PATH", &pd);
      Else
         &pd [3] = False;
      End-If;
      
      Local string &path, &superId;
      If %This.tempMap = Null Then
         %This.tempMap = CreateJavaObject("java.util.HashMap");
      Else
         If %This.tempMap.containsKey(&deptId) Then /* 防止树结构死循环 */
            %This.tempMap = Null;
            Return "";
         End-If;
      End-If;
      
      &path = %Super.getStrByDate(&setId | &deptId, %Date, 6);
      &superId = %Super.getStrByDate(&setId | &deptId, %Date, 7);
      
      If None(&superId) Then
         &pd [4] = &path;
         %This.tempMap = Null;
      Else
         &pd [4] = %This.getRealTimePathDescrShortByDate(&setId, &superId, &date) | "/" | &path;
      End-If;
   End-If;
   Return &pd [4];
end-method;

method getRealTimePathCodeByDate
   /+ &setId as String, +/
   /+ &deptId as String, +/
   /+ &date as Date +/
   /+ Returns String +/
   If %Super.mapData = Null Then
      %This.loading();
   End-If;
   Local array of any &pd = %Super.mapData.get(&setId | &deptId | &date | "PATH");
   If &pd = Null Or
         &pd [5] Then
      If &pd = Null Then
         &pd = CreateArrayAny( True, 0, True, 0, False, 0);
         %Super.mapData.put(&setId | &deptId | &date | "PATH", &pd);
      Else
         &pd [5] = False;
      End-If;
      
      Local string &superId;
      If %This.tempMap = Null Then
         %This.tempMap = CreateJavaObject("java.util.HashMap");
      Else
         If %This.tempMap.containsKey(&deptId) Then /* 防止树结构死循环 */
            %This.tempMap = Null;
            Return "";
         End-If;
      End-If;
      
      &superId = %Super.getStrByDate(&setId | &deptId, %Date, 7);
      
      If None(&superId) Then
         &pd [6] = &deptId;
         %This.tempMap = Null;
      Else
         &pd [6] = %This.getRealTimePathCodeByDate(&setId, &superId, &date) | "/" | &deptId;
      End-If;
   End-If;
   Return &pd [6];
end-method;

method getSortStrByDate
   /+ &setId as String, +/
   /+ &deptId as String, +/
   /+ &date as Date +/
   /+ Returns String +/
   If %This.sortData = Null Then
      %This.loadingSortStr();
   End-If;
   Local JavaObject &ss = %This.sortData.get(&setId | &deptId | "R");
   If &ss = Null Then
      Local string &sort, &superId;
      /* Local integer &i;
      Local array of array of string &pathSortArray = CreateArrayRept(CreateArrayRept("", 0), 0);*/
      If %This.tempMap = Null Then
         %This.tempMap = CreateJavaObject("java.util.HashMap");
      Else
         If %This.tempMap.containsKey(&deptId) Then /* 防止树结构死循环 */
            %This.tempMap = Null;
            Return "";
         End-If;
      End-If;
      
      &ss = %This.sortData.get(&setId | &deptId);
      If &ss = Null Then
         &sort = "00000" | &setId | "99999" | &deptId;
      Else
         &sort = &ss.toString();
         &ss = Null;
      End-If;
      
      &superId = %Super.getStrByDate(&setId | &deptId, %Date, 7);
      
      If None(&superId) Then
         %This.tempMap = Null;
      Else
         &sort = %This.getSortStrByDate(&setId, &superId, &date) | &sort;
      End-If;
      
      %This.sortData.put(&setId | &deptId | "R", &sort);
      Return &sort;
   Else
      Return &ss.toString();
   End-If;
end-method;

method getTreeDataManagerByDate
   /+ &date as Date +/
   /+ Returns COMMON:UTIL:TreeDataManager +/
   Local COMMON:UTIL:TreeDataManager &tdm = %Super.mapData.get(&date | "TREE");
   If &tdm = Null Then
      &tdm = create COMMON:UTIL:TreeDataManager();
      %Super.mapData.put(&date | "TREE", &tdm);
      %This.treeDataManagerArray.Push(&tdm);
      Local array of string &allKey = %Super.getAllKey();
      Local integer &i;
      Local string &superId;
      Local any &row;
      Local COMMON:UTIL:entity:TreeDataEntity &tde;
      For &i = 1 To &allKey.Len
         &row = %Super.getRowByDate(&allKey [&i], &date);
         If &row <> Null Then
            If None(&row [7]) Then
               &superId = "";
            Else
               &superId = &row [1] | &row [7];
            End-If;
            &tde = create COMMON:UTIL:entity:TreeDataEntity(&allKey [&i], &superId);
            &tde.anyProperty = &row;
            &tdm.disorderAddTreeNode(&tde);
         End-If;
      End-For;
   End-If;
   Return &tdm;
end-method;

method getDescrByTreeDataEntity
   /+ &tde as COMMON:UTIL:entity:TreeDataEntity +/
   /+ Returns String +/
   Return String(&tde.anyProperty [5]);
end-method;

method getCompanyCodeByTreeDataEntity
   /+ &tde as COMMON:UTIL:entity:TreeDataEntity +/
   /+ Returns String +/
   Return String(&tde.anyProperty [8]);
end-method;

method getDeptAttrCodeByTreeDataEntity
   /+ &tde as COMMON:UTIL:entity:TreeDataEntity +/
   /+ Returns String +/
   Return String(&tde.anyProperty [13]);
end-method;

method getIsCompanyByTreeDataEntity
   /+ &tde as COMMON:UTIL:entity:TreeDataEntity +/
   /+ Returns Boolean +/
   Return (String(&tde.anyProperty [9]) = "Y");
end-method;

method getIsVirtualCompanyByTreeDataEntity
   /+ &tde as COMMON:UTIL:entity:TreeDataEntity +/
   /+ Returns Boolean +/
   Return (String(&tde.anyProperty [11]) = "Y");
end-method;

method getIsShellCompanyByTreeDataEntity
   /+ &tde as COMMON:UTIL:entity:TreeDataEntity +/
   /+ Returns Boolean +/
   Return (String(&tde.anyProperty [12]) = "Y");
end-method;

method getIsVirtualDeptByTreeDataEntity
   /+ &tde as COMMON:UTIL:entity:TreeDataEntity +/
   /+ Returns Boolean +/
   Return (String(&tde.anyProperty [10]) = "Y");
end-method;

method clean
   %This.sortData = Null;
   %Super.clean();
   Local integer &i;
   For &i = 1 To %This.treeDataManagerArray.Len
      %This.treeDataManagerArray [&i].clean();
   End-For;
end-method;

method loading
   %Super.mapData = CreateJavaObject("java.util.HashMap");
   Local string &sqlStr = "SELECT DT.SETID, DT.DEPTID, DT.EFFDT, DT.EFF_STATUS, DT.DESCR9, DT.DESCRSHORT";
   &sqlStr = &sqlStr | " , DT.PARENT_BUSINESS, DT.COMPANY, DT.IS_COMPANY, DT.IS_VIRTUAL_DPT";
   &sqlStr = &sqlStr | " , DT.IS_VIRTUAL_COMP, DT.IS_SHELL, DT.DEPT_ATTR ";
   &sqlStr = &sqlStr | " FROM PS_DEPT_TBL DT ";
   &sqlStr = &sqlStr | "ORDER BY DT.SETID, DT.DEPTID, DT.EFFDT DESC";
   Local array of any &data = CreateArrayAny();
   Local SQL &sql = CreateSQL(&sqlStr);
   While &sql.Fetch(&data)
      %Super.addRowData(&data [1] | &data [2], &data [3], &data [4], &data.Clone());
   End-While;
end-method;

method loadingSortStr
   %This.sortData = CreateJavaObject("java.util.HashMap");
   Local string &sqlStr = "SELECT HD.SETID, HD.DEPTID, LPAD(BU.SORT_NBER, 5, '0') || HD.SETID || LPAD( DECODE(HD.DEPT_ORDER,0,99999,HD.DEPT_ORDER) , 5, '0') || HD.DEPTID FROM ";
   &sqlStr = &sqlStr | "PS_DEPT_SORT_HD HD LEFT JOIN PS_BUS_UNIT_TBL_HR BU ON HD.SETID = BU.BUSINESS_UNIT";
   Local array of any &data = CreateArrayAny();
   Local SQL &sql = CreateSQL(&sqlStr);
   While &sql.Fetch(&data)
      %This.sortData.put(&data [1] | &data [2], &data [3]);
   End-While;
end-method;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值