11import io
22import json
33import uuid
4- from typing import List , Dict
4+ from typing import List , Dict , Literal
55
66import openpyxl
77from fastapi import UploadFile
@@ -176,6 +176,9 @@ async def _sync_sop_record(sop_records: list[LinsightSOPRecord], override: bool
176176 description = one_record .description ,
177177 content = one_record .content ,
178178 rating = one_record .rating ,
179+ linsight_version_id = one_record .linsight_version_id ,
180+ showcase = False ,
181+ user_id = one_record .user_id ,
179182 ))
180183 override_name_dict [one .name ] = True
181184 # 再新增剩下的sop记录
@@ -187,6 +190,7 @@ async def _sync_sop_record(sop_records: list[LinsightSOPRecord], override: bool
187190 description = one .description ,
188191 content = one .content ,
189192 rating = one .rating ,
193+ linsight_version_id = one .linsight_version_id ,
190194 ), one .user_id )
191195 elif save_new :
192196 for one in sop_records :
@@ -199,6 +203,7 @@ async def _sync_sop_record(sop_records: list[LinsightSOPRecord], override: bool
199203 description = one .description ,
200204 content = one .content ,
201205 rating = one .rating ,
206+ linsight_version_id = one .linsight_version_id ,
202207 ), one .user_id )
203208 else :
204209 # 说明有重复的记录,需要用户确认
@@ -211,6 +216,7 @@ async def _sync_sop_record(sop_records: list[LinsightSOPRecord], override: bool
211216 description = one .description ,
212217 content = one .content ,
213218 rating = one .rating ,
219+ linsight_version_id = one .linsight_version_id ,
214220 ), one .user_id )
215221 if oversize_records :
216222 raise ValueError (f"{ '、' .join (oversize_records )} 内容超长" )
@@ -285,6 +291,28 @@ async def upload_sop_file(cls, login_user: UserPayload, file: UploadFile, ignore
285291 records = [LinsightSOPRecord (** one , user_id = login_user .user_id ) for one in success_rows ]
286292 return await cls ._sync_sop_record (records , override = override , save_new = save_new )
287293
294+ @classmethod
295+ async def get_sop_list (cls , keywords : str = None , sort : Literal ["asc" , "desc" ] = "desc" , showcase : bool = False ,
296+ page : int = 1 , page_size : int = 10 ) -> dict :
297+ """
298+ 获取SOP列表
299+ :param keywords: 关键词
300+ :param sort: 排序方式
301+ :param page: 页码
302+ :param page_size: 每页数量
303+ :param showcase: 是否仅展示精选案例的SOP
304+ :return: SOP列表和总数
305+ """
306+ sop_pages = await LinsightSOPDao .get_sop_page (keywords = keywords , showcase = showcase , page = page ,
307+ page_size = page_size ,
308+ sort = sort )
309+ user_ids = list (set ([one ["user_id" ] for one in sop_pages ["items" ]]))
310+ user_map = UserDao .aget_user_by_ids (user_ids = user_ids )
311+ user_map = {one .user_id : one .user_name for one in await user_map }
312+ for one in sop_pages ["items" ]:
313+ one ["user_name" ] = user_map .get (one ["user_id" ], str (one ["user_id" ]))
314+ return sop_pages
315+
288316 @staticmethod
289317 async def add_sop (sop_obj : SOPManagementSchema , user_id ) -> UnifiedResponseModel | None :
290318 """
@@ -336,16 +364,20 @@ async def add_sop(sop_obj: SOPManagementSchema, user_id) -> UnifiedResponseModel
336364 return resp_200 (data = sop_model )
337365
338366 @staticmethod
339- async def update_sop (sop_obj : SOPManagementUpdateSchema ) -> UnifiedResponseModel | None :
367+ async def update_sop (sop_obj : SOPManagementUpdateSchema ,
368+ update_version_id : bool = True ) -> UnifiedResponseModel | None :
340369 """
341370 更新SOP
342371 :param sop_obj:
372+ :param update_version_id: 是否更新版本ID
343373 :return: 更新后的SOP对象
344374 """
345375 # 校验SOP是否存在
346376 existing_sop = await LinsightSOPDao .get_sops_by_ids ([sop_obj .id ])
347377 if not existing_sop :
348378 return NotFoundError .return_resp ()
379+ if not update_version_id :
380+ sop_obj .linsight_version_id = existing_sop [0 ].linsight_version_id
349381
350382 if sop_obj .content != existing_sop [0 ].content :
351383
@@ -419,6 +451,18 @@ async def remove_sop(sop_ids: list[int], login_user: UserPayload) -> UnifiedResp
419451
420452 return resp_200 (data = True )
421453
454+ @classmethod
455+ async def get_sop_by_id (cls , sop_id : int ) -> LinsightSOP | None :
456+ """
457+ 根据ID获取SOP
458+ :param sop_id: SOP唯一ID
459+ :return: SOP对象
460+ """
461+ sop_models = await LinsightSOPDao .get_sops_by_ids ([sop_id ])
462+ if not sop_models :
463+ return None
464+ return sop_models [0 ]
465+
422466 # sop 库检索
423467 @classmethod
424468 async def search_sop (cls , query : str , k : int = 3 ) -> (List [Document ], BaseErrorCode | None ):
0 commit comments