hyb
2026-01-09 4cb426cb3ae31e772a09d4ade5b2f0242aaeefa0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
Ë
~˜2itGãó&—ddlZddlZddlZddlmZddlZddlZddlmZddl    m
Z
m Z m Z m Z ddlZdZdZdZdZd    Zd
Zd Zd ZdZgZej2«ZGd „d«Zdedefd„ZGd„d«Zd„Ze dk(rejBe««yy)éN)ÚError)Údatetime)ÚListÚDictÚAnyÚOptionaludbExcel/数据库信息.xlsxu更新日志.csvu用户信息导出z
Baoyi@1341éÿÿÿÿéz 192.168.6.168ircó"—eZdZdZd„Zd„Zd„Zy)ÚRedisRefresheruRedis缓存刷新器có—d|_y©N)Ú redis_client)Úselfs õsh:\项目\archive\测试组\脚本\Change_password\异步批量修改数据库的哈希密码和原始密码V2.0.pyÚ__init__zRedisRefresher.__init__ s
€Ø ˆÕócƒóLK—    ddl}|jtttd¬«|_t j|j
j«ƒd{–—†y7Œ#t$rtd«Yyt$r!}tdt|«›«Yd}~yd}~wwxYw­w)u连接Redis服务器rNT)ÚhostÚportÚpasswordÚdecode_responsesu@错误: æœªå®‰è£…redis库,请使用 'pip install redis' å®‰è£…Fu连接Redis失败: ) ÚredisÚRedisÚ
REDIS_HOSTÚ
REDIS_PORTÚREDIS_PASSWORDrÚasyncioÚ    to_threadÚpingÚ ImportErrorÚprintÚ    ExceptionÚstr)rrÚes   rÚ connect_rediszRedisRefresher.connect_redis#s”èø€ð    ã Ø %§ ¡ ÜÜÜ'Ø!%ð    !,ó!ˆDÔ ô×#Ñ# D×$5Ñ$5×$:Ñ$:Ó;× ;Ð ;Øð <ùäò    Ü ÐTÔ UÙÜò    Ü Ð'¬¨A« xÐ0Ô 1Üûð    üsM‚B$„AA"ÁA ÁA"ÁB$Á A"Á"B!Á6B$Á8B!ÂBÂB$ÂB!Â!B$c
ƒóK—    |js|j«ƒd{–—†sy    tj|jjd«ƒd{–—†}t |j dd««}d}d}t|«D]s}    |jjj«}tj|jd|«ƒd{–—†tj|j«ƒd{–—†tj|jd«ƒd{–—†tj|j«ƒd{–—†}|dkDrktj|jd«ƒd{–—†tj|j«ƒd{–—†|d    z }||z }td
|›d |›d «tj|jjj|«ƒd{–—†Œvdd|›d|›d fS7Œå7Œ´#d}YŒžxYw7ŒE7Œ!7Œû7ŒÖ7Œ«7Œ†7Œ0#t$r%}td |›dt|«›«Yd}~ŒËd}~wwxYw#t$r}ddt|«›fcYd}~Sd}~wwxYw­w)u刷新所有Redis数据库N)Fu无法连接Redis服务器ڠ   databasesérÚSELECTÚDBSIZEÚFLUSHDBr
u已刷新数据库 u : æ¸…除了 u ä¸ªé”®u刷新数据库 u  æ—¶å‡ºé”™: Tu 成功刷新 u ä¸ªRedis数据库,共清除 Fu"刷新Redis缓存时发生错误: )rr&rrÚ
config_getÚintÚgetÚrangeÚconnection_poolÚget_connectionÚ send_commandÚ read_responser"Úreleaser#r$)    rÚconfigÚdb_countÚ refreshed_dbsÚ
total_keysÚdb_indexÚ temp_clientÚ    key_countr%s             rÚrefresh_all_redisz RedisRefresher.refresh_all_redis8s^èø€ð.    HØ×$Ò$Ø!×/Ñ/Ó1×1Ð1Ø>ð ä&×0Ñ0°×1BÑ1B×1MÑ1MÈ{Ó[×[Ü˜vŸz™z¨+°rÓ:Ó;ð
ˆM؈Jô" (›Oó ðà"&×"3Ñ"3×"CÑ"C×"RÑ"RÓ"TKÜ!×+Ñ+¨K×,DÑ,DÀhÐPXÓY×YÐYÜ!×+Ñ+¨K×,EÑ,EÓF×FÐFô"×+Ñ+¨K×,DÑ,DÀhÓO×OÐOÜ&-×&7Ñ&7¸ ×8QÑ8QÓ&R× RIà  1’}ä%×/Ñ/° ×0HÑ0HÈ)ÓT×TÐTÜ%×/Ñ/° ×0IÑ0IÓJ×JÐJØ%¨Ñ*˜ Ø" iÑ/˜
ÜР3°H°:¸\È)ÈÐT[Ð\Ô]ä!×+Ñ+¨D×,=Ñ,=×,MÑ,M×,UÑ,UÐWbÓc×cÒcð' ð2˜=¨¨Ð7VÐWaÐVbÐbiÐjÐjÐ jðS2ùð \úð à“úðZùØFùðPøØ RøðUøØJøð
dùä òÜÐ,¨X¨J°lÄ3ÀqÃ6À(ÐKÔLÝûðûô ò    HØÐ>¼sÀ1»v¸hÐGÐGÕ Gûð    Hüs‚I?„I£H¤I¨I?ª-HÁH ÁHÁ7I AH(ÃHÃ&H(Ã:HÃ;'H(Ä"HÄ#&H(Å    H Å
,H(Å6H"Å7&H(ÆH$ÆAH(Ç5H&Ç6H(Ç: IÈI?ÈIÈ HÈHÈIÈH(ÈH(ÈH(È H(È"H(È$H(È&H(È(    IÈ1IÉ IÉIÉIÉ    I<É"I7É1I<É2I?É7I<É<I?N)Ú__name__Ú
__module__Ú __qualname__Ú__doc__rr&r=©rrr r s„Ùò!òó*0Hrr ÚnameÚreturncóX—tjdd|«}|jdd«}|S)u3清理文件名,移除可能引起问题的字符z [\\/*?:"<>|]Úú Ú_)ÚreÚsubÚreplace)rCs rÚsanitize_filenamerLks+€ô 6‰6/ 2 tÓ ,€Dà <‰<˜˜SÓ !€DØ €Krc ó—eZdZdZ    ddedededededef d„Zd    eejjjfd
„Z d    e fd „Zdd eeed    eefd„Zdedede d    e fd„Zded    efd„Zd    e fd„Zdd eeed    e fd„Zy )ÚDatabaseUpdateru数据库更新器类ÚprojectrÚdatabaseÚuserrrcóf—||_||_||_||_||_||_g|_yr)rOrrPÚdb_userÚ db_passwordrÚ updated_users)rrOrrPrQrrs       rrzDatabaseUpdater.__init__ws5€àˆŒ ؈Œ    Ø ˆŒ ؈Œ Ø#ˆÔ؈Œ    ØˆÕrrDc ƒó&K—    tjtjj|j
|j |j|j|jd¬«ƒd{–—†}|S7Œ#t$r}td|j›d|›«t4ƒd{–—†7tj|j|jdddd|›d    œ«ddd«ƒd{–—†7n#1ƒd{–—†7swYnxYwYd}~yd}~wwxYw­w)
u建立数据库连接T)rrrQrrPÚuse_pureNõ❌ [u] æ•°æ®åº“连接失败:u 连接失败rFõ错误信息: ©õ项目u    æ•°æ®åº“u用户IDõ    ç”¨æˆ·åu 明文密码u 哈希密码)rrÚmysqlÚ    connectorÚconnectrrrSrTrPrr"rOÚlog_lockÚ log_recordsÚappend)rÚconnr%s   rr_zDatabaseUpdater.connectsìèø€ð    Ü ×*Ñ*Ü—‘×'Ñ'Ø—Y‘YØ—Y‘YØ—\‘\Ø×)Ñ)ØŸ™Øô÷ˆDðˆKðùôò     Ü E˜$Ÿ,™,˜Ð'AÀ!ÀÐEÔ FÜ÷ ò Ü×"Ñ"Ø"Ÿl™lØ!%§¡Ø .Ø!#Ø$&Ø&4°Q°CÐ$8ñ $ô÷ ÷ ÷ ÷ ó úôûð     üs}‚D„A)A6Á-A4Á.A6Á3DÁ4A6Á6    DÁ?%D    Â$B'Â%D    Â)4C/à D    Ã(C+Ã)D    Ã/D    Ã5C8Ã6D    Ã=D    ÄDÄ    DÄDc󬗠   |jd«|j«duS#t$r%}td|j›d|›«Yd}~yd}~wwxYw)u$检查是否存在 plain_text å­—段z,SHOW COLUMNS FROM sys_user LIKE 'plain_text'NrXu#] æ£€æŸ¥ plain_text å­—段失败:F©ÚexecuteÚfetchonerr"rO)rÚcursorr%s   rÚcheck_plain_text_columnz'DatabaseUpdater.check_plain_text_column›sS€ð    Ø N‰NÐIÔ JØ—?‘?Ó$¨DÐ0Ð 0øÜò    Ü E˜$Ÿ,™,˜Ð'JÈ1È#ÐNÔ OÜûð    ús‚"%¥    A®AÁANÚ user_filtercóŠ—    d}tg}t|t«r;|r9djdgt    |«z«}|d|›dz }|j |«n|dk(rt dk7r |dt ›z }|j||«|j«S#t$r'}td    |j›d
|›«gcYd }~Sd }~wwxYw) u!获取需要更新的用户列表z‰
                SELECT id, login_name, name, current_role_id 
                FROM sys_user 
                WHERE id != %s
            ú,z%sz AND login_name IN (ú)ÚLIMITr    z LIMIT rXu] èŽ·å–ç”¨æˆ·åˆ—è¡¨å¤±è´¥ï¼šN) ÚPROTECTED_USER_IDÚ
isinstanceÚlistÚjoinÚlenÚextendÚ
USER_COUNTrfÚfetchallrr"rO)rrhrjÚbase_sqlÚparamsÚ placeholdersr%s       rÚget_users_to_updatez#DatabaseUpdater.get_users_to_update¤sˀð    ðˆHô (Ð(ˆFô˜+¤tÔ,±Ø"Ÿx™x¨¨´°[Ó1AÑ(AÓB ØÐ2°<°.ÀÐBÑBØ— ‘ ˜kÕ*Ø Ò'Ü Ò#Ø '¬*¨Р6Ñ6Hà N‰N˜8 VÔ ,Ø—?‘?Ó$Ð $øÜò    Ü E˜$Ÿ,™,˜Ð'DÀQÀCÐHÔ I؍Iûð    ús‚BB    CÂB=Â7CÂ=CÚuser_idÚ
login_nameÚhas_plain_textc    ór—    tjd¬«}tjtj    d«|«j d«}|rd}|j |t||f«yd}|j |||f«y#t$r(}td|j›d|›d    |›«Yd
}~y d
}~wwxYw) u更新用户密码é
©Úroundsúutf-8zŽ
                    UPDATE sys_user
                    SET plain_text = %s, password = %s
                    WHERE id = %s
                z}
                    UPDATE sys_user
                    SET password = %s
                    WHERE id = %s
                TrXu] æ›´æ–°ç”¨æˆ· u å¯†ç å¤±è´¥ï¼šNF)
ÚbcryptÚgensaltÚhashpwÚNEW_PASSWORD_PLAINÚencodeÚdecoderfrr"rO)    rrhr{r|r}ÚsaltÚhashedÚ
update_sqlr%s             rÚupdate_user_passwordz$DatabaseUpdater.update_user_password¿sº€ð    Ü—>‘>¨Ô,ˆDÜ—]‘]Ô#5×#<Ñ#<¸WÓ#EÀtÓL×SÑSÐT[Ó\ˆFñð
ð
—‘˜zÔ,>ÀÈÐ+PÔQðð
ð
—‘˜z¨F°GÐ+<Ô=àøÜò    Ü E˜$Ÿ,™,˜ °z°lÐBRÐSTÐRUÐVÔ WÜûð    ús‚A+BÁ.B    B6ÂB1Â1B6Úrole_idcóė    |sy|jd|f«|j«}|r|dSdS#t$r%}td|j›d|›«Yd}~yd}~wwxYw)    u æ ¹æ®è§’色ID获取角色名称õ    æ— è§’色z'SELECT name FROM sys_role WHERE id = %sru角色不存在rXu] èŽ·å–è§’è‰²åç§°å¤±è´¥ï¼šNu 获取失败re)rrhrÚresultr%s     rÚ get_role_namezDatabaseUpdater.get_role_nameÛsi€ð        "ÙØ"à N‰NÐDÀwÀjÔ QØ—_‘_Ó&ˆFÙ &6˜!‘9Ð =Ð,=Ð =øÜò    "Ü E˜$Ÿ,™,˜Ð'DÀQÀCÐHÔ IÜ!ûð    "ús‚1…)1¯1±    AºAÁAc
ƒó¼K—    |jstd|j›d«ytjt
d¬«t td„|jD«««}i}|D]0}tj|j||«ƒd{–—†}|||<Œ2g}|jD]5}|j|dt|d    |j|d
d «d œ«Œ7tj|«}t!|j«}    t#j$«j'd «}
|    ›d|
›d} tj(j+t
| «} tj|j,| d¬«ƒd{–—†td|j›d| ›«y7Œ7Œ##t.$r%} td|j›d| ›«Yd} ~ yd} ~ wwxYw­w)u导出用户信息到Excelu⚠️ [u)] æ²¡æœ‰æ›´æ–°è¿‡çš„用户,无需导出FT)Úexist_okc3ó2K—|]}|dsŒ    |d–—Œy­w)rNrB)Ú.0rQs  rú    <genexpr>z3DatabaseUpdater.export_user_info.<locals>.<genexpr>ósèø€Òb°DÐRVÐW`ÓRa  Y¥Ñbùs‚

Nr|rCrr)r\u密码u姓名u 角色名称z%Y%m%du测试环境账号密码_z.xlsx)Úindexõ✅ [u] ç”¨æˆ·ä¿¡æ¯å·²å¯¼å‡ºåˆ°: rXu] å¯¼å‡ºç”¨æˆ·ä¿¡æ¯å¤±è´¥ï¼š)rUr"rOÚosÚmakedirsÚ
EXPORT_DIRrqÚsetrrr‘rbr†r/ÚpdÚ    DataFramerLrÚnowÚstrftimeÚpathrrÚto_excelr#)rrhÚrole_idsÚ role_name_maprÚ    role_nameÚ export_datarQÚ    df_exportÚsafe_project_nameÚdate_strÚfilenameÚfilepathr%s              rÚexport_user_infoz DatabaseUpdater.export_user_infoèsÄèø€ð+    Ø×%Ò%ܘ §¡ Ð.WÐXÔYØô K‰Kœ
¨TÕ 2ôœCÑb¸D×<NÑ<NÔbÓbÓcˆHðˆMØ#ò 3Ü")×"3Ñ"3°D×4FÑ4FÈÐPWÓ"X×X    Ø)2 ˜gÒ&ð 3ð
ˆKØ×*Ñ*ò Ø×"Ñ"Ø!% lÑ!3Ü0Ø" 6™lØ$1×$5Ñ$5°d¸9±oÀ{Ó$Sñ    $õð ôŸ ™  [Ó1ˆIô!2°$·,±,Ó ?Ð Ü—|‘|“~×.Ñ.¨xÓ8ˆHØ+Ð,Ð,EÀhÀZÈuÐUˆHÜ—w‘w—|‘|¤J°Ó9ˆHô×#Ñ# I×$6Ñ$6¸ÈÔN× NÐ NÜ E˜$Ÿ,™,˜Ð'CÀHÀ:ÐNÔ OØð3Yùð. Oùôò    Ü E˜$Ÿ,™,˜Ð'DÀQÀCÐHÔ IÜûð    üs^‚G„%F+©GªA+F+ÂF&ÂC/F+ÆF)ÆF+Æ%GÆ&F+Æ)F+Æ+    GÆ4GÇGÇGÇGcƒóK—d}d}    |j«ƒd{–—†}|s'    |r|j«|r|j«yy|j«}tj|j
|«ƒd{–—†}tj|j ||«ƒd{–—†}|s@td|j›d«    |r|j«|r|j«yy|D]\}}}}    tj|j||||«ƒd{–—†}
|
sŒ7|jj||||    dœ«t4ƒd{–—†tj|j|j|||rtndt!j"tj%d«t!j&d¬    ««j)d«d
œ«ddd«ƒd{–—†td |j›d |›d |›d«Œ|j+«td |j›dt-|j«›d«    |r|j«|r|j«yy7ŒS7Œõ7ŒÏ7ŒZ7Œ+7Œ›#1ƒd{–—†7swYŒ«xYw#t.$r´} td|j›d| ›«t4ƒd{–—†7tj|j|jdddd| ›d
œ«ddd«ƒd{–—†7n#1ƒd{–—†7swYnxYwYd} ~ |r|j«|r|j«yyd} ~ wwxYw#|r|j«|r|j«wwxYw­w)u!更新数据库中的用户密码NFrXu,] æœªæ‰¾åˆ°ç¬¦åˆæ¡ä»¶çš„用户,跳过。)Úidr|rCru    æœªæ›´æ–°r‚rr€rZr˜u    ] ç”¨æˆ· z (ID:u) æ›´æ–°æˆåŠŸu] å…± u ä¸ªç”¨æˆ·æ›´æ–°å®ŒæˆTu] æ•°æ®åº“操作失败:u 操作失败rFrY)r_Úcloserhrrrirzr"rOrŒrUrbr`rarPr†rƒr…r‡r„rˆÚcommitrsr) rrjrcrhr}ÚusersÚuidr|rCÚcurrent_role_idÚsuccessr%s             rÚupdate_databasezDatabaseUpdater.update_databases2èø€àˆØˆðC    ØŸ™›×'ˆDÙØñzØ— ‘ ”ÙØ—
‘
• ððy—[‘[“]ˆFô$+×#4Ñ#4°T×5QÑ5QÐSYÓ#Z×ZˆNô"×+Ñ+¨D×,DÑ,DÀfÈkÓZ×ZˆEáܘ˜dŸl™l˜^Ð+WÐXÔYØñ`Ø— ‘ ”ÙØ—
‘
• ðð_;@ó _Ñ6Z  Ü '× 1Ñ 1Ø×-Ñ-¨v°s¸JÈó!÷òà×&Ñ&×-Ñ-Ø!Ø&0Ø $Ø#2ñ    /ôô (÷    ñ    Ü#×*Ñ*Ø&*§l¡lØ)-¯©Ø(+Ø)3ÙBPÕ,>ÐVaÜ,2¯M©MÔ:L×:SÑ:SÐT[Ó:\Ü6<·n±nÈBÔ6Oó-QßQWÑQWÐX_ÓQ`ñ,ô÷    ÷    ô˜E $§,¡, ¨y¸¸ ÀEÈ#ÈÈnÐ]Ö^ð3 _ð8 K‰KŒMÜ E˜$Ÿ,™,˜ v¬c°$×2DÑ2DÓ.EÐ-FÐF\Ð]Ô ^ØñØ— ‘ ”ÙØ—
‘
• ððC(ùð[ùð[ùðùð    ùð    ø÷    ÷    ñ    ûô"ò     Ü E˜$Ÿ,™,˜Ð'AÀ!ÀÐEÔ FÜ÷ ò Ü×"Ñ"Ø"Ÿl™lØ!%§¡Ø .Ø!#Ø$&Ø&4°Q°CÐ$8ñ $ô÷ ÷ ÷ ÷ ó úóáØ— ‘ ”ÙØ—
‘
• ðûð     ûñØ— ‘ ”ÙØ—
‘
• ðüs)‚M>ˆJ›I.œJ£&M>Á    3JÁ<I1Á=(JÂ%I4Â&JÃ&M>Ã,1JÄI7ÄJÄ%*JÅI:ÅJÅBI?Ç JÇ!I=Ç"A%JÉ&M>É.JÉ1JÉ4JÉ7JÉ:JÉ=JÉ?J    ÊJÊJ    Ê JÊ    MÊ%M ËKËM Ë4L Ë; M ÌL    ÌM Ì L    ÌLÌL    ÌM Ì"MÌ&&M>Í MÍMÍ'M;Í;M>)iê r)r>r?r@rAr$r.rrr]r^Ú
connectionÚMySQLConnectionr_ÚboolrirÚtuplerzrŒr‘r¬rµrBrrrNrNtsï„Ùð8<ñ  ð ¨3ð ¸#ð Øð Ø&)ð Ø14ó ð˜x¨¯©×(BÑ(B×(RÑ(RÑSóð4°óñ°xÀÀSÁ    Ñ7JðÐVZÐ[`ÑVaóð6°CðÀSðØ-1ðØ6:óð8 "¨Sð "°Só "ð-°ó-ñ^G°¸$¸s¹)Ñ1DðGÐPTôGrrNc    ƒóÈ    K—    tjt«}|dj «j «}|s t    d«yt    d«t|d«D]\}}t    d|›d|›«Œ    td    «j«}|st    d
«|}ni    |jd d «jd «Dcgc]}t|j««dz
‘Œ }}|D    cgc]}    ||    ‘Œ    }}    |s td «‚    t    d«t    d«t    d«td«j«}
d} |
dk(r€    td«j«} | s t    d«Œ(| jd d «jd «D cgc]} | j«‘Œ} } t| «dk(r t    d«nnŒ|
dk7r t    d«d}
||dj!|«}|j"r t    d«yg}|j%«D]F\}}|dd\}}}}}}t    d|›d|›d|›«t'||||||«}|j)|«ŒHg}|D]*}|j)|j+|
dk(r| nd ¬!««Œ,t-j.|Žƒd{–—†|D]Ì}|j0sŒtd"|j2›d#«j«j5«}|d$k(s|d%k(re    |j7«ƒd{–—†}|rI|j9«}|j;|«ƒd{–—†|j=«|j=«Œ´t    d(|j2›d)«ŒÎt>rYt-j@tjBt>«jDtFd*d+¬,«ƒd{–—†t    d-tF›«n t    d.«t    d/«tI«}|jK«ƒd{–—†\}}|rt    d0|›«yt    d1|›«y#t$r}t    d|›«Yd}~yd}~wwxYwcc}wcc}    w#ttf$r}t    d|›d«Yd}~nd}~wwxYwŒ cc} w7Œð7Œ‰7Œa#t$r&}t    d&|j2›d'|›«Yd}~Œd}~wwxYw7Œ7ŒÅ­w)2u主异步函数u❌ è¯»å–Excel文件失败:Nr[u(❌ Excel æ–‡ä»¶ä¸­æœªæ‰¾åˆ°ä»»ä½•项目uI
请选择要处理的项目(输入编号,多个用逗号分隔):r
z  [z] u)
请输入项目编号(例如 1,3):u+⚠️ æœªé€‰æ‹©é¡¹ç›®ï¼Œé»˜è®¤å¤„理全部u,rlu至少选择一个有效项目u❌ è¾“入无效:u,请重新输入u
请选择操作模式:u9  [1] æ‰¹é‡æ›´æ–°æ‰€æœ‰ç”¨æˆ·ï¼ˆæŽ’除ID为1的用户)u  [2] æŒ‡å®šç”¨æˆ·åæ›´æ–°u!请输入模式编号(1/2):Ú2u0请输入用户名(多个用逗号分隔):u⚠️ ç”¨æˆ·åä¸èƒ½ä¸ºç©ºru%❌ è‡³å°‘输入一个有效用户名Ú1u.⚠️ è¾“入无效,默认使用批量模式u.❌ ç­›é€‰åŽæ— æœ‰æ•ˆé¡¹ç›®ï¼Œè¯·æ£€æŸ¥è¾“å…¥éu
🚀 å‡†å¤‡å¤„理项目:u | æ•°æ®åº“:u  | ç«¯å£ï¼šrn)rju
是否导出项目 u çš„用户信息? (y/N): ÚyÚyesu❌ å¯¼å‡ºé¡¹ç›® u ç”¨æˆ·ä¿¡æ¯æ—¶å‡ºé”™: u⚠️ è·³è¿‡é¡¹ç›® u çš„用户信息导出Fz    utf-8-sig)r—Úencodingu$
✅ æ‰€æœ‰æ›´æ–°æ—¥å¿—已保存至 u"⚠️ æ— ä»»ä½•更新记录生成u
开始刷新Redis缓存...u✅ u❌ )&rÚ
read_excelÚ
EXCEL_PATHr#r"ÚuniqueÚtolistÚ    enumerateÚinputÚstriprKÚsplitr.Ú
ValueErrorÚ
IndexErrorrsÚisinÚemptyÚiterrowsrNrbrµrÚgatherrUrOÚlowerr_rhr¬r¯rarržÚto_csvÚ LOG_CSV_PATHr r=)Údfr%Ú all_projectsÚidxrOÚselectedÚselected_projectsÚnÚindexesÚiÚmoderjÚ    usernamesrCÚ df_filteredÚupdatersrHÚrowrrrPrQrÚupdaterÚtasksÚ export_choicercrhÚredis_refresherr´Úmessages                               rÚmainräasîèø€ðÜ ]‰]œ:Ó &ˆð h‘<×&Ñ&Ó(×/Ñ/Ó1€LÙ Ü Ð8Ô9Øô
Ð
VÔWÜ! ,°Ó2ò&‰ ˆˆWÜ C5˜˜7˜)Ð$Õ%ð&ð ÜÐEÓF×LÑLÓNˆÙÜ Ð?Ô @Ø ,Ð Ø ð    ?Ø3;×3CÑ3CÀEÈ3Ó3O×3UÑ3UÐVYÓ3ZÖ[¨a”s˜1Ÿ7™7›9“~¨Ó)Ð[ˆGÐ[Ø:AÖ B°Q ¨a£РBÐ РBÙ$Ü Ð!AÓBÐBØ ô
 
Ð
&Ô'Ü    Ð
EÔFÜ    Ð
'Ô(Ü Ð4Ó 5× ;Ñ ;Ó =€Dà€KØ ˆs‚{ØÜÐPÓQ×WÑWÓYˆIÙÜÐ4Ô5ØØ4=×4EÑ4EÀeÈSÓ4Q×4WÑ4WÐX[Ó4\Ö]¨D˜4Ÿ:™:<Ð]ˆKÐ]ܐ;Ó 1Ò$ÜÐ=Õ>àðð
ŠÜ Ð>Ô?؈ðR˜‘\×&Ñ&Ð'8Ó9Ñ:€KØ×ÒÜ Ð>Ô?Øð€HØ×&Ñ&Ó(ò!‰ˆˆ3Ø8;¸B¸Q¸Ñ5ˆt˜X t¨XÜ Ð,¨W¨I°_ÀXÀJÈlÐ[_ÐZ`ÐaÔbÜ! '¨4°¸4ÀÈ4ÓPˆØ‰˜Õ ð    !ð €EØò ˆØ  ‰ W×,Ñ,Ø'+¨s¢{™ ¸ð-ó
õ     ð ô
.‰.˜%Ð
 × Ð ðòVˆØ ×  Ó  Ü!Ð$9¸'¿/¹/Ð9JÐJcÐ"dÓe×kÑkÓm×sÑsÓuˆMØ Ò# }¸Ò'=ð\Ø!(§¡Ó!2×2DÙØ!%§¡£˜Ø%×6Ñ6°vÓ>×>Ð>ØŸ ™ œØŸ
™
œ øôÐ,¨W¯_©_Ð,=Ð=SÐTÕUðVõ"ä×ÑÜ L‰LœÓ %× ,Ñ ,Ü ØØ ô    
÷    
ð    
ô     Ð5´l°^ÐDÕEä Ð2Ô3ô
Ð
(Ô)Ü$Ó&€OØ,×>Ñ>Ó@×@Ñ€GˆWÙÜ WIÐÕä WIÐÕøôc òÜ Ð.¨q¨cÐ2Ô3Üûðüò.\ùÚ BøôœJÐ'ò    ?Ü Ð'¨ sÐ*<Ð=× >Ñ >ûð    ?úñ ùò:^ð<!ùð3ùð?úô!ò\ÜÐ-¨g¯o©oÐ->Ð>VÐWXÐVYÐZ×[Ò[ûð\úð    
ùðAús‚S"„QB    S"Â'#Q0Ã
#Q&Ã-Q0Ã3 Q+Ã?Q0ÄB S"ÆRÆ2DS"Ê2R"Ê3S"Ë    ?S"Ì    R+ÌR%Ì*R+ÍR(Í$R+Í,A#S"ÏSÏA
S"ÐS Ð'S"Ñ    Q#Ñ QÑS"ÑQ#Ñ#S"Ñ&
Q0Ñ0RÑ?RÒS"ÒRÒ S"Ò%R+Ò(R+Ò+    SÒ4SÓS"ÓSÓS"Ó S"Ú__main__)"ÚpandasrrƒÚmysql.connectorr]rrr™rÚtypingrrrrrIrÂrÑr›r†rurorrrraÚLockr`r r$rLrNrär>ÚrunrBrrú<module>rës¿ðÛÛ ÛÝ!ÛÛ    Ýß,Ó,Û    ð,€
Ø!€ Ø !€
Ø!ÐØ €
ØÐð€
Ø €
Ø€ð€ Ø ˆ7<‰<‹>€÷KHñKHð\˜Cð Có÷jñjòZv ðt ˆzÒØ€G‡KK‘“Õðr