Files
SMANAGE/_api_backup/TempLateAPI/GERP/API/FormAPI/Add.api
T
2026-06-16 11:55:14 +08:00

130 lines
4.7 KiB
Plaintext

from PDAPI import *
import TempLateAPI.GERP.API.FormAPI.FormData as FormData
CLEARABLE_UUID_FIELDS = {"CompanyUUID", "TenantUUID", "DeptUUID", "ParentCompanyUUID", "ReviewerUUID"}
def VerifyForm(TableName):
Table = FormData.GetTable(TableName)
if not Table:
return {"code": 1, "msg": "找不到表格"}, 404
Table.SetRequired(["PrimaryKey", "MechanicalItem"], False)
fields = Table.Get()
for field in fields:
field_type = field.get("Type", "")
field_name = field.get("Name", "")
if field_type == "UUID" and field_name in CLEARABLE_UUID_FIELDS:
field["AllowedEmpty"] = True
else:
field["PassEmpty"] = True
return fields
__metadata__ = {
"route": "{DEFAULT_ROUTE}/<TableName>",
"methods": ["POST"],
"blueprint": "GERP",
"permission": 3.0,
"attributes": [],
"limit": "1 per second",
"form": VerifyForm
}
def HandleRequest(_CleanedData):
Table = FormData.GetTable(_CleanedData["params"]["TableName"])
if not Table:
return {"code": 404, "msg": "找不到表格"}, 404
ctx = FormData.PM._build_context(Table, _CleanedData["params"]["TableName"], _CleanedData)
if not FormData.PM.check_permission("add", ctx):
return {"code": 403, "msg": "无新增权限"}, 403
skip, custom_result = FormData.PM.run_before_add(ctx)
if skip:
return custom_result
extension = FormData.get_table_extension(_CleanedData["params"]["TableName"])
if extension and hasattr(extension, "add"):
extension_result = extension.add(Table, _CleanedData)
if extension_result:
return extension_result
Model = Table.GetModel()
CheckUniqueResult, CheckUniqueCause = Table.CheckAllUniqueFieldsDuplicate(flask.request.form)
if not CheckUniqueResult:
return {"code": 409, "msg": f"项重复:{CheckUniqueCause}"}, 409
for i in Table.RangeItem():
if i not in _CleanedData["form"]:
continue
field_config = Table.GetItem(i)
value = _CleanedData["form"][i]
if value is None or value == '':
continue
if field_config:
if field_config.get("Type") == "int":
try:
value = int(value)
except ValueError:
pass
elif field_config.get("Type") == "float":
try:
value = float(value)
except ValueError:
pass
elif field_config.get("Type") == "bool":
value = bool(value)
elif field_config.get("Type") == "UUID":
value = Table.KeyToUUIDConversion(i, value, bytes)
elif field_config.get("Type") == "timestampstr":
utc_str = FormData.user_tz_to_utc(value)
ts_format = field_config.get("TimestampFormat", "%Y-%m-%d %H:%M:%S")
try:
value = datetime.datetime.strptime(utc_str, "%Y-%m-%d %H:%M:%S")
except ValueError:
try:
value = datetime.datetime.strptime(utc_str, ts_format)
except ValueError:
pass
setattr(Model, i, value)
else:
setattr(Model, i, value)
table_data = FormData.data.get(_CleanedData["params"]["TableName"])
if table_data and "config" in table_data and "autoFill" in table_data["config"]:
auto_fill = table_data["config"]["autoFill"]
current_user = GetELTUser()
if current_user:
for field, value in auto_fill.items():
if value == "current_user":
setattr(Model, field, Get16toBytes(current_user.GetUserUUID()))
gen_func = Table.PrimaryKeyGenerationFunction()
if gen_func:
gen_value = gen_func() if callable(gen_func) else gen_func
gen_value = Table.KeyToUUIDConversion(Table.PrimaryKey, gen_value, bytes)
setattr(Model, Table.PrimaryKey, gen_value)
try:
db.session.add(Model)
db.session.commit()
pk_value = getattr(Model, Table.PrimaryKey, None)
pk_value = Table.KeyToUUIDConversion(Table.PrimaryKey, pk_value, str)
result = {"code": 0, "msg": "创建成功", "id": pk_value}, 201
except sqlalchemy.exc.IntegrityError as e:
db.session.rollback()
err_msg = str(e.orig) if e.orig else str(e)
result = {"code": 409, "msg": f"数据冲突:{err_msg}"}, 409
except:
print(traceback.print_exc())
db.session.rollback()
result = {"code": 1, "msg": "SQL 提交失败"}, 500
modified_result, skip_response = FormData.PM.run_after_add(ctx, result)
if skip_response:
return modified_result
return result