feat: add Jinshuju student sync
All checks were successful
CI / check (pull_request) Successful in 2m14s

This commit is contained in:
2026-07-22 11:37:20 +08:00
parent 1dc13274de
commit 393ee62168
18 changed files with 1378 additions and 12 deletions

View File

@@ -0,0 +1,53 @@
import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';
/**
* Field mappings from Jinshuju field keys (field_1, field_2, ...) to Student columns.
* Only mapped fields are extracted; unmapped fields are ignored.
*/
export interface JinshujuFieldMapping {
/** Jinshuju field key → Student column name */
name?: string; // e.g. "field_1"
phone?: string; // e.g. "field_2"
idNumber?: string; // e.g. "field_3"
gender?: string;
ethnicity?: string;
emergencyContact?: string;
emergencyPhone?: string;
studentNo?: string;
}
export const DEFAULT_MAPPING: JinshujuFieldMapping = {
name: 'field_1',
phone: 'field_2',
};
const mappingTransformer = {
to(value: JinshujuFieldMapping): string {
return JSON.stringify(value);
},
from(value: string | null): JinshujuFieldMapping {
if (!value) return {};
return JSON.parse(value);
},
};
@Entity('jinshuju_match_rules')
export class JinshujuMatchRule {
@PrimaryGeneratedColumn()
id: number;
@Column({ length: 100 })
name: string;
@Column({ name: 'form_token', length: 64 })
formToken: string;
@Column({ type: 'text', transformer: mappingTransformer })
mappings: JinshujuFieldMapping;
@CreateDateColumn({ name: 'created_at' })
createdAt: Date;
@UpdateDateColumn({ name: 'updated_at' })
updatedAt: Date;
}