diff --git a/packages/geek-auto-start-chat-with-boss/index.mjs b/packages/geek-auto-start-chat-with-boss/index.mjs index 92aeca3..dfa3a81 100644 --- a/packages/geek-auto-start-chat-with-boss/index.mjs +++ b/packages/geek-auto-start-chat-with-boss/index.mjs @@ -296,7 +296,7 @@ export async function mainLoop (hooks) { throw new Error('STARTUP_CHAT_ERROR_WITH_UNKNOWN_ERROR') } } else { - hooks.newChatStartup?.call(jobData) + await hooks.newChatStartup?.promise(jobData) blockBossNotNewChat.add(jobData.jobInfo.encryptUserId) await storeStorage(page).catch(() => void 0) diff --git a/packages/run-core-of-geek-auto-start-chat-with-boss/main.mjs b/packages/run-core-of-geek-auto-start-chat-with-boss/main.mjs index 70b8314..9e6d247 100644 --- a/packages/run-core-of-geek-auto-start-chat-with-boss/main.mjs +++ b/packages/run-core-of-geek-auto-start-chat-with-boss/main.mjs @@ -51,7 +51,7 @@ const main = async () => { cookieWillSet: new SyncHook(['cookies']), userInfoResponse: new AsyncSeriesHook(['userInfo']), newChatWillStartup: new AsyncSeriesHook(['positionInfoDetail']), - newChatStartup: new SyncHook(['positionInfoDetail']), + newChatStartup: new AsyncSeriesHook(['positionInfoDetail']), noPositionFoundForCurrentJob: new SyncHook(), noPositionFoundAfterTraverseAllJob: new SyncHook(), errorEncounter: new SyncHook(['errorInfo']) diff --git a/packages/sqlite-plugin/src/entity/BossInfo.ts b/packages/sqlite-plugin/src/entity/BossInfo.ts index 7317872..c72ddc0 100644 --- a/packages/sqlite-plugin/src/entity/BossInfo.ts +++ b/packages/sqlite-plugin/src/entity/BossInfo.ts @@ -15,5 +15,5 @@ export class BossInfo { date: Date; @Column() - title: Date; + title: string; } diff --git a/packages/sqlite-plugin/src/entity/ChatStartupLog.ts b/packages/sqlite-plugin/src/entity/ChatStartupLog.ts index 4c64209..37d4595 100644 --- a/packages/sqlite-plugin/src/entity/ChatStartupLog.ts +++ b/packages/sqlite-plugin/src/entity/ChatStartupLog.ts @@ -6,7 +6,7 @@ export class ChatStartupLog { id: number; @Column() - encryptPositionId: string; + encryptJobId: string; @Column() encryptCurrentUserId: string; diff --git a/packages/sqlite-plugin/src/entity/CompanyInfo.ts b/packages/sqlite-plugin/src/entity/CompanyInfo.ts index 064caef..361ed56 100644 --- a/packages/sqlite-plugin/src/entity/CompanyInfo.ts +++ b/packages/sqlite-plugin/src/entity/CompanyInfo.ts @@ -14,12 +14,12 @@ export class CompanyInfo { @Column({ nullable: true }) - scaleLow?: string; + scaleLow?: number; @Column({ nullable: true }) - scaleHeight?: string; + scaleHeight?: number; @Column({ nullable: true diff --git a/packages/sqlite-plugin/src/entity/JobInfo.ts b/packages/sqlite-plugin/src/entity/JobInfo.ts index 2fa5ab6..f664b5c 100644 --- a/packages/sqlite-plugin/src/entity/JobInfo.ts +++ b/packages/sqlite-plugin/src/entity/JobInfo.ts @@ -26,18 +26,13 @@ export class JobInfo { }) salaryMonth?: number; - @Column({ - nullable: true - }) - experienceYearLow?: number; - - @Column({ - nullable: true - }) - experienceYearHigh?: number; - @Column() - publishDate: Date; + experienceName: string; + + @Column({ + nullable: true + }) + publishDate?: Date; @Column({ nullable: true diff --git a/packages/sqlite-plugin/src/index.ts b/packages/sqlite-plugin/src/index.ts index b847b95..5b3843f 100644 --- a/packages/sqlite-plugin/src/index.ts +++ b/packages/sqlite-plugin/src/index.ts @@ -3,13 +3,14 @@ import { DataSource } from "typeorm"; import { BossInfo } from "./entity/BossInfo"; import { BossInfoChangeLog } from "./entity/BossInfoChangeLog"; -import { ChatStartupLog } from "./entity/ChatStartupLog"; +import { ChatStartupLog } from './entity/ChatStartupLog'; import { CompanyInfoChangeLog } from "./entity/CompanyInfoChangeLog"; import { CompanyInfo } from "./entity/CompanyInfo"; import { JobInfo } from "./entity/JobInfo"; import { JobInfoChangeLog } from "./entity/JobInfoChangeLog"; import { BossActiveStatusRecord } from "./entity/BossActiveStatusRecord"; import { UserInfo } from "./entity/UserInfo"; +import { parseCompanyScale, parseSalary } from "./utils/parser"; async function initDb() { const appDataSource = new DataSource({ @@ -39,21 +40,101 @@ export default class SqlitePlugin { constructor() { this.initPromise = initDb(); } + + userInfo = null + apply(hooks) { - hooks.userInfoResponse.tapPromise("SqlitePlugin", async (userInfoResponse) => { - if (userInfoResponse.code !== 0) { - return + hooks.userInfoResponse.tapPromise( + "SqlitePlugin", + async (userInfoResponse) => { + if (userInfoResponse.code !== 0) { + return; + } + const { zpData: userInfo } = userInfoResponse; + this.userInfo = userInfo + console.log(userInfo); + + const ds = await this.initPromise; + const userInfoRepository = ds.getRepository(UserInfo); + + const user = new UserInfo(); + user.encryptUserId = userInfo.encryptUserId; + user.name = userInfo.name; + + return await userInfoRepository.save(user); } - const { zpData: userInfo } = userInfoResponse - console.log(userInfo); + ); + + hooks.newChatStartup.tapPromise("SqlitePlugin", async (_jobInfo) => { + console.log(_jobInfo); + debugger; const ds = await this.initPromise; - const userInfoRepository = ds.getRepository(UserInfo); - const user = new UserInfo(); - user.encryptUserId = userInfo.encryptUserId - user.name = userInfo.name + const { bossInfo, brandComInfo, jobInfo } = _jobInfo; - return await userInfoRepository.save(user) + //#region boss + const boss = new BossInfo(); + boss.encryptBossId = jobInfo.encryptUserId; + boss.encryptCompanyId = brandComInfo.encryptBrandId; + boss.name = bossInfo.name; + boss.title = bossInfo.title; + boss.date = new Date(); + const bossInfoRepository = ds.getRepository(BossInfo); + await bossInfoRepository.save(boss); + //#endregion + + //#region company + const company = new CompanyInfo(); + company.encryptCompanyId = brandComInfo.encryptBrandId; + company.brandName = brandComInfo.brandName; + company.name = brandComInfo.customerBrandName; + company.industryName = brandComInfo.industryName; + company.stageName = brandComInfo.stageName; + const companyScale = parseCompanyScale(brandComInfo.scaleName) + company.scaleLow = companyScale[0] + company.scaleHeight = companyScale[1] + + const companyInfoRepository = ds.getRepository(CompanyInfo); + await companyInfoRepository.save(company); + //#endregion + + //#region job + const job = new JobInfo(); + const jobSalary = parseSalary(jobInfo.salaryDesc) + const jobUpdatePayload: JobInfo = { + address: jobInfo.address, + degreeName: jobInfo.degreeName, + description: jobInfo.postDescription, + encryptBossId: jobInfo.encryptUserId, + encryptCompanyId: brandComInfo.encryptBrandId, + encryptJobId: jobInfo.encryptId, + jobName: jobInfo.jobName, + positionName: jobInfo.positionName, + experienceName: jobInfo.experienceName, + salaryHeight: jobSalary.heigh, + salaryLow: jobSalary.low, + salaryMonth: jobSalary.month, + }; + + Object.assign(job, jobUpdatePayload); + + const jobInfoRepository = ds.getRepository(JobInfo); + await jobInfoRepository.save(job); + //#endregion + + //#region chat-startup-log + const chatStartupLog = new ChatStartupLog() + const chatStartupLogPayload: Partial = { + date: new Date(), + encryptCurrentUserId: this.userInfo.encryptUserId, + encryptJobId: jobInfo.encryptId, + } + Object.assign(chatStartupLog, chatStartupLogPayload) + + const chatStartupLogRepository = ds.getRepository(ChatStartupLog); + await chatStartupLogRepository.save(chatStartupLog); + //#endregion + return }); } } diff --git a/packages/sqlite-plugin/src/utils/parser.ts b/packages/sqlite-plugin/src/utils/parser.ts new file mode 100644 index 0000000..16544bb --- /dev/null +++ b/packages/sqlite-plugin/src/utils/parser.ts @@ -0,0 +1,67 @@ +export const parseCompanyScale = (str: string): [number| null, number | null] => { + if (!str) { + return [null, null] + } + + const betweenRangeMatchResult = str.match( + /(\d+)-(\d+)人/ + ); + if (betweenRangeMatchResult) { + const arr = [...betweenRangeMatchResult]; + arr.shift(); + return arr.map(Number) as [number, number] + } + + const gtRangeMatchResult = str.match( + /(\d+)人以上/ + ); + if (gtRangeMatchResult) { + const arr = [...gtRangeMatchResult]; + arr.shift(); + return [Number(arr[0]), null] + } + + return [null, null] +} + +export const parseSalary = (str: string): { low: null | number, heigh: null | number, month: null | number } => { + const result = { + heigh: null, + low: null, + month: null + } + if (!str) { + return result + } + + const baseMatchResult = str.match( + /([\.\d]+)-([\.\d]+)k/i + ); + if (baseMatchResult) { + const arr = [...baseMatchResult]; + arr.shift(); + Object.assign( + result, + { + low: Number(arr[0]), + heigh: Number(arr[1]), + } + ) + } + + const month = str.match( + /([\.\d]+)薪/ + ) + if (month) { + const arr = [...month]; + arr.shift(); + Object.assign( + result, + { + month: Number(arr[0]) + } + ) + } + + return result +}