@@ -227,4 +227,50 @@ async def crud_self_tree(user_id: int, page_number: int, page_size: int, db: Asy
227227 note_array = [{"note_id" : note .id , "note_title" : note .title } for note in notes ]
228228 article_array [j ]["notes" ] = note_array
229229
230- return total_num , folder_array
230+ return total_num , folder_array
231+
232+ async def crud_self_article_statistic (user_id : int , db : AsyncSession ):
233+ # 查询个人拥有的、未被删除的文献总数
234+ query = (
235+ select (func .count (Article .id ))
236+ .join (Folder , Article .folder_id == Folder .id )
237+ .where (Folder .user_id == user_id , Folder .visible == True , Article .visible == True )
238+ )
239+ result = await db .execute (query )
240+ article_total_num = result .scalar_one_or_none ()
241+
242+ # 获取明天日期和7天前的日期
243+ tomorrow = datetime .now ().date () + timedelta (days = 1 )
244+ seven_days_ago = datetime .now ().date () - timedelta (days = 6 )
245+
246+ # 查询近7天内的笔记数目,按日期分组
247+ query = (
248+ select (
249+ cast (Article .create_time , Date ).label ("date" ), # 按日期分组
250+ func .count (Article .id ).label ("count" ) # 统计每日期的笔记数
251+ )
252+ .join (Folder , Article .folder_id == Folder .id )
253+ .where (
254+ Folder .user_id == user_id ,
255+ Folder .visible == True ,
256+ Article .visible == True ,
257+ Article .create_time >= seven_days_ago , # 大于等于7天前的0点
258+ Article .create_time < tomorrow , # 小于明天0点
259+ )
260+ .group_by (cast (Article .create_time , Date )) # 按日期分组
261+ .order_by (cast (Article .create_time , Date )) # 按日期排序
262+ )
263+
264+ # 执行查询
265+ result = await db .execute (query )
266+ data = result .fetchall ()
267+
268+ # 格式化结果为字典列表
269+ articles = [{"date" : row .date , "count" : row .count } for row in data ]
270+
271+ # 若某日期没有记录,则为0
272+ for i in range (0 , 7 ):
273+ if i == len (articles ) or articles [i ].get ("date" ) != seven_days_ago + timedelta (days = i ):
274+ articles .insert (i , {"date" : seven_days_ago + timedelta (days = i ), "count" : 0 })
275+
276+ return article_total_num , articles
0 commit comments