user_id = await get_user() user_orgid = (await get_userorgid()) or '0' dbname = get_module_dbname('supplychain') ns = params_kw.copy() ns['id'] = getID() ns['resellerid'] = user_orgid ns['created_by'] = user_id ns['created_at'] = timestampstr() ns['updated_at'] = timestampstr() # Auto-generate contract_code if not ns.get('contract_code'): today = curDateString().replace('-', '') prefix = f'SC-{today}' db = DBPools() async with db.sqlorContext(dbname) as sor: recs = await sor.sqlExe( "SELECT COUNT(*) as cnt FROM supply_contracts WHERE resellerid = ${rid}$ AND contract_code LIKE ${p}$", {"rid": user_orgid, "p": prefix + "%"} ) seq = (recs[0].cnt if recs else 0) + 1 ns['contract_code'] = f'{prefix}-{seq:04d}' # Clean non-column keys for k in list(ns.keys()): if k.endswith('_text') or k.startswith('_') or k in ('page', 'rows', 'pagerows', 'data_filter', 'referer_widget'): ns.pop(k, None) db = DBPools() async with db.sqlorContext(dbname) as sor: await sor.C('supply_contracts', ns) return json.dumps({'widgettype':'Message','options':{'title':'Success','message':'供应合同创建成功'}}, ensure_ascii=False)