外部系统接口稽核经验谈

新业务流程系统上线接入到集团云门户系统。按设计要求通过了单点登录和待办/待阅任务推送功能。

但是,在接口稽核时,云门户运维人员天天反馈稽核问题,虽然这些不影响单点登录和待办任务处理功能,但是涉及到用户维护考核,开发人员一直未找到原因,很是闹心!

我翻出云门户接口及稽核开发接口规范,经过多次实验及解读,终于理解了!

这里写图片描述

如上图中的文字“则必须填写调用云门户服务的字段,才能保证能够对数据进行稽核”。

稽核出现问题的关键是稽核日志视图中的每个字段要与推送到云门户上的每个字段内容保持一致

下图为新业务流程系统推送待办到云门户的日志截图:

这里写图片描述

下面列举出开发人员的代码与我的修改对照,分析其中的“坑”。

  • 原开发人员的设计:
-- 待办稽核原视图

create or replace view bop_pdt.vw_pengding_task as
select t.task_instance_id as pendingcode,
       t.bo_title as pendingtitle,
       to_char(t.create_datetime, 'yyyyMMddHHmmss') as pendingDate,
       t.task_receiver_id as pendingUserID,
       t.task_receiver as pendingUser,
       'unicom/workflow/workflow_wrapper.htm?bizInfoInstanceID='||t.biz_instanceid||'&'||'taskID='||t.task_instance_id as pendingurl,
       t.status as pendingstatus,
       '0' as pendingLevel,
       'hl' as pendingCityCode,
       t.task_sender_id as pendingsourceuserid,
       t.task_sender as pendingsource,
       'a' as operatorType,
       sysdate as createTime,
       'hl006' as pendingNote
       from pnd_task t;
  • 修改完善的代码
-- 修改完善的视图
create or replace view bop_pdt.vw_pengding_task as
select t.task_instance_id as pendingcode,
       t.bo_title as pendingtitle,
       to_char(t.create_datetime + interval '8' hour ,'yyyymmddHH24MIss') as pendingDate,
       t.task_receiver_id as pendingUserID,
       t.task_receiver as pendingUser,
       'http://10.64.50.143/unicom/system/unicom/home/sso_ucloud.htm?userId='||t.task_receiver_id||'&'||'bizInstId='||t.biz_instanceid||'&'||'taskId='||t.task_instance_id||
'&'||'isTask=1'||'&'||'isComplete=0'||'&'||'isProcess=1'||'&'||'orgId='||
substr(t.tenant_dn,3,instr(t.tenant_dn,',')-3) as pendingurl,
       t.status as pendingstatus,
       '0' as pendingLevel,
       'hl' as pendingCityCode,
       t.task_sender_id as pendingsourceuserid,
       t.task_sender as pendingsource,
       'a' as operatorType,
       'hl006' as pendingNote,
       t.create_datetime +  interval '8' hour  as createTime
       from pnd_task t;

上述代码差异说明:

  • pendingurl:此字段的URL拼接出现问题了;
  • pendingDate:时间表述中的多个问题。

1. 对接口规范理解的想当然,唯技术本位思考

由于pendingurl字段是专业系统自用的参数,而且在本系统中是没有实际使用意义的数据,开发人员从本位思考,想当然认为传个参数就行了。

对于稽核的理解,开发人员也从本位的技术思考理解,认为稽核要稽核关键接口数据,例如ID、用户账号等内容,其他数据无所谓。

2. 对时区及时间处理的易忽视的情况

由于使用的系统平台Cordys产品是国外产品,时间是标准时间,与北京时间差8个时区,也就是少8个小时。

Oracle时间转换字符时,分钟与月份的混淆,如上述原代码想用mm表述分钟,但是SQL中不区分大小写,MM和mm被认为是相同的格式代码,被转换成月份。

所以,正确的表达是要不足8个小时,并正确的转换出分钟字符串,如下所示:

to_char(t.create_datetime + interval '8' hour ,'yyyymmddHH24MIss')

3. 类型转换成字符出现的小数位问题

下面对照待阅稽核视图的差异,上述1、2条已经说过,再请看本段的重点所说数据类型转换所易出现的问题。

  • 原开发人员的设计:
--原待阅稽核视图
create or replace view bop_pdt.vw_pengding_reading as
select t.pnd_reading_id as readingCode,
       t.bo_title as readingTitle,
       to_char(t.create_datetime, 'yyyyMMddHHmmss') as readingDate,
       t.task_receiver_id as readingUserID,
       t.task_receiver as readingUser,
       'unicom/workflow/workflow_wrapper_reading.htm?bizInfoInstanceID='||t.biz_instanceid||'&'||'pndReadingID='||t.pnd_reading_id as readingURL,
       t.status as readingStatus,
       t.task_sender_id as readingSourceUserID,
       t.task_sender as readingSource,
       'hl' as readingCityCode,
       'a' as operatorType,
       sysdate as createTime,
       'hl006' as readingNote
       from pnd_reading t;
  • 修改完善的代码
--更正后的视图
create or replace view bop_pdt.vw_pengding_reading as
select t.pnd_reading_id as readingCode,
       t.bo_title as readingTitle,
       to_char(t.create_datetime + interval '8' hour ,'yyyymmddHH24MIss') as readingDate,
       t.task_receiver_id as readingUserID,
       t.task_receiver as readingUser,
      'http://10.64.50.143/unicom/system/unicom/home/sso_ucloud.htm?userId='||
       t.task_receiver_id||'&'||
'bizInstId='||t.biz_instanceid||'&'||'taskId='||t.pnd_reading_id||
'&'||'isTask=0'||'&'||'isComplete=0'||'&'||'isProcess='||t.type||'.0'||
'&'||'orgId='||substr(t.tenant_dn,3,instr(t.tenant_dn,',')-3) as readingURL,
       t.status as readingStatus,
       t.task_sender_id as readingSourceUserID,
       t.task_sender as readingSource,
       'hl' as readingCityCode,
       'a' as operatorType,
       'hl006' as readingNote,
       t.create_datetime  +  interval '8' hour as createTime
       from pnd_reading t;

上述代码差异说明:

  • type,原数据库中此类型为int,在类型转换为字符串时,Cordys系统将其“1”转换为“1.0”,而SQL语句直接为“1”,所以,需要补足差异而增加代码“’.0’”

但愿本次完善是找到结症,后续再请开发人员把推送内容原封不动的记录到数据库中,避免这种拼接SQL语句的、非正规的方法。

另外,也整理了几条其他需要注意事项:

  • 集群环境中,注意每台主机配置的准确并且对外连接一致,而且要逐台设备测试,例如解析域名的配置;
  • 系统参数配置要每台设备要一致,例如服务器地址、云门户接口设置;
  • 客户端兼容性检测与验证,例如IE浏览器的兼容性。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肖永威

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值