验证状态:已源码核验、未联调;适用基线:Web
959f8f9、servicesaed1381;核验日期:2026-09-12
本页是本资源族操作页复用的字段正本。字段来自当前后端 DTO、Mapper 与序列化配置;“可空未知”表示源码没有足以证明数据库值或成功响应一定非空的约束。时间字段均按 UTC epoch 秒传输,响应顶层 timestamp 例外为 epoch 毫秒,详见数据类型与时间。
所有 list、page 和树查询都接收 JSON object。资源 DTO 还声明了审计字段和时间范围过滤,但当前 Web 只发送下表字段;App 不应把未列出的动态查询能力当作稳定合同。
| JSON 路径 | JSON 类型 | 必填 | 可空 | 默认值/范围 | 语义与证据 |
|---|---|---|---|---|---|
sqlQueryCriteriaLike |
boolean | 否 | 是 | true |
false 时字符串按精确匹配;各 *ListRequestDTO 与 Mapper selectWhere |
sqlQueryCriteria |
object<string,string> |
否 | 否 | {} |
Mapper 已观察值为字段级 eq,deleteTime=skip 可包含已删除行;不要发送任意 SQL |
sqlQuerySorter.field |
string | 否 | 是 | 无 | 仅 Mapper 显式白名单字段生效;未知字段不形成排序 |
sqlQuerySorter.order |
string | 否 | 是 | 非 ascend 按降序分支 |
当前 Web 只发送 ascend 或省略;Mapper 未定义其他稳定枚举 |
sqlQueryLimit |
number | 否 | 是 | null→100;钳制到 1..100000 |
QueryLimits.normalizeSqlQueryLimit;Web 下拉选择用 1000,XLSX 导出用 100000 |
current |
number | 否(Web 始终发送) | 未承诺 | 省略时 Java primitive 为 0;Web 从 1 开始 | Java long,Controller 没有 Bean Validation;当前 Web 每次递增页码 |
pageSize |
number | 否(Web 始终发送) | 未承诺 | 省略时 Java primitive 为 0;Web 为 10 | Java long,本组 Controller 未调用 normalizePageSize,服务端边界未闭合 |
字符串筛选默认是包含匹配;sqlQueryCriteriaLike=false 或对应 sqlQueryCriteria.<field>="eq" 才是精确匹配。范围结束值在 Mapper 中使用 <,因此是左闭右开。
| 字段组 | JSON 类型 | 说明 |
|---|---|---|
employeeId、employeeNo、orgId、callName、fullName、mobilePhone、telePhone、intro、icon、employeeState、enableIntercom、username |
string | 可选筛选;当前 Web 页面使用 employeeNo/callName/fullName/orgId,选择器还使用 employeeId |
numberOfChannels、revision |
number | 可选精确筛选 |
birthDateRangeStart/End、effectiveStartTimeRangeStart/End、effectiveEndTimeRangeStart/End、审计时间范围 |
number | UTC epoch 秒;结束值不含 |
tenantId、tenantIds[] |
string、array | 服务端作用域字段;普通 App 不以此替代已认证租户 |
data[] 或详情 data 的雇员对象字段为:employeeId、employeeNo、orgId、orgNo、orgName、callName、fullName、mobilePhone、telePhone、intro、icon、employeeState、enableIntercom、username(string,可空未知),numberOfChannels、revision(number,可空未知),birthDate、effectiveStartTime、effectiveEndTime、createdTime、lastModifiedTime、deleteTime(number,UTC epoch 秒,可空未知),以及 createdUsername、lastModifiedUsername、tenantId(string,可空未知)。证据为 Employee*ResponseDTO、EmployeeMapper.selectColumns/selectOnePlusResponseDTOByEmployeeId。
| JSON 路径 | JSON 类型 | 保存必填 | 更新必填 | 可空 | 长度/语义 |
|---|---|---|---|---|---|
employeeId |
string | 否 | 是 | 保存可省略 | 最长 32;Web 保存时生成 ID |
employeeNo |
string | 是 | 是 | 否 | 1..36;Controller 按精确值拒绝重复 |
orgId |
string | Web 是 | Web 是 | 后端可空 | 最长 32;Web 从机构树选择 |
callName、fullName |
string | 否 | 否 | 是 | 最长 256 |
mobilePhone、telePhone |
string | 否 | 否 | 是 | 最长 36 |
intro |
string | 否 | 否 | 是 | 最长 1024 |
birthDate、effectiveStartTime、effectiveEndTime |
number | 否 | 否 | 是 | UTC epoch 秒;小于 1 反序列化为 null |
icon |
string | 否 | 否 | 是 | 最长 512;最终文件责任端未由本接口证明 |
numberOfChannels、revision |
number | 否 | 否 | 是 | DTO 未给范围 |
employeeState |
string | 否 | 否 | 是 | 最长 128;枚举未闭合 |
enableIntercom |
string | 否 | 否 | 是 | 最长 1;枚举未闭合 |
username |
string | 是 | 是 | 否 | 后端 3..36;Web 表单仅要求 1..36,短于 3 会在后端失败 |
password、confirmPassword |
string | 是 | 是 | 否 | 最长 1024;Web 把 3..20 位字母数字口令转成大写 MD5 后发送;后端不比较两字段 |
roleIds、userGroupIds |
array<string> |
否 | 否 | 是 | 绑定目标用户的角色/用户组;当前 Web 始终发送数组 |
查询字段包括 employeeUserId、employeeId、usernamePrefix、username、employeeNo、employeeFullName、userFullName(string),审计/租户与通用查询控制字段同上。返回对象字段为 employeeUserId、employeeId、usernamePrefix、username、employeeNo、employeeFullName、userFullName、createdUsername、lastModifiedUsername、tenantId(string),createdTime、lastModifiedTime、deleteTime(UTC epoch 秒)和 revision(number);成功响应字段的可空性源码未完全约束。
保存要求 employeeId、username 为非空 string、最长分别 32 和 36;employeeUserId 可省略、最长 32,Web 会生成。更新还要求非空 employeeUserId。usernamePrefix 可省略、最长 36,服务会按 username 计算前缀。更新实现只持久化 employeeId 与 revision,不会改写请求中的 username;要更换用户应删除后重建关联。
查询字段为 roleId、roleCode、name、createdUsername、lastModifiedUsername(string),审计时间、revision、tenantId/tenantIds 和通用查询控制字段。返回对象包含 roleId、roleCode、name、createdUsername、lastModifiedUsername、tenantId(string),审计时间(UTC epoch 秒)与 revision(number);详情另含 permissionCodes: array<string>。
写入时 roleCode 是非空 string、最长 36;roleId 保存可省略、更新必填、最长 32;name 可空、最长 256;permissionCodes 可空数组。服务拒绝创建或改写 roleCode="administrator",也拒绝把现有 administrator 角色改成其他代码。角色保存/更新与权限集合变更在同一事务中。
本票实际使用只查询:username(string,消费者发送精确匹配)、roleId、roleUserId、usernamePrefix 及通用查询控制字段。返回对象字段为 roleUserId、roleId、usernamePrefix、username、createdUsername、lastModifiedUsername、tenantId(string),审计时间(UTC epoch 秒)与 revision(number)。
查询字段为 orgId、orgNo、name、parentOrgId、parentOrgNo、parentOrgName、treeOrgId、treeOrgName、审计/租户字段及通用查询控制字段。机构对象返回 orgId、orgNo、name、parentOrgId、parentOrgNo、parentOrgName、treeOrgId、treeOrgName、createdUsername、lastModifiedUsername、tenantId(string),审计时间(UTC epoch 秒)与 revision(number);可空性未由 DTO 单独保证。
保存时 orgNo 必填、1..36;orgId 可省略、最长 32(当前 Web 生成);name 最长 256;parentOrgId 最长 32;treeOrgId/treeOrgName DTO 上限为 Java int 最大值,不能视为可无限输入;roleIds、parentOrgNo、parentOrgName 可省略。更新还要求 orgId 非空;空 parentOrgId 会把 treeOrgId/treeOrgName 重设为自身 ID/名称。Controller 按精确 orgNo 拒绝重复。
查询字段为 tenantId、tenantNoPrefix、tenantNo、tenantType、name、parentTenantId、treeTenantId、treeTenantName、审计字段、tenantIds[] 及通用查询控制字段。返回对象包含同名资源字段、createdUsername、lastModifiedUsername(string),审计时间(UTC epoch 秒)与 revision(number)。
| JSON 路径 | JSON 类型 | 必填 | 限制与行为 |
|---|---|---|---|
tenantId |
string | 当前 Web 是 | 最长 32;Web 对 team/personal-space 分别生成 t_/p_ 前缀;非 administrator 会被 Controller 覆盖为当前租户 |
tenantNo |
string | 是 | 1..36;按精确值拒绝重复 |
tenantType |
string | 是 | 1..128;已核实行为分支只有 team、personal-space,其他非空值会写租户但不执行用户绑定 |
name |
string | 否 | 最长 256 |
parentTenantId |
string | 否 | 最长 32;当前 Web 编辑表单不发送,更新会把空值写回并重设树根字段 |
username |
string | 是 | 后端 3..36;新用户额外限字母、数字、下划线 |
password、confirmPassword |
string | 是 | 最长 1024;Web 发送大写 MD5;后端不比较确认字段 |
更新 DTO 也声明 tenantNoPrefix/treeTenantId/treeTenantName/revision,但当前 Plus 更新实现不持久化它们;tenantType 只决定绑定分支,不改写数据库中的租户类型。
当前 Web 列表使用 username、callName、fullName;查重使用 username + sqlQueryCriteriaLike=false。DTO 还声明 userId、usernamePrefix、email、mobilePhone、地址和个人资料字段、审计时间范围、tenantIds[] 与通用查询控制字段。
用户详情和列表当前 Mapper 会返回下列字段:
| 字段组 | JSON 类型 | 可空 | 说明 |
|---|---|---|---|
userId、usernamePrefix、username、callName、fullName、email、intro、mobilePhone、locus、companyName、telePhone、profession、maritalState、nation、diploma、country、province、city、area、address、gender、qq、idCardNo、portraitUrl、审计用户名 |
string | 未知 | getById 会用关联表查询到的最后一个手机号/邮箱覆盖主用户字段;没有关联时设为 null |
birthDate、审计时间 |
number | 未知 | UTC epoch 秒 |
revision |
number | 未知 | 版本字段 |
password、passwordSalt、privatePassword、privatePasswordSalt |
string | 未知 | 当前 DTO/Mapper 会暴露这些存储值;客户端必须忽略、不得记录或回传。此行为是已确认安全风险,不是推荐合同。 |
保存要求 username 非空、最长 36;userId 可省略、最长 32,当前 Web 生成。callName/fullName 最长 256,intro 最长 1024,portraitUrl 最长 512,email/mobilePhone/telePhone 最长 36;其余个人资料 string 上限见 UserSaveRequestDTO(128、512 或 1024)。birthDate 为 UTC epoch 秒,roleIds/userGroupIds 为 array。
保存不要求 password;为空时服务使用 MD5(username).toUpperCase() 作为初始 wire 密码,再用随机盐加密存储。当前 Web 的“新增用户”表单不发送密码,因此 App 不应假定这是安全的开户流程,应在产品流程确认后立即走改密操作。
更新要求 userId、username 非空。服务只更新非空字符串及非空 birthDate/revision,因此空字符串不能清除旧值;password/passwordSalt/privatePassword/privatePasswordSalt 不由此操作更新。对非当前登录用户,roleIds 仅在非空时同步(空数组不能清空角色),userGroupIds 会同步;当前用户的角色和用户组变更被跳过。
机构和租户树返回 data: array<TreeNode>;每个节点含 title: string(资源名称)、value: string(资源 ID)和 children: array<TreeNode>(叶子可空)。树根由请求的 parentOrgId/parentTenantId 决定。证据为 Lists.TitleValueTreeNode 及 OrgPlusController/TenantPlusController 的 node mapper。
前端:2.0.1-cn-1-yaoht-20260730,HEAD 959f8f913eedd8dbb5b0d1439e8f9b455bf18792。后端:同名分支,HEAD aed13815811b026b6b1f0ae59eb46a334b932c1c。核验日期:2026-09-12。所读 Controller、DTO、Mapper、Service、复合函数和监听器均与各自 HEAD 一致;后端工作树其他文件的脏改动不在本票证据链内。
| 结论 | 状态 | 仓库/基线 | 路径、符号及定位 | 内容指纹(脏文件) |
|---|---|---|---|---|
| Web JSON、header、method 推导与 15 分钟超时 | 已源码核验 | web 959f8f9 |
app/.common/lib/fetch-timeouts.ts:4-75 fetchTimeout/fetchTimeoutResponseJson;app/.common/auth/index.ts:35-52 getFetchRequestInit |
与 HEAD 一致 |
| tenant-bound 表与全局用户表的数据范围差异 | 已源码核验 | services aed1381 |
es-center-server-main-service/src/main/java/com/es/center/server/config/MybatisPlusConfig.java:72-87 TenantLineInnerInterceptor、config/SecurityConfig.java:179-189 tenantIdIgnoreTableFunction、src/main/resources/application-default-es-center-server.yaml:4-9 tenant-id-ignore-tables;gt-common-user-center-common/src/main/resources/mapper/postgresql/gt-common-user-center/UserMapper.xml:4-40,392-405 |
与 HEAD 一致 |
| 雇员字段、校验、查询和 Plus 投影 | 已源码核验 | services aed1381 |
es-center-server-basedata-dto/src/main/java/com/es/center/server/basedata/dto/EmployeeSaveRequestDTO.java:22-128、es-center-server-basedata-dto/src/main/java/com/es/center/server/basedata/dto/EmployeeListRequestDTO.java:23-135、es-center-server-basedata-dto/src/main/java/com/es/center/server/basedata/dto/employee/EmployeeSavePlusRequestDTO.java:21-52;es-center-server-basedata-common/src/main/resources/mapper/postgresql/es-center-server-basedata/EmployeeMapper.xml:4-230 selectColumns/selectWhere |
与 HEAD 一致 |
| 雇员—用户关联字段与唯一性/更新语义 | 已源码核验 | services aed1381 |
es-center-server-basedata-dto/src/main/java/com/es/center/server/basedata/dto/EmployeeUserSaveRequestDTO.java:22-47、es-center-server-basedata-dto/src/main/java/com/es/center/server/basedata/dto/employee_user/EmployeeUserListPlusResponseDTO.java:20-29;es-center-server-basedata-common/src/main/java/com/es/center/server/basedata/service/EmployeeUserService.java:34-100 save/updateById |
与 HEAD 一致 |
| 角色及角色—用户字段 | 已源码核验 | services aed1381 |
gt-common-authority-dto/src/main/java/tech/gt/authority/dto/RoleSaveRequestDTO.java:22-42、gt-common-authority-dto/src/main/java/tech/gt/authority/dto/role/RoleGetByIdPlusResponseDTO.java:21-25、gt-common-authority-dto/src/main/java/tech/gt/authority/dto/RoleUserListRequestDTO.java:23-82;gt-common-authority-common/src/main/java/tech/gt/authority/service/impl/RoleServiceImpl.java:38-93 |
与 HEAD 一致 |
| 机构字段、树与数据权限 | 已源码核验 | services aed1381 |
gt-common-user-center-dto/src/main/java/tech/gt/user/center/dto/OrgSaveRequestDTO.java:22-54、gt-common-user-center-dto/src/main/java/tech/gt/user/center/dto/org/OrgListPlusResponseDTO.java:20-26;es-center-server-main-service/src/main/java/com/es/center/server/user/center/controller/OrgController.java:55-172、OrgPlusController.java:44-156 |
与 HEAD 一致 |
| 租户字段、树与绑定分支 | 已源码核验 | services aed1381 |
gt-common-user-center-dto/src/main/java/tech/gt/user/center/dto/TenantSaveRequestDTO.java:22-63、gt-common-user-center-dto/src/main/java/tech/gt/user/center/dto/tenant/TenantSavePlusRequestDTO.java:22-37;gt-common-user-center-common/src/main/java/tech/gt/user/center/service/impl/TenantServiceImpl.java:43-197;es-center-server-main-service/src/main/java/com/es/center/server/user/center/controller/TenantPlusController.java:320-380 |
与 HEAD 一致 |
| 用户字段、敏感返回字段与写入语义 | 已源码核验 | services aed1381 |
gt-common-user-center-dto/src/main/java/tech/gt/user/center/dto/UserSaveRequestDTO.java:22-156、gt-common-user-center-dto/src/main/java/tech/gt/user/center/dto/UserGetByIdResponseDTO.java:20-127;gt-common-user-center-common/src/main/resources/mapper/postgresql/gt-common-user-center/UserMapper.xml:4-40 selectColumns、gt-common-user-center-common/src/main/java/tech/gt/user/center/service/UserService.java:35-155 |
与 HEAD 一致 |
| 时间、BigDecimal 与响应信封 | 已源码核验 | services aed1381 |
es-center-server-main-service/src/main/java/com/es/center/server/config/JsonFormatConfig.java:20-111;gt-common-core/src/main/java/tech/gt/api/ApiResult.java:43-159 |
与 HEAD 一致 |
| 树节点 JSON 形态 | 已源码核验 | services aed1381 |
gt-common-core/src/main/java/tech/gt/collect/Lists.java:186-199 TitleValueTreeNode |
与 HEAD 一致 |
| 真实部署联调 | 未执行 | — | 未发送请求、未连接数据库/JMS/文件代理 | — |