add logic to handle if mark as not suit when job detail is not match

This commit is contained in:
geekgeekrun
2025-05-01 22:01:05 +08:00
parent 45d14e70fb
commit 67e4b94f9e
11 changed files with 223 additions and 60 deletions

View File

@@ -1,4 +1,4 @@
import { MarkAsNotSuitReason } from "../enums";
import { MarkAsNotSuitOp, MarkAsNotSuitReason } from "../enums";
import { requireTypeorm } from "../utils/module-loader";
import { ChatStartupFrom } from "./ChatStartupLog";
const { Entity, Column, PrimaryGeneratedColumn } = requireTypeorm()
@@ -27,6 +27,11 @@ export class MarkAsNotSuitLog {
})
markReason?: MarkAsNotSuitReason
@Column({
nullable: true
})
markOp?: MarkAsNotSuitOp
@Column({
nullable: true
})

View File

@@ -3,4 +3,10 @@ export enum MarkAsNotSuitReason {
BOSS_INACTIVE = 1,
USER_MANUAL_OPERATION_WITH_UNKNOWN_REASON = 2,
JOB_NOT_SUIT = 3,
}
}
export enum MarkAsNotSuitOp {
MARK_AS_NOT_SUIT_ON_BOSS = 1,
MARK_AS_NOT_SUIT_ON_LOCAL = 2,
NO_OP = 3
}

View File

@@ -1,4 +1,4 @@
import { DataSource } from "typeorm";
import { DataSource, Raw } from "typeorm";
import { BossActiveStatusRecord } from "./entity/BossActiveStatusRecord";
import { BossInfo } from "./entity/BossInfo";
import { CompanyInfo } from "./entity/CompanyInfo";
@@ -270,7 +270,7 @@ export async function saveMarkAsNotSuitRecord(
ds: DataSource,
_jobInfo,
{ encryptUserId },
{ autoStartupChatRecordId = undefined, markFrom = undefined, extInfo = undefined, markReason = undefined } = {}
{ autoStartupChatRecordId = undefined, markFrom = undefined, extInfo = undefined, markReason = undefined, markOp = undefined } = {}
) {
const { jobInfo } = _jobInfo;
@@ -283,7 +283,8 @@ export async function saveMarkAsNotSuitRecord(
autoStartupChatRecordId,
markFrom,
markReason,
extInfo: extInfo ? JSON.stringify(extInfo) : undefined
extInfo: extInfo ? JSON.stringify(extInfo) : undefined,
markOp
}
Object.assign(markAsNotSuitLog, markAsNotSuitLogPayload)
@@ -326,3 +327,15 @@ export async function saveGptCompletionRequestRecord(
//#endregion
return
}
export async function getNotSuitMarkRecordsInLastSomeDays (ds: DataSource, days = 0) {
const repo = ds.getRepository(MarkAsNotSuitLog)
const result = await repo.findBy({
date: Raw(alias => `DATE(${alias}) >= DATE('${
new Date(
Number(new Date()) - 7 * 24 * 60 * 60 * 1000
).toISOString()
}')`)
})
return result
}

View File

@@ -22,10 +22,12 @@ import { ChatMessageRecord } from './entity/ChatMessageRecord'
import { LlmModelUsageRecord } from './entity/LlmModelUsageRecord'
import sqlite3 from 'sqlite3';
import { saveChatStartupRecord, saveJobInfoFromRecommendPage, saveMarkAsNotSuitRecord } from "./handlers";
import { saveChatStartupRecord, saveJobInfoFromRecommendPage, saveMarkAsNotSuitRecord, getNotSuitMarkRecordsInLastSomeDays } from "./handlers";
import { UpdateChatStartupLogTable1729182577167 } from "./migrations/1729182577167-UpdateChatStartupLogTable";
import minimist from 'minimist'
import { UpdateBossInfoTable1732032381304 } from "./migrations/1732032381304-UpdateBossInfoTable";
import { MarkAsNotSuitOp } from "./enums";
import { AddColumnForMarkAsNotSuitLog1746092370665 } from "./migrations/1746092370665-AddColumnForMarkAsNotSuitLog";
export function initDb(dbFilePath) {
const { DataSource } = requireTypeorm()
@@ -59,6 +61,7 @@ export function initDb(dbFilePath) {
migrations: [
UpdateChatStartupLogTable1729182577167,
UpdateBossInfoTable1732032381304,
AddColumnForMarkAsNotSuitLog1746092370665,
],
migrationsRun: true
});
@@ -97,6 +100,19 @@ export default class SqlitePlugin {
return await userInfoRepository.save(user);
}
);
hooks.mainFlowWillLaunch.tapPromise(
"SqlitePlugin",
async ({
jobNotMatchStrategy,
blockJobNotSuit
}) => {
if (jobNotMatchStrategy === MarkAsNotSuitOp.MARK_AS_NOT_SUIT_ON_LOCAL) {
const ds = await this.initPromise;
const last7DayMarkRecords = (await getNotSuitMarkRecordsInLastSomeDays(ds, 7) ?? []).map(it => it.encryptJobId);
last7DayMarkRecords.forEach(id => blockJobNotSuit.add(id))
}
}
);
hooks.jobDetailIsGetFromRecommendList.tapPromise("SqlitePlugin", async (_jobInfo) => {
const ds = await this.initPromise;
@@ -111,13 +127,14 @@ export default class SqlitePlugin {
});
});
hooks.jobMarkedAsNotSuit.tapPromise("SqlitePlugin", async (_jobInfo, { markFrom = ChatStartupFrom.AutoFromRecommendList, markReason = undefined, extInfo = undefined } = {}) => {
hooks.jobMarkedAsNotSuit.tapPromise("SqlitePlugin", async (_jobInfo, { markFrom = ChatStartupFrom.AutoFromRecommendList, markReason = undefined, extInfo = undefined, markOp = undefined } = {}) => {
const ds = await this.initPromise;
return await saveMarkAsNotSuitRecord(ds, _jobInfo, this.userInfo, {
autoStartupChatRecordId: this.runRecordId,
markFrom,
markReason,
extInfo
extInfo,
markOp
});
});
}

View File

@@ -0,0 +1,31 @@
import { MigrationInterface, QueryRunner, TableColumn } from "typeorm";
const viewNames = [
"v_boss_library",
"v_chat_startup_log",
"v_company_library",
"v_job_library",
"v_mark_as_not_suit_log",
];
export class AddColumnForMarkAsNotSuitLog1746092370665 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
for (const viewName of viewNames) {
await queryRunner.query(`DROP VIEW IF EXISTS "${viewName}"`);
}
if (await queryRunner.hasTable("mark_as_not_suit_log")) {
if (!await queryRunner.hasColumn("mark_as_not_suit_log", "markOp")) {
await queryRunner.addColumn(
"mark_as_not_suit_log",
new TableColumn({
name: "markOp",
type: "number",
isNullable: true,
})
);
}
}
}
public async down(queryRunner: QueryRunner): Promise<void> {}
}