fix(aihr): keep assignment sources server-owned
This commit is contained in:
+3
-1
@@ -1906,7 +1906,9 @@ public class AihrPracticeSeedService {
|
|||||||
String scenarioId = firstNonBlank(request == null ? null : request.scenarioId(), "fee-parking");
|
String scenarioId = firstNonBlank(request == null ? null : request.scenarioId(), "fee-parking");
|
||||||
ScenarioSeed scenario = resolveScenario(scenarioId, null);
|
ScenarioSeed scenario = resolveScenario(scenarioId, null);
|
||||||
String traineeName = firstNonBlank(request == null ? null : request.traineeName(), extPartyId);
|
String traineeName = firstNonBlank(request == null ? null : request.traineeName(), extPartyId);
|
||||||
String source = firstNonBlank(request == null ? null : request.source(), "manual");
|
// Assignment source is a server-owned classification. Client supplied values
|
||||||
|
// must not turn a manual supervisor assignment into a daily/retry/camp record.
|
||||||
|
String source = "manual";
|
||||||
String reason = firstNonBlank(request == null ? null : request.reason(), "主管派发专项训练");
|
String reason = firstNonBlank(request == null ? null : request.reason(), "主管派发专项训练");
|
||||||
Timestamp createdAt = Timestamp.valueOf(now);
|
Timestamp createdAt = Timestamp.valueOf(now);
|
||||||
jdbcTemplate.update("""
|
jdbcTemplate.update("""
|
||||||
|
|||||||
+11
@@ -109,6 +109,17 @@ public class AihrPracticeSeedServiceTest {
|
|||||||
assertEquals("缺少员工ID,无法派发专项训练", error.getMessage());
|
assertEquals("缺少员工ID,无法派发专项训练", error.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void supervisorAssignmentSourceIsServerOwned() throws Exception {
|
||||||
|
String source = Files.readString(Path.of("src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java"));
|
||||||
|
int methodStart = source.indexOf("public PracticeAssignmentResponse createAssignment(PracticeAssignmentRequest request)");
|
||||||
|
int methodEnd = source.indexOf("public PracticeAssignmentResponse createAssignment(PracticeAssignmentRequest request, String supervisorExtPartyId)", methodStart);
|
||||||
|
String method = source.substring(methodStart, methodEnd);
|
||||||
|
|
||||||
|
assertTrue(method.contains("String source = \"manual\""));
|
||||||
|
assertFalse(method.contains("request.source()"));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void newHireWindowUsesInclusiveThreeMonthBoundary() {
|
public void newHireWindowUsesInclusiveThreeMonthBoundary() {
|
||||||
LocalDate asOf = LocalDate.of(2026, 7, 14);
|
LocalDate asOf = LocalDate.of(2026, 7, 14);
|
||||||
|
|||||||
@@ -269,3 +269,4 @@
|
|||||||
- 2026-07-14 BRD 6.3 SOP 来源标识修复:SOP 检索成功时前端原先忽略 API 返回的 `records`,后端返回的内置记录也没有来源字段,可能把演示文档显示成真实知识库;现 API 成功态只使用响应记录,内置记录明确标记 `source=demo`,失败/未检索态继续保留已有回退提示。未修改知识库数据或生产环境。
|
- 2026-07-14 BRD 6.3 SOP 来源标识修复:SOP 检索成功时前端原先忽略 API 返回的 `records`,后端返回的内置记录也没有来源字段,可能把演示文档显示成真实知识库;现 API 成功态只使用响应记录,内置记录明确标记 `source=demo`,失败/未检索态继续保留已有回退提示。未修改知识库数据或生产环境。
|
||||||
- 2026-07-14 当前线上资源复核:生产根站、`/h5/` 和 `/prod-api/auth/tenant/list` 均返回 `200`;线上管理端 `index-CJZ3Ax3Z.js` SHA-256 为 `8b9278a26ccb760abce489b12a20b221748c64d4c4153613d2511777bb9677bc`,当前分支构建 `index-B3bSjqdi.js` SHA-256 为 `2ff13b11307631f9cd672247d6d08e395fb674ac5b9c6f7c4fb27832eacdf075`;线上 H5 `index-D4-NrEpb.js` SHA-256 为 `ab15bfd17cabe58e2f34b0ac61ee198a837128ed85dc6bb0ddf77bc3e22dcd9c`,当前分支构建 `index-8gZKJTho.js` SHA-256 为 `c6b01faeba4198cb7ff9f5c2ffa88f1cc97c8ecdf20be86f432ca7a1d673f3e1`。本轮只读核验,未执行生产静态资源同步、后端重启或业务数据写入。
|
- 2026-07-14 当前线上资源复核:生产根站、`/h5/` 和 `/prod-api/auth/tenant/list` 均返回 `200`;线上管理端 `index-CJZ3Ax3Z.js` SHA-256 为 `8b9278a26ccb760abce489b12a20b221748c64d4c4153613d2511777bb9677bc`,当前分支构建 `index-B3bSjqdi.js` SHA-256 为 `2ff13b11307631f9cd672247d6d08e395fb674ac5b9c6f7c4fb27832eacdf075`;线上 H5 `index-D4-NrEpb.js` SHA-256 为 `ab15bfd17cabe58e2f34b0ac61ee198a837128ed85dc6bb0ddf77bc3e22dcd9c`,当前分支构建 `index-8gZKJTho.js` SHA-256 为 `c6b01faeba4198cb7ff9f5c2ffa88f1cc97c8ecdf20be86f432ca7a1d673f3e1`。本轮只读核验,未执行生产静态资源同步、后端重启或业务数据写入。
|
||||||
- 2026-07-14 BRD 4.4 场景派发覆盖复核:数据库已有 12 个生活顾问场景,但移动端主管“指派专项”和“复盘后再练”此前只提供 3 个静态场景,导致其余已启用场景无法从主管入口使用;现改为 API 优先加载已启用场景,失败时保留 3 个本地兜底。BRD 所称 7–14 天专项训练营目前仍只有 `source='camp'` 标签,没有训练营计划、天数、每日任务、进度和完成规则,需 HR 确认内容与运营口径后再实现,不以标签冒充训练营闭环。
|
- 2026-07-14 BRD 4.4 场景派发覆盖复核:数据库已有 12 个生活顾问场景,但移动端主管“指派专项”和“复盘后再练”此前只提供 3 个静态场景,导致其余已启用场景无法从主管入口使用;现改为 API 优先加载已启用场景,失败时保留 3 个本地兜底。BRD 所称 7–14 天专项训练营目前仍只有 `source='camp'` 标签,没有训练营计划、天数、每日任务、进度和完成规则,需 HR 确认内容与运营口径后再实现,不以标签冒充训练营闭环。
|
||||||
|
- 2026-07-14 BRD G3/M5 派发来源完整性复核:主管派发接口此前信任客户端 `source`,理论上可把手工派发伪装成 `daily`、`retry` 或 `camp`,污染每日题、低分再练和训练营统计;现将主管创建任务的来源固定为服务端 `manual`,`daily/retry` 仍只由各自系统路径生成。新增服务源码回归测试与 `demo-check` marker,未修改生产数据。
|
||||||
|
|||||||
@@ -517,6 +517,7 @@ contains mobile-uni/src/pages/supervisor/review/index.vue "人工贡献分"
|
|||||||
contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrMobileController.java "/practice/reviews/{id}/reviewed"
|
contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrMobileController.java "/practice/reviews/{id}/reviewed"
|
||||||
contains mobile-uni/src/pages/supervisor/review/index.vue "标记已复盘"
|
contains mobile-uni/src/pages/supervisor/review/index.vue "标记已复盘"
|
||||||
contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java "source = 'retry'"
|
contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java "source = 'retry'"
|
||||||
|
contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java 'String source = "manual"'
|
||||||
contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java "isWithinNewHireWindow"
|
contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java "isWithinNewHireWindow"
|
||||||
contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java "allow-legacy-daily-drill-fallback"
|
contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java "allow-legacy-daily-drill-fallback"
|
||||||
contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java "isLegacyDailyDrillFallbackEnabled"
|
contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java "isLegacyDailyDrillFallbackEnabled"
|
||||||
|
|||||||
Reference in New Issue
Block a user