+
    }jJ                     |    ^ RI HtHt ^ RIHt ^ RIHtHtHt ^ RI	H
t
Ht ^ RIHt ^ RIHt ^ RItRR ltR	 tR
 tR# )    )requestjsonify)get_db)get_user_id_from_tokenbuild_locationget_admin_from_token)build_search_conditionserror_response)get_config_value)check_sensitive_wordsNc                   \        4       pVP                  4       p VP                  RV 34       VP                  4       pV'       g   RVP	                  4        # \        RV4      pV'       d   RVP	                  4        # V'       d!   VR,          V8w  d   RVP	                  4        # RVP	                  4        #   TP	                  4        i ; i)uZ   
检查用户是否有权限操作任务
返回 (has_permission, is_admin, error_message)
zBSELECT publisher_id FROM tasks WHERE id = ? AND deleted_at IS NULLNpublisher_id)FF   任务不存在)TTN)FFu   无权操作此任务)TFN)r   cursorexecutefetchonecloser   )task_iduser_idrequire_ownerconnr   taskis_admins   &&&    backend/routes/tasks.pycheck_task_permissionr   	   s    
 8D[[]F[^e]gh 2 	

 (g6 # 	

 T.1W<8 	

 !



s#   ,B9 B9 ?B9 B9 'B9 9Cc                 
   V '       g   / # \        4       pVP                  4       p R P                  R.\        V 4      ,          4      pVP	                  RV R2V 4       VP                  4       p/ pV FS  pVR,          ^ 8  d8   \        VR,          VR,          ,          ^d,          4      pV R2WVR,          &   KH  RWVR,          &   KU  	  V  F  pW9  g   K  RWX&   K  	  VVP                  4        #   TP                  4        i ; i)	,?a\  
            SELECT
                t.publisher_id,
                COUNT(*) as total,
                SUM(CASE WHEN tr.rating = 'good' THEN 1 ELSE 0 END) as positive_count
            FROM task_ratings tr
            JOIN tasks t ON tr.task_id = t.id
            WHERE tr.rating_type = 'acceptor_to_publisher'
              AND t.publisher_id IN (z.)
            GROUP BY t.publisher_id
        totalpositive_count%r   -)r   r   joinlenr   fetchallroundr   )	user_idsr   r   placeholdersrows
rating_maprowrater   s	   &        r   get_bulk_publisher_rating_ratesr-   &   s    	8D[[]FxxH 56 & '3^ 4	
 
	  
C7|ac"23c'lBcIJ59F!*
~./25
~./   G(&)
#   



s   B+C0 	C0 0Dc                 L  a V P                  R R.R7      R 4       pV P                  RR.R7      R 4       pV P                  RR.R7      R 4       pR oV P                  R R	.R7      V3R
 l4       pV P                  RR.R7      R 4       pV P                  RR.R7      R 4       pR# )z
/api/tasksGET)methodsc            
      b   \         P                  P                  R 4      p \         P                  P                  R4      p\         P                  P                  R4      p\        \         P                  P                  R^4      4      p\        \         P                  P                  R^
4      4      pV^,
          V,          p\	        4       pVP                  4       p RpRp	. p
. pV '       d<   V R8w  d5   VR,          pV	R,          p	V
P                  V 4       VP                  V 4       \         P                  P                  R	4      pV'       d   V'       d   VP                  R
4      '       d   VP                  R4      ^,          p\        V4      pV'       d   VR8X  d6   VR,          pV	R,          p	V
P                  V4       VP                  V4       MsVR8X  dm   VR,          pV	R,          p	V
P                  V4       VP                  V4       VR,          pV	R,          p	V
P                  RR.4       VP                  RR.4       V'       dO   . ROp\        W4      w  ppV'       d5   VV,          pV	V,          p	V
P                  V4       VP                  V4       VP                  W4       VP                  4       ^ ,          pVR,          pV
P                  WE.4       VP                  W4       VP                  4       p\!        \#        R V 4       4      4      p\%        V4      p. pV FK  p\'        V4      p\)        VRR7      VR&   VP                  VR,          R4      VR&   VP                  V4       KM  	  \+        RVRVRVRV/4      VP-                  4        #   TP-                  4        i ; i)statustypesearchpagelimitz
                SELECT t.*, u.phone as publisher_phone
                FROM tasks t LEFT JOIN users u ON t.publisher_id = u.id 
                WHERE t.deleted_at IS NULL
            z7SELECT COUNT(*) FROM tasks t WHERE t.deleted_at IS NULLallz AND status = ?AuthorizationBearer  	publishedz AND publisher_id = ?acceptedz AND acceptor_id = ?z AND status IN (?, ?)in_progress	completedz* ORDER BY created_at DESC LIMIT ? OFFSET ?c              3   T   "   T F  qR ,          '       g   K  VR ,          x  K   	  R# 5i)r   N ).0r+   s   & r   	<genexpr>:register_task_routes.<locals>.get_tasks.<locals>.<genexpr>   s$     $`DSP^L_L_%8S%8%8Ds   ((Tinclude_detaillocationr   r"   publisher_rating_rateitemsr   )zt.titlezt.descriptionz
t.provincezt.cityz
t.districtzt.street)r   argsgetintr   r   appendheaders
startswithsplitr   extendr	   r   r   r%   listsetr-   dictr   r   r   )r2   
type_paramr4   r5   r6   offsetr   r   querycount_queryparamscount_paramsauth_headertokencurrent_user_idsearch_fieldssearch_condsearch_paramsr   r)   publisher_idspublisher_rating_maprH   r+   r   s                            r   	get_tasks'register_task_routes.<locals>.get_tasksL   s"   !!(+\\%%f-
!!(+7<<##FA./GLL$$Wb12(e#xG	E
 TKFL&E/**00f%##F+!//--o>Kkk.D.DY.O.O#))#.q1"8"?"![0!88#'>>o6$++O<#z1!77#'==o6$++O<!88#'>>}k&BC$++]K,HI n-D]-[*][(E;.KMM-0 ''6NN;5OO%a(EAAEMM5/*NN5)??$D $`D$`!`aM#B=#Q ECy#1$t#LZ 0D0H0H^I\^a0b,-T"	  	  JJLDJJLs'   A1N N N ,C!N D=N N.z/api/tasks/countc                      \         P                  P                  R 4      p V '       d   V P                  R4      '       g   \	        RR4      # V P                  R4      ^,          p\        V4      pV'       g   \	        RR4      # \        4       pVP                  4       p VP                  RV34       VP                  4       ^ ,          p\        \        RR4      4      p\        R	VR
V/4      VP                  4        #   TP                  4        i ; i)r8   r9   u	   未登录  r:   u   登录已过期z
                SELECT COUNT(*) FROM tasks 
                WHERE publisher_id = ? AND status IN ('pending', 'in_progress') AND deleted_at IS NULL
            max_publish_tasks3countmax)r   rM   rJ   rN   r
   rO   r   r   r   r   r   rK   r   r   r   )rZ   r[   r   r   r   current_countmax_publishs          r   get_task_count,register_task_routes.<locals>.get_task_count   s    oo))/:+"8"8"C"C!+s33!!#&q)(/!"3S99x	NN   #OO-a0M./BCHIKG]E;GHJJLDJJLs   AC; ;Dz/api/tasks/<int:task_id>c                    \        4       pVP                  4       p VP                  R V 34       VP                  4       pV'       g   \	        R4      VP                  4        # \        V4      p\        VRR7      VR&   VP                  R4      '       d   VR,          VR&   M#VP                  R4      '       d   VR,          VR&   \        V4      VP                  4        #   TP                  4        i ; i)a  
                SELECT t.*, u.nickname as user_nickname, u.phone as acceptor_phone, u.avatar as acceptor_avatar,
                       pr.rating as publisher_rating, pr.comment as publisher_rating_comment, pr.created_at as publisher_rating_created_at,
                       ar.rating as acceptor_rating, ar.comment as acceptor_rating_comment, ar.created_at as acceptor_rating_created_at
                FROM tasks t 
                LEFT JOIN users u ON t.acceptor_id = u.id 
                LEFT JOIN task_ratings pr ON t.id = pr.task_id AND pr.rating_type = 'publisher_to_acceptor'
                LEFT JOIN task_ratings ar ON t.id = ar.task_id AND ar.rating_type = 'acceptor_to_publisher'
                WHERE t.id = ? AND t.deleted_at IS NULL
            r   TrD   rF   user_nicknameacceptor_nameacceptor_phone)
r   r   r   r   r
   r   rS   r   rJ   r   )r   r   r   r+   results   &    r   get_task&register_task_routes.<locals>.get_task   s    x	NN 	 	 //#C%&78 JJL #YF!/t!LF:zz/***0*A',--*01A*B'6?JJLDJJLs   5C "AC 8C C1c                      \         P                   P                  V R 4      p\         P                   P                  4       pW8  #   \         d     R# i ; i)z%Y-%m-%d %H:%MF)datetimestrptimenow	Exception)task_time_str	task_timecurrent_times   &  r   validate_task_time0register_task_routes.<locals>.validate_task_time   sO    	 ))22=BRSI#,,002L++ 		s   AA AAPOSTc                    < \         P                  p \        4       pVP                  4       p V P	                  R 4      pV'       d*   S! V4      '       g   \        R4      VP                  4        # \        V P	                  R4      V P	                  R4      V P	                  R4      V P	                  R4      4      w  rEV'       d   \        R4      VP                  4        # \         P                  P	                  R4      pRpV'       d   VP                  R	4      '       d   VP                  R
4      ^,          pVP                  RV34       VP                  4       p	V	'       d   V	R,          ^8w  d   \        RR4      VP                  4        # V	R,          pVP                  RV34       VP                  4       ^ ,          p
\        \        RR4      4      pW8  d    \        RV R24      VP                  4        # VP                  RV P	                  R4      V P	                  R4      V P	                  R4      V P	                  R4      V P	                  R4      V P	                  R4      V P	                  R4      V P	                  R 4      V P	                  R4      VV P	                  R4      V P	                  R4      V P	                  RR4      V P	                  RR4      34       VP                  pVP!                  4        VP                  R V34       VP                  4       p\#        V4      p\%        VR!R"7      VR#&   \'        V4      VP                  4        #   \(         d   pTP+                  4        ThRp?ii ; i  TP                  4        i ; i)$timeu$   任务时间必须晚于当前时间titledescriptiondetail_locationreward0   文字中存在敏感词，请修改后再发布r8   Nr9   r:   z
                    SELECT u.id, u.enabled FROM users u
                    JOIN sessions s ON u.id = s.user_id
                    WHERE s.token = ? AND s.expires_at > datetime('now') AND u.deleted_at IS NULL
                enabledu'   账户已被禁用，无法发布任务  idz
                        SELECT COUNT(*) FROM tasks 
                        WHERE publisher_id = ? AND status IN ('pending', 'in_progress') AND deleted_at IS NULL
                    rf   rg   u(   待处理+进行中的任务数最多为u   个，暂时无法发布z
                INSERT INTO tasks (title, description, province, city, district, street, detail_location, time, reward, publisher_id, publisher_name, contact, status, type)
                VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
            provincecitydistrictstreetpublisher_namecontactr2   pendingr3   r;    SELECT * FROM tasks WHERE id = ?TrD   rF   )r   jsonr   r   rJ   r
   r   r   rM   rN   rO   r   r   rK   r   	lastrowidcommitrS   r   r   ry   rollback)datar   r   r{   foundwordrZ   r   r[   userrj   rk   r   created_taskrr   er}   s                   r   create_task)register_task_routes.<locals>.create_task   s   ||xM	(I))44)*PQR JJLM 0!'*+"	KE %&XY~ JJL{ "//--o>KL{55i@@#))#.q1   X	
 (I!+-.WY\]^ JJL[ $(:LNN $ '* %+OO$5a$8M"%&67JC&P"QK$3-0XYdXee}.~F JJLC NN  !'$ $"*+ ")*#9--( &&GKKMNN=zJ!??,L,'F!/t!LF:6?
 JJL	  	MMOG	 JJLsW   &M 
M /AM (M M AM !M AM 8E	M M4M//M44M7 7N	PUTc                    \         P                  P                  R 4      pV'       d   VP                  R4      '       g   \	        RR4      # VP                  R4      ^,          p\        V4      pV'       g   \	        RR4      # \        WRR7      w  rEpV'       g   \	        VR4      # \         P                  p\        VP                  R	4      VP                  R
4      VP                  R4      VP                  R4      4      w  rV'       d   \	        R4      # \        4       p
V
P                  4       p VP                  RV 34       VP                  4       pV'       g   \	        R4      V
P                  4        # . p. pR	V9   d*   VP                  R4       VP                  VR	,          4       R
V9   d*   VP                  R4       VP                  VR
,          4       RV9   d*   VP                  R4       VP                  VR,          4       RV9   d*   VP                  R4       VP                  VR,          4       RV9   d*   VP                  R4       VP                  VR,          4       V'       EdQ   RV9   d*   VP                  R4       VP                  VR,          4       RV9   d*   VP                  R4       VP                  VR,          4       RV9   d*   VP                  R4       VP                  VR,          4       RV9   d*   VP                  R4       VP                  VR,          4       RV9   d*   VP                  R4       VP                  VR,          4       R V9   d*   VP                  R!4       VP                  VR ,          4       R"V9   d*   VP                  R#4       VP                  VR",          4       VP                  R$4      R%8X  d4   VP                  R#4       VP                  V4       VP                  R&4       V'       g   \	        R'4      V
P                  4        # VP                  V 4       VP                  R(R)P!                  V4       R*2V4       V
P#                  4        VP                  R 4      R+8X  d   R,V9   d   W<R-,          8X  d   VR",          '       dz   VP                  R.V R/34       VP                  4       pV'       gN   VP                  R0WVR",          VP                  R,4      VP                  R1R24      R/34       V
P#                  4        VP                  RV 34       VP                  4       pV'       d7   \%        V4      p\'        VRR37      VR4&   \)        V4      V
P                  4        # \	        R4      V
P                  4        #   \*         d   pT
P-                  4        ThR5p?ii ; i  T
P                  4        i ; i)6r8   r9      请先登录re   r:   !   登录已过期，请重新登录Tr   r   r   r   r   r   r   r   r   z	title = ?zdescription = ?r   ztime = ?z
reward = ?r   zcontact = ?r   zprovince = ?r   zcity = ?r   zdistrict = ?r   z
street = ?zdetail_location = ?r2   z
status = ?acceptor_idzacceptor_id = ?r3   r<   zaccept_time = datetime('now')u   没有需要更新的字段zUPDATE tasks SET z, z WHERE id = ?r>   ratingr   z@SELECT * FROM task_ratings WHERE task_id = ? AND rating_type = ?publisher_to_acceptorz
                            INSERT INTO task_ratings (task_id, publisher_id, acceptor_id, rating, comment, rating_type)
                            VALUES (?, ?, ?, ?, ?, ?)
                        rating_comment rD   rF   N)r   rM   rJ   rN   r
   rO   r   r   r   r   r   r   r   r   r   rL   r#   r   rS   r   r   ry   r   )r   rZ   r[   r   has_permissionr   	error_msgr   r   r   r   r   r   update_fieldsupdate_valuesexisting_ratingupdated_taskrr   r   s   &                  r   update_task)register_task_routes.<locals>.update_task7  s     oo))/:+"8"8"C"C!.#66!!#&q)(/!"EsKK /DGdh.i+)!)S11|| ,HHWHH]#HH&'HHX	
 !"TUUxY	NN=zJ??$D%&78h JJLc MM $$$[1$$T']3$$$%67$$T-%89~$$Z0$$T&\24$$\2$$T(^4D $$]3$$T)_5 x%!((8!((j)9:T>!((4!((f6%!((8!((j)9:t#!((6!((h8$,!(()>?!((.?)@At#!((6!((h8 D(!(():;!((m)<= xx:-$$%67$$W-$$%FG %&CD< JJL9   )NN.tyy/G.HVXefKKMxx![0X5E>22tM7J7JNN#eho  rI  hJ  K&,oo&7O* ( &]0CTXXhEWY]YaYabrtvYw  zQ  RS NN=zJ!??,Ll+%3F4%Pz"v JJL &&78
 JJL	  	MMOG	 JJLsX   05V# 6C<V# 3F V# 
V# /A>V# .+V# A7V# %V# 
V# #W.W  WW WDELETEc                 z   \         P                  P                  R 4      pV'       d   VP                  R4      '       g   \	        RR4      # VP                  R4      ^,          p\        V4      pV'       g   \	        RR4      # \        WRR7      w  rEpV'       g   \	        VR4      # \        4       pVP                  4       p VP                  R	V 34       VP                  4        \        R
RRR/4      VP                  4        #   \         d   p	TP                  4        T	hRp	?	ii ; i  TP                  4        i ; i)r8   r9   r   re   r:   r   Tr   r   z:UPDATE tasks SET deleted_at = datetime('now') WHERE id = ?successmessageu   删除成功N)r   rM   rJ   rN   r
   rO   r   r   r   r   r   r   r   r   ry   r   )
r   rZ   r[   r   r   r   r   r   r   r   s
   &         r   delete_task)register_task_routes.<locals>.delete_task  s    oo))/:+"8"8"C"C!.#66!!#&q)(/!"EsKK /DGdh.i+)!)S11x		NNY\c[efKKMItYGH
 JJL	  	MMOG	 JJLs$   1D D%D  D%%D( (D:N)route)apprb   rl   rs   r   r   r   r}   s   &      @r   register_task_routesr   K   s    YY|eWY-Q .Qf 	YY!E7Y3 44 	YY)E7Y; <> 	YY|fXY.Q /Qf 	YY)E7Y;x <xt 	YY)H:Y> ?    )T)flaskr   r   utils.databaser   
utils.authr   r   r   utils.helpersr	   r
   utils.configr   utils.sensitive_filterr   rv   r   r-   r   r@   r   r   <module>r      s.    " ! S S A ) 8 :#JDr   