Files
test/app/service/__pycache__/employment_service.cpython-311.pyc
T

82 lines
9.5 KiB
Plaintext
Raw Normal View History

2026-09-21 19:03:31 +08:00
§
°‰ªjèãó¬—dZddlmZddlmZddlmZddlmZm Z ddl
m Z ddl m
Z
ddlmZdd lmZmZmZdd
lmZdd lmZmZGd „d
¦«ZdS)u¬就业业务规则(需求 2.3):一个事务里完æˆ�"写就业表 + 改学生状æ€�"。
为什么必须在一个事务里
--------------------------------------------------------------------------
需求写得很明白:"登记就业信��功时,必须**�时**执行:就业表�入记录 +
学生表状�更新"。这两步是"�么都���么都��"的关系——
中间断电/异常时,如果就业记录写进去了而学生状�没改,�级就业率就会长期�低,
而且是那�没人会�现的错。所以这里统一 flush�由调用方一次 commit,
任何一步抛异常都由 FastAPI 的会��赖整体回滚。
返回值约定(�用字符串拼�示语,改由调用方组装):
register -> (employment, created, status_changed, from_text, to_text)
update -> (employment, status_changed, from_text, to_text)
delete -> (status_changed, from_text, to_text)
é)Ú annotations)ÚSession)Úsettings)Ú
BusinessErrorÚ
NotFoundError)Ú
parse_date)Ú
EmploymentDao)Ú
StudentDao)Ú
EmploymentÚStudentÚ
StudentStatus)ÚSTUDENT_STATUS_TEXT)ÚEmploymentCreateÚEmploymentUpdatecóæ—eZdZedd„¦«Zedd„¦«Zed d
„¦«Zed!d„¦«Zed"d„¦«Z ed#d„¦«Z
ed$d„¦«Z ed%d„¦«Z ed&d„¦«Z
dS)'ÚEmploymentServiceÚreturnÚintcó —|�ttj¦«S|�ttj¦«Sttj¦«S)uZ学生状æ€�的唯一真æº�:有 offer = 已就业,å�ªæœ‰å¼€æ”¾æ—¶é—´ = 进入就业。)rr
ÚEMPLOYEDÚ EMPLOYINGÚSTUDYING©Ú open_dateÚ
offer_dates ú6D:\xwt0803\wolin_sms\app\service\employment_service.pyÚ
derive_statuszEmploymentService.derive_status!sC€ð Ð !Ý•}Ô-Ñ.Ô.Ð .Ø Ð Ý•}Ô.Ñ/Ô/Ð /Ý•=Ô)Ñ*Ô*Ð*óÚcodeú
int | Noneú
str | NonecóN—|€dStj|t|¦«¦«S©N)rÚgetÚstr)rs rÚ status_textzEmploymentService.status_text*s%€à ˆ<Ø�4Ý"Ô& t­S°©Y¬YÑ7Ô7Ð7rÚstudentr Ú
employmentr ú#tuple[bool, str | None, str | None]cóØ—| |j|j¦«}| |j¦«}| |¦«}|j|krd||fS||_d||fS)ug按就业记录推导并写回学生状æ€�,返回 (是å�¦å�˜åŒ–, 原状æ€�文案, 新状æ€�文案)。FT)rrrr&Ústatus)Úclsr'r(ÚtargetÚ before_textÚ
after_texts rÚ apply_statuszEmploymentService.apply_status0sq€ð×"Ò" :Ô#7¸Ô9NÑOÔOˆØ—o’o g¤nÑ5Ô5ˆ Ø—_’_ VÑ,Ô,ˆ
Ø Œ>˜VÒ #Ð #ؘ+ zÐ1Ð 1؈ŒØ�[ *Ð,Ð,rÚdbrÚpayloadrú5tuple[Employment, bool, bool, str | None, str | None]c óö—tj||j¦«}|€td|j›d�¦«‚|j}t j||jd¬¦«}|dup
|jdk}|€*t|j¬¦«}|  |¦«d|vrt|j d ¦«n|j }d
|vrt|j d ¦«n|j }| 
||¦«d |_|j|_||_ ||_ d
D]%} | |vrt|| t!|| ¦«¦«Œ&| ¦«| ||¦«\}
} } | ¦«|||
| | fS)u-登记就业信æ�¯ï¼ˆå·²å­˜åœ¨åˆ™æ›´æ–°ï¼‰ã€‚Nu学生ä¸�存在(id=õ)T)Ú with_deletedé)Ústu_idrõ就业开放时间rõoffer 下å�‘æ—¶é—´r©ÚcompanyÚsalaryÚpositionÚcityÚremark)r
r$r8rÚmodel_fields_setr Ú
get_by_stu_idÚis_delr ÚaddrrrÚ _check_datesÚclass_idÚsetattrÚgetattrÚflushr0)
r,r1r2r'Úexplicitr(ÚcreatedrrÚkeyÚchangedÚbeforeÚafters
rÚregisterzEmploymentService.register<s²€õ
”.  W¤^Ñ4Ô4ˆØ ˆ?ÝÐ K¸¼Ð KÐ KÐ KÑLÔLÐ LàÔ+ˆÝ"Ô0°°W´^ÐRVÐWÑWÔWˆ
Ø Ð$Ð>¨
Ô(9¸QÒ(>ˆØ Ð Ý#¨7¬>Ð:Ñ:Ô:ˆJØ �FŠF�:Ñ Ô Ð ð ˜hÐ&Ð&õ
�wÔ(Ð*>Ñ ?Ô ?Ð ?àÔ%ð ð˜xÐ'Ð'õ
�wÔ)Ð+?Ñ @Ô @Ð @àÔ&ð ð
×Ò˜ JÑ/Ô/Ð/ðˆ
ÔØ%Ô.ˆ
ÔØ(ˆ
ÔØ *ˆ
ÔØFð @ð @ˆCØ�hˆˆÝ˜
 C­°¸#Ñ)>Ô)>Ñ?Ô?Ð?øà
�Љ
Œ
ˆ
Ø!$×!1Ò!1°'¸:Ñ!FÔ!Fш�˜Ø
�Љ
Œ
ˆ
ؘ7 G¨V°UÐ:Ð:rrú/tuple[Employment, bool, str | None, str | None]cóŒ—| d¬¦«}d|vr#t| d¦«d¦«n|j}d|vr#t| d¦«d¦«n|j}| ||¦«d|vr||_d|vr||_dD]}||vrt
||||¦«Œ|jr&|j|jjkr|jj|_|  ¦«|j€|dddfS| 
|j|¦«\}} }
|  ¦«||| |
fS) NT)Ú
exclude_unsetrr9rr:r;F) Ú
model_dumprr$rrrErGr'rFrIr0) r,r1r(r2ÚdatarrrLrMrNrOs rÚupdatezEmploymentService.updatehsy€ð×!Ò!°Ð!Ñ5Ô5ˆàOZÐ^bÐObÐOb•J˜tŸxšx¨ Ñ4Ô4Ð6JÑKÔKÐKÐhrÔh|ˆ ØQ]ÐaeÐQeÐQe•Z §¢¨Ñ 6Ô 6Ð8LÑMÔMÐMÐkuôlAˆ
Ø ×Ò˜ JÑ/Ô/Ð/ð ˜$Ð Ð Ø#,ˆJÔ Ø ˜4Ð Ð Ø$.ˆJÔ !ØFð 4ð 4ˆCØ�dˆ{ˆ{ݘ
 C¨¨c¬Ñ3Ô3Ð3øð Ô ð > *Ô"5¸Ô9KÔ9TÒ"TÐ"TØ",Ô"4Ô"=ˆJÔ à
�Љ
Œ
ˆ
Ø Ô Ð %ؘu d¨DÐ0Ð 0Ø!$×!1Ò!1°*Ô2DÀjÑ!QÔ!Qш�˜Ø
�Љ
Œ