130 lines
3.2 KiB
Python
130 lines
3.2 KiB
Python
"""业务页字典 ensure:白名单内按 label 复用或插入 sys_dict_data。"""
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
from typing import Dict, Optional, Set
|
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.core.utils import generate_uuid
|
|
from app.models.models import SysDictData
|
|
|
|
DICT_ENSURE_WHITELIST: Set[str] = {
|
|
"crm_product_gg",
|
|
"crm_shfs",
|
|
"crm_product_unit",
|
|
"crm_customer_park",
|
|
}
|
|
|
|
|
|
class DictEnsureError(ValueError):
|
|
pass
|
|
|
|
|
|
def ensure_dict_data(
|
|
db: Session,
|
|
*,
|
|
tenant_no: str,
|
|
dict_type: str,
|
|
label: str,
|
|
user_id: str = "",
|
|
preferred_value: Optional[str] = None,
|
|
) -> Dict[str, object]:
|
|
label = (label or "").strip()
|
|
if not label:
|
|
raise DictEnsureError("字典标签不能为空")
|
|
if dict_type not in DICT_ENSURE_WHITELIST:
|
|
raise DictEnsureError("不支持的字典类型")
|
|
|
|
preferred = (preferred_value or "").strip() or label
|
|
|
|
existing_label = (
|
|
db.query(SysDictData)
|
|
.filter(
|
|
SysDictData.tenant_no == tenant_no,
|
|
SysDictData.dict_type == dict_type,
|
|
SysDictData.dict_label == label,
|
|
SysDictData.del_flag == 0,
|
|
)
|
|
.first()
|
|
)
|
|
if existing_label:
|
|
return {
|
|
"label": existing_label.dict_label,
|
|
"value": existing_label.dict_value,
|
|
"created": False,
|
|
}
|
|
|
|
by_value = (
|
|
db.query(SysDictData)
|
|
.filter(
|
|
SysDictData.tenant_no == tenant_no,
|
|
SysDictData.dict_type == dict_type,
|
|
SysDictData.dict_value == preferred,
|
|
SysDictData.del_flag == 0,
|
|
)
|
|
.first()
|
|
)
|
|
if by_value:
|
|
return {
|
|
"label": by_value.dict_label,
|
|
"value": by_value.dict_value,
|
|
"created": False,
|
|
}
|
|
|
|
obj = SysDictData(
|
|
id=generate_uuid(),
|
|
dict_label=label,
|
|
dict_value=preferred,
|
|
dict_type=dict_type,
|
|
tag_type="",
|
|
tenant_no=tenant_no,
|
|
order_num=0,
|
|
remark=None,
|
|
create_by=user_id or None,
|
|
create_dept_id="",
|
|
create_time=datetime.now(),
|
|
update_by=user_id or None,
|
|
update_time=datetime.now(),
|
|
del_flag=0,
|
|
)
|
|
db.add(obj)
|
|
db.flush()
|
|
return {"label": obj.dict_label, "value": obj.dict_value, "created": True}
|
|
|
|
|
|
def ensure_remove_dict_data(
|
|
db: Session,
|
|
*,
|
|
tenant_no: str,
|
|
dict_type: str,
|
|
value: str,
|
|
user_id: str = "",
|
|
) -> None:
|
|
value = (value or "").strip()
|
|
if not value:
|
|
raise DictEnsureError("字典值不能为空")
|
|
if dict_type not in DICT_ENSURE_WHITELIST:
|
|
raise DictEnsureError("不支持的字典类型")
|
|
|
|
row = (
|
|
db.query(SysDictData)
|
|
.filter(
|
|
SysDictData.tenant_no == tenant_no,
|
|
SysDictData.dict_type == dict_type,
|
|
SysDictData.dict_value == value,
|
|
SysDictData.del_flag == 0,
|
|
)
|
|
.first()
|
|
)
|
|
if not row:
|
|
raise DictEnsureError("字典数据不存在")
|
|
if (row.create_by or "") != (user_id or ""):
|
|
raise DictEnsureError("无权删除该字典项")
|
|
|
|
row.del_flag = 1
|
|
row.update_by = user_id or None
|
|
row.update_time = datetime.now()
|
|
db.add(row)
|
|
db.flush()
|