本文档,主要为了让实施人员能够方便地将用户数据(包括组织机构、人员帐号)同步到用户服务相关业务表。
主要涉及用户数据 相关的 字典数据,详细『字典说明』
| 字段 | 名称 | 类型(长度) | 说明 | | - | - | - | - | | ID | 编号 | VARCHAR(64), PK, NN | | | CODE | 代码 | VARCHAR(120), NN | | | NAME | 名称 | VARCHAR(200), NN | | | MULTI_LEVEL | 是否多层级 | INT | 1:是,0:否;默认是 | | ENABLE | 是否启用 | INT | 1:启用,0:不启用;默认启用 | | SORT | 排序 | BIGINT | | | IS_DATA_CENTER | 是否来源数据中心 | INT | 0:否,1:是;默认否 |
| 字段 | 名称 | 类型(长度) | 说明 | | - | - | - | - | | ID | 编号 | VARCHAR(64), PK, NN | | | DICTIONARY_TYPE_ID | 字典类型 | VARCHAR(64), NN | TB_B_DICTIONARY_TYPE 表 ID | | PARENT_DICTIONARY_ID | 父级字典 | VARCHAR(64) | TB_B_DICTIONARY 表 ID | | CODE | 代码 | VARCHAR(120), NN | | | NAME | 名称 | VARCHAR(200), NN | | | ENABLE | 是否启用 | INT | 1:启用,0:不启用;默认启用 | | SORT | 排序 | BIGINT | | | IS_DATA_CENTER | 是否来源数据中心 | INT | 0:否,1:是;默认否 |
帐号身份类型,以及 身份 与 用户组下人员 的初始关联设置
| 字段 | 名称 | 类型(长度) | 说明 | | - | - | - | - | | ID | 编号 | VARCHAR(100), PK, NN | | | PARENT_IDENTITY_TYPE_ID | 父身份类型 | VARCHAR(64) | TB_B_IDENTITY_TYPE 表 ID | | CODE | 代码 | VARCHAR(120), NN | | | NAME | 名称 | VARCHAR(200), NN | | | ENABLE | 是否启用 | INT | 1:启用,0:不启用;默认启用 | | SORT | 排序 | BIGINT | |
| 字段 | 名称 | 类型(长度) | 说明 | | - | - | - | - | | ID | 编号 | VARCHAR(100), PK, NN | | | IDENTITY_TYPE_ID | 身份类型ID | VARCHAR(64), NN | TB_B_IDENTITY_TYPE 表 ID | | GROUP_ID | 用户组ID | VARCHAR(64), NN | TB_B_GROUP 表 ID |
组织机构数据
| 字段 | 名称 | 类型(长度) | 说明 | | - | - | - | - | | ID | 编号 | VARCHAR(64), PK, NN | | | IS_ROOT_ORGANIZATION | 是否根组织机构 | INT | 0:否,1:是;默认否 | | ROOT_ORGANIZATION_ID | 所属的根组织机构 | VARCHAR(64) | TB_B_ORGANIZATION 表 ID | | PARENT_ORGANIZATION_ID | 所属的父级组织机构 | VARCHAR(64) | TB_B_ORGANIZATION 表 ID | | CODE | 代码 | VARCHAR(120), NN | | | NAME | 名称 | VARCHAR(200), NN | | | DESCRIPTION | 描述 | VARCHAR(500) | | | TYPE_ID | 组织机构部门类型 | VARCHAR(64), NN | TB_B_DICTIONARY 表 ID;字典类型:ORGANIZATION_TYPE | | STATE | 状态 | INT | 0:正常,1:冻结,2:注销;默认正常 | | ENABLE | 是否启用 | INT | 1:启用,0:不启用;默认启用 | | SORT | 排序 | BIGINT | | | IS_DATA_CENTER | 是否来源数据中心 | INT | 0:否,1:是;默认是 |
用户的基本信息、安全设置的数据
| 字段 | 名称 | 类型(长度) | 说明 | | - | - | - | - | | ID | 编号 | VARCHAR(64), PK, NN | | | UID | 唯一编号 | VARCHAR(64), NN | | | PASSWORD | 账号密码 | VARCHAR(255), NN | | | LDAP_USER_PASSWORD | 账号密码(LDAP同步用) | VARCHAR(255) | | | PASSWORD_STATE | 密码过期状态 | INT | 0:正常 未过期,-1:已过期,>0:n天后即将过期;默认0 | | NAME | 姓名 | VARCHAR(255), NN | | | NAME_SPELLING | 姓名简拼 | VARCHAR(120) | | | FULL_NAME_SPELLING | 姓名全拼 | VARCHAR(255) | | | CERTIFICATE_TYPE_ID | 证件类型 | VARCHAR(64), NN | TB_B_DICTIONARY 表 ID;字典类型:CERTIFICATE_TYPE | | CERTIFICATE_NUMBER | 证件号码 | VARCHAR(120), NN | | | PHONE_NUMBER | 手机号码 | VARCHAR(50) | | | EMAIL | 邮箱 | VARCHAR(50) | | | IMAGE_URL | 头像 | VARCHAR(255) | | | GENDER_ID | 性别 | VARCHAR(64) | TB_B_DICTIONARY 表 ID;字典类型:GENDER | | NATION_ID | 民族 | VARCHAR(64) | TB_B_DICTIONARY 表 ID;字典类型:NATION | | COUNTRY_ID | 国家 | VARCHAR(64) | TB_B_DICTIONARY 表 ID;字典类型:COUNTRY | | ADDRESS_ID | 地区 | VARCHAR(64) | TB_B_DICTIONARY 表 ID;字典类型:ADDRESS |
| 字段 | 名称 | 类型(长度) | 说明 | | - | - | - | - | | ID | 编号 | VARCHAR(64), PK, NN | | | USER_ID | 用户ID | VARCHAR(64), NN | TB_B_USER 表 ID | | SCORE | 账号安全得分 | VARCHAR(5), NN | 默认0 | | PASSWORD_SCORE | 安全密码得分 | VARCHAR(5), NN | 默认0 | | SECURE_EMAIL | 安全邮箱 | VARCHAR(60), NN | | | SECURE_PHONE | 安全手机 | VARCHAR(20), NN | |
帐号数据,帐号所属组织机构、帐号所属用户组等
| 字段 | 名称 | 类型(长度) | 说明 | | - | - | - | - | | ID | 编号 | VARCHAR(64), PK, NN | | | USER_ID | 用户ID | VARCHAR(64), NN | TB_B_USER 表 ID | | ACCOUNT_NAME | 人员账号;唯一 | VARCHAR(64), NN | | | ACCOUNT_EXPIRY_DATE | 账号有效日期[yyyy-MM-dd] | DATE | | | ACCOUNT_LOCKED | 是否锁定 | INT | 0:未锁定;1:锁定;默认,0 未锁定 | | ORGANIZATION_ID | 所属组织机构 | VARCHAR(64), NN | TB_B_ORGANIZATION 表 ID | | IDENTITY_TYPE_ID | 身份类型 | VARCHAR(64), NN | TB_B_IDENTITY_TYPE 表 ID | | ACTIVATION | 是否激活定 | INT | 0:未激活;1:激活;默认,0 未激活 | | STATE | 状态 | VARCHAR(20) | NORMAL:正常;FREEZE:冻结;WRITTENOFF:注销;默认,NORMAL | | IS_DATA_CENTER | 是否来源数据中心 | INT | 0:否;1:是;默认,1 是 |
| 字段 | 名称 | 类型(长度) | 说明 | | - | - | - | - | | ID | 编号 | VARCHAR(64), PK, NN | | | ROOT_ORGANIZATION_ID | 根组织机构ID | VARCHAR(64), NN | TB_B_ORGANIZATION 表 ID | | ACCOUNT_ID | 人员账户ID | VARCHAR(64), NN | TB_B_ACCOUNT 表 ID | | ORGANIZATION_ID | 组织机构ID | VARCHAR(64), NN | TB_B_ORGANIZATION 表 ID |
| 字段 | 名称 | 类型(长度) | 说明 | | - | - | - | - | | ID | 编号 | VARCHAR(64), PK, NN | | | ACCOUNT_ID | 人员账户ID | VARCHAR(64), NN | TB_B_ACCOUNT 表 ID | | GROUP_ID | 用户组ID | VARCHAR(64), NN | TB_B_GROUP 表 ID |
若组织机构数据、人员数据中使用的字典与以下现有字典 不一致的,须进行重新初始化
代码 | 名称 | 是否可调整
注,除 10000 外,其他组织机构类型代码都可以视项目情况,删除,然后新增
采用标准代码
代码 | 名称
采用标准代码
代码 | 名称
采用标准代码
代码 | 名称
采用标准代码
代码 | 名称
采用标准代码,代码过多,此处只列出若干,详细可见系统的字典管理功能
代码 | 名称
身份数据由项目根据实际情况 进行创建
保存数据时, 验证 组织机构数据 是否合法,代码、名称、是否启用、上级组织机构 不能为空 判断 组织机构类型(字典) 是否存在?若不存在,则无法同步 判断 上级组织机构 是否存在?若不存在,则无法同步 根据 组织机构代码 判断组织机构是否已存在?若否,则新增;否则,更新
新增时,将 组织机构代码 作为 组织机构ID 进行保存。 更新时,判断 组织机构ID 是否与 上级组织机构ID 一致?若是,则无法同步;否则 保存。
删除数据时, 将 组织机构数据 的状态修改为 2:注销
,并不进行物理删除
保存数据时, 验证 帐号数据 是否合法,姓名、证件类型、证件号码、账号名、身份类型、所属组织机构 不能为空 判断 证件类型(字典) 是否存在?若不存在,则无法同步 判断 所属组织机构 是否存在?若不存在,则无法同步 判断 所属组织机构 是否为行政组织机构?若不是,则无法同步 判断 身份类型 是否存在?若不存在,则无法同步
根据 帐号名 获取帐号信息是否存在? 若不存在,则须新增帐号,同时根据 证件号码 获取用户信息是否存在? 若不存在,则须新增用户 否则,判断 姓名是否 一致?若不一致,则无法同步;否则,可更新用户 否则,可更新帐号,同时 可更新用户
新增用户时,设置激活状态,设置信息完善状态 更新用户时,若一人一帐号,则 更新用户的 姓名、证件类型、证件号码
新增帐号时,设置激活状态(与用户的激活状态保持一致) 更新帐号时,不再更新 激活状态
删除数据时, 将 帐号数据 的状态修改为 WRITTENOFF:注销
,并不进行物理删除
实施人员,将 组织机构、人员帐号 数据,通过数据交换等工具,交换至以下临时表中
同步程序会定时,读取待处理的数据,调用对应的同步接口,将数据同步到用户服务的相关业务表中
TMP_ORGANIZATION_ORIGIN
名称 | 类型 | 描述 | 是否必填
TMP_ACCOUNT_ORIGIN
名称 | 类型 | 描述 | 是否必填
TMP_ORGANIZATION_TRANS
名称 | 类型 | 描述 | 是否必填
TMP_ACCOUNT_TRANS
名称 | 类型 | 描述 | 是否必填
需在临时表上,增加更新触发器,执行以下脚本
用于将 源头表 数据的变更,触发到 转换表 中,更新转换表的相关状态字段,方便同步程序进行处理
DROP TRIGGER IF EXISTS after_update_organization_origin; delimiter // create trigger after_update_organization_origin after update on TMP_ORGANIZATION_ORIGIN for each row begin declare ID1 varchar(100); declare ID2 varchar(100); -- new 代表 表中新增的数据 set ID1 = (select ID from TMP_ORGANIZATION_TRANS where ((ID is null and new.ID is null) or ID=new.ID) and ((PARENT_ORGANIZATION_ID is null and new.PARENT_ORGANIZATION_ID is null) or PARENT_ORGANIZATION_ID=new.PARENT_ORGANIZATION_ID) and ((CODE is null and new.CODE is null) or CODE=new.CODE) and ((NAME is null and new.NAME is null) or NAME=new.NAME) and ((DESCRIPTION is null and new.DESCRIPTION is null) or DESCRIPTION=new.DESCRIPTION) and ((TYPE_ID is null and new.TYPE_ID is null) or TYPE_ID=new.TYPE_ID) and ((STATE is null and new.STATE is null) or STATE=new.STATE) and ((ENABLE is null and new.ENABLE is null) or ENABLE=new.ENABLE) and ((IS_DATA_CENTER is null and new.IS_DATA_CENTER is null) or IS_DATA_CENTER=new.IS_DATA_CENTER) ); -- into @ID1; if ID1 is null then set ID2 = (select ID from TMP_ORGANIZATION_TRANS where ID=new.ID); -- into @ID2; if ID2 is null then insert into TMP_ORGANIZATION_TRANS(TRANS_STATUS, TRANS_TIME, PROC_STATUS, PROC_TIME, ID, PARENT_ORGANIZATION_ID, CODE, NAME, DESCRIPTION, TYPE_ID, STATE, ENABLE, IS_DATA_CENTER ) values ('1', now(), '0', null, new.ID, new.PARENT_ORGANIZATION_ID, new.CODE, new.NAME, new.DESCRIPTION, new.TYPE_ID, new.STATE, new.ENABLE, new.IS_DATA_CENTER ) ; else update TMP_ORGANIZATION_TRANS set TRANS_STATUS='2', TRANS_TIME=now(), PROC_STATUS='0', PARENT_ORGANIZATION_ID=new.PARENT_ORGANIZATION_ID, CODE=new.CODE, NAME=new.NAME, DESCRIPTION=new.DESCRIPTION, TYPE_ID=new.TYPE_ID, STATE=new.STATE, ENABLE=new.ENABLE, IS_DATA_CENTER=new.IS_DATA_CENTER where ID=new.ID ; end if; else -- 如果数据没变化,但存在记录,且被处理,则标记未 不更新、不处理 update TMP_ORGANIZATION_TRANS set TRANS_STATUS='0', TRANS_TIME=now(), PROC_STATUS='0' where ID=new.ID and PROC_RESULT!='0' ; end if; end // delimiter ; DROP TRIGGER IF EXISTS after_update_account_origin; delimiter // create trigger after_update_account_origin after update on TMP_ACCOUNT_ORIGIN for each row begin declare ID1 varchar(100); declare ID2 varchar(100); -- new 代表 表中新增的数据 set ID1 = (select ID from TMP_ACCOUNT_TRANS where ((ID is null and new.ID is null) or ID=new.ID) and ((UID is null and new.UID is null) or UID=new.UID) and ((NAME is null and new.NAME is null) or NAME=new.NAME) and ((NAME_SPELLING is null and new.NAME_SPELLING is null) or NAME_SPELLING=new.NAME_SPELLING) and ((FULL_NAME_SPELLING is null and new.FULL_NAME_SPELLING is null) or FULL_NAME_SPELLING=new.FULL_NAME_SPELLING) and ((CERTIFICATE_TYPE_ID is null and new.CERTIFICATE_TYPE_ID is null) or CERTIFICATE_TYPE_ID=new.CERTIFICATE_TYPE_ID) and ((CERTIFICATE_NUMBER is null and new.CERTIFICATE_NUMBER is null) or CERTIFICATE_NUMBER=new.CERTIFICATE_NUMBER) and ((PHONE_NUMBER is null and new.PHONE_NUMBER is null) or PHONE_NUMBER=new.PHONE_NUMBER) and ((EMAIL is null and new.EMAIL is null) or EMAIL=new.EMAIL) and ((IMAGE_URL is null and new.IMAGE_URL is null) or IMAGE_URL=new.IMAGE_URL) and ((GENDER_ID is null and new.GENDER_ID is null) or GENDER_ID=new.GENDER_ID) and ((NATION_ID is null and new.NATION_ID is null) or NATION_ID=new.NATION_ID) and ((COUNTRY_ID is null and new.COUNTRY_ID is null) or COUNTRY_ID=new.COUNTRY_ID) and ((ADDRESS_ID is null and new.ADDRESS_ID is null) or ADDRESS_ID=new.ADDRESS_ID) and ((ACCOUNT_NAME is null and new.ACCOUNT_NAME is null) or ACCOUNT_NAME=new.ACCOUNT_NAME) and ((ACCOUNT_EXPIRY_DATE is null and new.ACCOUNT_EXPIRY_DATE is null) or ACCOUNT_EXPIRY_DATE=new.ACCOUNT_EXPIRY_DATE) and ((ORGANIZATION_ID is null and new.ORGANIZATION_ID is null) or ORGANIZATION_ID=new.ORGANIZATION_ID) and ((IDENTITY_TYPE_ID is null and new.IDENTITY_TYPE_ID is null) or IDENTITY_TYPE_ID=new.IDENTITY_TYPE_ID) and ((ACTIVATION is null and new.ACTIVATION is null) or ACTIVATION=new.ACTIVATION) and ((STATE is null and new.STATE is null) or STATE=new.STATE) and ((IS_DATA_CENTER is null and new.IS_DATA_CENTER is null) or IS_DATA_CENTER=new.IS_DATA_CENTER) ); -- into @ID1; if ID1 is null then set ID2 = (select ID from TMP_ACCOUNT_TRANS where ID=new.ID); -- into @ID2; if ID2 is null then insert into TMP_ACCOUNT_TRANS(TRANS_STATUS, TRANS_TIME, PROC_STATUS, PROC_TIME, ID, UID, NAME, NAME_SPELLING, FULL_NAME_SPELLING, CERTIFICATE_TYPE_ID, CERTIFICATE_NUMBER, PHONE_NUMBER, EMAIL, IMAGE_URL, GENDER_ID, NATION_ID, COUNTRY_ID, ADDRESS_ID, ACCOUNT_NAME, ACCOUNT_EXPIRY_DATE, ORGANIZATION_ID, IDENTITY_TYPE_ID, ACTIVATION, STATE, IS_DATA_CENTER ) values ('1', now(), '0', null, new.ID, new.UID, new.NAME, new.NAME_SPELLING, new.FULL_NAME_SPELLING, new.CERTIFICATE_TYPE_ID, new.CERTIFICATE_NUMBER, new.PHONE_NUMBER, new.EMAIL, new.IMAGE_URL, new.GENDER_ID, new.NATION_ID, new.COUNTRY_ID, new.ADDRESS_ID, new.ACCOUNT_NAME, new.ACCOUNT_EXPIRY_DATE, new.ORGANIZATION_ID, new.IDENTITY_TYPE_ID, new.ACTIVATION, new.STATE, new.IS_DATA_CENTER ) ; else update TMP_ACCOUNT_TRANS set TRANS_STATUS='2', TRANS_TIME=now(), PROC_STATUS='0', UID=new.UID, NAME=new.NAME, NAME_SPELLING=new.NAME_SPELLING, FULL_NAME_SPELLING=new.FULL_NAME_SPELLING, CERTIFICATE_TYPE_ID=new.CERTIFICATE_TYPE_ID, CERTIFICATE_NUMBER=new.CERTIFICATE_NUMBER, PHONE_NUMBER=new.PHONE_NUMBER, EMAIL=new.EMAIL, IMAGE_URL=new.IMAGE_URL, GENDER_ID=new.GENDER_ID, NATION_ID=new.NATION_ID, COUNTRY_ID=new.COUNTRY_ID, ADDRESS_ID=new.ADDRESS_ID, ACCOUNT_NAME=new.ACCOUNT_NAME, ACCOUNT_EXPIRY_DATE=new.ACCOUNT_EXPIRY_DATE, ORGANIZATION_ID=new.ORGANIZATION_ID, IDENTITY_TYPE_ID=new.IDENTITY_TYPE_ID, ACTIVATION=new.ACTIVATION, STATE=new.STATE, IS_DATA_CENTER=new.IS_DATA_CENTER where ID=new.ID ; end if; else -- 如果数据没变化,但存在记录,且被处理,则标记未 不更新、不处理 update TMP_ACCOUNT_TRANS set TRANS_STATUS='0', TRANS_TIME=now(), PROC_STATUS='0' where ID=new.ID and PROC_RESULT!='0' ; end if; end // delimiter ;
将 TMP_ACCOUNT_ORIGIN,TMP_ACCOUNT_TRANS 表的数据删除即可
按以下顺序,依次删除相关主业务数据即可
删除 帐号 数据,将级联地删除 帐号-组织机构关系、帐号-用户组关系 2个表的数据
删除 用户 数据,将级联地删除 用户安全设置 的数据
删除 组织机构 数据