docs: 更新 用户数据同步 文档
author刘洪青 <hongqing.liu@supwisdom.com>
Mon, 14 Dec 2020 09:46:30 +0000 (17:46 +0800)
committer刘洪青 <hongqing.liu@supwisdom.com>
Mon, 14 Dec 2020 09:46:30 +0000 (17:46 +0800)
docs/用户数据同步说明文档.md
docs/用户数据同步说明文档.pdf

index 106692d..68bc1e7 100644 (file)
 # 用户数据同步说明文档
 
 
-## 基于数据交换
+## 说明
+
+本文档,主要为了让实施人员能够方便地将用户数据(包括组织机构、人员帐号)同步到用户服务相关业务表。
+
+
+## 用户服务
+
+### 业务数据表说明
+
+#### 字典
+
+主要涉及用户数据 相关的 字典数据,详细『字典说明』
+
+* 字典类型 TB_B_DICTIONARY_TYPE
+
+| 字段 | 名称 | 类型(长度) | 说明 |
+| - | - | - | - |
+| 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:是;默认否 |
+
+
+* 字典项 TB_B_DICTIONARY
+
+| 字段 | 名称 | 类型(长度) | 说明 |
+| - | - | - | - |
+| 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:是;默认否 |
+
+
+
+#### 身份
+
+帐号身份类型,以及 身份 与 用户组下人员 的初始关联设置
+
+* 身份类型 TB_B_IDENTITY_TYPE
+
+| 字段 | 名称 | 类型(长度) | 说明 |
+| - | - | - | - |
+| 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 |   |
+
+
+* 身份类型-用户组初始化关系 TB_B_IDENTITY_TYPE_GROUP_INITIAL
+
+| 字段 | 名称 | 类型(长度) | 说明 |
+| - | - | - | - |
+| 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 |
+
+
+
+#### 组织机构
+
+组织机构数据
+
+* 组织机构 TB_B_ORGANIZATION
+
+| 字段 | 名称 | 类型(长度) | 说明 |
+| - | - | - | - |
+| 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:是;默认是 |
+
+
+
+#### 用户
+
+用户的基本信息、安全设置的数据
+
+* 用户基础信息 TB_B_USER
+
+| 字段 | 名称 | 类型(长度) | 说明 |
+| - | - | - | - |
+| 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 |
+
+
+* 用户安全设置 TB_B_SAFETY
+
+| 字段 | 名称 | 类型(长度) | 说明 |
+| - | - | - | - |
+| 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 |   |
+
+
+#### 帐号
+
+帐号数据,帐号所属组织机构、帐号所属用户组等
+
+* 帐号 TB_B_ACCOUNT
+
+| 字段 | 名称 | 类型(长度) | 说明 |
+| - | - | - | - |
+| 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 是 |
+
+
+* 帐号-组织机构关系(一人多部门关系) TB_B_ACCOUNT_ORGANIZATION
+
+| 字段 | 名称 | 类型(长度) | 说明 |
+| - | - | - | - |
+| 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 |
+
+
+* 帐号-用户组关系 TB_B_ACCOUNT_GROUP
+
+| 字段 | 名称 | 类型(长度) | 说明 |
+| - | - | - | - |
+| 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 | 根组织机构 | 不要删除、调整
+10001 | 学校 | 
+10002 | 部门 | 
+10003 | 院系 | 
+10004 | 专业 | 
+10005 | 班级 | 
+
+**注**,除 10000 外,其他组织机构类型代码都可以视项目情况,删除,然后新增
+
+
+* 证件类型
+
+采用标准代码
+
+代码 | 名称
+- | -
+1 | 居民身份证
+2 | 军官证
+3 | 士兵证
+4 | 文职干部证
+5 | 部队离退休证
+6 | 香港特区护照/身份证明
+7 | 澳门特区护照/身份证明
+8 | 台湾居民来往大陆通行证
+9 | 境外永久居住证
+A | 护照
+B | 户口薄
+C | 外国人永久居留证
+Z | 其他
+
+
+* 性别
+
+采用标准代码
+
+代码 | 名称
+- | -
+0 | 未知的性别
+1 | 男
+2 | 女
+9 | 未说明的性别
+
+
+* 民族
+
+采用标准代码
+
+代码 | 名称
+- | -
+01 | 汉族
+02 | 蒙古族
+03 | 回族
+04 | 藏族
+05 | 维吾尔族
+06 | 苗族
+07 | 彝族
+08 | 壮族
+09 | 布依族
+10 | 朝鲜族
+11 | 满族
+12 | 侗族
+13 | 瑶族
+14 | 白族
+15 | 土家族
+16 | 哈尼族
+17 | 哈萨克族
+18 | 傣族
+19 | 黎族
+20 | 傈僳族
+21 | 佤族
+22 | 畲族
+23 | 高山族
+24 | 拉祜族
+25 | 水族
+26 | 东乡族
+27 | 纳西族
+28 | 景颇族
+29 | 柯尔克孜族
+30 | 土族
+31 | 达斡尔族
+32 | 仫佬族
+33 | 羌族
+34 | 布朗族
+35 | 撒拉族
+36 | 毛难族
+37 | 仡佬族
+38 | 锡伯族
+39 | 阿昌族
+40 | 普米族
+41 | 塔吉克族
+42 | 怒族
+43 | 乌孜别克族
+44 | 俄罗斯族
+45 | 鄂温克族
+46 | 德昂族
+47 | 保安族
+48 | 裕固族
+49 | 京族
+50 | 塔塔尔族
+51 | 独龙族
+52 | 鄂伦春族
+53 | 赫哲族
+54 | 门巴族
+55 | 珞巴族
+56 | 基诺族
+81 | 穿青人族
+97 | 其他
+98 | 外国血统中国籍人士
+
+
+* 国家
+
+采用标准代码
+
+代码 | 名称
+- | -
+156 | 中国
+
+
+* 地区
+
+采用标准代码,代码过多,此处只列出若干,详细可见系统的字典管理功能
+
+代码 | 名称
+- | -
+110000 | 北京市
+110100 | 市辖区
+110101 | 东城区
+110102 | 西城区
+|
+120000 | 天津市
+120100 | 市辖区
+120101 | 和平区
+120102 | 河东区
+120103 | 河西区
+|
+310000 | 上海市
+310100 | 市辖区
+310101 | 黄浦区
+
+
+### 身份说明
+
+身份数据由项目根据实际情况 进行创建
+
+
+### 同步接口逻辑说明
+
+#### 组织机构同步接口
+
+保存数据时,
+验证 组织机构数据 是否合法,代码、名称、是否启用、上级组织机构 不能为空
+判断 组织机构类型(字典) 是否存在?若不存在,则无法同步
+判断 上级组织机构 是否存在?若不存在,则无法同步
+根据 组织机构代码 判断组织机构是否已存在?若否,则新增;否则,更新
+
+新增时,将 组织机构代码 作为 组织机构ID 进行保存。
+更新时,判断 组织机构ID 是否与 上级组织机构ID 一致?若是,则无法同步;否则 保存。
+
+删除数据时,
+将 组织机构数据 的状态修改为 `2:注销`,并不进行物理删除
+
+
+#### 帐号同步接口
+
+保存数据时,
+验证 帐号数据 是否合法,姓名、证件类型、证件号码、账号名、身份类型、所属组织机构 不能为空
+判断 证件类型(字典) 是否存在?若不存在,则无法同步
+判断 所属组织机构 是否存在?若不存在,则无法同步
+判断 所属组织机构 是否为行政组织机构?若不是,则无法同步
+判断 身份类型 是否存在?若不存在,则无法同步
+
+根据 帐号名 获取帐号信息是否存在?
+  若不存在,则须新增帐号,同时根据 证件号码 获取用户信息是否存在?
+    若不存在,则须新增用户
+    否则,判断 姓名是否 一致?若不一致,则无法同步;否则,可更新用户
+  否则,可更新帐号,同时 可更新用户
+
+新增用户时,设置激活状态,设置信息完善状态
+更新用户时,若一人一帐号,则 更新用户的 姓名、证件类型、证件号码
+
+新增帐号时,设置激活状态(与用户的激活状态保持一致)
+更新帐号时,不再更新 激活状态
+
+删除数据时,
+将 帐号数据 的状态修改为 `WRITTENOFF:注销`,并不进行物理删除
+
+
+## 基于同步程序
+
+实施人员,将 组织机构、人员帐号 数据,通过数据交换等工具,交换至以下临时表中
+
+同步程序会定时,读取待处理的数据,调用对应的同步接口,将数据同步到用户服务的相关业务表中
+
 
 ### 临时表说明
 
+#### 源头数据表
+
 
 * 组织机构表
 
@@ -67,10 +442,87 @@ STATE | varchar(20) | 账号状态[ NORMAL:正常   FREEZE:冻结    WRITTENOFF:
 IS_DATA_CENTER | int(1) | 是否来源数据中心 [ 0:否  1:是 ];默认是 | 必填
 
 
+
+#### 转换数据表
+
+
+* 组织机构表
+
+TMP_ORGANIZATION_TRANS
+
+名称 | 类型 | 描述 | 是否必填
+- | - | - | -
+TRANS_STATUS | VARCHAR(10) | 传输状态(0 无变化、1 新增、2 更新、3 删除) | 
+TRANS_TIME | DATETIME | 同步时间 | 
+PROC_STATUS | VARCHAR(10) | 处理状态(0 不处理、1 可处理) | 
+PROC_RESULT | VARCHAR(10) | 处理结果(0 未处理、1 处理成功、2 处理失败) | 
+PROC_TIME | DATETIME | 处理时间 | 
+ID | varchar(64) | ID,主键,随机生成 | 必填
+DELETED | int(1) | 是否删除  0:有效  1:删除 | 必填
+ADD_ACCOUNT | varchar(100) | 创建人用户名
+ADD_TIME | timestamp | 创建时间
+EDIT_ACCOUNT | varchar(100) | 修改人用户名
+EDIT_TIME | timestamp | 修改时间
+DELETE_ACCOUNT | varchar(100) | 删除人用户名
+DELETE_TIME | timestamp | 删除时间
+PARENT_ORGANIZATION_ID | varchar(64) | 所属的父级组织机构,顶级组织机构为 0
+CODE | varchar(120) | 组织机构代码 | 必填
+NAME | varchar(200) | 组织机构名称 | 必填
+DESCRIPTION | varchar(500) | 组织机构描述
+TYPE_ID | varchar(64) | 组织机构部门类型,字典表ID、代码均可 | 必填
+STATE | int(2) | 状态 [0:正常  1:冻结   2:注销];默认正常 | 必填
+ENABLE | int(1) | 是否启用  1:启用  0:不启用;默认启用
+IS_DATA_CENTER | int(1) | 是否来源数据中心 [ 0:否  1:是 ];默认是 | 必填
+
+
+* 帐号表
+
+TMP_ACCOUNT_TRANS
+
+名称 | 类型 | 描述 | 是否必填
+- | - | - | -
+TRANS_STATUS | VARCHAR(10) | 传输状态(0 无变化、1 新增、2 更新、3 删除) | 
+TRANS_TIME | DATETIME | 同步时间 | 
+PROC_STATUS | VARCHAR(10) | 处理状态(0 不处理、1 可处理) | 
+PROC_RESULT | VARCHAR(10) | 处理结果(0 未处理、1 处理成功、2 处理失败) | 
+PROC_TIME | DATETIME | 处理时间 | 
+ID | varchar(64) | ID,主键,随机生成 | 必填
+DELETED | int(1) | 是否删除  0:有效  1:删除 | 必填
+ADD_ACCOUNT | varchar(100) | 创建人用户名
+ADD_TIME | timestamp | 创建时间
+EDIT_ACCOUNT | varchar(100) | 修改人用户名
+EDIT_TIME | timestamp | 修改时间
+DELETE_ACCOUNT | varchar(100) | 删除人用户名
+DELETE_TIME | timestamp | 删除时间
+UID | varchar(64) | 唯一编号 | 必填
+NAME | varchar(255) | 姓名 | 必填
+NAME_SPELLING | varchar(120) | 姓名简拼
+FULL_NAME_SPELLING | varchar(255) | 姓名全拼
+CERTIFICATE_TYPE_ID | varchar(64) | 证件类型,字典表ID、代码均可 | 必填
+CERTIFICATE_NUMBER | varchar(120) | 证件号码 | 必填
+PHONE_NUMBER | varchar(50) | 手机号码
+EMAIL | varchar(50) | 邮箱
+IMAGE_URL | varchar(255) | 个人照片地址
+GENDER_ID | varchar(64) | 性别,字典表ID、代码均可
+NATION_ID | varchar(64) | 民族,字典表ID、代码均可
+COUNTRY_ID | varchar(64) | 国家,字典表ID、代码均可
+ADDRESS_ID | varchar(64) | 地区,字典表ID、代码均可
+ACCOUNT_NAME | varchar(120) | 人员账号 | 必填,唯一
+ACCOUNT_EXPIRY_DATE | date | 账号有效日期[yyyy-MM-dd]
+ORGANIZATION_ID | varchar(64) | 所属组织机构 | 必填
+IDENTITY_TYPE_ID | varchar(64) | 身份类型,身份表ID、代码均可 | 必填
+ACTIVATION | int(1) | 是否激活 [0:未激活    1:激活] | 必填
+STATE | varchar(20) | 账号状态[ NORMAL:正常   FREEZE:冻结    WRITTENOFF:注销] 默认正常状态 | 必填
+IS_DATA_CENTER | int(1) | 是否来源数据中心 [ 0:否  1:是 ];默认是 | 必填
+
+
+
 ### 添加触发器
 
 需在临时表上,增加更新触发器,执行以下脚本
 
+用于将 源头表 数据的变更,触发到 转换表 中,更新转换表的相关状态字段,方便同步程序进行处理
+
 ```sql
 DROP TRIGGER IF EXISTS after_update_organization_origin;
 
@@ -259,154 +711,3 @@ delimiter ;
 ```
 
 
-### 字典说明
-
-若组织机构数据、人员数据中使用的字典与以下现有字典 不一致的,须进行重新初始化
-
-* 组织机构类型
-
-代码 | 名称 | 是否可调整
-- | - | -
-10000 | 根组织机构 | 不要删除、调整
-10001 | 学校 | 
-10002 | 部门 | 
-10003 | 院系 | 
-10004 | 专业 | 
-10005 | 班级 | 
-
-**注**,除 10000 外,其他组织机构类型代码都可以视项目情况,删除,然后新增
-
-
-* 证件类型
-
-采用标准代码
-
-代码 | 名称
-- | -
-1 | 居民身份证
-2 | 军官证
-3 | 士兵证
-4 | 文职干部证
-5 | 部队离退休证
-6 | 香港特区护照/身份证明
-7 | 澳门特区护照/身份证明
-8 | 台湾居民来往大陆通行证
-9 | 境外永久居住证
-A | 护照
-B | 户口薄
-C | 外国人永久居留证
-Z | 其他
-
-
-* 性别
-
-采用标准代码
-
-代码 | 名称
-- | -
-0 | 未知的性别
-1 | 男
-2 | 女
-9 | 未说明的性别
-
-
-* 民族
-
-采用标准代码
-
-代码 | 名称
-- | -
-01 | 汉族
-02 | 蒙古族
-03 | 回族
-04 | 藏族
-05 | 维吾尔族
-06 | 苗族
-07 | 彝族
-08 | 壮族
-09 | 布依族
-10 | 朝鲜族
-11 | 满族
-12 | 侗族
-13 | 瑶族
-14 | 白族
-15 | 土家族
-16 | 哈尼族
-17 | 哈萨克族
-18 | 傣族
-19 | 黎族
-20 | 傈僳族
-21 | 佤族
-22 | 畲族
-23 | 高山族
-24 | 拉祜族
-25 | 水族
-26 | 东乡族
-27 | 纳西族
-28 | 景颇族
-29 | 柯尔克孜族
-30 | 土族
-31 | 达斡尔族
-32 | 仫佬族
-33 | 羌族
-34 | 布朗族
-35 | 撒拉族
-36 | 毛难族
-37 | 仡佬族
-38 | 锡伯族
-39 | 阿昌族
-40 | 普米族
-41 | 塔吉克族
-42 | 怒族
-43 | 乌孜别克族
-44 | 俄罗斯族
-45 | 鄂温克族
-46 | 德昂族
-47 | 保安族
-48 | 裕固族
-49 | 京族
-50 | 塔塔尔族
-51 | 独龙族
-52 | 鄂伦春族
-53 | 赫哲族
-54 | 门巴族
-55 | 珞巴族
-56 | 基诺族
-81 | 穿青人族
-97 | 其他
-98 | 外国血统中国籍人士
-
-
-* 国家
-
-采用标准代码
-
-代码 | 名称
-- | -
-156 | 中国
-
-
-* 地区
-
-采用标准代码,代码过多,此处只列出若干,详细可见系统的字典管理功能
-
-代码 | 名称
-- | -
-110000 | 北京市
-110100 | 市辖区
-110101 | 东城区
-110102 | 西城区
-|
-120000 | 天津市
-120100 | 市辖区
-120101 | 和平区
-120102 | 河东区
-120103 | 河西区
-|
-310000 | 上海市
-310100 | 市辖区
-310101 | 黄浦区
-
-
-
-
index 802c925..beb8e65 100644 (file)
Binary files "a/docs/\347\224\250\346\210\267\346\225\260\346\215\256\345\220\214\346\255\245\350\257\264\346\230\216\346\226\207\346\241\243.pdf" and "b/docs/\347\224\250\346\210\267\346\225\260\346\215\256\345\220\214\346\255\245\350\257\264\346\230\216\346\226\207\346\241\243.pdf" differ