diff --git a/manager/src/main/java/org/jiayunet/service/JobCleanService.java b/manager/src/main/java/org/jiayunet/service/JobCleanService.java index 17a6526..6e099ec 100644 --- a/manager/src/main/java/org/jiayunet/service/JobCleanService.java +++ b/manager/src/main/java/org/jiayunet/service/JobCleanService.java @@ -69,12 +69,7 @@ public class JobCleanService { @Scheduled(cron = "0 */1 * * * ?") public void cleanJob() { // 批量锁定:原子操作,clean_status 0→1 - int locked = appJobDataMapper.update(null, - new LambdaUpdateWrapper() - .set(AppJobData::getCleanStatus, 1) - .eq(AppJobData::getCleanStatus, 0) - .eq(AppJobData::getIsValid, 1) - .last("LIMIT " + batchSize)); + int locked = appJobDataMapper.update(null, new LambdaUpdateWrapper().set(AppJobData::getCleanStatus, 1).eq(AppJobData::getCleanStatus, 0).eq(AppJobData::getIsValid, 1).last("LIMIT " + batchSize)); if (locked == 0) { return; @@ -82,11 +77,7 @@ public class JobCleanService { log.info("岗位清洗:锁定{}条数据", locked); // 查出刚锁定的数据 - List dataList = appJobDataMapper.selectList( - new LambdaQueryWrapper() - .eq(AppJobData::getCleanStatus, 1) - .eq(AppJobData::getIsValid, 1) - .last("LIMIT " + batchSize)); + List dataList = appJobDataMapper.selectList(new LambdaQueryWrapper().eq(AppJobData::getCleanStatus, 1).eq(AppJobData::getIsValid, 1).last("LIMIT " + batchSize)); // 多线程并发处理 for (AppJobData data : dataList) { @@ -143,6 +134,8 @@ public class JobCleanService { if (json.startsWith("```")) { json = json.replaceAll("^```\\w*\\n?", "").replaceAll("\\n?```$", "").trim(); } + // 清除控制字符(Tab等),保留换行符,防止 Jackson 解析失败 + json = json.replaceAll("[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F]", ""); JsonNode root = HttpTool.objectMapper.readTree(json); @@ -222,7 +215,8 @@ public class JobCleanService { 6. tags 是核心职能标签(如数据分析、团队协作),最多5个 7. skillTags 是技能关键词(如Java、MySQL),最多8个 8. companyShortName 去掉地区后缀、招聘后缀、括号内容,保持简洁 - 9. 只返回JSON,不要其他内容 + 9. 字符串值中不允许出现Tab、换行等控制字符,用空格或中文标点替代 + 10. 只返回JSON,不要其他内容 """; }