fix(aihr): gate organization display fields in production

This commit is contained in:
2026-07-14 12:07:10 +08:00
parent 183b68a529
commit ed998753be
8 changed files with 46 additions and 18 deletions
@@ -156,6 +156,9 @@ mail:
--- # sms 短信 支持 阿里云 腾讯云 云片 等等各式各样的短信服务商
# https://sms4j.com/doc3/ 差异配置文档地址 支持单厂商多配置,可以配置多个同时使用
aihr:
org-sync:
# 仅开发演示保留姓名/部门展示;生产默认关闭,组织同步只保留必要主体与范围字段
store-display-fields: true
sms:
login-template-id: ${AIHR_SMS_LOGIN_TEMPLATE_ID:}
# 演示兜底:非空则不真发短信,验证码固定为该值(仅 dev,prod 配置不含此项)
@@ -159,6 +159,9 @@ mail:
--- # sms 短信 支持 阿里云 腾讯云 云片 等等各式各样的短信服务商
# https://sms4j.com/doc3/ 差异配置文档地址 支持单厂商多配置,可以配置多个同时使用
aihr:
org-sync:
# BRD 5.4:生产不复制外部人员姓名/部门到本地展示快照
store-display-fields: false
sms:
login-template-id: ${AIHR_SMS_LOGIN_TEMPLATE_ID:}
sms:
@@ -68,6 +68,9 @@ public class AihrOrgSyncService {
@Value("${aihr.org-sync.signing-secret:${AIHR_ORG_SYNC_SIGNING_SECRET:}}")
private String configuredSigningSecret;
@Value("${aihr.org-sync.store-display-fields:${AIHR_ORG_SYNC_STORE_DISPLAY_FIELDS:false}}")
private boolean storeDisplayFields;
public SyncResponse sync(SyncRequest request) {
SyncRequest req = request == null ? new SyncRequest(null, null, null, null, null, null, null, null) : request;
String baseUrl = normalizeBaseUrl(configuredBaseUrl);
@@ -208,9 +211,9 @@ public class AihrOrgSyncService {
rs.getLong("id"),
rs.getString("project_code"),
rs.getString("project_name"),
rs.getString("dept_name"),
storeDisplayFields ? rs.getString("dept_name") : "",
rs.getString("ext_party_id"),
rs.getString("person_name"),
storeDisplayFields ? rs.getString("person_name") : "",
rs.getString("position_name"),
rs.getString("position_level"),
rs.getString("employment_status"),
@@ -387,19 +390,20 @@ public class AihrOrgSyncService {
String projectName = firstNonBlank(
text(employee, "project_name", "projectName", "company_name", "companyName"),
company == null ? "" : company.name(),
deptName,
storeDisplayFields ? deptName : "",
"组织架构"
);
String personName = firstNonBlank(text(employee, "name", "person_name", "personName", "employee_name", "employeeName"), "-");
String positionName = firstNonBlank(text(employee, "position_name", "positionName", "job_title", "jobTitle",
"post_name", "postName", "job_name", "jobName", "role_name", "roleName", "position", "title"), "员工");
String positionLevel = firstNonBlank(text(employee, "position_level", "positionLevel", "job_level", "jobLevel"), level(positionName));
return new OrgRow(
projectCode,
projectName,
deptName,
storeDisplayFields ? deptName : "",
extPartyId,
phone(employee),
firstNonBlank(text(employee, "name", "person_name", "personName", "employee_name", "employeeName"), "-"),
storeDisplayFields ? personName : "",
positionName,
positionLevel(positionLevel, positionName),
status(text(employee, "status", "employment_status", "employmentStatus")),
@@ -442,16 +446,26 @@ public class AihrOrgSyncService {
String keywordValue = clean(keyword);
if (!keywordValue.isBlank()) {
String like = "%" + keywordValue + "%";
where.append("""
and (person_name like ? or ext_party_id like ? or person_phone like ?
or position_name like ? or dept_name like ? or project_name like ?)
""");
args.add(like);
args.add(like);
args.add(like);
args.add(like);
args.add(like);
args.add(like);
if (storeDisplayFields) {
where.append("""
and (person_name like ? or ext_party_id like ? or person_phone like ?
or position_name like ? or dept_name like ? or project_name like ?)
""");
args.add(like);
args.add(like);
args.add(like);
args.add(like);
args.add(like);
args.add(like);
} else {
where.append("""
and (ext_party_id like ? or position_name like ? or project_code like ? or project_name like ?)
""");
args.add(like);
args.add(like);
args.add(like);
args.add(like);
}
}
String project = clean(projectCode);
if (!project.isBlank()) {