当前IC卡同步基本都是采用数据库同步方式,除数据库表结构、连接信息外基本遵循相同的逻辑,为减少重复劳动,提升对接效率,研发部完成了IC卡同步标准方案,该方案基于容器实现。
IC卡对接的基本步骤会为:
SQL脚本用于查询同步所需要用户,可使用dbeaver/navicat等工具连接到IC卡数据库并在工具中调试,示例为某学校的oracle数据库同步SQL脚本:
SELECT OUTID AS SN,convert(NAME, 'AL32UTF8') as NAME,to_number(SCARDSNR,'xxxxxxxxxx') AS CARD, CUSTDEPT AS dpmno, convert(DPFULLNAME, 'AL32UTF8') AS dpmname, CASE STATUS WHEN 1 THEN 0 ELSE 1 END STATUS FROM M_BASE_CUSTOMERSCARD WHERE STATUS=1 AND CUSTDEPT LIKE '001001%'
通过SQL脚本可以读取到用户的工号、姓名、IC卡号、部门编号、部门名称、卡状态,得到的数据需要满足一些强制要求:
同步使用iDsteSync用户,该用户仅需要操作BaseInfo和Users表。使用root连接数据库运行如下命令创建新用户并授权:
在nccs数据库中执行如下命令用于修改、创建表和数据:
R07.04以上的服务器版本还需要执行以下sql语句给iDsteSync用户OAuthAppInfo表的查询权限:
BaseInfo表中的302-307的Descrption配置了连接IC卡数据库所需基本信息,定义如下:
BaseInfo.301.Description配置IC卡同步时间点,24小时制,整点同步,多个同步时间以逗号分隔,示例
BaseInfo.298.Descrption为数据库环境变量,,不填时使用NLS_LANG=AMERICAN_AMERICA.UTF8,如果默认配置不能得到正常编码,还可以尝试NLS_LANG=AMERICAN_AMERICA.ZHS16GBK;此配置在对接ORACLE数据库时非常重要,否则会导致导入的用户姓名乱码。
BaseInfo.3001.Description未配置或配置为1时表示默认授权所有设备的使用权限,为0表示默认不授权。
BaseInfo表中ID为[10100,10199]的Description配置项保留为SQL脚本配置,每一行为一个SQL语句,最多1024字节
docker软件安装参考DOCKER容器安装,镜像存储在ccr.ccs.tencentyun.com/idste-cus/idste.ic.sync.r6.8:latest,使用方法:
* docker login --username 100008766382 ccr.ccs.tencentyun.com # 密码为iDste1057Hello(该账户如有变更,请联系公司腾讯云管理人员处理) * docker pull ccr.ccs.tencentyun.com/idste-cus/idste.ic.sync.r6.8 * docker run -itd --name idste.ic.sync --net=host --restart=always ccr.ccs.tencentyun.com/idste-cus/idste.ic.sync.r6.8 # 运行容器,--restart=always表示容器退出后自动重启, --net=host使用主机网络 * docker logout ccr.ccs.tencentyun.com # 退出镜像服务器
容器运行后可使用docker logs -f idste.ic.sync,在容器运行60秒开始同步并能在屏幕上看到一些信息,如果看到报错,请检查数据库连接、sql脚本等。
容器运行时会向容器中的/var/log/workerman/icsync.log写入日志,查看方法:
* docker exec -it idste.ic.sync /bin/bash * cat /var/log/workerman/icsync.log * exit 退出容器
正常情况应该能看到同步失败的用户卡号和同步成功的用户数等日志信息。
2019-09-06 增加同步日志,同步成功后添加系统日志,内容形如“IC卡同步成功,同步[xxx]条”。如果R6.2及以下版本需要有如下更改:
1. vi /home/www/api/common/messages/zh-CN/message.php
return [ ......之后添加以下内容....... 'type/server' => "服务器", 'title/server/ic-sync' => "IC卡同步成功,同步「{title1}」条", 'title/server/timetable-sync' => "课表同步成功,同步「{title1}」条", ];
2. vi /home/www/api/api/controllers/BaseController.php
public $logActions = [ ......之后添加以下内容....... 'server' => ['ic_sync', 'timetable_sync'] ];