Files
test/app/model/__pycache__/employment.cpython-313.pyc
T

46 lines
5.8 KiB
Plaintext
Raw Normal View History

2026-09-21 19:03:31 +08:00
ó
O‡ªjSãóŠ•SrSSKJr SSKJr SSKJr SSKJrJ r J
r
J r J r SSK
JrJrJr SSKJrJrJr "SS \\\5rg
) u 就业信�表(需求 2.3)。
关于「学生姓��学生�级属于冗余字段�的处�
--------------------------------------------------------------------------
需求点��自行设计表结构�平衡查询效率与一致性。这里的��:
* **学生姓���库。** 它是 student.name 的投影,1:1 关系,
JOIN 一次的�本�以忽略;而一旦�库,改�就会两处�一致,收益为零。查询接�
统一 `JOIN student` ��字。
* **�级�库(class_id 而� class_name)。** 因为"按�级筛就业�按�级算就业率/
平�就业时长"是高频统计场景,�次 JOIN student � JOIN clazz �本更高;
而且存 id �存�字,�级改��会导致�数�。
代价是学生转�时��步——由 ``EmploymentService.sync_class_id()`` 在学生
接�里兜�,�给"记得改"留��。
* **就业时长��库**,= offer_date - open_date,用 SQL DATEDIFF 或 Python 现算。
状��动(需求 2.3 �选扩展,这里是必�):
登记就业 -> 有 open_date 则学生 status=2(进入就业),
-> 有 offer_date 则学生 status=3(已就业)
删除就业记录 -> 学生状�回退(3 -> 2 -> 1),��许跨级跳。
é)Ú annotations)Údate)ÚDecimal)ÚDateÚ
ForeignKeyÚNumericÚStringÚText)ÚMappedÚ
mapped_columnÚ relationship)ÚBaseÚSoftDeleteMixinÚTimestampMixincó&•\rSrSr%SrSS0r\"SSS9rS\S'\"\ "S 5SS
SS S 9r
S\S
'\"\ "S5SSS9r S\S'\"\ SS9r
S\S'\"\ SS9rS\S'\"\"S5SSS9rS\S'\"\"SS5SSS9rS \S!'\"\"S"5S#S9rS\S$'\"\"S%5S&S9rS\S''\"\S(S9rS\S)'\"SS*S+9rS,\S-'\"S*\ /S.9rS/\S0'\S:S1j5r\S:S2j5r\S;S3j5r\S:S4j5r\S:S5j5r\S;S6j5r \S<S7j5r!S8r"g9)=Ú
Employmenté"Ú
employmentÚcommentu学生就业信æ�¯è¡¨T)Ú primary_keyÚ
autoincrementz Mapped[int]Úidz
student.idFu)学生ID(一学生一æ�¡å°±ä¸šè®°å½•))ÚuniqueÚnullableÚindexrÚstu_idzclazz.iduGç�­çº§ID(冗余,用于按ç�­ç»Ÿè®¡ï¼Œè½¬ç�­æ—¶ç”± service å�Œæ­¥ï¼‰)rrzMapped[int | None]Úclass_idu就业开放时间)rzMapped[date | None]Ú open_dateuoffer 下å�‘æ—¶é—´Ú
offer_dateéPu就业公å�¸å��ç§°zMapped[str | None]Úcompanyé
éu就业薪资(元/月)zMapped[Decimal | None]Úsalaryé2u å²—ä½�å��ç§°Úpositionéu 就业城市Úcityu备注ÚremarkÚjoined)Úback_populatesÚlazyzMapped['Student']Ústudent)r,Ú foreign_keyszMapped['Clazz']ÚklasscóT•UR(aURR$S$©N)r-Úname©Úselfs Úapp\model\employment.pyÚ student_nameÚEmployment.student_name<s€à$(§L§Lˆt�|‰|× Ñ Ð:°dÐ:ócóT•UR(aURR$S$r1)r-Ústu_nor3s r5r:ÚEmployment.stu_no@ó€à&*§l§lˆt�|‰|×"Ñ"Ð<¸Ð<r8cóT•UR(aURR$S$r1)r-Ústatusr3s r5Ústudent_statusÚEmployment.student_statusDr<r8cóT•UR(aURR$S$r1)r-Ú status_textr3s r5Ústudent_status_textÚEmployment.student_status_textHs€à+/¯<¯<ˆt�|‰|×'Ñ'ÐA¸TÐAr8cóˆ•UR(a0URRS:XaURR$S$)Nr)r/Úis_delr2r3s r5Ú
class_nameÚEmployment.class_nameLs.€ð#'§*§*°·±×1BÑ1BÀaÓ1Gˆt�z‰z�‰ÐQÈTÐQr8cóŽ•UR(a4UR(a#URUR-
R$g)uB就业时长 = offer 下å�‘æ—¶é—´ - 就业开放时间(天)。N)rrÚdaysr3s r5Ú
duration_daysÚEmployment.duration_daysQs-€ð �>�>˜dŸoŸoØ—O‘O d§n¡nÑ4×:Ñ:Ð :Ør8cód•URb"[[UR5S- S5$S$)Ni'r#)r$ÚroundÚfloatr3s r5Ú
salary_wanÚEmployment.salary_wanXs,€à7;·{±{Ñ7NŒu”U˜4Ÿ;™;Ó'¨%Ñ/°Ó3ÐXÐTXÐXr8©N)Úreturnz
str | None)rSz
int | None)rSz float | None)#Ú__name__Ú
__module__Ú __qualname__Ú__firstlineno__Ú
__tablename__Ú__table_args__r rÚ__annotations__rrrrrrr r!rr$r&r(r