北京市政与浪潮数据同步
待办事项
项目记录
事前工作
- 创建子集监控表
-- 创建子集监控表
create table t_subset_monitor
(
employee_id varchar(18),
A0100 varchar(10),
SUBSET varchar(10)
)
ALTER TABLE t_subset_monitor ALTER COLUMN employee_id varchar(18) NOT NULL ;
ALTER TABLE t_subset_monitor ALTER COLUMN A0100 varchar(10) NOT NULL ;
ALTER TABLE t_subset_monitor ALTER COLUMN SUBSET varchar(10) NOT NULL ;
ALTER TABLE t_subset_monitor add nbase varchar(18) NOT NULL ;
alter table t_subset_monitor add primary key(a0100,subset,nbase);
-
添加jar包
路径 ~\webapps\ehr\WEB-INF\classes\ext_sync2langc_job.jar
动态创建触发器后台作业
? 该后台作业配置完成后只需要执行一次即可!!!,
也可以选择不掉用后台作业,手工创建触发器,sql参照下面sql脚本
数据库脚本
-- 创建子集表触发器的脚本,看实施需求是否需要创建
insert into t_sys_jobs (job_id,description,jobclass)
values ((select MAX(job_id)+1 as maxid from t_sys_jobs) ,'创建与浪潮子集同步触发器后台作业','com.hjsj.hrms.businessobject.sys.job.ExtLangcCreateTriggerJob');
-- 该段sql由创建触发器的后台作业调用,无须手工创建,只需要配好对应的二开参数即可
-- 触发器存在就删除
if exists(select *
from dbo.sysobjects
where id = object_id(n'[dbo].[trigger_usra04]')
and objectproperty(id, n'istrigger') = 1)
drop trigger [dbo].[trigger_usra04]
go
-- 创建触发器脚本
create trigger trigger_usra04
on [dbo].[usra04]
after update, delete, insert
as
begin
declare
@a0100 varchar(10),
@employee_id varchar(18)
declare cur cursor local --声明deleted临时表的游标
for
select a0100 from deleted union select a0100 from inserted
open cur --打开游标
fetch next from cur into @a0100 --取数据
while (@@fetch_status = 0) --判断是否还有数据
begin
if ((select count(*) from t_subset_monitor where a0100 = @a0100 and subset = 'a04' and @a0100 != null) <
1)
begin
select @employee_id = (select a0177
from reta01
where a0100 = @a0100
union
select a0177
from reta01
where a0100 = @a0100)
insert into t_subset_monitor values (@employee_id, @a0100, 'a04');
end
fetch next from cur into @a0100 --这里一定要写取下一条数据
end
close cur
deallocate cur
end
二开参数
参数名称 | 参数值 | 参数描述 |
---|---|---|
sync2langc_dbname | USR | 与浪潮人员数据同步涉及人员库(创建子集触发器的后台作业也能用到)?该参数必须创建,本次同步范围为在职人员库 |
sync2langc_subset | A04,A10 | 与浪潮子集数据同步需要创建触发器的子集(创建触发器的时候用到)? 此参数不使用后台作业创建触发器,可以不创建 |
组织机构,人员,子集信息同步
数据库脚本
-- 创建后台作业的脚本
insert into t_sys_jobs (job_id,description,jobclass)
values ((select MAX(job_id)+1 as maxid from t_sys_jobs) ,'与浪潮数据同步','com.hjsj.hrms.businessobject.sys.job.ExtSync2LangcJob');
配置service.xml
<!-- 北京市政路桥组织机构数据同步 start-->
<service xmlns="http://xfire.codehaus.org/config/1.0">
<name>Sync2LangcService</name>
<namespace>http://www.hjsj.com/HrService</namespace>
<serviceClass>com.hjsj.hrms.service.langc.ExtSync2LangcService</serviceClass>
</service>
<!-- 北京市政路桥组织机构数据同步 end-->
配置同步信息的xml
- 文件名: sync2langc.xml
- 路径: ~\webapps\ehr\WEB-INF\classes
- 内容参考以下代码
<?xml version="1.0" encoding="UTF-8"?>
<!--此xml用于北京市政与浪潮组织机构与岗位的数据同步-->
<root>
<sync_fields>
<!-- 字段说明
hrfield:hr系统字段 格式:所属子集加.字段;
destfield:目标系统字段;
coreset:该字段在系统所属代码类;
transfer: 代码项进行转换后要取值的类型 eg: 1:转换代码, 2:代码描述;
!!! coreset与transfer这两项需要同时出现,否则转换不生效
desc:同步字段名称(不影响代码逻辑执行) -->
<sync_org desc="同步组织机构信息">
<!-- hrfield:hr系统字段(org.字段名称代表从organization表中取值, orgView代表从视图t_org_view中取值);
destfield:目标系统字段; -->
<sync_field hrfield="org.codeitemid" destfield="number" desc="机构编码"></sync_field>
<sync_field hrfield="org.codeitemdesc" destfield="name" desc="机构名称"></sync_field>
<sync_field hrfield="org.start_date" destfield="begin_date" desc="开始时间"></sync_field>
<sync_field hrfield="org.codesetid" destfield="org_type" desc="结束时间"></sync_field>
<!--只有是否启用字段要从视图中取值-->
<sync_field hrfield="orgView.langc" destfield="enabled" desc="是否启用"></sync_field>
<sync_field hrfield="org.GUIDKEY" destfield="third_id" desc="机构主键guidkey"></sync_field>
<sync_field hrfield="org.parentid" destfield="parent_id" desc="父机构guidkey"></sync_field>
</sync_org>
<sync_post desc="同步岗位信息">
<!-- hrfield:hr系统字段(org.字段名称代表从organization表中取值, orgView代表从视图t_org_view中取值);
destfield:目标系统字段; -->
<sync_field hrfield="org.codeitemid" destfield="number" desc="机构编码"></sync_field>
<sync_field hrfield="org.codeitemdesc" destfield="name" desc="机构名称"></sync_field>
<sync_field hrfield="org.start_date" destfield="begin_date" desc="开始时间"></sync_field>
<sync_field hrfield="org.codesetid" destfield="org_type" desc="结束时间"></sync_field>
<!--只有是否启用字段要从视图中取值-->
<sync_field hrfield="postView.langc" destfield="enabled" desc="是否启用"></sync_field>
<sync_field hrfield="org.GUIDKEY" destfield="third_id" desc="机构主键guidkey"></sync_field>
<sync_field hrfield="org.parentid" destfield="parent_id" desc="父机构guidkey"></sync_field>
</sync_post>
<sync_emp desc="同步人员信息">
<!--同步人员信息中的字段所有取值都源自t_hr_view,只要填写字段名称即可,确保人员视图中已有该数据-->
<sync_field hrfield="A0100" destfield="number" desc="工号"></sync_field>
<sync_field hrfield="A0101" destfield="name" desc="姓名"></sync_field>
<sync_field hrfield="A0152" destfield="mobile" desc="手机号"></sync_field>
<sync_field hrfield="A0107" destfield="name" corecode="1" desc="性别"></sync_field>
<sync_job desc="任职信息">
<sync_field hrfield="b0110" destfield="unit_id" desc="单位"></sync_field>
<sync_field hrfield="e0122" destfield="department_id" desc="部门"></sync_field>
<sync_field hrfield="e01a1" destfield="position_id" desc="岗位"></sync_field>
</sync_job>
</sync_emp>
<sync_sub desc="同步子集信息">
<subset from="A04" target="EmployeeEducation" desc="学历与学位子集">
<!-- 子集字段说明
hrfield:hr系统字段 格式:所属子集加.字段;
destfield:目标系统字段;
coreset:该字段在系统所属代码类;
transfer: 代码项进行转换后要取值的类型 eg: 1:转换代码, 2:代码描述;
!!! coreset与transfer这两项需要同时出现,否则转换不生效
desc:同步字段名称(不影响代码逻辑执行) -->
<sync_field hrfield="a04.A0435" destfield="school" desc="学校"></sync_field>
<sync_field hrfield="a04.A0410" destfield="major" desc="专业"></sync_field>
<sync_field hrfield="a04.A0405" destfield="education" desc="学历"></sync_field>
<sync_field hrfield="a04.A0415" destfield="from_date" desc="入学时间"></sync_field>
<sync_field hrfield="a04.A0440" destfield="degree" codeset="AN" transfer="1" desc="学位"></sync_field>
<sync_field hrfield="a04.A0430" destfield="end_date" desc="毕业时间"></sync_field>
<!-- 注意!!! 子集的guidkey必须存在,否则系统无法同步该数据-->
<sync_field hrfield="a04.guidkey" destfield="guidkey" desc="子集主键"></sync_field>
</subset>
<subset from="A10" target="QualificationInformation" desc="职业情况子集">
<sync_field hrfield="a10.A1005" destfield="zyzg_name" desc="职业资格名称"></sync_field>
<sync_field hrfield="a10.A1015" destfield="take_date" desc="资格授予时间"></sync_field>
<sync_field hrfield="a10.A1035" destfield="zdy_zcdw" desc="资格证书所在单位"></sync_field>
</subset>
</sync_sub>
</sync_fields>
</root>
二开参数
参数名称 | 参数值 | 参数描述 |
---|---|---|
langc_targetOrgid | 1234 | 与浪潮组织机构同步顶级机构的父节点 |
sync2langc_org_url | hduiaduiasdhi | 与浪潮单位部门数据同步接口url |
sync2langc_subset_url | sdad | 与浪潮子集数据同步接口url |
sync2langc_post_url | sadadasd | 与浪潮岗位数据同步接口url |
sync2langc_emp_url | dsadadadad | 与浪潮人员数据同步接口url |
no_sync2langc | t_hr_view,t_org_view,t_post_view,t_subset_monitor | t_hr_view 人员/任职 t_org_view 组织 t_post_view 岗位 t_subset_monitor 子集 |
sync2langc_mode | true | true为全量(默认为全量) false为增量 |
sync2langc_subset | a03,a04,a05 | 监控的在职的子集是那些,需要通过后台作业更新这些表上的触发器 |
注意事项
- 不支持子集附件的子集是没有guidkey字段的
- 支持子集附件的子集,在刚创建时也没有guidkey字段
- 子集的guidkey字段会在人员手动查看某条子集记录时创建,并为该条记录生成guidkey值
调试中遇到的问题整理
system.properties参数整理
#宏景微信参数、LDAP数据同步参数
hr_data_addr=172.172.103.231
hr_data_post=1433
hr_data_base=szjj
hr_sync_user=sa
hr_sync_pass=yksoft1919
#宏景eHR系统数据库人员同步中间表
sync_emp_table=t_hr_view
#宏景eHR系统数据库机构同步中间表
sync_org_table=t_org_view
#宏景eHR系统数据库岗位同步中间表
sync_post_table=t_post_view
#为兼容以前版本同步,添加此参数设置,该参数值不能修改
sync_orgpost_only_field=unique_id
新增二开参数,是否全量同步
sync2langc_mode控制 true为全量(默认为全量) false为增量
删除掉的组织机构不同步
浪潮方没有删除的概念,只有撤销,因此真正删除的机构,只能进行手动删除
数据同步持续时间太久,导致数据库链接断掉
<!--
removeAbandoned: 到达指定时间是否断掉数据库链接
removeAbandonedTimeout: 断掉链接所要的时间
-->
<Resource name="jdbc/MSSQL" auth="Container" type="javax.sql.DataSource" maxTotal="900" maxIdle="30" username="sa" password="yksoft1919" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
factory="com.alibaba.druid.pool.DruidDataSourceFactory" validationQuery="SELECT 1" testWhileIdle="true" timeBetweenEvictionRunsMillis="60000"
minEvictableIdleTimeMillis="30000" removeAbandoned="true" removeAbandonedTimeout="1800" logAbandoned="true"
url="jdbc:sqlserver://172.172.103.231:1433;databaseName=szjj;"/>
视图中要添加的指标
单位,岗位,人员,任职在xml中用到的字段需要添加到视图中
对于所传字段的特殊处理
任职子集中特殊处理两个字段position_status_id岗位状态 action_reason_id 变动原因
-
position_status_id岗位状态
// 任职子集中特殊处理两个字段position_status_id岗位状态 action_reason_id 变动原因 if (StringUtils.equals("position_status_id", destfield)) { destfieldValue= ""; }
-
action_reason_id