一次bug的处理过程-OA重复档案的问题

简介:

1、有的用户无法新增,昨天已经提交该问题,需尽快处理,目前有人入职但是无法使用OA

2、有的用户新增后,出现了如下的情况,同一个用户出现两条记录(具体如下图),造成该用户无法登陆;但是生成了该员工的档案,但是查看详情时,却又无法看到数据,都是空档案;

  这些问题的出现跟最近新上线的功能即新建系统用户直接创建空档案功能有关(仅包括工号、用户名、姓名以及自动创建标识)。

  对于问题1,我们直接远程调试到生产系统,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
UserEntity userEntity = userService.queryUserByStaffId(staffinfoEntity.getStaffId());
         if  (userEntity !=  null ) {
             boolean  isOk = userService.updateUserInfoforDefine4(userEntity.getUserCode(),  "updateNofiles" );
             if (isOk) {
                 code = staffinfoDao.add(staffinfoEntity);
             }
             try  {
                 moduleProxyService.updateUserAndLdapAdByStaffInfo(staffinfoEntity);
             catch  (Exception e) {
                 throw  new  StaffInfoException( "新增档案失败"  + e.getMessage());
             }
         else  {
             code = staffinfoDao.add(staffinfoEntity);
         }

  在第一行查询时,user只有一个。然后我们进到updateUserAndLdapAdByStaffinfo方法中,该方法第一行即为根据工号查询用户。此时系统则报出错误。我们使用mybatis的selectOne,但是结果集却为两个。我们开始查询user表发现并不存在对应新增staffid的用户,因为事务在此处并未提交,这是没有问题的。但事务并未提交,在前一句还查的是一条,为什么在这里就变成了两条。在这两句中间只有一句话,那就是插入了一条档案数据。那就是在事务中档案及用户数据都应该是一条。

  我们打开对应queryUserByStaffId的方法,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!-- 按员工工号查询  -->
     < select  id = "queryUserByStaffId"  resultMap = "UserResultMap"   parameterType = "String" >
         SELECT 
         < include  refid = "UserAll_column" />, User.userStatus
         FROM 
         < include  refid = "User_Staff_View" /> 
         User  
         WHERE User.staffId = #{staffid}
     </ select >
     < sql  id = "User_Staff_View">
         (SELECT tsu.id,tsu.sortNo,tsu.userCode,tsu.deptCode,tsu.deptName,tsu.userName,tsu.userNamePinying,tsu.sex,tsu.userNameEn,tsu.aliasName,tsu.`password`,tsu.dn,tsu.managementScopeType,tsu.managementScope,
         tsu.accessControl,tsu.createTime,tsu.createUserCode,tsu.bindingIp,tsu.modifyTime,tsu.modifyUserCode,tsu.define1,tsu.define2,tsu.define3,tsu.active,tsu.staffId,tsu.deskMenuSequence,tsu.userStatus,
         tsu.givenName,tsu.sn,tsu.displayname,
         tps.personalEmail AS email,
         tps.phone AS mobile,
         tps.stationNo AS physicalDeliveryOfficeName,
         tps.extensionPhone AS telephoneNumber,
         tps.officeAddress AS l,
         tps.postName AS title,
         tps.directLeaderName AS manager,
         tps.define4 AS define4
        FROM t_sys_user tsu INNER JOIN t_per_staffinfo tps ON tsu.staffId = tps.staffId)
     </ sql >   

  这种查询用户的方法源于我们之前的一次优化过程。因为用户和档案信息中存在部分字段重复,我们将user表中与档案信息存在重复的一些字段进行了整理,统一关联到档案表中。因为user表中有一些字段被删除,而在业务中可能又需要这些字段,所以我们加了如User_Staff_View的查询方式。

  负责的工程师首先认为是inner join导致的这个问题,导致出现两条。我马上予以了否认,如果user\staffinfo各只有一条数据,使用inner join不会产生两条查询结果。工程师修改为left join得到的结果也是一样。

  同时,其他的问题不断爆出,出现了问题2,错误原因了也是登陆成功后查询用户信息,因selectOne报出500错误。我在系统中查询同一工号或用户名确实是两条相同的用户信息。于是我问运维同事什么情况下会插入两条相同用户信息。随后在后台数据中我又发现用户记录却只有一条,为什么查询却会出现两条呢?

  问题逐渐聚焦在查询方法上。这个关联查询出现问题可以肯定的是不是用户信息有多条,就是档案信息有多个。但从业务角度讲,用户和档案相对于staffid都是全局唯一的。我查询了档案数据,发现档案果然就是两条——HR在使用OA为新入职员工创建档案使用的是excel导入的追加功能(导入有追加和更新两种,如果选择追加,则不做判断,直接插入新记录),而新上线的功能又会在创建用户时同步创建一个空档案,从而产生两条档案记录,也影响到了用户的查询。

  再回到第一个问题,我们知道,新增用户时在新增用户未完成之前,新增档案动作还没有执行。这时候不仅用户,档案也只是一条未提交事务记录,不可能存在多条。我们进一步确认,发现我们新增用户的那个工号已经在用户表中存在,这个工号曾经被分配给一个放弃入职的新员工,放弃入职后IT并未将其删除,所以在新建用户后,未提交事务中的记录+已存在的记录恰是两条。这个问题的错误导向也直接影响了我们对问题2的分析和判断。

  下面我们看一下inner join\left join\right join三者的区别:三者的定义我们大家都知道,inner join只查出符合条件的记录,left join以左表为基准,right join以右表为基准。我们看看我们这种情况,使用三种join的查询结果,经过测试,都是两条。其实这也是我马上对工程师的判断予以否认的原因。




     本文转自 gaochaojs 51CTO博客,原文链接:http://blog.51cto.com/jncumter/1638134,如需转载请自行联系原作者

相关文章
OA系统档案管理方案及可实施性分析
OA系统以“权限+文档”两大功能板块为基础,帮助组织统一“纸质档案”与“电子档案”,用一套系统高效存储、借阅档案…
|
4天前
|
安全 数据挖掘 BI
一款功能全面且免费的OA办公系统,下载即用
点晴免费OA办公系统是一款完全免费,不限使用时间,不限用户数,功能全面的免费OA办公系统,下载安装即用,使用点晴OA办公系统可以简单快速地建立办公自动化系统。
29 5
|
29天前
|
监控
点晴OA系统为企业的发展注入新的活力
点晴OA办公系统是真正完全免费的协同OA系统软件商,而且是不限使用时间,不限用户数,不限功能模块的免费OA办公系统,为企业全面实现行政办公一体化,深受众多企业的青睐。
27 5
|
1月前
|
安全 搜索推荐 数据安全/隐私保护
点晴免费OA办公系统:高效协同,安全易用
信息技术发展推动企业信息化,即企业利用现代技术提升生产、经营、管理效率,增强竞争力。点晴免费OA系统作为信息化管理的基础,是实现企业信息化的关键手段。
40 2
|
2月前
|
数据安全/隐私保护
点晴OA办公系统让企业变得高效协同
随着企业信息化进程的加快,很多企业开始寻求使用企业管理免费OA办公系统来提高工作效率。然而,有些些企业可能缺乏信息化经验,对技术一无所知,甚至从未接触过OA办公系统。在这种情况下,企业需要寻求功能比较全面的OA办公系统,以满足企业的实际需求。
50 1
|
2月前
|
敏捷开发 数据可视化 数据挖掘
哪些OA任务管理系统值得推荐?4款高效办公工具介绍
在现代企业中,OA(办公自动化)任务管理系统是提升工作效率和团队协作的关键工具。本文介绍了4款备受推崇的OA任务管理系统:板栗看板、Trello、Asana和Monday.com,分别从提高工作效率、增强团队协作、优化资源分配和提升工作质量等方面进行了详细说明,为用户提供全面的参考和选择指南。
|
2月前
|
存储 安全 数据安全/隐私保护
如何明智选择免费OA系统的关键因素
在数字化办公日益普及的今天,选择一款合适的免费OA系统对于企业提升工作效率和管理水平至关重要。不管是办公的便捷方便,还是与其他平台的融合,免费OA系统的选择,需要看这几点,易用性、开放性、稳定性、服务性、实用性、安全性。
26 0
|
3月前
|
搜索推荐 BI 数据处理
点晴OA系统让考勤管理不再头疼
在当今数字化管理趋势下,点晴OA办公系统中的考勤管理作为企业内部管理的重要组成部分,其自动化和智能化水平的提高在提高企业运营效率和员工满意度方面发挥着重要作用。
59 4
|
4月前
|
Java uml
某OA系统需要提供一个假条审批的模块,如果员工请假天数小于3天,主任可以审批该请假条;如果员工请假天数大于等于3天,小于10天,经理可以审批;如果员工请假天数大于等于10天,小于30天,总经理可以审批
该博客文章通过一个OA系统中的请假审批模块示例,使用Java语言实现了职责链模式,展示了如何根据不同的请假天数由不同级别的领导进行审批,并讨论了职责链模式的优缺点。
某OA系统需要提供一个假条审批的模块,如果员工请假天数小于3天,主任可以审批该请假条;如果员工请假天数大于等于3天,小于10天,经理可以审批;如果员工请假天数大于等于10天,小于30天,总经理可以审批
|
3月前
|
数据安全/隐私保护 UED
免费OA办公系统的实力派:点晴OA
点晴OA办公系统是一款面向中小企业的办公自动化解决方案,旨在提高工作效率和优化管理流程。它通过提供多维度的功能模块结构、高度的定制化能力、友好的用户界面以及安全可靠的数据保护机制,满足企业日常办公的多样化需求。以下是关于点晴OA办公系统的详细介绍:
101 0