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