找回密码
 开放注册

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

通达OA官网网站
搜索
查看: 7052|回复: 11

部门管理细化——隐藏部门(附完整源码)

  [复制链接]

257

主题

1154

回帖

1万

牛毛

游客

积分
18851
QQ
发表于 2016-2-25 14:43:59 | 显示全部楼层 |阅读模式
本帖最后由 cgft 于 2016-2-26 19:16 编辑

一、目的概述
通达OA的部门管理里面,有一个默认的隐藏部门,名称就是“离职人员/外部人员”。该部门的所有用户,在用户表user 的记录中的部门ID字段DEPT_ID,赋值是“0”;换句话说,部门信息表department中虽然没有“离职人员/外部人员”这个部门,但却将department中的DEPT_ID=0,默认为是“离职人员/外部人员”。
之所以将“离职人员/外部人员”称其为隐藏部门,就是在通常的部门选择操作中,操作界面不会出现“离职人员/外部人员”这个部门。
那么,另外再设置一个隐藏的部门有什么用?答案是:用它来保存企业部门变动的历史数据。既然如此,我们姑且就将其称作“撤并留存”好了。有可能会有叫“留守处”的,但估计没有哪一家会把一个部门命名为“撤并留存”吧?;P

再进一步,为什么要保存企业部门变动的历史数据?OA除了是一款便利的办公软件外,也是一个知识资料库,也是一个历史档案库。OA作为深入至企业管理各层面的一个有机整体,就部门管理而言,若仅是简单粗暴地撤并、删除甚至修改部门数据而不保存部门变动的本身历史痕迹,则是凡与部门变动有关的诸多模块都会受到影响。等到数年之后回头再看,许多历史资料就会变得面目全非甚至错误百出,何谈完整地记录和全面地复原企业的经营轨迹?

举一个简单的例子,如果有“行政财务部”这么个部门。它发布了一则事关财务费用管理的公告通知,落款是行政财务部;之后该部门因组织机构的调整而被拆解为行政部和财务部。在OA系统里,不管是把行政财务部的名称改为行政部并再新建财务部,还是删除行政财务部后另外再新建行政部和财务部。回头再看这则公告通知,其结果都不能真实还原原貌。不外乎会出现如下的问题或疑问:
1、先看发布部门,是行政部,内容却实实在在是财务部的。行政部的勺子怎么伸到财务部的碗里了?
2、再看落款,为什么发布部门与正文落款不同?
3、或如果是删除了行政财务部的话,就会发现为什么发布部门里没有内容了?
若能在OA的部门管理里保留被拆解的行政财务部,另外新建行政部和财务部,就不会有这些“为什么”了。但这个已成为历史的“行政财务部”依旧出现在部门选择界面里,确实也不妥当。

由此,对“撤并留存”部门的管理要求归结为:既要在OA的部门管理里保留被撤并的历史部门,又不允许被撤并的历史部门在通常的部门选择操作界面中蹦出来捣乱

二、实现思路
就从部门信息表department中下手。
分析部门信息表department中的几个字段:
DEPT_ID,记录的关键字指针。
DEPT_NO,部门排序号。以3位数码为一组,代表一个层级,在本级层次中不许重复。
DEPT_PARENT,上级部门ID。其值为父节点的DEPT_ID,DEPT_ID=0表示该部门系一级部门。

经测试剖析,可知:
1、将DEPT_PARENT的值设置成与DEPT_ID的值相等时,即可达到在选择部门的操作界面里隐藏该部门的目的。
2、将DEPT_NO的值由一组(3位数码)设置成多组(6位以上的数码),即可达到在OA精灵的组织机构中隐藏该部门的目的。
3、如果某角色已被设置为部门私有角色,且该部门已置于“撤并留存”部门或被置于“撤并留存”的下级部门,则在“撤并留存”被隐藏后,会导致角色的选择操作出现异常。因此,在做隐藏“撤并留存”部门的操作时,必须将这些角色设置成系统全局角色。

根据上述三点,其实现思路即毋庸赘述了。

257

主题

1154

回帖

1万

牛毛

游客

积分
18851
QQ
 楼主| 发表于 2016-2-26 14:06:29 | 显示全部楼层
本帖最后由 cgft 于 2016-2-26 18:37 编辑

三、实现方法
1、建立“撤并留存”部门
按下列要求输入,(尤其是前3项的输入值)一个字都别改,否则代码运行会出错的。

部门排序号:987
部门名称:撤并留存
上级部门:无
部门类型:普通
部门职能:部门变动历史存档


将来,所有的被撤并、改名的部门,通过现有的部门管理模块,都云集于“撤并留存”的麾下,成为它的儿孙。只要把“撤并留存”塞进洞里隐藏起来,旗下的徒子徒孙们秉承“龙生龙,凤生凤,老鼠生来会打洞”的血统,就都会跟着钻洞的:lol:shutup:
话说这只耗子,什么时候出洞觅食呢?当又要往里塞一只小耗子的时候;或者,需要从洞里拽出某只幸运的耗子让它重新丑小鸭变天鹅(恢复该部门原建制和名称)的时候。

2、程序代码
2个程序文件,存放路径是:  MYOA\webroot\general\system\dept

程序名: dept_hidden.php
代码:
  1. <?
  2. include_once('inc/auth.inc.php');
  3. $HTML_PAGE_TITLE= '显示/隐藏 名称为“撤并留存”的部门';
  4. include_once('inc/header.inc.php');
  5. $query= "SELECT DEPT_ID,DEPT_PARENT FROM department WHERE DEPT_NAME='撤并留存' AND right(DEPT_NO,3)='987'";
  6. $cursor= exequery(TD::conn(), $query);
  7. $ROW= mysql_fetch_array($cursor);
  8. $DEPT_ID= $ROW['DEPT_ID'];
  9. $IS_HIDDEN= $ROW['DEPT_PARENT']==0 ? 1 : 0;
  10. ?>

  11. <link rel="stylesheet" type="text/css" href="<?=MYOA_STATIC_SERVER?>/static/js/bootstrap/css/bootstrap.css">
  12. <style type="text/css">
  13. .WRYH {
  14.         font-family: "微软雅黑","Microsoft Yahei","宋体";
  15. }
  16. .notec {
  17.         color: #5c7;
  18. }
  19. </style>
  20. <script src="<?=MYOA_JS_SERVER?>/static/js/jquery-1.10.2/jquery.min.js<?=$GZIP_POSTFIX?>"></script>
  21. <script>
  22. if(window.external && typeof window.external.OA_SMS != 'undefined') {
  23.         var h= Math.min(300, screen.availHeight- 120), w= Math.min(660, screen.availWidth- 180);
  24.         window.external.OA_SMS(w, h, "SET_SIZE");
  25. }
  26. </script>
  27. <body class="bodycolor WRYH">
  28. <div style="margin:0 auto; height:300px; width:660px; border:1px solid #f89;">
  29.         <div style="margin:10px 20px; border:none; position:relative;">
  30.                 <img src="<?=MYOA_STATIC_SERVER?>/static/privat_ftc/images/StuBarPic.gif">
  31.                 <span style="font-size:11pt; font-weight:bold; position:absolute; bottom:0px;">
  32.                           <?=$HTML_PAGE_TITLE?></span>
  33.         </div>
  34.         <div style="margin:30px; border:0px;">
  35.                 <span class="notec">   1. 所有被撤并、改名的部门,均可保存在名称为“撤并留存”的部门之下,
  36.                 此举利于完整地记录和全面地复原组织机构中部门变迁的历史沿革及其他模块中的部门信息。<br />  
  37.                 2. “撤并留存”平时处于隐藏状态,不在日常的部门选择操作界面中出现。<br />  
  38.                 3. 需要保存被撤并或改名的部门时,执行“显示撤并留存”命令,可使之处于可见状态,但不影响对其部门信息的读取。<br />  
  39.                 4. 当保存被撤并、改名的部门的操作结束后,再执行“隐藏撤并留存”命令,使“撤并留存”重新恢复至不可见的常态。</span>
  40.         </div>
  41.         <div style="margin:30px; border:1px solid #ccc;"><?
  42.             if(($IS_HIDDEN)) { ?>
  43.                 <button type="button" class="btn btn-large btn-danger" node-type="dirOpts"
  44.                  node-data="hidden_cblc" title="用于在部门管理中隐藏“撤并留存”">
  45.                 <i class="icon-off icon-white"></i> 隐藏 撤并留存</button>  
  46.                 部门“撤并留存”的当前状态: 全部用户<span class="big4">都可见</span><?
  47.             } else { ?>
  48.                 <button type="button" class="btn btn-large btn-primary" node-type="dirOpts"
  49.                  node-data="show_cblc" title="用于在部门管理中显示“撤并留存”">
  50.                 <i class="icon-share icon-white"></i> 显示 撤并留存</button>  
  51.                 部门“撤并留存”的当前状态: 全部用户<span class="big4">不可见</span><?
  52.             } ?>
  53.         </div>
  54. </div>
  55. <script>
  56. (function($){
  57.         $("button[node-type='dirOpts']").click(function(e){
  58.                 var action= $(this).attr("node-data");
  59.                 switch(action) {
  60.                         case 'hidden_cblc':
  61.                                 var url= "cblc_hdnshw.php?DEPT_ID=<?=$DEPT_ID?>&hidd=1";
  62.                                 window.location.href= url;
  63.                                 break;
  64.                         case 'show_cblc':
  65.                                 var url= "cblc_hdnshw.php?DEPT_ID=<?=$DEPT_ID?>&hidd=0";
  66.                                 window.location.href= url;
  67.                                 break;
  68. }        });        })(jQuery);
  69. </script>
  70. </body></html>
复制代码

程序名: cblc_hdnshw.php
代码:
  1. <?
  2. include_once('inc/auth.inc.php');
  3. include_once('inc/utility_org.php');
  4. include_once('inc/header.inc.php');
  5. echo "<body class='bodycolor'>";
  6. if($_SESSION['LOGIN_USER_PRIV']!=1) {
  7.         echo "<br /><br />";
  8.         message('', '本操作仅授权给系统管理员admin使用');
  9.         Button_Back();
  10.         exit();
  11. }
  12. if($hidd) {
  13.         $DEPTID_STR= GetUnionSetOfChildDeptId($DEPT_ID);
  14.         $query= "UPDATE user_priv SET PRIV_DEPT_ID=0, IS_GLOBAL=0 WHERE IS_GLOBAL=1 AND PRIV_DEPT_ID in($DEPTID_STR)";
  15.         exequery(TD::conn(), $query);
  16.         $query= "UPDATE department SET DEPT_NO='987987', DEPT_PARENT=$DEPT_ID WHERE DEPT_ID=$DEPT_ID";
  17. } else
  18.         $query= "UPDATE department SET DEPT_NO='987', DEPT_PARENT=0 WHERE DEPT_ID=$DEPT_ID";
  19. exequery(TD::conn(), $query);
  20. include_once("inc/utility_cache.php");
  21. cache_department();
  22. header("location:dept_hidden.php");
  23. ?></body></html>
复制代码

图片文件见下图,将其另存为 StuBarPic.gif  即可。
  

图片文件存放路径:MYOA\webroot\static\privat_ftc\images
若路径不存在,新建就是了。
图片的文件名、图片内容及存放路径,可自行修改,但相对应的程序代码也要做相应的修改。




StuBarPic.gif

257

主题

1154

回帖

1万

牛毛

游客

积分
18851
QQ
 楼主| 发表于 2016-2-26 15:18:03 | 显示全部楼层
本帖最后由 cgft 于 2016-2-29 12:28 编辑

运行截图




看了一下,代码上传后,部分字符被屏蔽了。特上传以上程序的完整的压缩包,含路径和图片。




1.png
2.png
3.png

撤并留存.rar

4.11 KB, 下载次数: 96

257

主题

1154

回帖

1万

牛毛

游客

积分
18851
QQ
 楼主| 发表于 2016-2-26 16:14:36 | 显示全部楼层
本帖最后由 cgft 于 2016-2-26 17:34 编辑

3、设置菜单
程序的执行菜单,命名为“部门显隐”,建议放在“系统管理/组织机构设置”里,排在“部门管理”之后。
菜单运行文件: MYOA\webroot\general\system\dept\dept_hidden.php
菜单权限,自然是仅授予管理员为好。范围大了也没关系,在程序里已用户有权限甄别,仅执行admin发出的命令,其他人等,一概拒绝。
以下是菜单设置截图:








11.png
12.png

65

主题

285

回帖

1602

牛毛

游客

积分
1952
QQ
发表于 2016-2-29 10:58:29 | 显示全部楼层
这么好的帖子,支持。:handshake
通达也应该去优化这个问题。

点评

为了不改变原结构,只得作变通处理,所以效果并不尽人意,只能凑合了  详情 回复 发表于 2016-2-29 12:31

257

主题

1154

回帖

1万

牛毛

游客

积分
18851
QQ
 楼主| 发表于 2016-2-29 12:31:20 | 显示全部楼层
z471204752 发表于 2016-2-29 10:58
这么好的帖子,支持。
通达也应该去优化这个问题。

为了不改变原结构,只得作变通处理,所以效果并不尽人意,只能凑合了:loveliness:

10

主题

44

回帖

604

牛毛

游客

积分
658
发表于 2016-3-8 16:03:33 | 显示全部楼层
赞一个。建议直接把菜单插入到SYS_FUNCTION表中配置就省了。

点评

不中啊,这是没有办法的办法。 如在部门管理方面能做到像人员管理中的离职人员,有一个固定的去处,就好了。这个,由于涉及到整个系统的核心应用,牵一发而,不是一个小程序就能解决的。  详情 回复 发表于 2016-3-8 21:18

257

主题

1154

回帖

1万

牛毛

游客

积分
18851
QQ
 楼主| 发表于 2016-3-8 21:18:32 | 显示全部楼层
sany217 发表于 2016-3-8 16:03
赞一个。建议直接把菜单插入到SYS_FUNCTION表中配置就省了。

不中啊,这是没有办法的办法。
如在部门管理方面能做到像人员管理中的离职人员,有一个固定的去处,就好了。这个,由于涉及到整个系统的核心应用,牵一发而动全身,就不是一个小程序能解决的了。

10

主题

44

回帖

604

牛毛

游客

积分
658
发表于 2016-3-9 10:35:23 | 显示全部楼层
cgft 发表于 2016-3-8 21:18
不中啊,这是没有办法的办法。
如在部门管理方面能做到像人员管理中的离职人员,有一个固定的去处,就好了 ...
  1. if ( !sys_func_exists($mn) )
  2. {
  3.         $func_id = 0;
  4.         $sql = "select MAX(FUNC_ID) from sys_function";
  5.         $cursor = exequery( TD::conn( ), $sql );
  6.         $ROW = mysql_fetch_array( $cursor );
  7.         $func_id = $ROW[0];
  8.         $func_id += 1;
  9.         $sql_office = "INSERT INTO SYS_FUNCTION (FUNC_ID,MENU_ID,FUNC_NAME,FUNC_CODE) VALUES ('{$func_id}','{$mn['mid']}','{$mn['name']}','{$mn['code']}');";
  10.         exequery( TD::conn( ), $sql_office );
  11.         $func_id_str = "";
  12.         $query = "select FUNC_ID_STR from user_priv where USER_PRIV = '1'";
  13.         $cursor = exequery( TD::conn( ), $query );
  14.         if ( ( $ROW = mysql_fetch_array( $cursor ) ) && !find_id( $ROW['FUNC_ID_STR'], $func_id ) )
  15.         {
  16.                 $update = "update user_priv set FUNC_ID_STR = '".$ROW['FUNC_ID_STR']."{$func_id},' where USER_PRIV = '1'";
  17.                 exequery( TD::conn( ), $update );
  18.         }
  19.         cache_menu( );
  20. }
复制代码
菜单。

24

主题

162

回帖

1411

牛毛

游客

积分
1597
发表于 2016-3-14 08:49:53 | 显示全部楼层
:victory::victory::victory::victory::victory::victory::victory::victory::victory::victory::victory::victory::victory::victory:
您需要登录后才可以回帖 登录 | 开放注册

本版积分规则

咨询电话:400 818 0505 通达OA,国内协同管理软件行业内唯一的央企单位,中国协同OA软件的领跑者,优秀协同办公解决方案供应商

帮助|Archiver|小黑屋|通信管理局专项备案号:[2008]238号|由NB5牛论坛提供技术支持NB5用户社区 ( 皖ICP备08004151号;皖公网安备34010402700514号 )

GMT+8, 2025-1-8 07:55 , Processed in 0.160191 second(s), 41 queries , Yac On.

Powered by Discuz

Copyright © 2001-2024, 北京通达信科科技有限公司.

快速回复 返回顶部 返回列表