
    V{j^O                       d Z ddlZddlZddlZddlZddlZddlZddlmZ ddlZ	ddl
mZmZ ej                            ej                            ej                            e                              Zej                            ed          Zej                            ed          Zej                            ed          Z ej                    ZdZd	Zd
ZdZdZi ZddddddZ ej                    ZdPdZ d Z!d Z"d Z#dQdZ$ej%        &                    d          pF e'ej        (                    d                    )                                *                                Z+ej%        &                    d          pF e'ej        (                    d                    )                                *                                Z,dZ-d Z.dZ/dZ0d Z1ej                            ed!          Z2d" Z3d# Z4d$ Z5d% Z6d& Z7d'd(d)d*d+d(d)d*d,d(d-d*d.d/d0d*d1d/d0d*d2d3d4d*d5d3d6d*d7d/d-d*d8Z8d9 Z9d: Z:ddl;Z<i Z= ej                    Z>ej                            ed;          Z?d<Z@ej                            ed=          ZAd>ZBd?ZCd@ ZDdA ZEdB ZFdC ZGdD ZH eG            Z= G dE dFe          ZIeJdGk    r eKejL                  dHk    r eMejL        dH                   ndIZN eOdJeNefz              eOdK           ddlZPdL ZQ ePjR        eQdMN          S                                  edOeNfeI          T                                 dS dS )Ru  
销售工作台 · 本地数据服务（仅依赖 Python 标准库）

用法：
  1. 把本文件放在同时包含「工具」和「数据」两个文件夹的目录里
  2. python3 销售工作台服务.py          （默认端口 8000）
     python3 销售工作台服务.py 8080     （指定端口）

功能：
  - 静态文件服务（替代原先的静态服务器，原有页面/JSON 路径不变）
  - GET  /api/todos   读取共享待办（存于 数据/todos.json）
  - POST /api/todos   写入共享待办，action 支持：
        save    {user, todos}   整体覆盖某用户的待办列表
        close   {item}          追加一条团队已关闭记录（按 id 去重，最多保留 200 条）
        unclose {id}            按 id 移除已关闭记录（重新打开/删除时调用）
  - 所有 .json 响应自动附加 Cache-Control: no-store，避免浏览器缓存旧数据
    N)datetime)ThreadingHTTPServerSimpleHTTPRequestHandler   数据z
todos.jsonzcustomer_feishu_data.json   z&m-abfb29e8-3104-434f-9944-8d0bb592f8cdz'https://project.feishu.cn/mcp_server/v16593cd71471290e3cc6be6e665ae1e5d44338dbe7c39a29ai  ,  i  	customersorders
complaints
activitiesopportunities2   c                 v   g }d}t          d|dz             D ]}t          | d}|r||d<   |ddg|d<   t          d|d	
          }|s n|                    di           }|s n|                                D ]X\  }}	|	D ]5}
i }|
                    d          p|
                    d          pg D ]}|                    dd          }|                    dd          }t          |t                    rg ||<   |D ]}t          |t                    rWd|v rS||                             |d                             dd          |d                             dd          d           nt          |t                    rTt          |          dk    rA||                             t          |
                                          d                    ||                             |           @t          |t                    r?d|v r;|d                             d|d                             dd                    ||<   t          |t                    r?t          |          dk    r,t          |
                                          d         ||<   |||<   |                    |           7t          |	          dk     r|c c S Z|s|                    dd          }|                    dg           }|D ]1}|                    dd          }t          |          |k    r|c c S 2!|S )uI   拉取全量 MCP 数据，自动翻页，展开 field_list 为扁平 JSONN   )project_keymql
session_iddefault)page_numgroup_idgroup_pagination_listsearch_by_mql<   timeoutdatamoql_field_list
field_listkey valuekey_label_valuelabel)r"   r&   r   r   listcount)rangeMCP_PKmcp_callgetitems
isinstancer'   dictappendlenvalues)	mql_query	max_pages	all_itemsr   pageargsresult	data_dictgidr-   itemflatfkvelemgroup_infosgitotals                         脚本/销售工作台服务.pymcp_pull_allrE   6   s   IJaQ'' -! -!%i88 	,!+D6:	)R)R(S$%/4<<< 	EJJvr**	 	E#//++ 	! 	!JC ' '((#455U,9O9OUSU $ $AeR((Agt,,A!!T** $"$Q$% 5 5D)$55 5:Kt:S:S $Qt<M7N7R7RSXY[7\7\gkl}g~  hC  hC  DK  LN  hO  hO  0P  0P  !Q  !Q  !Q  !Q!+D$!7!7 5CIINN $QtDKKMM/B/B1/E F F F F $Qt 4 4 4 45 $At,, $1Ba1G1G"#$5"6":":7AFWDXD\D\]bceDfDf"g"gQ#At,, $Q1"&qxxzz"2"21"5Q"#Q  &&&&5zzB        	6L"55Jjj,, 	! 	!BFF7A&&E9~~&&       '	!     c                    t           5  t                              |           }|rMt          j                    |d         z
  t                              | d          k     r|d         cddd           S ddd           n# 1 swxY w Y   dS )u    获取缓存，过期返回 Nonetimer
   r   N)MCP_CACHE_LOCK	MCP_CACHEr,   rH   MCP_CACHE_TTL)	cache_keyentrys     rD   get_mcp_cacherN   j   s    	 ! !i(( 	!TY[[5=0=3D3DYPS3T3TTT=! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 4s   AA>>BBc                    t           5  t          j                    |dt          | <   ddd           n# 1 swxY w Y   t          j                            t          d|  d          }	 t          |dz   dd          5 }t          j	        d	t          j
        d
          | dk    rdnd|i|d           ddd           n# 1 swxY w Y   t          j        |dz   |           dS # t          $ r Y dS w xY w)u3   写入缓存 + 写入 JSON 文件作为降级备份)rH   r   Nmcp_.json.tmpwutf-8encoding
updated_at%Y-%m-%d %H:%M:%Sr   r-   Fensure_ascii)rI   rH   rJ   ospathjoinDATA_DIRopenjsondumpstrftimereplace	Exception)rL   r   backup_pathr=   s       rD   set_mcp_cacherf   r   s   	 C C(,	TBB	)C C C C C C C C C C C C C C C ',,x)@	)@)@)@AAK+&g>>> 	]!I|T]3F%G%GXaepXpXpv}  @D  E  GH  W\  ]  ]  ]  ]	] 	] 	] 	] 	] 	] 	] 	] 	] 	] 	] 	] 	] 	] 	]

;'55555   sB   377(C$ =6B?3C$ ?CC$ CC$ $
C21C2c                 0   	 t          |          }t          j                            d|  dt	          |           d           t          j                                         t          | |           t	          |          S # t          $ r	}t          j                            d|  d| d           t          j                                         t          j	        
                    t          d|  d          }t          j	                            |          rv	 t          |d	          5 }t          j        |          }d
d
d
           n# 1 swxY w Y   t	          |                    dg                     cY d
}~S # t          $ r Y nw xY w|d
}~ww xY w)u   强制刷新缓存z[MCP] refresh z: got z items
z ERROR: 
rP   rQ   rT   rU   Nr   )rE   sysstderrwriter1   flushrf   rd   r[   r\   r]   r^   existsr_   r`   loadr,   )rL   r3   r   ere   r=   olds          rD   refresh_mcp_cacherq      s   I&&
N)NN3t99NNNOOO
i&&&4yy   
B)BBQBBBCCC
gll8-DI-D-D-DEE7>>+&& 	+888 'A)A,,C' ' ' ' ' ' ' ' ' ' ' ' ' ' '37762..////////   sa   A>B FBFE>*E?E>E	E>E	%E>8F>
FF
FFF   c                    t           j                            t          t	          j        ddd| |dd                              d          t          ddd	
          }	 t           j                            ||          5 }t	          j	        |
                                          }d|v rd|d         dcddd           S |d         d         D ]>}|                    dd          }d|v rt	          j	        |          c cddd           S 	 ddd           n# 1 swxY w Y   n)# t          $ r}dt          |          dcY d}~S d}~ww xY wdddS )u   调用飞书 MCP APIz2.0r   z
tools/call)name	arguments)jsonrpcidmethodparamsrT   application/json)zX-Mcp-TokenContent-TypePOSTr   headersrx   r   errorFokr   Nr8   contenttextr#   log_idz
no content)urllibrequestRequestMCP_APIr`   dumpsencode	MCP_TOKENurlopenloadsreadr,   rd   str)	rx   r7   r   reqrdctro   s	            rD   r+   r+      s   
.
 
 ZA"%D99
 
   6'?? );MNN ! 	 	C
.^##C#99 	%Q
16688$$A!||#aj99	% 	% 	% 	% 	% 	% 	% 	% x[+ % %EE&"%%q==(z!}}$$	% 	% 	% 	% 	% 	% 	% 	%%		% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%  . . .c!ff--------.,///sU   !D(  5D5D( A DD( D( D  D( #D $D( (
E2E	E	EIMA_OPENAPI_CLIENTIDz~/.config/ima/client_idIMA_OPENAPI_APIKEYz~/.config/ima/api_keyz,fwEO41E0Ef0CfulmtQHYgYQy_jBsbl6tXE5x6VYLIoA=c                    t           j                            d|  t          j        |                              d          t          t          ddd          }t           j                            |d          5 }t          j	        |
                                                    d                    cd	d	d	           S # 1 swxY w Y   d	S )
u   调用 IMA OpenAPIzhttps://ima.qq.com/rT   rz   )zima-openapi-clientidzima-openapi-apikeyr{   r|   r}      r   N)r   r   r   r`   r   r   IMA_CLIENT_IDIMA_API_KEYr   r   r   decode)r\   bodyr   resps       rD   ima_apir      s    
.
 
 $d$$Z$$W--$1"-.
 

  ! 	 	C 
		R		0	0 7Dz$))++,,W55667 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7s   ;9CCCcli_aaee6a2f90b89bc1 arht5fd8wyppZysFvOjUcb2bV0UMVVYF#ou_901b790c9afdda4a8f14554962b32664zima_pending_review.jsonc                 (   	 t          j        t          t          d                                          }t
          j                            d|ddid          }t          j        t
          j        	                    |d          
                                          }|                    d	d
          }|sdS t          j        d|id          }t          j        | d|d                              d          }t
          j                            d|dd|z   dd          }t          j        t
          j        	                    |d          
                                          }|                    d          dk    S # t          $ r Y dS w xY w)u,   发送飞书文本消息，成功返回 Trueapp_id
app_secretzEhttps://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internalr{   rz   r|   r}   
   r   tenant_access_tokenr#   Fr   rY   )
receive_idmsg_typer   rT   zGhttps://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=open_idBearer r{   Authorization   coder   )r`   r   FEISHU_APP_IDFEISHU_APP_SECRETr   r   r   r   r   r   r   r,   rd   )open_idr   r   r   r   tokenr   msgs           rD   feishu_notifyr      s   z]BSTTUU\\^^n$$S0BCF % T T Jv~--c2->>CCEEFF+R00 	5*fd^%@@@jVPWXXYY``ahiin$$U/AT]`eTeffou % w w Jv~--c2->>CCEEFFuuV}}!!   uus   B5F 9C	F 
FFc                  $   	 t           j                            t                    rYt	          t          d          5 } t          j        |           }d d d            n# 1 swxY w Y   t          |t                    r|S n# t          $ r Y nw xY wg S )NrT   rU   )
r[   r\   rm   IMA_REVIEW_FILEr_   r`   rn   r.   r'   rd   r=   r   s     rD   _load_ima_reviewr      s    7>>/** 	o888 !AIaLL! ! ! ! ! ! ! ! ! ! ! ! ! ! !!T""    Is4   :B  AB  A!!B  $A!%B   
BBc                 ,   	 t          j        t          d           t          dz   }t	          |dd          5 }t          j        | |dd	           d d d            n# 1 swxY w Y   t          j        |t                     dS # t          $ r Y dS w xY w)
NTexist_okrR   rS   rT   rU   Fr   rZ   indent)	r[   makedirsr^   r   r_   r`   ra   rc   rd   )r   tmpr=   s      rD   _save_ima_reviewr      s    
Ht,,,,&#sW--- 	=IdAE!<<<<	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	=

3(((t   uus4   7B AB A""B %A"&B 
BBc                  d   t           j                            t                    si g d dS 	 t	          t          d          5 } t          j        |           }d d d            n# 1 swxY w Y   |                    di            |                    dg            |S # t          $ r	 i g d dcY S w xY w)N)usersclosedrW   rT   rU   r   r   )	r[   r\   rm   
TODOS_FILEr_   r`   rn   
setdefaultrd   r   s     rD   
read_storer      s    7>>*%% ?r>>>?*w/// 	1	!A	 	 	 	 	 	 	 	 	 	 	 	 	 	 		Wb!!!	Xr""" ? ? ?r>>>>>?s5   B A#B #A''B *A'+0B B/.B/c                 6   t          j        t          d           t          j        d          | d<   t
          dz   }t          |dd          5 }t          j        | |d	d
           d d d            n# 1 swxY w Y   t          j	        |t
                     d S )NTr   rX   rW   rR   rS   rT   rU   F   r   )
r[   r   r^   rH   rb   r   r_   r`   ra   rc   )r   r   r=   s      rD   write_storer     s    K4((((m$788AlO
v
C	c3	)	)	) 6Q	!QU155556 6 6 6 6 6 6 6 6 6 6 6 6 6 6JsJs   A44A8;A8u   超级管理员adminu   诊断原料销售部)rt   roledeptu	   刘新元u   刘欣u   诊断原料销售拓展部u	   刘子研salesu   诊断原料大客户销售部u	   赵云浩u   吴云manageru   生命科学-浙江u	   韩远怀u   生命科学-广东u	   宋学伟)r   zliuxinyuan@biori.comzliuxin@biori.comzliuziyan@biori.comzzhaoyunhao@biori.comzwuyun@biori.comzhanyuanhuai@biori.comzsongxuewei@biori.comc                    ddg g dd}|dvrd|d<   |S 	 |dk    r]d	d
l }t          | dd          5 }|                    |          }d t          |          D             }d
d
d
           n# 1 swxY w Y   ngd	d
l}|                    | d          }|j        }	t          |	                    ddd                    }
d |
D             }|                                 ||d<   t          d |D                       }t          d |D                       }t          d |D                       }t          d |D                       }t          d |D                       }|r|rd|d<   dt          |           d|d<   nS|s|rd|d<   dt          |           d|d<   n3d t          |           d|d<   |d!                             d"           |S |d         dk    r>d#D ];t          fd$|D                       s|d!                             d%            <|d!         sd|d&<   |dxx         d'z  cc<   nG# t          $ r:}|d!                             t          |                     d(| |d<   Y d
}~nd
}~ww xY w|S ))u<   质检上传文件：检测类型、列名、数据完整性Funknownr#   )passtypecolumnsissuessummary).xlsx.xls.csvuA   不支持的文件格式，仅支持 .xlsx/.xls/.csv 数据文件r   r   r   Nr   	utf-8-sigrU   c                 6    g | ]}|                                 S  )strip.0hs     rD   
<listcomp>z%run_quality_check.<locals>.<listcomp>(  s     ;;;17799;;;rF   T	data_onlyr   min_rowmax_rowvalues_onlyc                 X    g | ]'}|r!t          |                                          nd (S r#   r   r   r   r   s     rD   r   z%run_quality_check.<locals>.<listcomp>.  s/    FFFq2s1vv||~~~FFFrF   r   c              3      K   | ]}d |v V  	dS )   单据编号Nr   r   s     rD   	<genexpr>z$run_quality_check.<locals>.<genexpr>2  s'      ==!+======rF   c              3   &   K   | ]}d |v pd|v V  dS )   价税合计	   税合计Nr   r   s     rD   r   z$run_quality_check.<locals>.<genexpr>3  s1      OO!n)=[A-=OOOOOOrF   c              3   &   K   | ]}d |v pd|v V  dS )u   购货单位u   客户Nr   r   s     rD   r   z$run_quality_check.<locals>.<genexpr>4  s0      QQA>Q.?(a-QQQQQQrF   c              3      K   | ]}d |v V  	dS )u   活动Nr   r   s     rD   r   z$run_quality_check.<locals>.<genexpr>5  s&      ::Q8q=::::::rF   c              3   &   K   | ]}d |v pd|v V  dS )u	   创建者u	   创建人Nr   r   s     rD   r   z$run_quality_check.<locals>.<genexpr>6  s1      PP1+*>kQ.>PPPPPPrF   	erp_orderr   u#   识别为 ERP 销售订单导出，u    列feishu_activityu   识别为 飞书活动导出，u   未识别，r   u   无法匹配处理管线)r   r   c              3       K   | ]}|v V  	d S )Nr   )r   r   r   s     rD   r   z$run_quality_check.<locals>.<genexpr>E  s'      33a16333333rF   u   缺少关键列: r   u   ，质检通过u   质检失败: )csvr_   readernextopenpyxlload_workbookactive	iter_rowscloseanyr1   r0   rd   r   )filepathextr8   r   r=   r   r~   r   wbws	first_row	has_orderhas_taxhas_customerhas_activityhas_creatorro   r   s                    @rD   run_quality_checkr
    s   Y2XZ[[F
+++_y)1&==JJJhk::: <aA;;d6ll;;;< < < < < < < < < < < < < < < OOO''D'AABBR\\!QD\QQRRIFFIFFFGHHJJJ#y==W=====	OOwOOOOOQQQQQQQ::':::::PPPPPPP 		 		(F6N Xc'll X X XF9 	[ 	.F6N T#g,, T T TF9 As7|| A A AF98##$>???M&>[((5 E E3333733333 E8$++,C,C,CDDDh 	3!F6N9!22 1 1 1xA'''0Q00y1 MsB   H= /A-!H= -A11H= 4A15EH= A'H= =
J0I<<Jc                   )* ddl }ddg d}	 t          j                            |          d                                         }|dk    rZddl}t          | dd	
          5 }|                    |          }|j        )t          |          }	ddd           n# 1 swxY w Y   nddl
}
|
                    | d          }|j        }d t          |                    ddd                    D             )g }	|                    dd          D ]\**s|	                    )*fdt!          t#          t%          )          t%          *                              D                        ]|                                 |dk    rddlm}m} )}dx}x}}|D ]}d|v r|}d|v sd|v r|}d|v sd|v r|} |            }|	dd         D ]*|r7t/          *                    |d          pd                                          nd}|                    d          r>t%          |          dk    r+d|dd         z   dz   |dd          z   }||xx         dz  cc<   |                    d!|          }|r>|                    d          dd         dz   |                    d          dd         z   nd}|r!|                    d          d         d         n'|p%t=          j                                         d"          }t=          j                                         d"          } |tB                    }dx}}|	D ]ڊ*|r7t/          *                    |d          pd                                          nd}|r
|d#k    sd$|v rJd}|r%tC          *                    |d          pd          nd}n#  Y zxY w||z  }|r7t/          *                    |d          pd                                          nd}|r|dk    r||xx         |z  cc<   |dz  }t=          j                                         d%          } d& tE          |#                                d' (          D             }!||k    r|| d)| tI          |d          |d* tE          |#                                d+ (          D             d,}"t          t          j        %                    tL          d-          d.d/
          5 }tO          j(        |"|dd0           ddd           n# 1 swxY w Y   |d1                             d-           | d2| d3|d4z  d5d6t%          |!           d7|d8<   nOtS          |*                    d          d                   }#t          j        %                    tL          d9          }$t          |$dd/
          5 }tO          j+        |          }%ddd           n# 1 swxY w Y   tI          |d          |%d:         t/          |#          <   t          |$d.d/
          5 }tO          j(        |%|dd0           ddd           n# 1 swxY w Y   |d1                             d9           t          j        %                    tL          d;          }&t          |&dd/
          5 }tO          j+        |          }'ddd           n# 1 swxY w Y   tI          |'                    d<d          |z   d          |'d<<   tI          |'                    d=d          |'d<         z   d          |'d><   | |'d?<   t          |&d.d/
          5 }tO          j(        |'|dd0           ddd           n# 1 swxY w Y   |d1                             d;           | d@| d3|d4z  d5d6t%          |!           d7|d8<   tY          j-        dAt          j        %                    t\          dBdC          gddDE           |d1                             dF           tY          j-        dGt          j        %                    t\          dBdH          gddIE           d|dJ<   n	dK| dL|d8<   n# t^          $ r}(dM|( |d8<   Y d}(~(nd}(~(ww xY w|S )NuX   处理上传文件：智能识别月份 → 路由到正确数据文件 → 合并部署r   NFr#   )r   r   updatedr   r   r   r   rU   Tr   c                 X    g | ]'}|r!t          |                                          nd (S r   r   r   s     rD   r   z)process_uploaded_file.<locals>.<listcomp>`  s/    wwwq2s1vv||~~~wwwrF   r   r   )r   r   c                 .    i | ]}|         |         S r   r   )r   ir~   rows     rD   
<dictcomp>z)process_uploaded_file.<locals>.<dictcomp>d  s#    !a!a!a'!*c!f!a!a!arF   r   )defaultdictCounterr   r   r   u	   销售员u	   下单人d   ZHBRr   20      -   z(2026\d{2})z%Y-%mNoneu   合计%Y-%m-%d %H:%Mc                 :    g | ]\  }}|t          |d           dS )r   )rt   amountroundr   r>   r?   s      rD   r   z)process_uploaded_file.<locals>.<listcomp>  s,    oooDAqqE!AJJ77ooorF   c                     | d          S Nr   r   xs    rD   <lambda>z'process_uploaded_file.<locals>.<lambda>  s    ijklimhm rF   r"   u   上传: c                 X    g | ]'\  }}|t          |d           t          |d           d(S )r   )rt   currentytdr  r!  s      rD   r   z)process_uploaded_file.<locals>.<listcomp>  sR      7d  7d  7dqtqrsteTUVWjjafghijakak7l7l  7d  7d  7drF   c                     | d          S r#  r   r$  s    rD   r&  z'process_uploaded_file.<locals>.<lambda>  s       ^_  `a  ^b  ]b rF   )monthr  sourcerC   r   peoplezkpi_progress.jsonrS   rT   r   r  z KPI: u   条, g     @z.1fu   万, u   人r   zthree_year_monthly.json2026zkpi_dashboard.jsontotal_h2_actualtotal_h1total_h1_h2rW   u	    校准: python3u   脚本zmerge_workbench_data.pyr   )capture_outputr   u!   workbench_data.json → CloudBasebashz
cb_sync.shr   r   u   类型 u    暂不支持自动处理u   处理失败: )0rer[   r\   splitextlowerr   r_   
DictReader
fieldnamesr'   r   r   r   r   r   r0   r)   minr1   r   collectionsr  r  r   r,   r   
startswithsearchgroupmost_commonr   nowrb   floatsortedr-   r   r]   r^   r`   ra   intsplitrn   
subprocessrunROOTrd   )+r   ftype
saved_namer6  r8   r  r   r=   r   	rows_listr   r  r  r  r  colsbn_colamt_colsp_colr   month_counterbnymmfile_ymdetected_monthcurrent_monthby_sprC   rowsamtspnow_strr.  kpi_data	month_numty_pathtykd_pathkdro   r~   r  s+                                            @@rD   process_uploaded_filerb  P  s   IIIbR88F_1gz**1-3355&==JJJhk::: )a** + LL	) ) ) ) ) ) ) ) ) ) ) ) ) ) )
 OOO''D'AABBwwDVWabptAuAu<v<vwwwGI||A4|@@ c c$H  !a!a!a!a!aeCGVYZ]V^V^D_D_>`>`!a!a!abbbbHHJJJK88888888D(,,F,Wv D D!Q&&!Q&&+*:*:aG!##{a'7'7! $GIIM # + +?EMS,,23399;;;2==(( +SWW]]1Q3#-1Q37B!"%%%*%%%		.*55A@AKaggajj!ns*QWWQZZ!_<<tGCP  D]66q99!<Q??W^  XCbjbnbpbpbyby  {B  cC  cCN$LNN33G<<M  K&&EED  	 	?EMS,,23399;;;2ER6\\X^^X>EL5!!4!4!9:::1SS ?EMS,,23399;;;23#''5999#3999	lnn--.>??GooF5;;==^m^mDnDnDnoooF ..%3&=&=&=eTU&*  7d  7dx~  @E  @K  @K  @M  @M  Sb  Sb  yc  yc  yc  7d  7d  7de e "',,x1DEEsU\]]] IabIhaHHHHI I I I I I I I I I I I I I Iy!(()<==='5$l$lT$l$lc	$l$l$l\_`f\g\g$l$l$ly!!   4 4S 9 9! <==	',,x1JKK'3999 &Q1B& & & & & & & & & & & & & & &-25!__6
3y>>*'3999 CQIb!%BBBBC C C C C C C C C C C C C C Cy!(()BCCC',,x1EFF'3999 &Q1B& & & & & & & & & & & & & & &(-bff5F.J.JU.RTU(V(V$%$)"&&Q*?*?"EVBW*WYZ$[$[=!#*< '3999 CQIb!%BBBBC C C C C C C C C C C C C C Cy!(()=>>>'5$o$o$o$o5QT9$o$o$o_bci_j_j$o$o$oy!NIrw||D(D]'^'^_pt  A  B  B  B  B9$$%HIIINFBGLLx$N$NO`dnpqqqqF4LL J% J J JF9 1 1 10Q00y1Ms  Aa !,Ba Ba  B!K%a )N0/a 0N42D8a *Ta Ta TB!a 8Wa Wa  W!;a Y5a Ya Y	Aa Z?3a ?[a [A4a ;] a  ]$$a ']$(C$a 
a)a$$a)zauth_sessions.jsoni:	 zuser_roles.jsonzT/Users/liuxinyuan/.npm-global/lib/node_modules/@cloudbase/cli/dist/standalone/cli.jszbier-sales-d0gatbvlx288724e9c                      	 t          t          d          5 } t          j        |           }ddd           n# 1 swxY w Y   t	          |t
                    r|S n# t          $ r Y nw xY wg S )uU   加载本地用户表（从 CloudBase user_roles 同步的快照），失败返回 []rT   rU   N)r_   USER_ROLES_FILEr`   rn   r.   r'   rd   r   s     rD   _load_user_rolesre    s    /G444 		!A	 	 	 	 	 	 	 	 	 	 	 	 	 	 	a 	H	   Is.   A 9A =A  =A 
A)(A)c                 X   ddl }d}d}	 |j                            dt          j        ||d                              d          dd	id
          }|j                            |d          5 }t          j        |                                          }ddd           n# 1 swxY w Y   |	                    d          }|sdS |j                            dt          j        d| d                              d          d	d|z   dd
          }|j                            |d          5 }t          j        |                                          }	ddd           n# 1 swxY w Y   |		                    d          dk    r(ddt          |		                    dd                    z  fS |		                    d          pi }
|
	                    d          pd                                }|
	                    d          pd                                }|s|sdS t                      }d}|r"|D ]}|	                    d          |k    r|} n |s$|r"|D ]}|	                    d          |k    r|} n |s	dd|p|z  fS |dfS # t          $ r}dt          |          fcY d}~S d}~ww xY w)u   飞书免登：用授权 code 换用户身份（直连飞书 API，不依赖 CloudBase）。
    返回 (user_dict, None) 或 (None, error_str)。r   Nr   r   Bhttps://open.feishu.cn/open-apis/auth/v3/app_access_token/internalr   rT   r{   rz   r|   r}   r   r   app_access_token)Nno access token<https://open.feishu.cn/open-apis/authen/v1/oidc/access_tokenauthorization_code
grant_typer   r   r   r   zauth failed: %sr   r#   r   rt   r   )Nzno identityu   账号未绑定：%s)urllib.requestr   r   r`   r   r   r   r   r   r,   r   r   re  rd   )r   r   r   r   r   r   tk	app_tokenreq2authr   rt   r   r   useruro   s                    rD   _feishu_identityru    s    *M:*n$$P}DUVVWW^^_fgg#%78 % I I ^##C#44 	&AFFHH%%B	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&FF-..	 	+**~%%J+?NNOOVVW^__%7)V_J_``io & q q ^##D"#55 	(:affhh''D	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(88Fq  *S%1D1D-E-EEEExx%2  &B--//88I&&,"3355 	'G 	'&& "" 	  55##w..DE /  	 	  55==D((DE )  	D/4?7CCCTz   SVV|s   A$J .'B!J !B%%J (B%)J A(J -'E J  E$$J 'E$(AJ ,A-J A$J  J 
J)J$J)$J)c                    	 t                      }d}|D ]2}|                    d          | k    r|                    d          } n3|sdS ddt          j        ddd|iidd	|iid
gd          d}t          j        |gd          }t	          j        dt          dddd|ddt          g
ddd          }|j        pd}|	                    d          }	|	dk     rdd|j
        p|dd         z   fS t          j        ||	d                   }
d|
v r6ddt          j        |
                    d          d          dd         z   fS 	 |
                    d i                               d!          pg gd         pi gd         }|                    d"          |                    d"          n|                    d#          }t          |t                    r*|                    d$          p|                    d%          }|t          |          dk    rd&S n# t          $ r Y nw xY wd'S # t          $ r}dd(t!          |          z   fcY d}~S d}~ww xY w))u   把某用户的 tabs 字段同步到 CloudBase user_roles 集合（node 直调 cli.js）。
    返回 (ok: bool, err: str)。用 _id 定位文档，$set 更新 tabs。Nrt   _id)Fu8   本地用户表无该用户 _id，无法同步 CloudBase
user_rolesUPDATEz$oidz$settabs)qrt  )updateupdates)	TableNameCommandTypeCommandFrY   nodedbnosqlexecutez	--commandz--jsonz-eTr   )r4  r   r   r#   {r   u   CloudBase 同步失败：r
   r   u   CloudBase 同步出错：r   resultsnnMatchedz
$numberIntz$numberLong)Fu_   CloudBase 未匹配到该用户文档（_id 可能已变更，请重新同步本地用户表）)Tr#   u   CloudBase 同步异常：)re  r,   r`   r   rF  rG  TCB_CLICB_ENVstdoutfindrj   r   r.   r/   rD  rd   r   )rt   rz  rolesdoc_idrt  cmd_objcmdr   rawstartr   resr  ro   s                 rD   _sync_tabs_to_cloudbaser    s   '; "" 	 	AuuV}}$$u %  	UTT%#z&#(66*:";6FTX>BZ[[\# #  
 
 j'777NFGT7I{TWYacgiop*.T2G G Ghn"1995S$3$8OOOOJs566{##a<<5
155>>`e8f8f8fgkhkgk8llll	EE&"%%)))44<a@HRD!LC # 8cggj>Q>QA!T"" @EE,''?155+?+?}Q1 	 	 	D	x ; ; ;1CFF::::::::;sQ   AH) B#H) /AH) CH H) 
H$!H) #H$$H) )
I3IIIc                  ^   	 t           j                            t                    rut	          t          d          5 } t          j        |           }ddd           n# 1 swxY w Y   t          j                    fd|                                D             S n# t          $ r Y nw xY wi S )u!   加载会话表，剔除过期项rT   rU   Nc                 P    i | ]"\  }}|                     d d          k    ||#S )	expire_atr   r,   )r   r>   r?   rA  s      rD   r  z"_load_sessions.<locals>.<dictcomp>7  s7    NNNTQ!%%Q2G2G#2M2MAq2M2M2MrF   )
r[   r\   rm   	AUTH_FILEr_   r`   rn   rH   r-   rd   )r=   r   rA  s     @rD   _load_sessionsr  0  s    7>>)$$ 	Oi'222 !aIaLL! ! ! ! ! ! ! ! ! ! ! ! ! ! !)++CNNNNQWWYYNNNN		O
    Is4   :B AB A""B %A"&5B 
B*)B*c                  4   	 t          j        t          d           t          dz   } t	          | dd          5 }t          j        t          |d           d d d            n# 1 swxY w Y   t          j        | t                     d S # t          $ r Y d S w xY w)	NTr   rR   rS   rT   rU   FrY   )
r[   r   r^   r  r_   r`   ra   AUTH_SESSIONSrc   rd   )r   r=   s     rD   _save_sessionsr  =  s    
Ht,,,,& #sW--- 	<ImQU;;;;	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	<

3	"""""   s4   7B	 A"B	 "A&&B	 )A&*B	 	
BBc                   T     e Zd Zd Zd Zd Z fdZddZd Zd Z	 fd	Z
d
 Z xZS )Handlerc                    | j                             dd          pd}|                    d          r|dd                                         nd}|sdS t          5  t
                              |          }ddd           n# 1 swxY w Y   |sdS |                    dd          t          j                    k     r<t          5  t
                              |d           ddd           n# 1 swxY w Y   dS t          j                    t          z   |d<   |                    dd          |                    d	d
          |                    dd          |                    dd          |                    dd          dS )u_   从 Authorization: Bearer <token> 验证身份，返回 user dict 或 None（含滑动续期）r   r#   r      Nr  r   rt   r   r   r   linedaemail)rt   r   r   r  r  )	r~   r,   r=  r   	AUTH_LOCKr  rH   pop	TOKEN_TTL)selfrr  r   sesss       rD   
_auth_userzHandler._auth_userM  s   |44:$(OOI$>$>FQRR   B 	4 	, 	, $$U++D	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	488K##dikk11 / /!!%.../ / / / / / / / / / / / / / /4 IKK)3[,,dhhvw6O6O,,dhhvt6L6L'2..0 0 	0s$   BB
BC,,C03C0c                     |                                                                 }t                              |          }|sdS |dk    }|sdS t	          |          S )u4   验证用户：先查默认表，密码用 biori2026N	biori2026)r   r8  DEFAULT_USERSr,   r/   )r  r  passwordrs  valids        rD   
_find_userzHandler._find_user`  s^    ##%%  '' 	4K' 	4DzzrF   c                 z    t           j                            |                                 d||z  d           d S )Nz - rh   )ri   rj   rk   address_string)r  fmtr7   s      rD   log_messagezHandler.log_messagek  s=    
(;(;(=(=(=(=sTzzzJKKKKKrF   c                 j   t          | d          r*t          | dd                              d          d         nd}|                    d          s*|                    d          s|                    d          r|                     dd	           t                                                       d S )
Nr\   r#   ?r   rQ   /api/.htmlzCache-Controlz#no-store, no-cache, must-revalidate)hasattrgetattrrE  endswithr=  send_headersuperend_headers)r  r\   	__class__s     rD   r  zHandler.end_headersn  s    :A$:O:OWwtVR((..s33A66UW==!! 	UT__W%=%= 	UwAWAW 	U_.STTTrF   r   c                    t          j        |d                              d          }|                     |           |                     dd           |                     dt          t          |                               |                     dd           |                                  | j        	                    |           d S )	NFrY   rT   r{   application/json; charset=utf-8Content-LengthAccess-Control-Allow-Origin*)
r`   r   r   send_responser  r   r1   r  wfilerk   )r  objr   r   s       rD   
_send_jsonzHandler._send_jsont  s    z#E22299'BB4   )JKKK)3s4yy>>:::6<<<
rF   c                 B   |                      d           |                     dd           |                     dd           |                     dd           |                                  	 |D ]d}dt          j        |d	
          z   dz   }| j                            |                    d                     | j                                         e| j                            d           | j                                         dS # t          t          f$ r Y dS w xY w)uK   SSE 流式响应：逐事件写 data: {json}

，供 /api/chat 流式透传r   r{   z text/event-stream; charset=utf-8r  r  zX-Accel-Bufferingnozdata: FrY   z

rT   s   data: [DONE]

N)r  r  r  r`   r   r  rk   r   rl   BrokenPipeErrorConnectionResetError)r  	generatoreventr  s       rD   _stream_ssezHandler._stream_sse}  s1   3)KLLL6<<<,d333	" # #$*U"G"G"GG&P
  W!5!5666
  """"J0111J!56 	 	 	DD	s   -BD	 	DDc                     |                      d           |                     dd           |                     dd           |                     dd           |                                  dS )	u   处理 CORS 预检请求   r  r  zAccess-Control-Allow-MethodszGET, POST, OPTIONSzAccess-Control-Allow-HeaderszContent-Type, AuthorizationN)r  r  r  )r  s    rD   
do_OPTIONSzHandler.do_OPTIONS  su    36<<<79MNNN79VWWWrF   c                 $   | j                             d          d         }|                    d          r3|dvr/|                                 s|                     dddd           d S |d	k    rdd
lm} d| j         v rEd  || j                             d          d                                                   D             ni }|                    dd          }|                                 }|s|                     dddd           d S |                    dd          }|                    dd          }|s|                     dddd           d S |dvr!||k    r|                     dddd           d S t          j         
                    t          j                             t                              }|t          j         vr t          j                             d|           dd l}	|                     d||	                    |          d           d S |dk    rdd
lm} d| j         v rEd  || j                             d          d                                                   D             ni }|                                 }|s|                     dddd           d S |                    dd          }|                    dd          }	 i }
t          j                             t$          d          }t          j                             |          rTt)          |d          5 }t+          j        |          }d d d            n# 1 swxY w Y   t/          |t0                    r|}
g }|
                                D ]\  }}|dvr||k    rt/          |t2                    r|s)t5          d |D                       }t5          d |D                       }t5          d |D                       }t5          d |D                       }t5          d  |D                       }t7          t9          d! |D                                 }|                    |||||||r|d         nd|r|d"         nd|d#d          d$	           	|                    d% &           |                     d|d'           d S # t>          $ r1}|                     dtA          |          dd(           Y d }~d S d }~ww xY w|d)k    rhdd*lm}m!} d| j         v rEd+  || j                             d          d                                                   D             ni }|                    d,d          }|                    d-d          d.k    }|                                 }|s|                     dddd           d S |                    dd          }|                    dd/          }|s|                     dd0dd           d S t          j         
                    t          j                             t                              }|t          j         vr t          j                             d|           dd l}	|	"                    |||          \  }}|!|                     d|dd1|v rdnd2           d S 	 t          j         #                    |          d         $                                }d3d3d4d5d6d7d8d9                    |d:          }t)          |d;          5 }|%                                }d d d            n# 1 swxY w Y   | &                    d<           | '                    d=|           | '                    d>tA          tQ          |                               | '                    d?|rd-nd@dA |t          j         )                    |                               | '                    dBdC           | *                                 | j+        ,                    |           d S # t>          $ r1}|                     dtA          |          dd(           Y d }~d S d }~ww xY w|dDk    rdd
lm} d| j         v rEdE  || j                             d          d                                                   D             ni }|                                 }|s|                     dddd           d S |                    dd          }|                    dd/          }t          j         
                    t          j                             t                              }|t          j         vr t          j                             d|           dd l}		 |                     d|	-                    ||          dF           d S # t>          $ r1}|                     dtA          |          dd(           Y d }~d S d }~ww xY w|dGk    r|                                 }|s|                     dddd           d S t          j         
                    t          j                             t                              }|t          j         vr t          j                             d|           dd l}		 |                     d|	.                    |          dH           d S # t>          $ r1}|                     dtA          |          dd(           Y d }~d S d }~ww xY w|dIk    rli }d| j         v rKdd
lm} dJ  || j                             d          d                                                   D             }|                    dKd          } 	 t)          t^          d          5 }!t+          j        |!          }"d d d            n# 1 swxY w Y   |"                    tA          |                     }#|#r|                     d|#dL           n|                     ddMdd2           d S d S # t`          $ r |                     ddNdd2           Y d S t>          $ r1}|                     dtA          |          dd(           Y d }~d S d }~ww xY w|dOk    rCtb          5  |                     te                                 d d d            d S # 1 swxY w Y   d S |dPk    rt          j                             t$          dQdR          }$t          j                             |$          r	 t)          |$dSd          5 }%t+          j        |%          }&d d d            n# 1 swxY w Y   |                     d|&dT           d S # t>          $ r1}|                     dtA          |          dd(           Y d }~d S d }~ww xY w|                     dg dT           d S |dUk    r|                                 }|s|                     dddd           d S |                    d          dvr|                     ddVdd           d S t          j         
                    t          j                             t                              }|t          j         vr t          j                             d|           dd l}		 dW tg                      D             }'|	4                                }(g })|'D ]}*|*                    dd          }+|(                    |+i           },|)                    |+|*                    dd/          |*                    dXd          |*                    dYdZ          |*                    d[d          |,                    d\|	j5                  t1          |*                    d]          pi           |,                    d^          pg |,                    d_          pg d`	           |	6                                \  }-}.t7          t9          da |-D                                 }/t7          t9          db |.D                                 }0|                     d|)|/|0|	j5        dc           d S # t>          $ r1}|                     dtA          |          dd(           Y d }~d S d }~ww xY w|                    dd          rdd
lm} d| j         v rEde  || j                             d          d                                                   D             ni }|                    df          d.k    }1dgdhdidjdkdl}2|7                    ddd          }3|3dmk    r|                     ddndd           d S |3|2v r	 |1r&tq          |3|2|3                   }4ts          |3          }
n6ts          |3          }
|
%tq          |3|2|3                   }4ts          |3          }
|                     d|3tQ          |
          |
do           d S # t>          $ r2}|                     dtA          |          |3dpd(           Y d }~d S d }~ww xY w|                     ddq|3 dd           d S tu                      ;                                 d S )rNr  r   r  
/api/login/api/auth/token/api/feishu/loginF!   登录已过期，请重新登录r     /api/history)parse_qsc                 &    i | ]\  }}||d          S r   r   r!  s      rD   r  z"Handler.do_GET.<locals>.<dictcomp>  "    PPPda!QqTPPPrF   r   rt   r#   r   name required  r   gmu   无权查看他人历史  T)r   rt   historyz/api/token_usagec                 &    i | ]\  }}||d          S r  r   r!  s      rD   r  z"Handler.do_GET.<locals>.<dictcomp>  r  rF   zai_token_usage.jsonrT   rU   c              3   ^   K   | ](}t          |                    d           pd          V  )dS )rC   r   NrD  r,   r   r   s     rD   r   z!Handler.do_GET.<locals>.<genexpr>  s9      GGQAEE'NN$7a 8 8GGGGGGrF   c              3   ^   K   | ](}t          |                    d           pd          V  )dS )promptr   Nr  r  s     rD   r   z!Handler.do_GET.<locals>.<genexpr>  s9       I IqQUU8__%9!:!: I I I I I IrF   c              3   ^   K   | ](}t          |                    d           pd          V  )dS )
completionr   Nr  r  s     rD   r   z!Handler.do_GET.<locals>.<genexpr>  s;      $Q$QqS|)<)<)A%B%B$Q$Q$Q$Q$Q$QrF   c              3   ^   K   | ](}t          |                    d           pd          V  )dS )	est_countr   Nr  r  s     rD   r   z!Handler.do_GET.<locals>.<genexpr>  s;      IIqc!%%"4"4"9::IIIIIIrF   c              3      K   | ]=}|                     d           t          |                     d          pd          V  >dS )	estimatedr  r   N)r,   rD  r  s     rD   r   z!Handler.do_GET.<locals>.<genexpr>  sP      !c!c1PQPUPUVaPbPb!c#aeeK&8&8&=A">">!c!c!c!c!c!crF   c              3      K   | ]H}|                     d           |                     d           dk    0|                     d d          V  IdS )dateu   历史r#   Nr  r  s     rD   r   z!Handler.do_GET.<locals>.<genexpr>  s[      +{+{!quuU[}}+{abafafgmananrzazazAEE&",=,=azazazaz+{+{rF   i)	rt   r(   r  total_tokensprompt_tokenscompletion_tokens
first_date	last_daterecentc                     | d          S )Nr  r   r$  s    rD   r&  z Handler.do_GET.<locals>.<lambda>  s    1^+<*< rF   r'  )r   usage  z/api/files/download)r  quotec                 &    i | ]\  }}||d          S r  r   r!  s      rD   r  z"Handler.do_GET.<locals>.<dictcomp>  r  rF   fidinline1r   zfid requiredu   无权  ztext/html; charset=utf-8ztext/markdown; charset=utf-8ztext/plain; charset=utf-8ztext/csv; charset=utf-8r  zapplication/pdf)r  z.htm.md.txtr   rQ   .pdfzapplication/octet-streamrbr   r{   r  zContent-Disposition
attachmentz; filename*=UTF-8''r  r  z/api/files/listc                 &    i | ]\  }}||d          S r  r   r!  s      rD   r  z"Handler.do_GET.<locals>.<dictcomp>  r  rF   r   filesz/api/activity/options)r   optionsz/api/feishu/customer_datac                 &    i | ]\  }}||d          S r  r   r!  s      rD   r  z"Handler.do_GET.<locals>.<dictcomp>3  s"    TTT$!Qa1TTTrF   customer_idr   r   z;no data for this customer, please ask Hermes to generate itzno cache file yet
/api/todosz/api/uploads   上传upload_log.jsonr   )r   uploads/api/permissions   仅管理员可访问c                 F    g | ]}|                     d d          dk    |S )statusu   在职u   离职r  )r   rt  s     rD   r   z"Handler.do_GET.<locals>.<listcomp>^  s1    ```q!%%(:S:SW_:_:_:_:_:_rF   r   r  r  r  ds_limitrz  extra_customersblocked_customers)	rt   r   r   r  r  r  rz  r  r  c              3   p   K   | ]1}|                     d           s|                     d           pdV  2dS rt   r#   Nr  r   s     rD   r   z!Handler.do_GET.<locals>.<genexpr>m  sI      'f'f!QRQVQVW]Q^Q^'f'fv)<"'f'f'f'f'f'frF   c              3   p   K   | ]1}|                     d           s|                     d           pdV  2dS r  r  )r   gs     rD   r   z!Handler.do_GET.<locals>.<genexpr>n  sI      (h(h1STSXSXY_S`S`(h(h!%%--*=2(h(h(h(h(h(hrF   )r   r   r   groupsdefault_ds_limitz	/api/mcp/c                 &    i | ]\  }}||d          S r  r   r!  s      rD   r  z"Handler.do_GET.<locals>.<dictcomp>v  r  rF   refresh  SELECT `name`,`work_item_id`,`field_17186c`,`field_6415cf`,`field_5ed7ab`,`field_2d5b6a`,`field_e62869`,`field_c3224b`,`field_c8e80d`,`field_a1ff52`,`field_79aa0b`,`owner`,`start_time`,`business`,`current_status_operator` FROM `6593cd71471290e3cc6be6e6`.`65ae1e403c87b152f3365ca6`v  SELECT `name`,`work_item_id`,`field_e1001d`,`field_a6e501`,`field_5ed7ab`,`field_2d6367`,`field_e0cce5`,`field_2e095b`,`field_4a1b47`,`field_29d947`,`field_3a3ccb`,`field_8c4b7b`,`field_5b2b3b`,`field_dbd4ab`,`field_a98458`,`field_8d9153`,`owner`,`start_time`,`business`,`current_status_operator`,`work_item_status` FROM `6593cd71471290e3cc6be6e6`.`662612aea6bb7089fea044ef`  SELECT `name`,`work_item_id`,`start_time`,`work_item_status`,`field_9e2144`,`field_6fb810`,`field_3ce9fe`,`field_d107b0`,`field_502a85`,`field_ac5caf`,`owner`,`business`,`current_status_operator`,`finish_time`,`finish_status` FROM `658288abfb8bd616b17025f1`.`6669433056a98249604376de`  SELECT `name`,`work_item_id`,`field_b54da4`,`field_b99055`,`field_76654e`,`field_a2b3f6`,`field_5f20fc`,`field_5ed7ab`,`field_d6ee93`,`owner`,`start_time`,`business`,`current_status_operator`,`work_item_status` FROM `6593cd71471290e3cc6be6e6`.`65ae1e5d44338dbe7c39a29a`SELECT `name`,`work_item_id`,`owner`,`start_time`,`business`,`current_status_operator`,`work_item_status`,`description` FROM `6593cd71471290e3cc6be6e6`.`story`r   	dashboardz;use POST /api/mcp/refresh or GET with ?refresh=1 to compute)r   r   rC   r-   )r   r   r   unknown type: )<r\   rE  r=  r  r  urllib.parser  r-   r,   r[   dirnameabspath__file__ri   insertai_chat_get_historyr]   r^   rm   r_   r`   rn   r.   r/   r'   sumrC  setr0   sortrd   r   r  _get_file_pathr7  r8  r   r  r  r1   basenamer  r  rk   _list_files_activity_optionsFEISHU_DATA_FILEFileNotFoundErrorLOCKr   re  _load_user_permissionsDEEPSEEK_DAILY_LIMIT_load_customer_datarc   rq   rN   r  do_GET)6r  r\   r  qsrt   _auvroleviewer_pr.  r   tffh_dr8   r  recsrC   r  r  cntest_cnt
real_datesro   r  r  r   fperrr  ctyper   cidr=   all_datacustomer_datalog_filelflogr   perms	out_usersrt  nmpcustsr  
cust_namesgroup_namesforceMQL_MAPrL   r(   r  s6                                                        rD   r=  zHandler.do_GET  s{   ys##A&??7## 	4j(j(j??$$ u7Z [ []`aaa>!!------TW[_[dTdTdPPhhtys/C/CA/F&G&G&M&M&O&OPPPPjlB66&"%%D//##C u7Z [ []`aaaGGFB''EWWVR((F u G GMMMO++u7Q R RTWXXX!:!:;;B!!2&&&NNNOO4'BVBVW[B\B\]]^^^^^'''------TW[_[dTdTdPPhhtys/C/CA/F&G&G&M&M&O&OPPPPjlB//##C u7Z [ []`aaaGGFB''EWWVR((F"EW\\(,ABB7>>"%% "b7333 +r!Yr]]+ + + + + + + + + + + + + + +!"d++ "!#zz||  GAtO33V %dD11 ! ! GG$GGGGGE  I ID I I IIIF!$$Q$QD$Q$Q$Q!Q!QJIIDIIIIIC!!c!c!c!c!cccG!'+{+{t+{+{+{({({!|!|JMM !!$%,(-)/-77A&Ijmmr7A%IZ^^r"&stt*
# 
# 
 
 
 
  < <===tf = =>>>>> E E Eus1vv > >DDDDDDDDDE***44444444TW[_[dTdTdPPhhtys/C/CA/F&G&G&M&M&O&OPPPPjlB&&##CVVHb))S0F//##C u7Z [ []`aaaWWVR((FGGFG,,E u~ F FLLL!:!:;;B!!2&&&NNN,,S&%@@GBzus ; ;HPSOOSSY\]]]Eg&&r**1-33557A[9C^5@a-	 
 #c566  "d^^ %r7799D% % % % % % % % % % % % % % %""3'''  777  !13s4yy>>BBB  !6agUyU]U]myUyUy  |A  |A  BD  BI  BR  BR  SU  BV  BV  |W  |W  |W  9X  Y  Y  Y  !>DDD  """
  &&&&& E E Eus1vv > >DDDDDDDDDE&&&------TW[_[dTdTdPPhhtys/C/CA/F&G&G&M&M&O&OPPPPjlB//##C u7Z [ []`aaaWWVR((FGGFG,,E!:!:;;B!!2&&&NNNEtg6I6I&RW6X6X Y YZZZZZ E E Eus1vv > >DDDDDDDDDE,,,//##C u7Z [ []`aaa!:!:;;B!!2&&&NNNEt8Q8QRU8V8V W WXXXXX E E Eus1vv > >DDDDDDDDDE000Bdi111111TT((49??33G3G3J*K*K*Q*Q*S*STTT&&++CE*W=== ,#y||H, , , , , , , , , , , , , , , (SXX 6 6  @OO4$G$GHHHHOO5;x$y$y{~ IH % R R Ru7J K KSQQQQQQ E E Eus1vv > >DDDDDDDDDE\!! . .
---. . . . . . . . . . . . . . . . . .^##w||Hh8IJJHw~~h'' =Ihg>>> ,""imm, , , , , , , , , , , , , , ,OO4C$@$@AAAAA  I I IOO53q66$B$BCHHHHHHHHHI t ; ;<<<<<'''//##C u7Z [ []`aaawwvo55u7N O OQTUUU!:!:;;B!!2&&&NNNE``$4$6$6```6688	 
 
Avr**B		"b))A$$ "AEE&',B,BAEERXZ\L]L] !fd 3 3aeeGR>P>P$%EE*g6R$S$S $QUU6]]%8b 9 9+,551B+C+C+Ir-.UU3F-G-G-M2& &     !( ; ; = =v#C'f'fu'f'f'f$f$fgg
$S(h(h(h(h(h%h%hiitijdo5<5Q!S !S T T T T T E E Eus1vv > >DDDDDDDDDE__[)) #	------TW[_[dTdTdPPhhtys/C/CA/F&G&G&M&M&O&OPPPPjlBFF9%%,E "| "Z "@ "q "C G ["55IK''u7t u uwz{{{G##\ < 1)WY=O P P,Y77,Y77<$5iAS$T$TE#0#;#;DOO4SQUYYae$f$fggggg  \ \ \OO53q669$U$UWZ[[[[[[[[[\ u7S	7S7S T TVYZZZZZGGNNs~  AS /MS MS ME(S 
S=&S88S=:A%`1 ] 4`1  ]`1 ]C'`1 1
a,;&a''a,,g 
h&hh5+k" "
l,&llp0 *o?p0 op0 oAp0 0#r	r&rr "sss(v  :uv  uv  "u#v   
v;
&v66v;6F8AA0 A0
AB+A:&AB&B&AB+E7BAG> G>
AH:H'AH5H5AH:c                 jj  qrs | j                             d          d         }|                    d          r3|dvr/|                                 s|                     dddd           d S |d	k    r	 t          | j                            d
          pd          }t          j	        | j
                            |          pd          }n*# t          $ r |                     dddd           Y d S w xY w|                    d          pd                                }|                    d          pg }|                    d          pd}|                    d          pd}|s|                     dddd           d S |dvr!||k    r|                     dddd           d S t          j                             t          j                             t"                              }|t$          j         vr t$          j                             d|           dd l}	|	                    ||           |                     d|d           d S |dk    r2	 t          | j                            d
          pd          }t          j	        | j
                            |          pd          }n*# t          $ r |                     dddd           Y d S w xY w|                    d          pd                                }
|                    d          pd}|                    d          pd}|
r|s|                     dddd           d S t          j                             |
          }
|
                    d          s|
|d k    rd!nd"z   }
t          j                             t2          d#          }t          j        |d$           t          j                             ||
          }	 t7          |d%d&'          5 }|                    |           d d d            n# 1 swxY w Y   n># t          $ r1}|                     dt;          |          dd(           Y d }~d S d }~ww xY w|                     dd)|
z   |
d*           d S |d+k    r	 t          | j                            d
          pd          }t          j	        | j
                            |          pd          }|                                 }|s|                     dddd           d S |                    d,d-          }|                    d.          pd}t=          |                    d/                    }|dvr|                     dd0dd           d S t          j                             t          j                             t"                              }|t$          j         vr t$          j                             d|           dd l}	|	                    ||          }|                     ||rdnd1d           n=# t          $ r0}|                     dt;          |          dd(           Y d }~nd }~ww xY w|d2k    r)	 t          | j                            d
          pd          }|d3k    r|                     dd4dd5           d S t          j	        | j
                            |          pd          }n*# t          $ r |                     dddd           Y d S w xY w|                                 }|s|                     dddd           d S ||d6<   	 t          j                             t          j                             t"                              }|t$          j         vr t$          j                             d|           dd l}	|                    d7          r)|                      |	!                    |                     n.|	"                    |          \  }}|                     ||           nl# t          $ r_}t$          j#                            d8t;          |          z             |                     dt;          |          dd(           Y d }~nd }~ww xY wd S |d9k    ri	 t          | j                            d
          pd          }t          j	        | j
                            |          pd          }n*# t          $ r |                     dd:dd           Y d S w xY w|                    d;          pd                                $                                }|                    d<d          }|                    d=          pd                                }tK                      }d }|r|D ]L}|                    d;d          $                                |k    r|                    d>d          |k    r|} nM|s3tL                              |          }|r|d?k    rtO          ||@          }n%|r#|D ] }|                    d=d          |k    r|} n!|s|                     ddAdd           d S tQ          j)        dB          }tT          5  |                    dd          |                    d,d-          |                    dCd          |                    dDdE          |                    d;|          tW          j+                    tX          z   dFtZ          |<   t]                       d d d            n# 1 swxY w Y   |                     d||                    dd          |                    d,d-          |                    dCd          |                    dDdE          |                    d;|          |                    dGi           |                    d>d          |                    d=d          dHdI           d S |dJk    r	 t          | j                            d
          pd          }t          j	        | j
                            |          pd          }n*# t          $ r |                     dd:dd           Y d S w xY w|                    dK          pd                                }|s|                     ddLdd           d S t_          |          \  }}|s|                     d|pdMdd           d S tQ          j)        dB          }tT          5  |                    dd          |                    d,d-          |                    dCd          |                    dDdE          |                    d;d          tW          j+                    tX          z   dFtZ          |<   t]                       d d d            n# 1 swxY w Y   |                     d||                    dd          |                    d,d-          |                    dCd          |                    dDdE          |                    d;d          |                    dGi           |                    d>d          |                    d=d          dHdI           d S |dNk    r_	 t          | j                            d
          pd          }t          j	        | j
                            |          pd          }n*# t          $ r |                     dd:dd           Y d S w xY w|                                 }|s|                     dddd           d S t          j                             t          j                             t"                              }|t$          j         vr t$          j                             d|           dd l}	|	0                    ||          \  }} |                     || dO|rdPnd           d S |dQk    r	 t          | j                            d
          pd          }t          j	        | j
                            |          pd          }n*# t          $ r |                     dd:dd           Y d S w xY w|                    d;          pd                                }|                    d<d          }|s|                     ddRdd           d S | 1                    ||          }|s|                     ddSdd           d S |                     d|                    d|                    dT          d                   |                    d,d-          |                    dCd          ||                    dGi           dUdV           d S |dWk    rs	 t          | j                            d
          pd          }t          j	        | j
                            |          pd          }n*# t          $ r |                     dddd           Y d S w xY w|                    dXd          }!	 |!dYk    r_|                    dZd          }"|                    d[td                    }#tg          d\|#|"dd]          }$|                     d|$d^           n4|!d_k    r|                    d`da          }%|                    dd          }tg          db|%|dcdd          }&|&                    dei                               df          pR|&                    df          p=|&                    dei                               dg          p|&                    dg          }'|'s|                     ddh|&did(           d S tg          djtd          dkdl|'i|%dm          }(|                     d|'|&|(dn           n|                     ddo|! dd           n=# t          $ r0}|                     dt;          |          dd(           Y d }~nd }~ww xY wd S |dpk    r3	 t          | j                            d
          pd          }t          j	        | j
                            |          pd          }n*# t          $ r |                     dddd           Y d S w xY w|                    dXd          }!	 |!dqk    r\|                    d`          pd                                }%|                    d          pd                                }|                    dr          pd                                })|%r|s|                     ddsdd           d S ti                      }*dttk          j6                    7                    du          z   |%||)tk          j6                    7                    dv          dwdxq|*8                    q           ts          |*           tu          tv          dy|%dz|)d{           |                     dqd|         d}           n|!d~k    r&|                     dti                      d           n|!dk    r|                    d|d          rti                      }*ty          rfd|*D             d           }+|+s|                     dddd           d S tg          db|+d`         |+d         dcdd          }&|&                    dei                               df          pR|&                    df          p=|&                    dei                               dg          p|&                    dg          }'|'s|                     dd|&did(           d S tg          djtd          dkdl|'i|+d`         dm          }(d|+d<   |                    dd          |+d<   tk          j6                    7                    dv          |+d<   ts          |*           |                     d|'|(d           n|!dk    r|                    d|d          r|                    d          pd                                },ti                      }*ty          rfd|*D             d           }+|+s|                     dddd           d S d|+d<   |                    dd          |+d<   |,|+d<   tk          j6                    7                    dv          |+d<   ts          |*           |                     ddd           n|                     dddd           n=# t          $ r0}|                     dt;          |          dd(           Y d }~nd }~ww xY wd S |dk    r	 t          | j                            d
          pd          }t          j	        | j
                            |          pd          }n*# t          $ r |                     dddd           Y d S w xY w	 t          j                             t          j                             t"                              }|t$          j         vr t$          j                             d|           dd l}	|                    d          pg }-|                    d6          pi }|                    d          s|                     dddd           d S |	=                    |-|          \  }%}|%s|                     d|dd(           d S |                     d|%|d           n=# t          $ r0}|                     dt;          |          dd(           Y d }~nd }~ww xY wd S |dk    r	 t          | j                            d
          pd          }t          j	        | j
                            |          pd          }n*# t          $ r |                     dddd           Y d S w xY w|                    dKd          }|s|                     ddLdd           d S 	 t|          j?        @                    dt          jA        ddd          B                                ddid          }.t|          j?        C                    |.d          5 }/t          j	        |/                                          }0d d d            n# 1 swxY w Y   |0                    dd          }1|1s|                     dddd(           d S t|          j?        @                    dt          jA        d|d          B                                dd|1 dd          }2t|          j?        C                    |2d          5 }3t          j	        |3                                          }4d d d            n# 1 swxY w Y   |4                    dK          dk    r1|                     ddt;          |4          d dP         did(           d S |4                    de          pi                     dd          }|                     d|d           n=# t          $ r0}|                     dt;          |          dd(           Y d }~nd }~ww xY wd S |dk    r	 t          | j                            d
          pd          }t          j	        | j
                            |          pd          }n*# t          $ r |                     dddd           Y d S w xY w|                    dd          }|                    d          }5|                    dd          }6|                    dd          }7|                    dtW          j7        d                    }8|                    d          }9ddddd}:d|dd|:                    |6d          dd|8r7t          tW          jD        tW          jE        |8d                              dz  n"t          tW          j+                    dz            dg};|7r|;8                    d|7d           |5r%|;8                    dt;          |5          d           |9r|;8                    d|9d           t          dt          t          |;dd          }$|$                    d          dk    r/|                     d|$                    dd          dd(           d S |$                    d|          p=|$                    d¦          p(|$                    dei                               d|          }<|<rd|< nd}=|                     d|<|=|$dĜ           d S |dk    r	 t          | j                            d
          pd          }t          j	        | j
                            |          pd          }n*# t          $ r |                     dddd           Y d S w xY w|                    ddƦ          }>dddddd̜}?|>dk    rhi }@|?I                                D ]8\  }A}B	 t          |A|B          |@|A<   # t          $ r}d| |@|A<   Y d }~1d }~ww xY w|                     d|@dΜ           n|>|?v rn	 t          |>|?|>                   }C|                     d|>|CdϜ           n# t          $ r0}|                     dt;          |          dd(           Y d }~nLd }~ww xY w|                     dd|> ddҠ                    |?K                                           dd           d S |dk    r	 t          | j                            d
          pd          }t          j	        | j
                            |          pd          }n*# t          $ r |                     dddd           Y d S w xY w|                    dԦ          pd                                }D|Ds|                     dddd           d S 	 t          j                             t2          ddצ          }Et          j        |Ed$           tk          j6                    7                    dئ          }F|Dd d         L                    ddڦ          }Gt          j                             |E|F d|G d۝          }Ht7          |Hd%          5 }It          jM        |D|                    dd          |                    dCd          |                    dd          |                    dd          |                    dd          |                    dg           tk          j6                    N                                d|Id           d d d            n# 1 swxY w Y   n)# t          $ r}t          d|            Y d }~nd }~ww xY w|                     dd|Dtk          j6                    N                                d           d S |dk    r	 | j                            dd          }Jd|Jvr|                     dddd           d S |J                    d          dc                                         }K|K                    d          r|K                    d          r
|Kdcd         }Kt          | j                            d
          pd          }| j
                            |          }Ld|Kz   B                    d&          }Md|Kz   dz   B                    d&          }N|L                    |M          }Og }P|Odcd          D ]}Q|Q                    d          r|Q                    d          r
|Qdd          }Q|Q                    d          r
|Qd d         }Q|QP                    d          }R|Rdk     rs|Qd |R         Q                    d&d          }S|Q|Rdz   d          }Tdd lR}U|US                    d|S          }V|Vs|VT                    dc          }
t          j                             t          d          }Wt          j        |Wd$           tk          j6                    7                    dئ          }F|F d|
 }Xt          j                             |W|X          }t7          |d          5 }|                    |T           d d d            n# 1 swxY w Y   t          j         V                    |
          dc         $                                }Yddddddddd}Z|Z                    |Yd          }|P8                    |
|Xt          |T          |d|X d           t          j                             t          dd          }[g }\t          j         X                    |[          rI	 t7          |[dtd&'          5 }]t          jY        |]          }\d d d            n# 1 swxY w Y   n	#  g }\Y nxY w|PD ]@}^|\                    dd tk          j6                    N                                i|^           A|\d d         }\t7          |[d%d&'          5 }]t          jM        |\|]dd           d d d            n# 1 swxY w Y   |                     d|Pd           n=# t          $ r0}|                     dt;          |          dd(           Y d }~nd }~ww xY wd S |dk    r	 t          | j                            d
          pd          }t          j	        | j
                            |          pd          }n*# t          $ r |                     dddd           Y d S w xY w|                    dd          }_|_s|                     dddd           d S t          j                             t          d          }Wt          j                             |W|_          }t          j         X                    |          s|                     dd|_ dd           d S t          j         V                    |_          dc         $                                }Yd|_g d}$t          ||Y          }`|`|$d	<   |$d
         8                    d|`                    dd          |`                    dd          d           |`                    d          s|                     |$           d S |`                    dd          }t          |||_          }a|a|$d<   |$d
         8                    d|a                    dd          |a                    dd          d           |a                    d          rt          j                             t          dd          }bt          j        |bd$           tk          j6                    7                    dئ          }F|F d|_ }cdd l\}d|d]                    |t          j                             |b|c                     |c|$d<   |$d
         8                    ddd|c d           n#|$d
         8                    dddd           |                     |$           d S |dk    rN|                                 }|s|                     dddd           d S |                    d,          dvr|                     dddd           d S 	 t          | j                            d
          pd          }t          j	        | j
                            |          pd          }n*# t          $ r |                     dddd           Y d S w xY w|                    d          pd                                }|s|                     dddd           d S t          j                             t          j                             t"                              }|t$          j         vr t$          j                             d|           dd l}	|	^                                }e|e                    |i           }fd|v rG	 t          |d                   |fd<   n+# t          $ r |                     dddd           Y d S w xY wd|v r4t          |d         t                    rd |d         D             |fd<   d|v r4t          |d         t                    rd |d         D             |fd<   |f|e|<   |	a                    |e           d}gd}hd}idG|v rt          |dG         tN                    rfd  |dG         I                                D             }j	 tK                      }k|kD ]o}|                    d          |k    rTtO          |                    dG          pi           }j|dG         I                                D ]\  }l}m|mrdcnd|j|l<   |j|dG<    npt          d!z   }nt7          |nd%d&'          5 }t          jM        |k|ddc           d d d            n# 1 swxY w Y   t          jL        |nt                     d}gnB# t          $ r5}|                     dd"t;          |          z   dd(           Y d }~d S d }~ww xY wt          ||j          \  }h}i|                     d||g|h|id#           d S |d$k    r|                     dddd           d S 	 t          | j                            d
          pd          }t          j	        | j
                            |          pd          }n*# t          $ r |                     dddd           Y d S w xY w|                    dX          }!t          5  t                      }o|!d%k    rt;          |                    d6          pd          }|                    d&          }p|rt          |pt                    s(|                     dd'dd           	 d d d            d S |p|od(         |<   n
|!d)k    r|                    d*          qt          qtN                    s(|                     dd'dd           	 d d d            d S qfd+|od,         D             |od,<   |od,                             dq           |od,         d t                   |od,<   n^|!d-k    r0|                    d|          ssfd.|od,         D             |od,<   n'|                     dddd           	 d d d            d S t          |o           d d d            n# 1 swxY w Y   |                     ddi           d S (/  Nr  r   r  r  Fr  r   r  r  r  s   {}zbad jsonr  rt   r#   r  r@  rA  r  r  u   无权操作他人历史r  T)r   rt   z/api/save_docfilenamer   r   mdzfilename and content required)r  r  r  htmlr  r  u   客户管理r   rS   rT   rU   r  u   客户管理/)r   r\   filez/api/files/mark_publicr   r   r  	is_publicu!   仅管理员可标记公共资源u   未找到该文件z	/api/chati  u;   请求体过大（超过 30MB），请压缩文件后重试i  rs  streamz[chat] ERROR: %s
r  u   请求格式错误r  r  r   pwdr  )r  u   身份验证失败    r   r  r  )rt   r   r   r  r  r  rz  )rt   r   r   r  r  rz  rc  r   )r   r   rs  r  r   zmissing codeu   免登失败z/api/competitor/intel)r   r   r   r  u   请输入邮箱u   邮箱未注册或密码错误@)rt   r   r   r  rz  )r   rs  z/api/imaactionr>  querykb_idz openapi/wiki/v1/search_knowledge)knowledge_base_idrg  cursorr  create_notetitleu   未命名经验zopenapi/note/v1/import_docr   )rl  r   content_formatr   note_idr  u   创建笔记失败)r   r   detailzopenapi/wiki/v1/add_knowledge   
content_id)ri  
media_type	note_inforl  )r   r  notekbzunknown action: z/api/ima_reviewsubmit	submitterztitle and content requiredr   z%Y%m%d%H%M%S%fr  pending)rw   rl  r   rw  submit_timer  u0   📖 新的经验库回写待审核：
标题：u   
提交人：u#   
请在「数据管理」Tab 审核rw   )r   rw   r'   )r   r-   approvec              3   N   K   | ]}|                     d           k    |V   dS rw   Nr  r   itpids     rD   r   z"Handler.do_POST.<locals>.<genexpr>  7      "N"N""&&,,#:M:M2:M:M:M:M"N"NrF   z	not foundr  u   IMA 创建笔记失败approvedr  reviewerreview_time)r   r  ru  rejectreasonc              3   N   K   | ]}|                     d           k    |V   dS r|  r  r}  s     rD   r   z"Handler.do_POST.<locals>.<genexpr>  r  rF   rejected)r   r  zunknown actionz/api/archive_experiencemessagesu	   未登录)r   rl  r   z/api/feishu/authrg  r   r   r   r{   rz   r|   r}   r   r   rh  ri  rj  rk  rl  r   r   zauth failedz/api/create_activityu   拜访纪要r  activity_type   线下拜访description
start_datez%Y-%m-%d
department	v4zlj721e	5vezmmm1y	wg15dd75b	wsxnxsd60)r  u   线上跟进u   陌拜u   协同拜访)	field_keyfield_valuefield_76654efield_a2b3f6i  field_b99055field_5f20fcfield_5ed7abcreate_workitem700373)r   work_item_typefieldstemplate_idr   r   zMCP call failedwork_item_idz)https://project.feishu.cn/baoyu/workitem/)r   r  
feishu_url
mcp_resultz/api/mcp/refreshallr"  r#  r$  r%  r&  r   zerror: )r   r  )r   r   r(   r(  z, valid: all, z, z/api/visit-cardcustomerzcustomer requiredr   visit_requestsz%Y%m%d_%H%M%S/_rQ   salesperson	visitDatert  requirementstypes)r  r  r   r  rt  r  r  requested_atrY   z[visit-card] Queue error: )r   queuedr  generated_atz/api/uploadzmultipart/form-datau   需要 multipart/form-dataz	boundary="r  z--s   --s   
r   s   

rc   )errorsr  zfilename="([^"]*)"r  r  u   ERP/飞书导出u   文档PDFu   图片)r   r   r   z.docxz.docr  z.pngz.jpgu   其他u   数据/上传/)originalsavedsizer   r\   r  rH   r  r   r	  z/api/upload/processr`  zmissing file paramu   文件不存在: )r   r`  stepsqcr  u   质检r   r   )stepr   r   r   processu   数据更新u   _已处理归档archiveu   归档u,   已归档至 数据/上传/_已处理归档/u-   处理未成功，文件保留在上传目录r  r  u   缺少用户名r  u'   ds_limit 必须是整数（-1=不限）r  c                     g | ]D}t          |                                          #t          |                                          ES r   r   r   r%  s     rD   r   z#Handler.do_POST.<locals>.<listcomp>  sA    'm'm'm1^abc^d^d^j^j^l^l'mA'm'm'mrF   r  c                     g | ]D}t          |                                          #t          |                                          ES r   r   r  s     rD   r   z#Handler.do_POST.<locals>.<listcomp>  sA    )q)q)qQbefgbhbhbnbnbpbp)q#a&&,,..)q)q)qrF   c                 "    i | ]\  }}||rd ndS )r   r   r   r!  s      rD   r  z#Handler.do_POST.<locals>.<dictcomp>  s&    QQQA!1maa!QQQrF   rR   u   tabs 本地保存失败：)r   rt   tabs_synced	cb_syncedcb_errr  savetodoszbad payloadr   r   r;   c                 l    g | ]0}|                     d                                d           k    .|1S rw   r  )r   r%  r;   s     rD   r   z#Handler.do_POST.<locals>.<listcomp>  s=    "_"_"_tPTPXPXY]P^P^A^A^1A^A^A^rF   r   unclosec                 F    g | ]}|                     d           k    |S r  r  )r   r%  tids     rD   r   z#Handler.do_POST.<locals>.<listcomp>  s.    "T"T"TtPSASAS1ASASASrF   )hr\   rE  r=  r  r  rD  r~   r,   r`   r   rfiler   rd   r   r[   r*  r+  r,  ri   r-  r.  _set_historyr4  r  r]   rH  r   r_   rk   r   bool_mark_publicr  handle_streamhandlerj   r8  re  r  r/   _secretstoken_urlsafer  rH   r  r  r  ru  _add_competitor_intelr  IMA_KB_DIAGr   r   r   rA  rb   r0   r   r   ADMIN_OPEN_IDr   archive_experiencer   r   r   r   r   r   mktimestrptimer+   r*   ACTIVITY_TYPE_KEYr-   rq   keysrc   ra   	isoformatprintr  r   r6  r>  r?  r^   r7  r1   rm   rn   r
  rb  shutilmover:  r.   r'   _save_user_permissionsrd  r  r9  r   
MAX_CLOSEDr   )tr  r\   lengthpayloadrt   r  r@  rA  rB  r.  r]  r   rI  
target_dirr   r=   ro   r?  r  ra  r   r   r   r  rc  r   r   rs  rt  u2r   rK  r   rf  rg  rh  r8   rl  rt  r  ru  rw  reviewtargetr  r  r   r   	token_resaccess_tokenrq  r2auth_resr  r  r  r  r  type_mapr  widr  rtyper[  r  r"   r   r(   r  	queue_dirtscn
queue_fileqfcontent_typeboundaryr  boundary_bytesend_boundarypartsuploaded_filespart
header_endheaders_rawr   _refn_match
upload_dir	safe_namer  	ftype_maprP  rR  rQ  ufrJ  r  process_resultarchive_dirarchive_namer  rS  rV  r  r  r  mergedr  r>   r?   r   storer  r;   r  r  st                                                                                                                    @@@rD   do_POSTzHandler.do_POST  sg<   ys##A& ??7## 	4j(j(j??$$ u7Z [ []`aaa >!!T\--.>??D1EE*TZ__V%<%<%EFF   uz B BCHHH KK''-24466Dkk),,2GKK((.BE[[**0bF u G GMMMO++u7Q R RTWXXX!:!:;;B!!2&&&NNN  w///OO466777F ?""T\--.>??D1EE*TZ__V%<%<%EFF   uz B BCHHH  J//52<<>>Hkk),,2G[[((0DE 7 u7V W WY\]]]w''11H$$%=>> N#%6//wwuMdN;;JK
T2222w||J99H(C'::: %aGGG$$$% % % % % % % % % % % % % % %   us1vv > >DDD OO481KU]^^___F +++ET\--.>??D1EE*TZ__V%<%<%EFFoo'' OO5;^$_$_adeeeF00kk%((.B [!9!9::	//OO5;^$_$_adeeeFW__RW__X%>%>??SX%%HOOAr***))#y99r"4VBBBV W WXXXX E E Eus1vv > >DDDDDDDDE ;T\--.>??D1EE,,,OO5;x$y$y{~F*TZ__V%<%<%EFF   uz B BCHHH //##C u7Z [ []`aaa!GFOEW__RW__X%>%>??SX%%HOOAr***;;x(( 0$$W%:%:7%C%CDDDD!(!8!8JD$OOD$/// E E E
  !5A!>???us1vv > >DDDDDDDDE F $$$T\--.>??D1EE*TZ__V%<%<%EFF   u7K L LcRRR [[))/R6688>>@@E++j"--C{{9--3::<<G$&&ED   AuuWb))//11U::quuUB?O?OSV?V?V  5&**511B 5c[00#Be444   AuuY++w66  7  u7K L LcRRR*2..E ! ! HHVR00$((67:S:S HHVR00$((64:P:P!XXgu55DIKKR[D[( (e$
    ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! OOU HHVR00$((67:S:S HHVR00$((64:P:P!XXgu55 HHVR0088E2..#xx	266 
 
 
 
 
 F &&&T\--.>??D1EE*TZ__V%<%<%EFF   u7K L LcRRR KK''-24466D u~ F FLLL(..ID# us7Ln M MsSSS*2..E ! ! HHVR00$((67:S:S HHVR00$((64:P:P!XXgr22yAX( (e$
    ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! OOU HHVR00$((67:S:S HHVR00$((64:P:P!XXgr22 HHVR0088E2..#xx	266 
 
 
 
 
 F ***T\--.>??D1EE*TZ__V%<%<%EFF   u7K L LcRRR //##C u7Z [ []`aaa!:!:;;B!!2&&&NNN33GSAAGBOO2c2224FCC3GGGF <T\--.>??D1EE*TZ__V%<%<%EFF   u7K L LcRRR [[))/R6688E++j"--C u7H I I3OOO??5#..D u7W X XZ]^^^OO HHVU[[-=-=a-@AA HHVW55 HHVR00" HHVR00 	 	 	 	 	 F :T\--.>??D1EE*TZ__V%<%<%EFF   uz B BCHHH [[2..F+EX%%#KK44E#KK==E$%G-2!&"$J J  F
 OO4$@$@AAAA},,#KK1BCCE%kk)R88G ##?!&#**+B B  D "XXfR0044Y??  R488ICVCV  RZ^ZbZbcijlZmZmZqZqrzZ{Z{  R  @D  @H  @H  IQ  @R  @RF! u?S_c(d(dfijjj !!@-8&(&2F%;!&	C C  B OO464WY$Z$Z[[[[ OO5;Vf;V;V$W$WY\]]] E E Eus1vv > >DDDDDDDDEF $$$T\--.>??D1EE*TZ__V%<%<%EFF   uz B BCHHH [[2..F=EX%%$[[117R>>@@E&{{955;BBDDG!([!9!9!?R F F H HI   u?[(\(\^abbb-//F!HLNN$;$;<L$M$MM!&7'/|~~'>'>?O'P'P"+	 D MM$'''$V,,,!--  _d  _d  _d  fo  fo  fo  2p  q  q  qOO4tDz$B$BCCCCv%%OO4:J:L:L$M$MNNNNy((!++dB//C-//F!"N"N"N"N"N"N"NPTUUF! u{(K(KSQQQ"#?!'VI=NbcB B  D "XXfb1155i@@  TDHHYDWDW  T[_[c[cdjln[o[o[s[st|[}[}  T  BF  BJ  BJ  KS  BT  BTF! u?Wcg(h(hjmnnn !@-8&2F%;fWoC C  B (2F8$)0Z)D)DF:&,4LNN,C,CDT,U,UF=)$V,,,OO46$L$LMMMMx''!++dB//C%kk(339r@@BBF-//F!"N"N"N"N"N"N"NPTUUF! u{(K(KSQQQ'1F8$)0Z)D)DF:&'-F8$,4LNN,C,CDT,U,UF=)$V,,,OO4:$F$FGGGGOO5;K$L$LcRRR E E Eus1vv > >DDDDDDDDEF ,,,T\--.>??D1EE*TZ__V%<%<%EFF   uz B BCHHHEW__RW__X%>%>??SX%%HOOAr***";;z228b{{6**0bxx'' OO5;$G$GMMMF!(!;!;Hd!K!Kw OO57$C$CSIIIFte P PQQQQ E E Eus1vv > >DDDDDDDDEF %%%T\--.>??D1EE*TZ__V%<%<%EFF   uz B BCHHH ;;vr**D u~ F FLLL!En,,X/EUw$x$xyy  A  A  C  C+-?@ -  
 ^++C+<< 5 $
16688 4 4I5 5 5 5 5 5 5 5 5 5 5 5 5 5 5(}}-?DD# OO5;L$M$MsSSSF ~--R3GQU$V$VWW^^``-?Rj\hRjRjkk!	 .   ^++D"+== 5#z"''))44H5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 <<''1,,OO5=TWX`TaTabfcfbfTg$h$hjmnnnF V,,277CCtT : :;;;; E E Eus1vv > >DDDDDDDDEF )))T\--.>??D1EE*TZ__V%<%<%EFF   uz B BCHHH ;;v~66D!++m44K#KKHHM!++mR88K \4=3L3LMMJ \22J )4[\g  zE  F  FH %T::,X\\-Yd=e=eff,  @J  >gST][egqMrMrAsAs=t=tw{={={  PS  TX  T]  T_  T_  bf  Tf  Pg  Pg  h  hF
  YN;WWXXX ^N3{K[K[\\]]] XN:VVWWW/%"3 '	2 2  F zz$5((uvzz'K\7]7] ^ ^`cddd **T""dfjj&@&@dFJJvWYDZDZD^D^_cDdDdCNQYJSJJJWYJOO4JflmmnnnF %%%T\--.>??D1EE*TZ__V%<%<%EFF   uz B BCHHH KK..E "| "Z "@ "q "C G ~~ ' 5 5HC5'8c'B'B$ 5 5 5'4}}5t @ @AAAA'!!I-eWU^DDEOO4$O$OPPPP  I I IOO53q66$B$BCHHHHHHHHI u7x7x7x]a]f]fgngsgsgugu]v]v7x7x y y{~F $$$T\--.>??D1EE*TZ__V%<%<%EFF   uz B BCHHH  J//52<<>>H u7J K KSQQQ8GLLx9IJJ	I5555\^^,,_==crc]**344W\\)5F5FR5F5F5FGG
*c** 
/bI$,'.{{="'E'E 'FB 7 7%,[[b%A%A 'FB 7 7(/NB(G(G!(Wb!9!9(0(@(@(B(B	 	 	/ 	/ 	/ 	/
/ 
/ 
/ 
/ 
/ 
/ 
/ 
/ 
/ 
/ 
/ 
/ 
/ 
/ 
/  8 8 86166777777778 OO$ ( 8 8 : :	     F =  OE#|//CC(<<OO5;W$X$XZ]^^^F'--k::1=CCEE&&s++ .0A0A#0F0F .'"~HT\--.>??D1EEjoof-- #'/!9!9'!B!B $x$ 6>>wGG		.11!#!!""I * *Du-- ! w// (#ABBx}}W-- )#CRCy!%;!7!7J!A~~ "&{
{"3":":79":"U"UK
Q0D %$$$"zz*?MMH# ! '~~a00H "$h!A!AJK
T::::!00AAB#% 2 2 2 2I!w||J	BBHh-- && & & & & & & & & & & & & & & '**844Q7==??C);DV_q)1(5Yajr!t !tI%MM#x88E"))$,!* #D		 % < < <+ +     7<<(<MNN7>>(++ !!!(C'BBB 0b"&)B--C0 0 0 0 0 0 0 0 0 0 0 0 0 0 0! ( N NBJJq68<>>+C+C+E+E"L"LMMMM$3$i(C'::: EbIc2E!DDDDE E E E E E E E E E E E E E E tn E EFFFF E E Eus1vv > >DDDDDDDDEF (((T\--.>??D1EE*TZ__V%<%<%EFF   uz B BCHHH !VR00J u7K L LcRRRh99Jw||J
;;H7>>(++ u7W:7W7W X XZ]^^^'"":..q17799C *rBBF #8S11BF4L7O""HBFF65<Q<Q^`^d^denpr^s^s#t#tuuu66&>> ''' FF69--E28UJOON .F97O""N.BTBTUY[`BaBan|  oA  oA  BK  MO  oP  oP  $Q  $Q  R  R  R !!$'' 
D gll8X?QRRK$7777\^^,,_=="$33z33Hbgll;&M&MNNN$0y!w&&  RO  AM  RO  RO  (P  (P  Q  Q  Q  Qw&&  SB  (C  (C  D  D  DOOF###F %%%//##C u7Z [ []`aaawwvo55u7N O OQTUUUT\--.>??D1EE*TZ__V%<%<%EFF   uz B BCHHH KK''-24466D u7H I I3OOO!:!:;;B!!2&&&NNN2244E		$##AW$$$'
(;$<$<AjMM    OO5;d$e$egjkkkFF !G++
7CT;UW[0\0\+'m'mHY@Z'm'm'm#$"g--*WEX=Y[_2`2`-)q)q'J]B^)q)q)q%&E$K**5111KIF  Z%F%F QQ9N9N9P9PQQQ,..E" " "55==D00%)!%%--*=2%>%>F(/(=(=(?(? : :112MAAq		(.AfI!E 1 *F2Cc3999 JQ	%qIIIIJ J J J J J J J J J J J J J JJsO444"&KK    OO5;WZ]^_Z`Z`;`$a$acfgggFFFFF %<D&$I$I!	6OO4k*3vG G H H HF <OO5;??EEEF	))*:;;@qAAFj!8!8!AEBBGG 	 	 	OO5:>>DDDFF	 X&& 	 	LLE7;;v..4"55G,, :eT#:#: OO5=$I$I3OOO	 	 	 	 	 	 	 	 (-gt$$7""{{6**!$-- OO5=$I$I3OOO	 	 	 	 	 	 	 	 #`"_"_"_eHo"_"_"_hh&&q$///"'/+:+">h9$$kk$''"T"T"T"TeHo"T"T"Thu7G H H#NNN-	 	 	 	 	 	 	 	. /	 	 	 	 	 	 	 	 	 	 	 	 	 	 	0 	t%%%%%sk  4AC #C32C3AJ) )#KK&P& 8PP& PP& !P"P& &
Q!0&QQ!
BX& A,X&  B%X& &
Y 0&YY +A[$ 5.[$ $#\
\C`% %
b/Ab		bAc3 3#ddBl44l8;l8Aq# ##r
	r
BwwwA{7 7#||@AAA A#ABBABF'AAG? G?#AH&H%AH&I EAO NAAO O
APO$&APPAPP!AAQ9 Q9#AR RAR R:BAd UEAd Z-B8Ad ]'DAd bBAd d
Aed&Ae	e	AeeAAf3 f3#AggAggCAk? j/4Ak? k%Ak? k?
Al9l	&Al4l4Al9mAAn n#AooAoo<A-Ax q)'ArrAx rAr r Ax r#Ar r$4Ax sA1Ax u'Au>u2Ax u>AvvAx vAvvAAx wAAx x
Ayx!&AyyAyyAAz6 z6#A{{A{D9ABF F#BF8F7BF8G;BHH
BH+HBH&H&BH+I/BI< I<
BJ6J&BJ1J1BJ6LABM M#BNNBNOB6BU RB<BUUBU UBUUBU UBUUBU U
BV U$BU;U;BV W
8Bi XI!Bi a%Bba;Bi bBb	bBi bBb	bCBi eBf e1BffBf fBffBf fBffBf fBi fBf$f"A%Bi hBh-h!Bi h-Bh1h1Bi h4Bh1h5Bi i
Bji&BjjBjjABk2 k2#BllBlz%AB{= {=#B|$|#B|$@C@, @,$CAACAD0BCH GCG3G'CH G3CG7G7CH G:CG7G;CH H
CIH%*CIICIJ1ACL	 L	#CL0L/CL0MBCTOACTQB#CTS6CTTCTTCT)r   )__name__
__module____qualname__r  r  r  r  r  r  r  r=  r  __classcell__)r  s   @rD   r  r  K  s        0 0 0&	 	 	L L L         "  @ @ @ @ @DC& C& C& C& C& C& C&rF   r  __main__r   i@  uH   销售工作台服务已启动：http://0.0.0.0:%d  （根目录：%s）u   按 Ctrl+C 停止c                     	 	 t           j                            t           j                            t                              } | t
          j        vr t
          j                            d|            dd l}|                    d          }|rt          d|z             n# t          $ r Y nw xY wt          j                                        d           )NTr   r   u"   已清理 %d 个过期生成文件iQ )r[   r\   r*  r+  r,  ri   r-  r.  _cleanup_expiredr  rd   _thEventwait)rB  r.  r  s      rD   _cleanup_loopr    s    	$	W__RW__X%>%>??SX%%HOOAr***,,R00 D>BCCC   IKKU###	$s   BB   
B-,B-T)r  daemonz0.0.0.0)r   )rr   )U__doc__r`   r[   ri   rF  	threadingrH   r   rn  r   http.serverr   r   r\   r*  r+  r,  rH  r]   r^   r   r7  Lockr9  r  r   r   r*   r  rJ   rK   rI   rE   rN   rf   rq   r+   environr,   r_   
expanduserr   r   r   r   r  r   r   r   r  r   r   r   r   r   r   r  r
  rb  secretsr  r  r  r  r  rd  r  r  re  ru  r  r  r  r  r  r1   argvrD  portr  r  r  Threadr  serve_foreverr   rF   rD   <module>r     s1   "  				 



                    E E E E E E E E	wrwrwx'@'@AABB7<<h''W\\(L11
7<<*EFF y~
 5	
3	#.  	   !!2 2 2 2h      ,0 0 0 04 
566|$$rw?Q?QRk?l?l:m:m:r:r:t:t:z:z:|:|jnn122vdd27;M;MNe;f;f6g6g6l6l6n6n6t6t6v6v<7 7 7" '6 5',,x)BCC  ,	 	 		 	 	
? 
? 
?      (BYZZ%0'Kbcc!)7Dabb#.Iijj%0'Kkll ()EZ[[&19Ncdd%0'Khii	 	2 2 2jd d dP    IN	GLL#788		',,x):;;
`	'	 	 	0 0 0f*; *; *;Z
 
 
     P& P& P& P& P&& P& P& P&f$ z"s38}}q0033sx{dD	E
TX\^bWc
cddd	E
$ $ $ CJmD11177999D)733AACCCCC) rF   