公司消费一卡通“变法”记

一卡通在每家公司都存在,不仅含考勤机,还会有门禁,订餐,食堂消费等。我们公司采用的是厦门舒特科技的一卡通系统,前后用了好几年了。

在我之前,一卡通的功能主要启用了考勤和消费这两大模块。

1、考勤机是每个子公司都有相应设备,员工每天上下班刷卡,然后每个区域子公司的人事部考勤同事开始每周排队,一人分一天下载考勤数据。如果所有人一起下载考勤数据的话,就会因为数据量巨大而导致网络堵塞,说到底是公司的小型VPN太差。

2、消费数据是由IT维护人员负责,每个月不定时IT维护人员会去下载所有区域的消费机的脱机数据,在月初的时候在一卡通系统里导出所有公司所有员工的消费数据,差不多会有十几万笔,再在Excel里做成汇总表,然后把这些数据发到公司一卡通的QQ群里供人事部同事下载人工导入HR系统。而月初的“补贴”也是由IT维护人员必做的不能忘记的一项工作。

然后,就以上这么点工作,敢接的,能接的人不多,坑实在是太多了,能说道的事情也太多了。

我认为公司一卡通系统有几个缺陷:

1、考勤数据都要由人事部轮流时间去人工下载再导入,而且经常因为账号卡死在里面而发生其他人没办法进去的情况。没办法实现自动下载和自动导入,增加了人工成本,IT 在其中的价值基本的不到体现;这其中主要的原因还是因为一卡通设备的问题。

2、消费机的数据整理全部都是IT来做,从管理上和安全要求来说,IT是不应该去直接接触数据的。耗费太多的时间和精力去整理这些数据,做着毫无价值和意义的事情。

自从今年3月份开始接手以来到现在,我逐渐摸通了一卡通系统的很多门道。既然之前信息化部门的头头造了这么多孽,我自然不能没有规划,一直想方设法把IT做的事情分到人事部门去做。

但这过程中我需要解决是写一个程序,让人事部可以自己自由查询消费数据,能够在程序上导出来汇总表。然后我再写一个可以自动发“补贴”的定时作业。

一、查询程序

因为对后台程序的数据库结构了解不多,但我还是懂得了消费表是哪张表,以及其他相关人员,设备等表。

于是我把查询消费表的功能写成了一个存储过程,通过传入时间和区域参数来查询消费记录。

还有汇总表的计算,因为要很长时间,所以我把计算功能做成一个存储过程,并用一张表存储计算结果:

然后,通过C#快速开发出一个查询程序出来,功能相对简单,但通过在Sql Server上做一个版本控制的存储过程,一旦我有修改程序,我就更新新的版本,之前的版本就自动失效,避免出现旧程序被使用的情况:

程序界面简单,如下:

二、设定自动排程计算每月消费汇总表

由于做成了存储过程,所以用排程去执行它就可以了!

三、自动发放补贴

PS:说到“补贴”,我就想笑。其实只是员工工资预支600元而已。

但做到自动发放补贴这里就比较艰难了。

因为发放补贴是要排除掉离职和非公司的人员,而且一卡通系统并不是执行标准的存储过程,而是把sql语句写到程序中了,所以根本不知道它是怎么执行的哪些表。

虽然我知道更新哪张表哪个字段可以实现发放补贴,但这样会有风险,因为我并不知道其中更多的逻辑。

打电话给舒特科技公司,告之说这个数据库规格书是要钱的!(顿时心中一万匹草泥马奔腾过)

后打算用Sql Server Profiler连接后台数据库,哪知道提示说:

我不知道公司信息管理部领导当初购买一卡通系统的时候到底是想的什么,居然还在用这么原始的系统存在!!后台数据库用的是sql server 2000,实在无力吐槽了!

于是我只好安装Sql Server 2008的Profiler工具,成功连接上系统,在里面做跟踪,经过大量的分析,总算知道了“发放补贴”这一逻辑:

里面使用大量的临时表,诸如这类语句:

IF OBJECT_ID('tempdb..#Subsidy') IS NULL

 BEGIN

  SELECT A.Person_ID,Person_No,Person_Name,Card_No,Dept_No, Dept_Name,Subsidy_Fund,Subsidy_Fund[PriTime_Fund], Subsidy_Fund[Use_Fund],Subsidy_Fund[Fact_Fund],Person_Name[Type_Name],   Birthday[Subsidy_Date],Person_No[Type_No],0[Data_Type],A.Person_ID[ID_KEY],Cast(0 as bit)[Is_OnlySubsidy]

  INTO #Subsidy

  FROM ST_Person A

  LEFT JOIN ST_Department C ON C.Dept_ID=A.Dept_ID

  LEFT JOIN ST_Card B ON B.Person_ID=A.Person_ID

  WHERE 1<>1

END

ELSE

  TRUNCATE TABLE #Subsidy

于是有了这些逻辑,接下来发放补贴的存储过程就好办多了:

此存储过程没有任何的参数传入,也自动过滤掉了不能发放补贴的所有部门!

设定排程工作,限定在每个月的1号凌晨跑,从此一劳永逸解决了我手工发放补贴的艰难动作!

一卡通的事情耗费了我不少的时间。主要是没有任何的数据库规格书,而且对很多的技术根本没法掌握得到。由此可以想到如果系统在立项和实施的时候,IT部门如果不介入或者专业度不够,很多文档如果没有提供,那未来要维护起来是多么的可怕,就是专门给后人挖坑和造虐的!想想现在的加密系统,不就是一个大坑吗?!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT 指南者专栏

讲讲本人本专业找工作的那些事儿

微信公众号:compassblog 欢迎关注、转发,互相学习,共同进步! 有任何问题,请后台留言联系! 没什么压迫感的日子,起床总是很晚,非常晚,睡得更晚!什么...

34812
来自专栏纯洁的微笑

提问的智慧

965
来自专栏申龙斌的程序人生

学会10多种语言是种什么样的体验?

80年代末,我第一次接触了Apple II电脑上的BASIC编程语言,从此走上了一条程序人生。十多年前我在博客园上开通了自己的博客,由于下象棋时经常出点“毒”招...

2966
来自专栏安恒信息

Black Hat 2017 | Day2看点:终端安全产品强势回归,勒索病毒惹的祸?

白帽子I黑帽子I乐趣 Black Hat总会给我们带来不一样的惊喜 ? BLACK HAT 不知不觉中,两天的主题演讲就这么结束了。安恒信息特派到Black...

2494
来自专栏何俊林

基于 MVP + Glide + Retrofit + RxJava2.0 + butterknife 的C9MJ TV App

导读:今天推荐一个还不错的项目,是确实还不错。喜欢可以给作者一个star. C9MJ 个人练手项目(新闻 + 视频直播): 基于 MVP + Glide + R...

1879
来自专栏编程一生

Redis各种数据结构性能数据对比和性能优化实践

1032
来自专栏程序员互动联盟

如何用一句话证明你是一个真正的程序员?

作为一个写了十几年代码的老程序员,其实编码生活简单而枯燥,每天做多少事情都可以掰着手指头说出来,特别是在一线城市的程序员更加的简单,早上急急忙忙挤上地铁,在地铁...

1022
来自专栏互联网开发者交流社区

JAVA学习之路:不走弯路,就是捷径

944
来自专栏漏斗社区

专属| 加密货币挖矿攻击急剧上升

据外媒报道,来自Check Point研究团队的《2018年9月全球威胁指数》数据显示,针对iOS设备以及使用Safari浏览器设备的加密挖矿恶意软件数量出现了...

882
来自专栏飞总聊IT

沟通学TCP握手,等于谋财害命

TCP之所以有这个三次握手协议有很多历史原因。但是最主要的我认为是网络基础架构不稳定。因为不稳定,所以我们需要多次向对方表示或者等待对方反复确认“我爱你”...

802

扫码关注云+社区