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

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

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

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部门如果不介入或者专业度不够,很多文档如果没有提供,那未来要维护起来是多么的可怕,就是专门给后人挖坑和造虐的!想想现在的加密系统,不就是一个大坑吗?!

转载于:https://www.cnblogs.com/saper/p/5625289.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql添加分区健_MySQL添加分区添加索引

添加新用户 今天在为mysql添加新用户时&#xff0c;找到下面这条指令&#xff1a; insert into mysql.user(Host,User,Password) values("localhost","test",password("1234")); 然后退出 mysql>\q 重新登录 $mysql -u …

win7 mysql添加到服务_MySQL服务添加到Windows系统服务中

MySQL的安装配置(win7 64-bit)转&#xff0c;整理。MySQL 版本是mysql-noinstall-5.1.66-winx64.zip(免安装版)mysql-workbench-gpl-5.2.44-win32.msimysql-connector-java-5.1.22mysql 配置数据库编码为utf-8(my.ini中指定).1 安装先将mysql-noinstall-5.1.66-winx64.zip解压缩…

OA,ERP等源码一部分演示

更多源码http://www.pssdss.com QQ:11851298 功能强大的JAVA开发的ERP源码http://cx050027.pssdss.com:8080/ 用户名pssdss 密码pssdss 超强大仿微盟JAVA开发微信公众平台源码JAVA源码,有代理功能http://www.pssdss.com/d329.html 大型汽车4S综合连锁服务管理系统源码 汽车美…

eslint不报错 vue_2-2【微信小程序全栈开发课程】index页面搭建--ESlint格式错误

1、修改入口文件也就是src/pages/index/main.js文件main.js是入口文件&#xff0c;通过main.js来加载index.vue文件。每个页面文件夹中都要有main.js文件//加载vue组件和index.vue文件 import Vue from vue import App from ./index//新建一个index页面的Vue实例 const app ne…

动态代理-实例解析

转自http://weixiaolu.iteye.com/blog/1477774 动态代理实例如下所示&#xff1a; package cn.xiaolu;import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;/*** 动态代理类使用到了一个接口InvocationHandler和一个…

linux下安装libsvm_在ubuntu下的Matlab中使用libsvm

事情的起因当然是因为一个错误&#xff0c;我平时一直在windows下用libsvm&#xff0c;当把程序放到安装了Ubuntu的服务器上就报错了&#xff0c;错误如下&#xff1a;Error using svmtrain (line 233)Y must be a vector or a character array.这个错误出现在matlab自带svmtra…

需求分析、概要设计

最近和一个朋友聊天&#xff0c; 发现还是需要一些理论功底&#xff0c;没事到网上找点资料看看吧 按照传统软件工程的软件过程,区别如下:1.需求分析--产生 软件功能规格说明书,需要确定用户对软件的需求,要作到明确、无歧义。不涉及具体实现方法。用户能看得明白&#xff0c;开…

mysql 事b务 查询_MySQL进阶学习笔记二(包括连接查询、子查询、联合查询、事务、存储过程)...

1、高级查询(1)了解笛卡尔积&#xff1a;笛卡尔乘积是指在数学中&#xff0c;两个集合X和Y的笛卡尔积(Cartesian product)&#xff0c;又称直积&#xff0c;表示为X Y&#xff0c;第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员&#xff0c;笛卡尔积在SQL…

当前,我们的DJANGO项目的requirements.txt文件

晒一晒&#xff0c;看用得多不多。。&#xff1a;&#xff09; amqp1.4.7 anyjson0.3.3 billiard3.3.0.21 celery3.1.19 celery-with-redis3.0 cx-Oracle5.1.2 Django1.8.4 django-bootstrap36.2.2 django-celery3.1.17 django-grappelli2.7.3 django-tinymce2.2.0 djangorestf…

python字典的应用实验报告_Python字典应用的一个例子

#!/usr/bin/env python#定义一个空字典db {}def newuser():prompt --login desired: while True:name raw_input(prompt)#根据关键字name看字典中是否已存在此键值对if db.has_key(name):prompt --name taken, try another: continueelse:breakpwd raw_input(passwd: )#存…

Untiy3D Material 材质系统

材质系统在任何引擎里面都算一个大模块&#xff0c;我也遍了解遍写&#xff0c;写到哪里算哪里。 里面涉及到材质属性系统&#xff0c;底层Shader模块和纹理Texture模块。所以比较复杂&#xff0c;如果理解材质系统&#xff0c;那就能控制整个游戏画面渲染效果。 Material 材质…

python弹出另一个窗口_Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法

1.先使用Qt designer设计两个窗口&#xff0c;一个是主窗口&#xff0c;一个是子窗口其中主窗口是新建-Main Window,子窗口是Dialog窗体。两个窗口不能是同一类型,否则会崩溃。并保存为EyeTracking_main.ui和EyeTracking_process.ui(因为我在做眼动追踪&#xff0c;因此窗体命名…

python读取文件数据堆栈溢出的原因_堆栈溢出一般是什么原因?

堆栈是一个在计算机科学中经常使用的抽象数据类型。堆栈中的物体具有一个特性&#xff1a; 最后一个放入堆栈中的物体总是被最先拿出来&#xff0c; 这个特性通常称为后进先出(LIFO)队列。 堆栈中定义了一些操作。 两个最重要的是PUSH和POP。 PUSH操作在堆栈的顶部加入一 个元素…

.NET Core 开发之旅 (1. .NET Core R2安装教程及Hello示例)

前言 前几天.NET Core发布了.NET Core 1.0.1 R2 预览版&#xff0c;之前想着有时间尝试下.NET Core。由于各种原因&#xff0c;就没有初试。刚好&#xff0c;前几天看到.NET Core发布新版本了&#xff0c;决定要去一探究竟。于是乎&#xff0c;就立马去官网查找相关的信息&…

java引用传递_理解Java中的引用传递和值传递

关于Java传参时是引用传递还是值传递&#xff0c;是一个讨论比较多的话题&#xff0c;有说Java中只有值传递&#xff0c;也有些地方说引用传递和值传递都存在&#xff0c;本篇记录思考过程&#xff0c;不保证正确性&#xff0c;感兴趣的同学一起讨论。1.基本类型和引用类型在内…

程雷被机器人_太意外了:49岁知名主持人程雷,得遗传性病和女友终分手!

注本文部分文字与图片资源来自于网络&#xff0c;转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益&#xff0c;请立即通知我们&#xff0c;情况属实&#xff0c;我们会第一时间予以删除&#xff0c;并同时向您表示歉意遗传性肝病发女友不离不弃&#x…

java flatmap_Java 8 Steam API map和flatMap方法使用详解

java 8 stream api 中有两个方法map和flatMap非常实用&#xff0c;应用场景也非常广泛&#xff0c;能极大提升编程效率。下面我们详细介绍一下这两个方法的用法。map方法我们来看个示例&#xff1a;把一个整数列表转换成字符串列表&#xff0c;java 8之前常用的实现方法如下Lis…

java post 多文件报头_Spring MVC-------文件上传,单文件,多文件,文件下载

Spring MVC框架的文件上传是基于 commons-fileupload 组件的文件上传&#xff0c;只不过SpringMVC 框架在原有文件上传组件上做了进一步封装&#xff0c;简化了文件上传的代码实现&#xff0c;取消了不同上传组件上的编程差异。commons-fileupload组件由于 Spring MVC 框架的文…

java 按照概率生成随机数_JAVA 根据设置的概率生成随机数的方法

import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Random;public class RandomTest {// String 可以为任意类型 也可以自定义类型static Map keyChanceMap new HashMap();static {keyChanceMap.put("a…

java文本域 图片_java swing中给面板或者文本域设置背景图片的方法!

以JPanel为例public class MyTextArea extends JPanel{/*** param args*/private Image bgImg null;public MyTextArea(){setOpaque(false);bgImg Toolkit.getDefaultToolkit().createImage(BGTextArea.class.getResource( "login2.gif ")); //图片要…