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

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

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

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,一经查实,立即删除!

相关文章

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…

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;就立马去官网查找相关的信息&…

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

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

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

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

win10 java无法运行_Win10中配置jdk之后javac无法运行

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数&#xff0c;如&#xff1a;临时文件夹位置和系统文件夹位置等。环境变量是在操作系统中一个具有特定名字的对象&#xff0c;它包含了一个或者多个应用程序所将使用到的信息。例如Windo…

java的reentrantlock_JAVA中ReentrantLock详解(转)

转自https://www.cnblogs.com/java-learner/p/9651675.html前言&#xff1a;本文解决的问题RentrantLock与Synchronized区别ReentrantLock特征ReentrantLock类的方法介绍1.什么是ReentrantLock1.1ReentrantLock 与Synchronized区别在面试中询问ReentrantLock与Synchronized区别…

Servlet添加商品

Servlet实现添加商品 <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd&…

java运行win10_win10配置java运行环境

1.下载jdk根据自己的电脑下载对应的版本&#xff0c;需要先注册账号才可以下载百度网盘&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1gjpdQo8t8Va8uPiHDDvB3Q提取码&#xff1a;5a0c2.下载完成&#xff0c;点击安装&#xff0c;一般直接根据默认安装即可&#xff0c;…

java8 stringbuilder_为什么 Java 8 中不需要 StringBuilder 拼接字符串

在Java开发者中&#xff0c;字符串的拼接占用资源高往往是热议的话题.让我们深入讨论一下为什么会占用高资源。在Java中&#xff0c;字符串对象是不可变的&#xff0c;意思是它一旦创建&#xff0c;你就无法再改变它。所以在我们拼接字符串的时候&#xff0c;创建了一个新的字符…

c mysql dll_C:\Windows\libmysql_e.dll

这是C:\Windows\libmysql_e.dll下载&#xff0c;一款很重要的dll文件组件哦&#xff0c;如果你的电脑libmysql e.dll错误或者确实会导致很程序和软件都不能正常运行的哦&#xff0c;有需要的就来下载吧&#xff01;软件介绍C:\Windows\libmysql_e.dll是需要安装php和MySQL的工具…

java datetime 转换_如何实现Java日期时间格式转换

Java日期时间以及日期相互转换Java日期时间&#xff0c;以及相互转化&#xff0c;供大家参考&#xff0c;具体内容如下package com.study.string;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import …

《机器学习》周志华 习题答案9.4

原题采用Kmeans方法对西瓜数据集进行聚类。我花了一些时间居然没找到西瓜数据集4.0在哪里&#xff0c;于是直接采用sklearn给的例子来分析一遍&#xff0c;更能说明Kmeans的效果。 #!/usr/bin/python # -*- coding:utf-8 -*- import numpy as np import matplotlib.pyplot as p…

一个电商项目的功能模块梳理

电商项目核心玩法&#xff1a;定制商品供应链&#xff08;商品辅料库&#xff09;网红社区最近做项目&#xff0c;功能越来越多&#xff0c;想清晰地理解项目&#xff0c;有点累了。今天抽空&#xff0c;把这个项目的核心功能模块简要总结下&#xff0c;顺便画了个图。一、全局…

java forkjoin 简书_浅谈Java的Fork/Join并发框架

1. Fork/Join是什么Oracle的官方给出的定义是&#xff1a;Fork/Join框架是一个实现了ExecutorService接口的多线程处理器。它可以把一个大的任务划分为若干个小的任务并发执行&#xff0c;充分利用可用的资源&#xff0c;进而提高应用的执行效率。Fork/Join实现了ExecutorServi…

pycharm新建python file没有默认头_Pycharm 设置默认头的图文教程

Pycharm 设置默认头的图文教程1. 设置的路径是File->settings->Editor->File and Code Templates->Python Script内容见图&#xff1a;这样新建文件的时候就会默认头如下&#xff1a;这里说明下#!/usr/bin/evn python 和 #!/usr/bin/python的区别&#xff1a;第一种…

python不支持的数据类型有achar bint cfloat dlist_第1篇:Cython的数据类型(第二部分)

Cython的C指针与C一样&#xff0c;尽管指针性与变量而不是类型相关联&#xff0c;但可以在类型或变量附近声*号。%%cythoncdef int *acdef int *b但这样在变量a,b写在一行,cython编译器会发出警告的信息,因此建议每个变量单独声明%%cythoncdef int *a,*bCython中的指针的解引操…

【micropython】用python来进行BadUSB的USB-HID测试(含无线控制)

转载请注明&#xff1a;小五义http://www.cnblogs.com/xiaowuyi QQ群&#xff1a;64770604 本文以TPYBoardv101开发板为例讲解了利用micropython进行BadUSB的usb-HID设备测试的主要方法&#xff0c;使用mt7681模块进行了一个简单的实验&#xff0c;实现了手机摇控键盘输入的测…

php返回类中方法,php如何获取类中所有的方法名

php获取类中所有的方法名的方法&#xff1a;可以利用【get_class_methods()】函数来获取&#xff0c;【get_class_methods()】函数可以返回指定类中所有的方法名&#xff0c;并且会将方法名保存到数组中。【相关学习推荐&#xff1a;php编程(视频)】php获取类所有方法名的方法&…