
    j"                        d dl mZ d dlZd dlmZ d dlmZmZmZ d dlm	Z	m
Z
  G d de
          Zd"d#dZd$dZd%dZd&dZd'dZd(dZe G d  d!                      ZdS ))    )annotationsN)	dataclass)datedatetime	timedelta)AnyProtocolc                  B    e Zd ZddZddZdd
ZddZdddZdddZdS )DashboardRepositoryProtocolreturn
str | Nonec                    d S N selfs    r   /Users/bot1/Volumes/root_for_ai/AI工作区/良渚_电商数据看板_前后端分离_20260602_0257/app/service.pylatest_datez'DashboardRepositoryProtocol.latest_date
             	list[str]c                    d S r   r   r   s    r   available_datesz+DashboardRepositoryProtocol.available_dates   r   r   
start_dater   end_datelist[dict[str, Any]]c                    d S r   r   r   r   r   s      r   store_summaryz)DashboardRepositoryProtocol.store_summary   r   r   c                    d S r   r   r   s      r   trendz!DashboardRepositoryProtocol.trend   r   r      limitintc                    d S r   r   r   r   r   r#   s       r   product_rankz(DashboardRepositoryProtocol.product_rank   r   r   c                    d S r   r   r&   s       r   traffic_rankz(DashboardRepositoryProtocol.traffic_rank   r   r   N)r   r   )r   r   )r   r   r   r   r   r   )r"   )r   r   r   r   r#   r$   r   r   )	__name__
__module____qualname__r   r   r   r!   r'   r)   r   r   r   r   r   	   s^        ,,,,////ZZZZRRRRjjjjjjjjjjjjr   r   valuer   fallbackr   r   c                    | p|}|st          j                    S t          j        |d                                           S )Nz%Y-%m-%d)r   todayr   strptime)r-   r.   raws      r   parse_iso_dater3      s?    

8C z||S*--22444r   grainstrselectedtuple[date, date, str]c                   | dk    r|||                                 fS | dk    rf|t          |                                          z
  }|t          d          z   }|||                                  d|                                  fS | dk    rg|                    d          }|                    t	          j        |j        |j                  d                   }|||                    d	          fS t          d
          )Ndayweek)days   u    至 month   )r9   z%Y-%mz&grain must be one of: day, week, month)
	isoformatr   weekdayreplacecalendar
monthrangeyearr=   strftime
ValueError)r4   r6   startends       r   resolve_periodrI      s   ~~8#5#5#7#7779(*:*:*<*<====iQ''''ceoo//GGcmmooGGGG  Q ''8#6x}hn#U#UVW#XYYc8,,W5555
=
>
>>r   r   floatc                X    | | dk    rdS 	 t          |           S # t          $ r Y dS w xY w)N g        )rJ   	Exceptionr-   s    r   numberrO   '   sG    }sU||   sss    
))c                @    t          t          | pd          d          S )Nr      )roundrJ   rN   s    r   round2rS   0   s    uz""A&&&r   repomethodargsr   c                P    t          | |d           }t          |          sg S  || S r   )getattrcallable)rT   rU   rV   fns       r   optional_rowsr[   4   s2    	vt	$	$BB<< 	2t9r   rowdict[str, Any]Nonec                    dD ]4}t          t          |                     |                              | |<   5dD ]4}t          t          |                     |                              | |<   5d S )N)promotion_spend_amountpromoted_transaction_amountnet_payment_amount_for_ratepromotion_click_countpromotion_impression_countpromoted_transaction_count)promotion_roipromotion_ctrpromotion_cpcpromotion_spend_ratepromotion_transaction_share)rS   rO   get)r\   keys     r   enrich_money_raterm   ;   sx     0 0 &..//Cy 0 0&..//C0 0r   c                  *    e Zd ZU ded<   ddZdd
ZdS )DashboardServicer   
repositoryr   r]   c                z    | j                                         | j                                         g dddddddS )N)r9   r:   r=   u   日u   周u   月u^   推广花费/成交默认采用阿里妈妈万相台营销场景报表日粒度归因口径。)r   r   grainsgrain_labelspromotion_note)rp   r   r   r   s    r   metazDashboardService.metaM   sL    ?6688#>>@@...$)55II~
 
 	
r   r4   r5   selected_dater   c                   | j                                         }t          ||          }t          ||          \  }}}| j                             ||          }| j                             ||          }	| j                             ||d          }
| j                             ||d          }t          | j         d||          }t          | j         d||          }t          | j         d||d          }t          | j         d||d          }t          d |D                       }t          d |D                       }t          d |D                       }t          d	 |D                       }|r||z  nd
}|r||z  nd
}d |D             }||z   |z   |z   D ]}t          |           t          d |D                       }t          d |D                       }t          d |D                       }t          d |D                       }t          d |D                       }|r||z  nd
}|r||z  nd
}|r||z  nd
}|r||z  nd
} |r||z  nd
}!|D ].}t          |                    d                    }"t          |                    d          p|                    d                    }#t          |                    d                    }$t          |#          |d<   t          |"          |d<   t          t          |                    d                              |d<   t          |$          |d<   |"rt          |$|"z            nd
|d<   |$rt          |#|$z            nd
|d<   |rt          |#|z            nd
|d<   |                    |                    d          i           }%t          t          |%                    d                              |d<   t          t          |%                    d                              |d<   t          t          |%                    d                              |d<   |#rt          |d         |#z            nd
|d<   |#rt          |d         |#z            nd
|d<   0||                                |                                |dd d!d"i dt          |          dt          |          dt          |          dt          |          dt          |          dt          |          d#t          |          d$t          |
          dt          |          dt          |          dt          |          dt          |          dt          |          d%t          |          d&t          |          d't          |           d(t          |!          d)t          |          i||
||||d*|	|d+d,S )-Nr"   promotion_store_summarypromotion_trendpromotion_scene_rankpromotion_plan_rankc              3     K   | ];}t          |                    d           p|                    d                    V  <dS )net_payment_amountpayment_amountNrO   rk   .0rs     r   	<genexpr>z-DashboardService.dashboard.<locals>.<genexpr>c   sJ      ii]^&';!<!<!WFV@W@WXXiiiiiir   c              3  Z   K   | ]&}t          |                    d                     V  'dS )visitor_countNr   r   s     r   r   z-DashboardService.dashboard.<locals>.<genexpr>d   s6      FF!vaeeO4455FFFFFFr   c              3  Z   K   | ]&}t          |                    d                     V  'dS )page_view_countNr   r   s     r   r   z-DashboardService.dashboard.<locals>.<genexpr>e   s7      HHAvaee$56677HHHHHHr   c              3  Z   K   | ]&}t          |                    d                     V  'dS )payment_buyer_countNr   r   s     r   r   z-DashboardService.dashboard.<locals>.<genexpr>f   s7      PPA6!%%(=">">??PPPPPPr   r   c                :    i | ]}|                     d           |S )
store_name)rk   r   s     r   
<dictcomp>z.DashboardService.dashboard.<locals>.<dictcomp>j   s&    OOOaeeL111OOOr   c              3  Z   K   | ]&}t          |                    d                     V  'dS )r`   Nr   r   s     r   r   z-DashboardService.dashboard.<locals>.<genexpr>n   s7      bbAquu-E'F'F G Gbbbbbbr   c              3  Z   K   | ]&}t          |                    d                     V  'dS )ra   Nr   r   s     r   r   z-DashboardService.dashboard.<locals>.<genexpr>o   s8      %m%mWXfQUU3P-Q-Q&R&R%m%m%m%m%m%mr   c              3  Z   K   | ]&}t          |                    d                     V  'dS )rc   Nr   r   s     r   r   z-DashboardService.dashboard.<locals>.<genexpr>p   s7       b bA.E(F(F!G!G b b b b b br   c              3  Z   K   | ]&}t          |                    d                     V  'dS )rd   Nr   r   s     r   r   z-DashboardService.dashboard.<locals>.<genexpr>q   s8      %l%lVWfQUU3O-P-P&Q&Q%l%l%l%l%l%lr   c              3  Z   K   | ]&}t          |                    d                     V  'dS )re   Nr   r   s     r   r   z-DashboardService.dashboard.<locals>.<genexpr>r   s8       g gQR.J(K(K!L!L g g g g g gr   r   r}   r~   r   r   payment_conversion_ratecustomer_unit_pricesales_sharer   r`   ra   rf   ri   rj   )rG   rH   labelu   阿里妈妈/万相台：营销场景报表用于总花费和场景汇总；计划报表只用于计划 TOP，避免重复加总。uR   ROI 为平台后台当前成交归因口径：推广成交金额 / 推广花费。)promotion_sourcerf   active_store_countproduct_countrc   rd   rg   rh   re   )storesproductstrafficpromotion_storespromotion_scenespromotion_plans)r!   ry   )r4   period
data_noteskpissectionscharts)rp   r   r3   rI   r   r!   r'   r)   r[   sumrm   rO   rk   rS   r?   len)&r   r4   rv   latestr6   rG   rH   r   r   r!   r   r   r   ry   r   r   total_salestotal_uvtotal_pvtotal_buyers
conversion	avg_orderpromotion_by_storer\   total_promo_spendtotal_promo_transactiontotal_promo_clickstotal_promo_impressionstotal_promo_ordersrf   ri   rj   rg   rh   uvnetbuyerspromos&                                         r   	dashboardzDashboardService.dashboardV   s   ,,..!-88*5(;;sE..uc::%%eS11?//sB??/..uc2>>(:SUZ\_``'9JESVWW(:PRWY\^`aa'9NPUWZ\^__iibhiiiiiFFvFFFFFHHHHHHHPPPPPPP2:AlX--
4@G[<//a	OO>NOOO#&66H?Z 	# 	#Cc""""bbQabbbbb"%%m%m\l%m%m%m"m"m  b bQa b b bbb"%%l%l[k%l%l%l"l"l  g gVf g g gggIZa03DDD`aDOV 1K ? ?UVQ\&c'>'L'Lbc#Jah+.EEEghDV]*-???\] 	p 	pC0011B!566S#''BR:S:STTCCGG$9::;;F(.sC$%#)"::C %+F377;L3M3M,N,N%O%OC!")/C%&DF-MVFRK-@-@-@AC)*AG)Nf)=)=)=QC%&>I!Pk(9!:!:!:qC&**377<+@+@"EEE,26%))D\:]:]3^3^,_,_C()17uyyIf?g?g8h8h1i1iC-.#)&?1K1K*L*L#M#MC Y\*c&5M1NQT1T*U*U*UbcC&'eh1o<Y8Z]`8`1a1a1anoC-..  % 1 1#--//TYZZ %j!u $f[&9&9!1!1 "6(#3#3 &vl';';	
 *6*+=+= &vi'8'8 %c&kk  X )&1B*C*C .v6M/N/N  !6!6 '/C(D(D .v6Q/R/R (0B)C)C -f5L.M.M   !6!6!"  !6!6#$ -f5G.H.H% * !$"$4$4#2  !&/JJG$
 $
 $	
r   N)r   r]   )r4   r5   rv   r   r   r]   )r*   r+   r,   __annotations__ru   r   r   r   r   ro   ro   I   sP         ++++
 
 
 
Y
 Y
 Y
 Y
 Y
 Y
r   ro   r   )r-   r   r.   r   r   r   )r4   r5   r6   r   r   r7   )r-   r   r   rJ   )r-   rJ   r   rJ   )rT   r   rU   r5   rV   r   r   r   )r\   r]   r   r^   )
__future__r   rB   dataclassesr   r   r   r   typingr   r	   r   r3   rI   rO   rS   r[   rm   ro   r   r   r   <module>r      s_   " " " " " "  ! ! ! ! ! ! . . . . . . . . . .                k k k k k( k k k5 5 5 5 5? ? ? ?   ' ' ' '   0 0 0 0 e
 e
 e
 e
 e
 e
 e
 e
 e
 e
r   