当前课表同步基本都是采用数据库同步方式,除数据库表结构、连接信息外基本遵循相同的逻辑,为减少重复劳动,提升对接效率,研发部完成了课表同步标准方案,该方案基于容器实现。
课表对接的基本步骤为:
BaseInfo表中ID为10211-10299的Description字段都用来存放SQL语句。 SQL语句用于查询同步所需要课程,可使用dbeaver/navicat等工具连接到第三方课表数据库并在工具中调试,示例为某学校的SqlServer数据库同步SQL语句:
SELECT JSGH AS USERSN, JXDD AS CLASSROOM, QSZ AS WEEKSTART, ZZZ AS WEEKEND, KSJC AS SECTIONSTART, JSJC AS SECTIONEND, ZLX AS WEEKTYPE, XQ AS ZONE, WEEKDAY AS WEEKDAY FROM PKB;
如果要删选学期或者星期几,按照以下格式填写同步语句:
SELECT JSGH AS USERSN, JXDD AS CLASSROOM, QSZ AS WEEKSTART, ZZZ AS WEEKEND, KSJC AS SECTIONSTART, JSJC AS SECTIONEND, ZLX AS WEEKTYPE, XQ AS ZONE, WEEKDAY AS WEEKDAY FROM PKB where WEEKDAY = { {weekday} } and TERM = '{ {termName} }';
通过SQL脚本可以读取到课程的教师工号、教室名称,开始周,结束周,开始节次、结束节次、周几,校区,单双周类型得到的数据需要满足一些强制要求:
该信息存放在nccs.BaseInfo表中ID号为570的Description字段:如下所示为某学校的BaseInfo配置示例:
insert into BaseInfo values(570, 'type=sqsrv;host=192.168.3.153;user=deshi;password=123456;db=publicdata', null);
其中type可选为oracle/service表示基于oracle的service name连接;oracle/sid表示基于oracle的sid连接;sqlsrv为mssql service数据库; mysql为mysql数据库
同步使用iDsteSync用户,该用户仅需要操作BaseInfo和Users表。使用root连接数据库运行如下命令创建新用户并授权:
在nccs数据库中执行如下命令用于修改、创建表和数据:
R07.04以上的服务器版本还需要执行以下sql语句给iDsteSync用户OAuthAppInfo表的查询权限:
BaseInfo.571.Description配置课表同步时间点,24小时制,整点同步,多个同步时间以逗号分隔。 示例:BaseInfo.571.Description=6,8,10,12 表示每天6、8、10、12点各同步一次共同步4次。
BaseInfo.573.Description配置课表中周次的格式。
例如:有个学校的上课周次(SKZC)为:'1,2,4,8-20',那么需要在BaseInfo.573字段填写‘comma’,课表同步sql编写如下: SELECT JSGH AS USERSN, JXDD AS CLASSROOM, SKZC AS WEEK, KSJC AS SECTIONSTART, JSJC AS SECTIONEND, ZLX AS WEEKTYPE, XQ AS ZONE, WEEKDAY AS WEEKDAY FROM PKB where WEEKDAY = { {weekday} } and TERM = '{ {termName} }';
BaseInfo.298.Descrption为数据库环境变量,,不填时使用NLS_LANG=AMERICAN_AMERICA.UTF8,如果默认配置不能得到正常编码,还可以尝试NLS_LANG=AMERICAN_AMERICA.ZHS16GBK;此配置在对接ORACLE数据库时非常重要,否则会导致导入的用户姓名乱码。
docker软件安装参考DOCKER容器安装,镜像存储在ccr.ccs.tencentyun.com/idste-cus/idste.timetable.sync.r6.8:latest,使用方法:
* docker login --username 100008766382 ccr.ccs.tencentyun.com # 密码为iDste1057Hello(该账户如有变更,请联系公司腾讯云管理人员处理) * 安装release版本 docker pull ccr.ccs.tencentyun.com/idste-cus/idste.timetable.sync.r6.8 * 安装指定版本容器(例:安装v0.6版本的容器) docker pull ccr.ccs.tencentyun.com/idste-cus/idste.timetable.sync:v0.6 * 运行适配6.8服务器版本的容器 docker run -itd --name idste.timetable.sync --net=host --restart=always ccr.ccs.tencentyun.com/idste-cus/idste.timetable.sync.r6.8 # 运行容器,--restart=always表示容器退出后自动重启, --net=host使用主机网络 * 运行指定版本 docker run -itd --name idste.timetable.sync --net=host --restart=always ccr.ccs.tencentyun.com/idste-cus/idste.timetable.sync:v0.6 # 运行容器,--restart=always表示容器退出后自动重启, --net=host使用主机网络 * docker logout ccr.ccs.tencentyun.com # 退出镜像服务器
容器运行后可使用docker logs -f idste.timetable.sync,在容器运行60秒开始同步并能在屏幕上看到一些信息,如果看到报错,请检查数据库连接、sql脚本等。
容器运行时会向容器中的/var/log/workerman/timetablesync.log写入日志,查看方法:
* docker exec -it idste.timetable.sync /bin/bash * cat /var/log/workerman/timetablesync.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'] ];