找回密码
 开放注册

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

通达OA官网网站
搜索
查看: 3949|回复: 8

【模块Bug修复】用户自定义公告通知(2015/2016版)

[复制链接]

257

主题

1154

回帖

1万

牛毛

游客

积分
18851
QQ
发表于 2016-11-15 21:02:15 | 显示全部楼层 |阅读模式
本帖最后由 cgft 于 2017-4-9 08:47 编辑

一、Bug产生环境
系统本身公告通知模块A,自建自定义公告模块B。
用户集{c1}拥有模块A和模块B的权限,用户集{c2}仅有模块A的权限,用户集{c3}仅有模块B的权限。
向用户集{c1}和用户集{c3}同时发布自定义公告,或单独向用户集{c3}发布自定义公告,用户集{c3}都收不到事务提醒。

二、Bug修复
在自定义公告模块的运行目录
MYOA\webroot\general\(自定义公告目录)\manage\
下的add.php和update.php两个文件中,都有如下一段代码:
  1. //-------排除没有公告通知菜单权限的人-------   
  2. $USER_ID_STR_ARRAY=explode(",",$USER_ID_STR);   
  3. $USER_ID_STR_ARRAY_COUNT=sizeof($USER_ID_STR_ARRAY);   
  4. for($I=0;$I<$USER_ID_STR_ARRAY_COUNT;$I++)   
  5. {      
  6.     if($USER_ID_STR_ARRAY[$I]=="")         
  7.         continue;      
  8.     $FUNC_ID_STR=GetfunmenuByuserID($USER_ID_STR_ARRAY[$I]);      
  9.     if(!find_id($FUNC_ID_STR,4))         
  10.         $USER_ID_STR=str_replace($USER_ID_STR_ARRAY[$I],'',$USER_ID_STR);   
  11. }
复制代码
上面的代码,错在第九句,错用了公告通知的菜单ID(ID=4)进行排除筛选。用如下代码将其覆盖,
  1. //-------排除没有公告通知菜单权限的人-------   
  2. $query="SELECT FUNC_ID FROM sys_function WHERE FUNC_NAME='".$dispName."'";   
  3. $cursor=exequery(TD::conn(),$query);   
  4. $ROW=mysql_fetch_array($cursor);
  5. $MY_MENU_ID=$ROW['0'];      // 读取菜单ID   
  6. $USER_ID_STR_ARRAY=explode(",",$USER_ID_STR);   
  7. $USER_ID_STR_ARRAY_COUNT=sizeof($USER_ID_STR_ARRAY);   
  8. for($I=0;$I<$USER_ID_STR_ARRAY_COUNT;$I++)   
  9. {     
  10.     if($USER_ID_STR_ARRAY[$I]=="")         
  11.         continue;      
  12.     $FUNC_ID_STR=GetfunmenuByuserID($USER_ID_STR_ARRAY[$I]);      
  13.     if(!find_id($FUNC_ID_STR,$MY_MENU_ID))         
  14.         $USER_ID_STR=str_replace($USER_ID_STR_ARRAY[$I],'',$USER_ID_STR);   
  15. }
复制代码
即可修复该Bug。

三、适用范围
2013增强版、2015版、2016版。
建议通达予以修复。

257

主题

1154

回帖

1万

牛毛

游客

积分
18851
QQ
 楼主| 发表于 2016-11-28 09:34:46 | 显示全部楼层
大致捋了一遍整个模块的代码,看来问题还真没那么简单。
配置文件config.php,定义了4个变量,后两个变量,基本没用上。不是没有用处,而是程序中把它遗忘了。要想完善地发挥config.php的作用,还需定义菜单代码和APP日志代码两个变量。
例如前帖所述的代码,如果定义了菜单代码,就变成了:

  1. //-------排除没有公告通知菜单权限的人-------   

  2. $USER_ID_STR_ARRAY=explode(",",$USER_ID_STR);   

  3. $USER_ID_STR_ARRAY_COUNT=sizeof($USER_ID_STR_ARRAY);   

  4. for($I=0;$I<$USER_ID_STR_ARRAY_COUNT;$I++)   

  5. {     
  6.    
  7. if($USER_ID_STR_ARRAY[$I]=="")         

  8.         
  9. continue;      
  10.    
  11. $FUNC_ID_STR=GetfunmenuByuserID($USER_ID_STR_ARRAY[$I]);      

  12.    
  13. if(!find_id($FUNC_ID_STR,$ExtNotify_FUNC_ID))         

  14.         
  15. $USER_ID_STR=str_replace($USER_ID_STR_ARRAY[$I],'',$USER_ID_STR);   

  16. }
复制代码

代码简单了许多,免除了数据库的查询,加快了执行速度。
除了主公告通知和自定义公告通知因授权用户集不同,造成用户收不到新建公告通知的事务提醒外,由于主公告通知和自定义公告通知两个模块混用内部标志,还会造成阅读记录混乱、阅读记录记载的时间错误、不能按要求再次提醒未读人员、删除公告通知时日志提醒等删除不彻底或删错等一系列莫名其妙的错误,如果企业因某种需求,想要用公告通知的阅读人员和阅读时间作为管理凭证甚至作为电子证据,那热闹可就大发了,不知道会产生多少“冤假错案”呢。总得来说,在二十多个程序中,只要涉及到自定义公告通知的内部标志的程序,都存在Bug。
下面,就是我改写后的manage目录下的delete.php代码:


  1. <?
  2. include_once("inc/auth.inc.php");
  3. include_once("inc/utility_all.php");
  4. include_once("inc/utility_file.php");
  5. include_once("inc/utility_sms1.php");
  6. include_once("inc/utility_cache.php");
  7. include_once("../config.php");
  8. include_once("inc/header.inc.php");
  9. $HTML_PAGE_TITLE="";
  10. ?>
  11. <body class="bodycolor">
  12. <?
  13. $PARA_ARRAY=get_sys_para("NOTIFY_EDIT_PRIV".$dbName);
  14. if($DELETE_STR=="")
  15. $DELETE_STR=0;
  16. elseif(substr($DELETE_STR,-1,1)==",")
  17. $DELETE_STR=substr($DELETE_STR,0,-1);
  18. $query="select BEGIN_DATE,SUBJECT,ATTACHMENT_ID,ATTACHMENT_NAME,NOTIFY_ID
  19. from $dbName where NOTIFY_ID in ($DELETE_STR)";
  20. $cursor=
  21. exequery(TD::conn(),$query);
  22. while($ROW=mysql_fetch_array($cursor))
  23. {
  24. $BEGIN_DATE=$ROW["BEGIN_DATE"];
  25. $SUBJECT1=$ROW["SUBJECT"];
  26. $SUMMARY=$ROW["SUMMARY"];
  27. $ATTACHMENT_ID=$ROW["ATTACHMENT_ID"];
  28. $ATTACHMENT_NAME=$ROW["ATTACHMENT_NAME"];
  29. $BEGIN_DATE=date("Y-m-d",$BEGIN_DATE);
  30. $NOTIFY_ID=$ROW["NOTIFY_ID"];
  31. $REMIND_URL="1:".$dbName."/show/read_notify.php?NOTIFY_ID=".$NOTIFY_ID;
  32. delete_remind_sms($sms_num,'','','',$REMIND_URL);
  33. if($ATTACHMENT_NAME!="")
  34.   delete_attach($ATTACHMENT_ID,$ATTACHMENT_NAME);
  35. $query="delete
  36. from APP_LOG where MODULE='$ExtNotify_MODULE_ID' and
  37. OPP_ID='$NOTIFY_ID'";
  38. exequery(TD::conn(),
  39. $query);
  40. add_log($log_num,"删除《".$SUBJECT1."》",$_SESSION["LOGIN_USER_ID"]);
  41. }
  42. $query="delete from $dbName where NOTIFY_ID in
  43. ($DELETE_STR)";
  44. exequery(TD::conn(),$query);
  45. if($SEARCH==1) {
  46. header("location:
  47. search.php?start=$start&SEARCH=1&SEND_TIME_MIN=$SEND_TIME_MIN&SEND_TIME_MAX=$SEND_TIME_MAX&SUBJECT=
  48. $SUBJECT&CONTENT= $CONTENT&FORMAT=$FORMAT&TYPE_ID=$TYPE_ID&PUBLISH=$PUBLISH&TOP=$TOP&TO_ID=$TO_ID&STAT=$STAT&IS_MAIN=1");
  49. }
  50. else {
  51. if($FROM!=2)
  52.   header("location:
  53. index1.php?start=$start&IS_MAIN=1");
  54. else
  55.   header("location:../auditing/audited.php?start=$start&IS_MAIN=1");
  56. }
  57. ?></body></html>
复制代码

257

主题

1154

回帖

1万

牛毛

游客

积分
18851
QQ
 楼主| 发表于 2016-11-28 09:40:46 | 显示全部楼层
本帖最后由 cgft 于 2017-4-9 08:40 编辑

论坛发帖,代码的粘贴,有问题。莫名其妙的多出来多余的换行,不该换行的也加进了换行。这次,因为仅是示例,就不重新编辑了。
______________________    ps:以下为新编辑内容  —————————————————————————

因用户自定义的公告通知栏目名称不同,另外用户系统也因已安装的应用不同,所以有关参数值不能固定。为保持原模块的通用性,就不能简单地在程序中修改或添加具体的参数数值,还是应该用变量来带入参数值。
原模块的参数值赋值程序config.php是这样写的:

  1. <?
  2. $dbName='';
  3. $dispName='';
  4. $sms_num='';
  5. $log_num='';
  6. ?>
复制代码

修复后的模块,参数值赋值程序config.php改为:

  1. <?
  2. $dbName='';
  3. $dispName='';
  4. $sms_num='';
  5. $log_num='';
  6. $ExtNotify_FUNC_ID='';
  7. $ExtNotify_MODULE_ID='';
  8. ?>
复制代码

以上各变量:
$dbName是自定义公告通知的栏目名称,一般是中文;
$dispName是自定义公告通知的数据库表名,要求应符合数据库表命名规则;
$sms_num是事务提醒的系统代码;
$log_num是操作日志的系统代码;
$ExtNotify_FUNC_ID,新增,自定义公告通知菜单的系统代码;
$ExtNotify_MODULE_ID,新增,附件模块信息的系统代码。

24

主题

162

回帖

1411

牛毛

游客

积分
1597
发表于 2016-11-28 10:58:55 | 显示全部楼层
佩服,OA应用有深度

点评

多交流!  详情 回复 发表于 2016-11-29 21:07

257

主题

1154

回帖

1万

牛毛

游客

积分
18851
QQ
 楼主| 发表于 2016-11-29 14:10:32 | 显示全部楼层
本帖最后由 cgft 于 2016-11-29 21:22 编辑

改自于公告通知的自定义模块,自然还带着原母版的Bug。但有一些Bug,在后续的版本升级中已经修复了。以manage/delete_all.php为例,我就觉得逻辑有问题,对管理员授权莫名其妙。这是原版2016自定义模块代码:
  1. <?
  2. include_once("inc/auth.inc.php");
  3. include_once("inc/utility_all.php");
  4. include_once("inc/utility_file.php");
  5. include_once("inc/utility_sms1.php");
  6. include_once("inc/utility_cache.php");
  7. include_once("../config.php");
  8. include_once("inc/header.inc.php");
  9. $HTML_PAGE_TITLE="";
  10. ?>
  11. <body class="bodycolor"><?
  12. $PARA_ARRAY=get_sys_para("NOTIFY_EDIT_PRIV".$dbName);if($_SESSION["LOGIN_USER_PRIV"]!="1")
  13.    $query="select ATTACHMENT_ID,ATTACHMENT_NAME from $dbName where ATTACHMENT_NAME!=''";
  14. $cursor=exequery(TD::conn(),$query);
  15. while($ROW=mysql_fetch_array($cursor))
  16. {
  17.   $ATTACHMENT_ID=$ROW["ATTACHMENT_ID"];
  18.   $ATTACHMENT_NAME=$ROW["ATTACHMENT_NAME"];  delete_attach($ATTACHMENT_ID,$ATTACHMENT_NAME);
  19. }if($_SESSION["LOGIN_USER_PRIV"]=="1")
  20.    $query="delete from $dbName";
  21. exequery(TD::conn(),$query);if($_SESSION["LOGIN_USER_PRIV"]=="1")
  22.   delete_remind_sms(1);
  23. else
  24.   delete_remind_sms(1, $_SESSION["LOGIN_USER_ID"]);
  25. add_log(15,_("删除所有".$dispName),$_SESSION["LOGIN_USER_ID"]);
  26. header("location: index1.php?IS_MAIN=1");
  27. ?></body>
  28. </html>
复制代码

这是我改过的:
  1. <?
  2. include_once("inc/auth.inc.php");
  3. include_once("inc/utility_all.php");
  4. include_once("inc/utility_file.php");
  5. include_once("inc/utility_sms1.php");
  6. include_once("inc/utility_cache.php");
  7. include_once("../config.php");
  8. include_once("inc/header.inc.php");
  9. $HTML_PAGE_TITLE="";
  10. ?><body class="bodycolor"><?
  11. if($_SESSION["LOGIN_USER_PRIV"]!="1") {
  12. echo '<br /><br />';
  13. Message('','此操作仅授权给系统管理员');
  14. exit();
  15. }$query="select ATTACHMENT_ID,ATTACHMENT_NAME from $dbName where ATTACHMENT_NAME!=''";
  16. $cursor=exequery(TD::conn(),$query);
  17. while($ROW=mysql_fetch_array($cursor)) {
  18. $ATTACHMENT_ID=$ROW["ATTACHMENT_ID"];
  19. $ATTACHMENT_NAME=$ROW["ATTACHMENT_NAME"];
  20. delete_attach($ATTACHMENT_ID,$ATTACHMENT_NAME);
  21. }$query="delete from $dbName";
  22. exequery(TD::conn(),$query);
  23. $query="delete from APP_LOG where MODULE='$ExtNotify_MODULE_ID'";
  24. exequery(TD::conn(), $query);
  25. delete_remind_sms($sms_num);
  26. add_log($log_num,'删除所有'.$dispName,$_SESSION['LOGIN_USER_ID']);
  27. header("location: index1.php?IS_MAIN=1");?>
  28. </body></html>
复制代码

今天,从网友那里淘到一个2016钻石版的delete_all.php原码,对比一看,我还真改对了,要按照2016自定义模块原版的逻辑去删除全部的内容,真会乱了套。不过嘛,2016钻石版的,删得不如自己改得彻底,阅读记录没删除,日久天长,难免就沉淀成了辣鸡。
  1. <?
  2. include_once("inc/auth.inc.php");
  3. include_once("inc/utility_all.php");
  4. include_once("inc/utility_file.php");
  5. include_once("inc/utility_sms1.php");
  6. include_once("inc/utility_cache.php");include_once("inc/header.inc.php");
  7. ?><body class="bodycolor"><?
  8. // $PARA_ARRAY=get_sys_para("NOTIFY_EDIT_PRIV");if($_SESSION["LOGIN_USER_PRIV_TYPE"] == "1")
  9. {
  10.     $query="select ATTACHMENT_ID,ATTACHMENT_NAME from NOTIFY where ATTACHMENT_NAME!=''";
  11.     $cursor=exequery(TD::conn(),$query);
  12.     while($ROW=mysql_fetch_array($cursor))
  13.     {
  14.         $ATTACHMENT_ID=$ROW["ATTACHMENT_ID"];
  15.         $ATTACHMENT_NAME=$ROW["ATTACHMENT_NAME"];        delete_attach($ATTACHMENT_ID,$ATTACHMENT_NAME);
  16.     }    $query="delete from NOTIFY";
  17.     exequery(TD::conn(),$query);    delete_remind_sms(1);
  18. }// delete_remind_sms(1, $_SESSION["LOGIN_USER_ID"]);add_log(15, _("删除所有公告通知"), $_SESSION["LOGIN_USER_ID"]);
  19. header("location: index1.php?IS_MAIN=1");
  20. ?></body>
  21. </html>
复制代码

257

主题

1154

回帖

1万

牛毛

游客

积分
18851
QQ
 楼主| 发表于 2016-11-29 21:25:57 | 显示全部楼层
本帖最后由 cgft 于 2016-11-30 00:11 编辑

实在忍不住吐槽一下,坛子里的代码粘贴功能,实在是难弄。

257

主题

1154

回帖

1万

牛毛

游客

积分
18851
QQ
 楼主| 发表于 2017-8-4 18:05:13 | 显示全部楼层
本帖最后由 cgft 于 2017-8-4 18:08 编辑

257

主题

1154

回帖

1万

牛毛

游客

积分
18851
QQ
 楼主| 发表于 2017-8-4 18:05:21 | 显示全部楼层
本帖最后由 cgft 于 2017-8-4 18:08 编辑
您需要登录后才可以回帖 登录 | 开放注册

本版积分规则

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

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

GMT+8, 2024-12-23 06:11 , Processed in 0.130894 second(s), 33 queries , Yac On.

Powered by Discuz

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

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