@@ -226,6 +226,10 @@ def create_terminology(session: SessionDep, info: TerminologyInfo, oid: int, tra
226226 specific_ds = info .specific_ds if info .specific_ds is not None else False
227227 datasource_ids = info .datasource_ids if info .datasource_ids is not None else []
228228
229+ if specific_ds :
230+ if not datasource_ids :
231+ raise Exception (trans ("i18n_terminology.datasource_cannot_be_none" ))
232+
229233 parent = Terminology (word = info .word , create_time = create_time , description = info .description , oid = oid ,
230234 specific_ds = specific_ds ,
231235 datasource_ids = datasource_ids )
@@ -237,8 +241,37 @@ def create_terminology(session: SessionDep, info: TerminologyInfo, oid: int, tra
237241 else :
238242 words .append (child )
239243
240- exists = session .query (
241- session .query (Terminology ).filter (and_ (Terminology .word .in_ (words ), Terminology .oid == oid )).exists ()).scalar ()
244+ # 基础查询条件(word 和 oid 必须满足)
245+ base_query = and_ (
246+ Terminology .word .in_ (words ),
247+ Terminology .oid == oid
248+ )
249+
250+ # 构建查询
251+ query = session .query (Terminology ).filter (base_query )
252+
253+ if specific_ds :
254+ # 仅当 specific_ds=False 时,检查数据源条件
255+ query = query .where (
256+ or_ (
257+ or_ (Terminology .specific_ds == False , Terminology .specific_ds .is_ (None )),
258+ and_ (
259+ Terminology .specific_ds == True ,
260+ Terminology .datasource_ids .isnot (None ),
261+ text ("""
262+ EXISTS (
263+ SELECT 1 FROM jsonb_array_elements(datasource_ids) AS elem
264+ WHERE elem::text::int = ANY(:datasource_ids)
265+ )
266+ """ ) # 检查是否包含任意目标值
267+ )
268+ )
269+ )
270+ query = query .params (datasource_ids = datasource_ids )
271+
272+ # 转换为 EXISTS 查询并获取结果
273+ exists = session .query (query .exists ()).scalar ()
274+
242275 if exists :
243276 raise Exception (trans ("i18n_terminology.exists_in_db" ))
244277
@@ -277,29 +310,59 @@ def update_terminology(session: SessionDep, info: TerminologyInfo, oid: int, tra
277310 if count == 0 :
278311 raise Exception (trans ('i18n_terminology.terminology_not_exists' ))
279312
313+ specific_ds = info .specific_ds if info .specific_ds is not None else False
314+ datasource_ids = info .datasource_ids if info .datasource_ids is not None else []
315+
316+ if specific_ds :
317+ if not datasource_ids :
318+ raise Exception (trans ("i18n_terminology.datasource_cannot_be_none" ))
319+
280320 words = [info .word ]
281321 for child in info .other_words :
282322 if child in words :
283323 raise Exception (trans ("i18n_terminology.cannot_be_repeated" ))
284324 else :
285325 words .append (child )
286326
287- exists = session .query (
288- session .query (Terminology ).filter (
289- Terminology .word .in_ (words ),
290- Terminology .oid == oid ,
327+ # 基础查询条件(word 和 oid 必须满足)
328+ base_query = and_ (
329+ Terminology .word .in_ (words ),
330+ Terminology .oid == oid ,
331+ or_ (
332+ Terminology .pid != info .id ,
333+ and_ (Terminology .pid .is_ (None ), Terminology .id != info .id )
334+ ),
335+ Terminology .id != info .id
336+ )
337+
338+ # 构建查询
339+ query = session .query (Terminology ).filter (base_query )
340+
341+ if specific_ds :
342+ # 仅当 specific_ds=False 时,检查数据源条件
343+ query = query .where (
291344 or_ (
292- Terminology .pid != info .id ,
293- and_ (Terminology .pid .is_ (None ), Terminology .id != info .id )
294- ),
295- Terminology .id != info .id
296- ).exists ()).scalar ()
345+ or_ (Terminology .specific_ds == False , Terminology .specific_ds .is_ (None )),
346+ and_ (
347+ Terminology .specific_ds == True ,
348+ Terminology .datasource_ids .isnot (None ),
349+ text ("""
350+ EXISTS (
351+ SELECT 1 FROM jsonb_array_elements(datasource_ids) AS elem
352+ WHERE elem::text::int = ANY(:datasource_ids)
353+ )
354+ """ ) # 检查是否包含任意目标值
355+ )
356+ )
357+ )
358+ query = query .params (datasource_ids = datasource_ids )
359+
360+ # 转换为 EXISTS 查询并获取结果
361+ exists = session .query (query .exists ()).scalar ()
362+
297363 if exists :
298364 raise Exception (trans ("i18n_terminology.exists_in_db" ))
299365
300- specific_ds = info .specific_ds if info .specific_ds is not None else False
301- datasource_ids = info .datasource_ids if info .datasource_ids is not None else []
302-
303366 stmt = update (Terminology ).where (and_ (Terminology .id == info .id )).values (
304367 word = info .word ,
305368 description = info .description ,
0 commit comments