|
|
@@ -1673,22 +1673,43 @@ def search_member():
|
|
|
return jsonify({"success": False, "message": "Unauthorized"}), 401
|
|
|
|
|
|
data = request.get_json()
|
|
|
- keyword = data.get('keyword', '').strip()
|
|
|
-
|
|
|
+ keyword = data.get('keyword', '').strip()
|
|
|
+ search_type = data.get('search_type', 'name') # name | former_name | childhood_name | name_word
|
|
|
+
|
|
|
if not keyword:
|
|
|
return jsonify({"success": False, "message": "请输入搜索关键词"})
|
|
|
-
|
|
|
+
|
|
|
conn = get_db_connection()
|
|
|
try:
|
|
|
with conn.cursor() as cursor:
|
|
|
- # 先去重查人员(每个 ID 只返回一行),再子查询附加父亲和出继信息
|
|
|
like = f'%{keyword}%'
|
|
|
- cursor.execute("""
|
|
|
+ # 根据搜索类型构建 WHERE 子句
|
|
|
+ if search_type == 'former_name':
|
|
|
+ where_clause = "fmi.former_name LIKE %s"
|
|
|
+ where_params = (like,)
|
|
|
+ order_params = (keyword, keyword, f'{keyword}%', f'{keyword}%')
|
|
|
+ elif search_type == 'childhood_name':
|
|
|
+ where_clause = "fmi.childhood_name LIKE %s"
|
|
|
+ where_params = (like,)
|
|
|
+ order_params = (keyword, keyword, f'{keyword}%', f'{keyword}%')
|
|
|
+ elif search_type == 'name_word':
|
|
|
+ where_clause = "fmi.name_word LIKE %s"
|
|
|
+ where_params = (like,)
|
|
|
+ order_params = (keyword, keyword, f'{keyword}%', f'{keyword}%')
|
|
|
+ else: # name(默认:姓名搜索)
|
|
|
+ where_clause = "fmi.name LIKE %s OR fmi.simplified_name LIKE %s OR fmi.former_name LIKE %s"
|
|
|
+ where_params = (like, like, like)
|
|
|
+ order_params = (keyword, keyword, f'{keyword}%', f'{keyword}%')
|
|
|
+
|
|
|
+ cursor.execute(f"""
|
|
|
SELECT
|
|
|
fmi.id,
|
|
|
fmi.name,
|
|
|
fmi.simplified_name,
|
|
|
fmi.name_word_generation,
|
|
|
+ fmi.former_name,
|
|
|
+ fmi.childhood_name,
|
|
|
+ fmi.name_word,
|
|
|
-- 父亲:优先非入继父(sub_type != 3),取第一条
|
|
|
(SELECT p.name FROM family_relation_info r
|
|
|
JOIN family_member_info p ON r.parent_mid = p.id
|
|
|
@@ -1700,7 +1721,7 @@ def search_member():
|
|
|
WHERE r.child_mid = fmi.id AND r.relation_type = 1
|
|
|
ORDER BY CASE WHEN COALESCE(r.sub_relation_type,0)=3 THEN 1 ELSE 0 END, r.id
|
|
|
LIMIT 1) AS father_simplified_name,
|
|
|
- -- 出继标注:同时有 sub_type=2(亲生方)和 sub_type=3(养家方)时生成
|
|
|
+ -- 出继标注
|
|
|
(SELECT CONCAT(
|
|
|
'出继自',
|
|
|
COALESCE(pbio.simplified_name, pbio.name, '?'),
|
|
|
@@ -1713,7 +1734,7 @@ def search_member():
|
|
|
WHERE rbio.child_mid = fmi.id AND rbio.sub_relation_type = 2
|
|
|
LIMIT 1) AS adoption_note
|
|
|
FROM family_member_info fmi
|
|
|
- WHERE fmi.name LIKE %s OR fmi.simplified_name LIKE %s OR fmi.former_name LIKE %s
|
|
|
+ WHERE {where_clause}
|
|
|
GROUP BY fmi.id
|
|
|
ORDER BY
|
|
|
CASE WHEN fmi.name = %s THEN 1
|
|
|
@@ -1721,7 +1742,7 @@ def search_member():
|
|
|
WHEN fmi.name LIKE %s THEN 3
|
|
|
WHEN fmi.simplified_name LIKE %s THEN 4
|
|
|
ELSE 5 END
|
|
|
- """, (like, like, like, keyword, keyword, f'{keyword}%', f'{keyword}%'))
|
|
|
+ """, (*where_params, *order_params))
|
|
|
members = cursor.fetchall()
|
|
|
|
|
|
if not members:
|
|
|
@@ -1793,7 +1814,7 @@ def get_lineage(member_id):
|
|
|
for depth in range(max_depth):
|
|
|
# 获取所有父母关系(支持出继/入继)
|
|
|
cursor.execute("""
|
|
|
- SELECT p.id, p.name, p.simplified_name, p.name_word, p.name_word_generation,
|
|
|
+ SELECT p.id, p.name, p.simplified_name, p.name_word, p.name_word_generation, p.former_name, p.childhood_name,
|
|
|
EXISTS(SELECT 1 FROM family_relation_info WHERE parent_mid = p.id AND relation_type IN (1, 2)) as has_children,
|
|
|
r.sub_relation_type
|
|
|
FROM family_relation_info r
|
|
|
@@ -1875,7 +1896,7 @@ def get_lineage(member_id):
|
|
|
|
|
|
# 获取祖先的兄弟(含 child_order 和 sub_relation_type,用于出继/入继标注)
|
|
|
cursor.execute("""
|
|
|
- SELECT c.id, c.name, c.simplified_name, c.name_word, c.name_word_generation,
|
|
|
+ SELECT c.id, c.name, c.simplified_name, c.name_word, c.name_word_generation, c.former_name, c.childhood_name,
|
|
|
EXISTS(SELECT 1 FROM family_relation_info WHERE parent_mid = c.id AND relation_type IN (1, 2)) as has_children,
|
|
|
COALESCE(r.child_order, NULL) AS child_order,
|
|
|
r.sub_relation_type
|
|
|
@@ -1950,7 +1971,7 @@ def get_lineage(member_id):
|
|
|
)"""
|
|
|
|
|
|
cursor.execute(f"""
|
|
|
- SELECT c.id, c.name, c.simplified_name, c.name_word, c.name_word_generation,
|
|
|
+ SELECT c.id, c.name, c.simplified_name, c.name_word, c.name_word_generation, c.former_name, c.childhood_name,
|
|
|
EXISTS(SELECT 1 FROM family_relation_info WHERE parent_mid = c.id AND relation_type IN (1, 2)) as has_children,
|
|
|
r.sub_relation_type,
|
|
|
r.child_order
|
|
|
@@ -2011,7 +2032,7 @@ def get_lineage(member_id):
|
|
|
center_child_order = co_row['child_order'] if co_row else None
|
|
|
|
|
|
cursor.execute("""
|
|
|
- SELECT c.id, c.name, c.simplified_name, c.name_word, c.name_word_generation,
|
|
|
+ SELECT c.id, c.name, c.simplified_name, c.name_word, c.name_word_generation, c.former_name, c.childhood_name,
|
|
|
EXISTS(SELECT 1 FROM family_relation_info WHERE parent_mid = c.id AND relation_type IN (1, 2)) as has_children,
|
|
|
r.sub_relation_type,
|
|
|
COALESCE(r.child_order, NULL) AS child_order
|
|
|
@@ -2108,7 +2129,7 @@ def get_ancestors_above(ancestor_id):
|
|
|
|
|
|
for depth in range(max_depth):
|
|
|
cursor.execute("""
|
|
|
- SELECT p.id, p.name, p.simplified_name, p.name_word, p.name_word_generation,
|
|
|
+ SELECT p.id, p.name, p.simplified_name, p.name_word, p.name_word_generation, p.former_name, p.childhood_name,
|
|
|
EXISTS(SELECT 1 FROM family_relation_info
|
|
|
WHERE parent_mid = p.id AND relation_type IN (1,2)) as has_children,
|
|
|
r.sub_relation_type
|
|
|
@@ -2178,7 +2199,7 @@ def get_ancestors_above(ancestor_id):
|
|
|
parent['child_order'] = co_row['child_order'] if co_row else 1
|
|
|
|
|
|
cursor.execute("""
|
|
|
- SELECT c.id, c.name, c.simplified_name, c.name_word, c.name_word_generation,
|
|
|
+ SELECT c.id, c.name, c.simplified_name, c.name_word, c.name_word_generation, c.former_name, c.childhood_name,
|
|
|
EXISTS(SELECT 1 FROM family_relation_info
|
|
|
WHERE parent_mid = c.id AND relation_type IN (1,2)) as has_children,
|
|
|
COALESCE(r.child_order, 1) AS child_order
|
|
|
@@ -2248,7 +2269,7 @@ def get_descendants(parent_id):
|
|
|
# Build query with exclusion
|
|
|
placeholders = ', '.join(['%s'] * len(excluded_list))
|
|
|
cursor.execute(f"""
|
|
|
- SELECT c.id, c.name, c.simplified_name, c.name_word, c.name_word_generation,
|
|
|
+ SELECT c.id, c.name, c.simplified_name, c.name_word, c.name_word_generation, c.former_name, c.childhood_name,
|
|
|
EXISTS(SELECT 1 FROM family_relation_info WHERE parent_mid = c.id AND relation_type IN (1, 2)) as has_children
|
|
|
FROM family_relation_info r
|
|
|
JOIN family_member_info c ON r.child_mid = c.id
|
|
|
@@ -2258,7 +2279,7 @@ def get_descendants(parent_id):
|
|
|
""", (parent_id,) + tuple(excluded_list))
|
|
|
else:
|
|
|
cursor.execute("""
|
|
|
- SELECT c.id, c.name, c.simplified_name, c.name_word, c.name_word_generation,
|
|
|
+ SELECT c.id, c.name, c.simplified_name, c.name_word, c.name_word_generation, c.former_name, c.childhood_name,
|
|
|
EXISTS(SELECT 1 FROM family_relation_info WHERE parent_mid = c.id AND relation_type IN (1, 2)) as has_children
|
|
|
FROM family_relation_info r
|
|
|
JOIN family_member_info c ON r.child_mid = c.id
|
|
|
@@ -6064,7 +6085,7 @@ def api_get_lineage(member_id):
|
|
|
|
|
|
for depth in range(max_depth):
|
|
|
cursor.execute("""
|
|
|
- SELECT p.id, p.name, p.simplified_name, p.name_word, p.name_word_generation,
|
|
|
+ SELECT p.id, p.name, p.simplified_name, p.name_word, p.name_word_generation, p.former_name, p.childhood_name,
|
|
|
EXISTS(SELECT 1 FROM family_relation_info
|
|
|
WHERE parent_mid = p.id AND relation_type IN (1,2)) as has_children,
|
|
|
r.sub_relation_type
|
|
|
@@ -6136,7 +6157,7 @@ def api_get_lineage(member_id):
|
|
|
parent['child_order'] = co_row['child_order'] if co_row else 1
|
|
|
|
|
|
cursor.execute("""
|
|
|
- SELECT c.id, c.name, c.simplified_name, c.name_word, c.name_word_generation,
|
|
|
+ SELECT c.id, c.name, c.simplified_name, c.name_word, c.name_word_generation, c.former_name, c.childhood_name,
|
|
|
EXISTS(SELECT 1 FROM family_relation_info
|
|
|
WHERE parent_mid = c.id AND relation_type IN (1,2)) as has_children,
|
|
|
COALESCE(r.child_order, 1) AS child_order
|
|
|
@@ -6162,7 +6183,7 @@ def api_get_lineage(member_id):
|
|
|
|
|
|
# Step 3: 获取子女(排除出继、保留入继,带排行)
|
|
|
cursor.execute("""
|
|
|
- SELECT c.id, c.name, c.simplified_name, c.name_word, c.name_word_generation,
|
|
|
+ SELECT c.id, c.name, c.simplified_name, c.name_word, c.name_word_generation, c.former_name, c.childhood_name,
|
|
|
EXISTS(SELECT 1 FROM family_relation_info
|
|
|
WHERE parent_mid = c.id AND relation_type IN (1,2)) as has_children,
|
|
|
COALESCE(r.child_order, 1) AS child_order, r.sub_relation_type
|
|
|
@@ -6212,7 +6233,7 @@ def api_get_lineage(member_id):
|
|
|
center_child_order = (co_row['child_order'] if co_row and co_row['child_order'] else 1)
|
|
|
|
|
|
cursor.execute("""
|
|
|
- SELECT c.id, c.name, c.simplified_name, c.name_word, c.name_word_generation,
|
|
|
+ SELECT c.id, c.name, c.simplified_name, c.name_word, c.name_word_generation, c.former_name, c.childhood_name,
|
|
|
EXISTS(SELECT 1 FROM family_relation_info
|
|
|
WHERE parent_mid = c.id AND relation_type IN (1,2)) as has_children,
|
|
|
r.sub_relation_type, COALESCE(r.child_order, 1) AS child_order
|
|
|
@@ -6292,7 +6313,7 @@ def api_get_ancestors_above(ancestor_id):
|
|
|
|
|
|
for depth in range(max_depth):
|
|
|
cursor.execute("""
|
|
|
- SELECT p.id, p.name, p.simplified_name, p.name_word, p.name_word_generation,
|
|
|
+ SELECT p.id, p.name, p.simplified_name, p.name_word, p.name_word_generation, p.former_name, p.childhood_name,
|
|
|
EXISTS(SELECT 1 FROM family_relation_info
|
|
|
WHERE parent_mid = p.id AND relation_type IN (1,2)) as has_children,
|
|
|
r.sub_relation_type
|
|
|
@@ -6358,7 +6379,7 @@ def api_get_ancestors_above(ancestor_id):
|
|
|
parent['child_order'] = co_row['child_order'] if co_row else 1
|
|
|
|
|
|
cursor.execute("""
|
|
|
- SELECT c.id, c.name, c.simplified_name, c.name_word, c.name_word_generation,
|
|
|
+ SELECT c.id, c.name, c.simplified_name, c.name_word, c.name_word_generation, c.former_name, c.childhood_name,
|
|
|
EXISTS(SELECT 1 FROM family_relation_info
|
|
|
WHERE parent_mid = c.id AND relation_type IN (1,2)) as has_children,
|
|
|
COALESCE(r.child_order, 1) AS child_order
|