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

140 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, **kwargs):
Table = FormData.GetTable(TableName)
Table.SetRequired(["ManualItem", "MechanicalItem"], False)
if not Table:
return {"code": 1, "msg": "找不到表格"}, 404
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>/<id>",
"methods": ["PATCH"],
"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": 1, "msg": "找不到表格"}, 404
ctx = FormData.PM._build_context(Table, _CleanedData["params"]["TableName"], _CleanedData)
if not FormData.PM.check_permission("modify_item", ctx):
return {"code": 403, "msg": "无修改权限"}, 403
skip, custom_result = FormData.PM.run_before_modify_item(ctx)
if skip:
return custom_result
pk_value = _CleanedData["params"]["id"]
pk_parts = [p.strip() for p in str(pk_value).split(',')]
if len(pk_parts) > 1:
filters = []
for i, pk_name in enumerate(Table.PrimaryKeys):
if i < len(pk_parts):
filters.append(
getattr(Table.Model, pk_name) == Table.KeyToUUIDConversion(
pk_name, pk_parts[i], bytes
)
)
Model = Table.Model.query.filter(*filters).first()
else:
Model = Table.Model.query.filter(
getattr(Table.Model, Table.PrimaryKey) == Table.KeyToUUIDConversion(
Table.PrimaryKey, pk_value, bytes
)
).first()
if not Model:
return {"code": 1, "msg": "用户不存在"}, 404
merged_data = {**_CleanedData["form"], **_CleanedData["json"]}
form_keys = list(merged_data.keys())
update_count = 0
for Key in form_keys:
if Key == Table.PrimaryKey:
continue
value = merged_data[Key]
field_config = Table.GetItem(Key)
if field_config:
field_type = field_config.get("Type")
if field_type == "int":
try:
value = int(value) if value is not None else None
except (ValueError, TypeError):
continue
elif field_type == "float":
try:
value = float(value) if value is not None else None
except (ValueError, TypeError):
continue
elif field_type == "bool":
value = bool(value) if value is not None else None
elif field_type == "UUID":
if not value or (isinstance(value, str) and not value.strip()):
value = None
nullable = True
try:
col = getattr(Table.Model, Key)
if hasattr(col, 'property') and hasattr(col.property, 'columns'):
nullable = list(col.property.columns)[0].nullable
except:
pass
if nullable:
setattr(Model, Key, None)
update_count += 1
continue
else:
value = Table.KeyToUUIDConversion(Key, value, bytes)
elif field_type == "json":
if isinstance(value, str):
try:
import json
value = json.loads(value)
except json.JSONDecodeError:
continue
if value is not None:
setattr(Model, Key, value)
update_count += 1
if update_count == 0:
return {"code": 1, "msg": "没有字段需要更新"}, 400
try:
db.session.commit()
result = {"code": 0, "msg": "更新成功"}, 200
except Exception as e:
db.session.rollback()
import traceback
traceback.print_exc()
result = {"code": 1, "msg": f"更新失败:{str(e)}"}, 500
modified_result, skip_response = FormData.PM.run_after_modify_item(ctx, result)
if skip_response:
return modified_result
return result