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}//", "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