北京市政与浪潮数据同步

发布时间 2023-07-06 18:03:43作者: 张Blog

北京市政与浪潮数据同步

待办事项

项目记录

事前工作

  • 创建子集监控表
-- 创建子集监控表
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 监控的在职的子集是那些,需要通过后台作业更新这些表上的触发器

注意事项

  1. 不支持子集附件的子集是没有guidkey字段的
  2. 支持子集附件的子集,在刚创建时也没有guidkey字段
  3. 子集的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