
    Yj#                        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Zddl	Z	ddl
Z
e	j                            e	j                            e	j                            e                              Ze	j                            ed          Ze	j                            ed          ZdZdZdZdZd	 Zd
 Zd ZdddZd Zd Zd Zedk    r e             dS dS )u   
顺丰物流轨迹数据管道
用法: python3 shipment_pipeline.py          # 从MCP拉数据+顺丰API
      python3 shipment_pipeline.py --mock   # 用mock数据测试

输出: 数据/shipment_status.json
    Nu   数据zshipment_status.jsonBRSWK5CQ08HV V7JDT0azGX93pnIXRyZe9zvlzY6fk1rCz/https://sfapi.sf-express.com/oauth2/accessTokenz(https://bspgw.sf-express.com/std/servicec                     t           j                            t          t          dd                              d          } t           j                            t          | ddi          }t           j        	                    |d          5 }t          j        |                                                    d                    }d	d	d	           n# 1 swxY w Y   |                    d
          dk    rt          d|           |d         S )u   获取顺丰 accessTokenpassword)	partnerIDsecret	grantTypeutf-8Content-Typez!application/x-www-form-urlencodeddataheaders   timeoutNapiResultCodeA1000zSF token failed: accessToken)urllibparse	urlencodeSF_PARTNER_ID	SF_SECRETencoderequestRequestSF_TOKEN_URLurlopenjsonloadsreaddecodeget	Exception)bodyreqrespresults       L   /Users/liuxinyuan/Desktop/Hermes输出-工作类/脚本/shipment_pipeline.pysf_get_tokenr*      s4   <!!"# #   vg	 	
 .
 
 D!DE ! G GC			R		0	0 9DDIIKK..w77889 9 9 9 9 9 9 9 9 9 9 9 9 9 9zz/""g--4F44555-  s   :CCCc           	         t          j        dd| ddd          }t          t          t	          j                                        }t          t          j                                                  dd          }t          j	        
                    t          |d|||d	                              d
          }t          j                            t          |ddi          }t          j                            |d          5 }t          j        |                                                    d
                    }ddd           n# 1 swxY w Y   |                    d          dk    r,|                    dd          |                    d          dS t          j        |                    dd                    }	|	S )u/   批量查询物流轨迹（最多10个单号）zzh-CN   )languagetrackingTypetrackingNumber
methodTypeF)ensure_ascii- EXP_RECE_SEARCH_ROUTES)r   	requestIDserviceCode	timestampr   msgDatar
   r   z/application/x-www-form-urlencoded;charset=utf-8r   r   r   Nr   r   apiErrorMsgunknown)errorcodeapiResultDataz{})r   dumpsstrinttimeuuiduuid4replacer   r   r   r   r   r   r   
SF_API_URLr   r    r!   r"   r#   )
tracking_numbersaccess_tokenmsg_datar7   
request_idr%   r&   r'   r(   inners
             r)   sf_query_routesrK   %   s   z*	 
   H C	$$%%ITZ\\""**333J<!!"/## #   vg 	 .
 
 $!RS ! U UC			R		0	0 9DDIIKK..w77889 9 9 9 9 9 9 9 9 9 9 9 9 9 9 zz/""g--M9==vzzRaGbGbcccJvzz/48899ELs   :EEEc                    |                      d          sg d|                      dd          dS |                      di                                dg           }i }|D ]}|                     dd          }|                     d	g           }|                     d
d          }d}d}|rh|d         }|                     dd          }	d|	v rd}nGd|	v s|                     d          dk    rd}n'd|	v s|                     d          dk    rd}nd}n|rd}||ddddddd d!                     |d          |||t          |          d"||<   |S )#u'   解析路由信息，提取关键状态successr;   errorMsgr3   )routesstatusr;   r8   
routeRespsmailNorO   reasonRemarkr:   Nremarku   签收	deliveredu   派送opCode30
deliveringu   揽收54	picked_up
in_transitno_datau	   已签收u	   派送中u	   已揽收u	   运输中u   暂无数据u   未知u   查询异常)rV   rY   r[   r\   r]   r:   r;   )rR   rP   statusLabel	lastRouterO   reason
routeCount)r#   len)
routes_dataroute_respsresultsr'   mail_norO   r`   rP   
last_routerU   s
             r)   parse_routesrh   E   s   ??9%% [+//*VX:Y:YZZZ//)R0044\2FFKG &
 &
((8R(((B''."-- 
 	J^^Hb11F6!!$V##z~~h'?'?4'G'G%V##z~~h'?'?4'G'G$% 	F ()())#'  c&(###f++
 
" N    )u	   刘子研zliuziyan@biori.com)	   张立娅	   黄明月c                 H   |                      dd          pd}|                      dd          pd}|t          v rt          |         \  | d<   | d<   nQ|                                dv r;|                                dk    rt          d         nt          d         \  | d<   | d<   | S )u4   把离职人员的创建者/邮箱映射到接替人	   创建者r3      创建者邮箱)zhangliya@biori.comzhuangmingyue@biori.comro   rj   rk   )r#   RESIGN_REASSIGNlower)ocreatoremails      r)   reassign_creatorru   {   s    eeK$$*GEE#R((.BE/!!/>w/G,++,,	K	K	KOT{{}}`uOuOu{/K/K  |K  LW  |X,++,Hri   c                    g }t                      }g }| D ]}t          |          }|                    d          pd                                }|                    |           |r.||vr*|                    |           |                    |           t          dt          |           dt          |           d           i }d}t          dt          |          |          D ]}	||	|	|z            }
d |
D             }	 t          ||          }t          |t                    r)d	|vr%t          |          }|                    |           n|D ]}|d	t          |          d
||<   n2# t          $ r%}|D ]}|d	t          |          d
||<   Y d}~nd}~ww xY w|	|z   t          |          k     rt!          j        d           g }|D ]o}|                    d          pd                                }|r|                    |i           ni }|                    |                    dd          |                    dd          |                    dd          |                    dd          |                    dd          |                    dd          |                    dd          |                    dd          ||                    dd          |                    dd          |                    dd          |                    dd          |                    dd          |d           q|S )u?   处理所有订单（含无物流单号的），批量查轨迹   物流单号r3   u   全量: u   条, 有物流单号: u   条
   r   c                 B    g | ]}|d                                           S )rw   )strip).0rr   s     r)   
<listcomp>z"process_orders.<locals>.<listcomp>   s)    BBBq>*0022BBBri   r;   )rR   rP   r;   Ng      ?   单据编号   购货单位#   销售订单关联客户   销售部门   创建时间   收货人姓名   收货人联系电话#   收货地址u   金额rm   rn   u   合同编号#)orderIdcustomermcpCustomerdept
createDate	recipientphoneaddress
trackingNoamounttaxTotalrs   creatorEmail
contractNoshipment)setru   r#   rz   appendaddprintrb   rangerK   
isinstancedictrh   updater?   r$   rA   sleep)orders_datatoken
all_ordersseen_tntracking_ordersrr   tnall_results
batch_sizeibatchtracking_numsr(   rO   eoutput
route_infos                    r)   process_ordersr      s    JeeGO & &QeeN##)r0022! 	&"G##KKOOO""1%%%	
US__
U
UC<P<P
U
U
UVVV KJ1c/**J77  !J,/BBEBBB
	U$]E::F&$'' ^G6,A,A%f--""6****' ^ ^B13wQTU[Q\Q\&]&]KOO 	U 	U 	U# U U-/7SQRVV"T"TBU U U U U	U z>C0000JsOOO F  eeN##)r002202:[__R,,,
uu^R00or2255!;R@@EE."--%%330"55UU3R88uu^R00eeHb))h++uu["--EE"3R88%%44"
 
 	 	 	 	" Ms   A)E--
F7FFc                     dt           j        v radddddddd	d
ddddddg} t                      }t          | |          }t	          dt          j        |dd          d d                     d S t          j        	                    t          d          }t          j                            |          s5t	          d|            t	          d           t          j        d           t          |d          5 }t          j        |          }d d d            n# 1 swxY w Y   t                      }t          ||          }t          j        t          d           t          t           dd          5 }t          j        t%          j        d          t)          |          |d |dd           d d d            n# 1 swxY w Y   t	          d!t            d"t)          |           d#           d S )$Nz--mockZHBR260724027u   圣湘生物u$   圣湘生物科技股份有限公司u   2×FastAmpli Premix-UNG ⅣzM2181-4-NA-09520320260417u   诊断原料大客户销售部u   标准销售订单u	   未开始z
2026-07-24u   蔡琦17610556866u   湖南省长沙市岳麓区SF5112860018518)r}   r~   r   u   物料名称u   货号#u   出货批号#r   u   单据类型u   状态r   r   r   r   rw   u   Mock结果: F   )r1   indenti  zmcp_orders_input.jsonu1   请先运行MCP拉取数据: 将订单JSON放入 u   或者使用 --mock 测试r,   r
   )encodingT)exist_okwz%Y-%m-%d %H:%M:%S)
updated_attotalordersu   ✅ 写入 z (u    条))sysargvr*   r   r   r   r>   ospathjoinDATA_DIRexistsexitopenloadmakedirsOUTPUTdumprA   strftimerb   )mockr   r   
input_filefr   s         r)   mainr      s{   38 ,+(N9*'<0!('&39-
 
   e,,UTZU1MMMdsdSUUVVV h(?@@J7>>*%% N*NNOOO*+++	j7	+	+	+ #qill# # # # # # # # # # # # # # # NNEK//FK4((((	fcG	,	,	, ,	-(;<<[[
 
 5		, 	, 	, 	,, , , , , , , , , , , , , , , 

4
4
4#f++
4
4
455555s$   :DD"D6<F>>GG__main__)__doc__r   hashlibbase64rA   rB   urllib.requestr   urllib.parser   r   r   dirnameabspath__file__ROOTr   r   r   r   r   r   rE   r*   rK   rh   rp   ru   r   r   __name__ ri   r)   <module>r      s    P O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O	wrwrwx'@'@AABB7<<h''	h 6	7	7 .	@7
! ! !  @. . .d 54 
  : : :x-6 -6 -6^ zDFFFFF ri   