diff --git a/apps/web/src/api/dictionaries.ts b/apps/web/src/api/dictionaries.ts index 3dcbe57..b44d443 100644 --- a/apps/web/src/api/dictionaries.ts +++ b/apps/web/src/api/dictionaries.ts @@ -8,6 +8,7 @@ export interface DictionaryItemInfo { value: string; sort_order: number; color?: string; + version: number; } export interface DictionaryInfo { @@ -16,6 +17,7 @@ export interface DictionaryInfo { code: string; description?: string; items: DictionaryItemInfo[]; + version: number; } export interface CreateDictionaryRequest { @@ -27,6 +29,7 @@ export interface CreateDictionaryRequest { export interface UpdateDictionaryRequest { name?: string; description?: string; + version: number; } export async function listDictionaries(page = 1, pageSize = 20) { @@ -53,8 +56,8 @@ export async function updateDictionary(id: string, req: UpdateDictionaryRequest) return data.data; } -export async function deleteDictionary(id: string) { - await client.delete(`/config/dictionaries/${id}`); +export async function deleteDictionary(id: string, version: number) { + await client.delete(`/config/dictionaries/${id}`, { data: { version } }); } export async function listItemsByCode(code: string) { @@ -77,6 +80,7 @@ export interface UpdateDictionaryItemRequest { value?: string; sort_order?: number; color?: string; + version: number; } export async function createDictionaryItem( @@ -102,6 +106,6 @@ export async function updateDictionaryItem( return data.data; } -export async function deleteDictionaryItem(dictionaryId: string, itemId: string) { - await client.delete(`/config/dictionaries/${dictionaryId}/items/${itemId}`); +export async function deleteDictionaryItem(dictionaryId: string, itemId: string, version: number) { + await client.delete(`/config/dictionaries/${dictionaryId}/items/${itemId}`, { data: { version } }); } diff --git a/apps/web/src/api/languages.ts b/apps/web/src/api/languages.ts index c3c6663..c738aa5 100644 --- a/apps/web/src/api/languages.ts +++ b/apps/web/src/api/languages.ts @@ -5,14 +5,11 @@ import client from './client'; export interface LanguageInfo { code: string; name: string; - enabled: boolean; - translations?: Record; + is_active: boolean; } export interface UpdateLanguageRequest { - name?: string; - enabled?: boolean; - translations?: Record; + is_active: boolean; } // --- API Functions --- diff --git a/apps/web/src/api/menus.ts b/apps/web/src/api/menus.ts index 1199eaa..772f4f9 100644 --- a/apps/web/src/api/menus.ts +++ b/apps/web/src/api/menus.ts @@ -11,6 +11,7 @@ export interface MenuInfo { menu_type: string; permission?: string; children: MenuInfo[]; + version: number; } export interface MenuItemReq { @@ -24,6 +25,7 @@ export interface MenuItemReq { menu_type?: string; permission?: string; role_ids?: string[]; + version?: number; } export async function getMenus() { @@ -51,6 +53,6 @@ export async function updateMenu(id: string, req: MenuItemReq) { return data.data; } -export async function deleteMenu(id: string) { - await client.delete(`/config/menus/${id}`); +export async function deleteMenu(id: string, version: number) { + await client.delete(`/config/menus/${id}`, { data: { version } }); } diff --git a/apps/web/src/api/numberingRules.ts b/apps/web/src/api/numberingRules.ts index c9bea59..fd29bfe 100644 --- a/apps/web/src/api/numberingRules.ts +++ b/apps/web/src/api/numberingRules.ts @@ -13,6 +13,7 @@ export interface NumberingRuleInfo { separator: string; reset_cycle: string; last_reset_date?: string; + version: number; } export interface CreateNumberingRuleRequest { @@ -33,6 +34,7 @@ export interface UpdateNumberingRuleRequest { seq_length?: number; separator?: string; reset_cycle?: string; + version: number; } export async function listNumberingRules(page = 1, pageSize = 20) { @@ -66,6 +68,6 @@ export async function generateNumber(id: string) { return data.data; } -export async function deleteNumberingRule(id: string) { - await client.delete(`/config/numbering-rules/${id}`); +export async function deleteNumberingRule(id: string, version: number) { + await client.delete(`/config/numbering-rules/${id}`, { data: { version } }); } diff --git a/apps/web/src/api/settings.ts b/apps/web/src/api/settings.ts index b69ff0c..e08ed7f 100644 --- a/apps/web/src/api/settings.ts +++ b/apps/web/src/api/settings.ts @@ -6,6 +6,7 @@ export interface SettingInfo { scope_id?: string; setting_key: string; setting_value: unknown; + version: number; } export async function getSetting(key: string, scope?: string, scopeId?: string) { @@ -16,14 +17,14 @@ export async function getSetting(key: string, scope?: string, scopeId?: string) return data.data; } -export async function updateSetting(key: string, settingValue: unknown) { +export async function updateSetting(key: string, settingValue: unknown, version?: number) { const { data } = await client.put<{ success: boolean; data: SettingInfo }>( `/config/settings/${key}`, - { setting_value: settingValue }, + { setting_value: settingValue, version }, ); return data.data; } -export async function deleteSetting(key: string) { - await client.delete(`/config/settings/${encodeURIComponent(key)}`); +export async function deleteSetting(key: string, version: number) { + await client.delete(`/config/settings/${encodeURIComponent(key)}`, { data: { version } }); } diff --git a/apps/web/src/pages/settings/DictionaryManager.tsx b/apps/web/src/pages/settings/DictionaryManager.tsx index fefe149..9c1a973 100644 --- a/apps/web/src/pages/settings/DictionaryManager.tsx +++ b/apps/web/src/pages/settings/DictionaryManager.tsx @@ -66,7 +66,7 @@ export default function DictionaryManager() { const handleDictSubmit = async (values: CreateDictionaryRequest) => { try { if (editDict) { - await updateDictionary(editDict.id, values); + await updateDictionary(editDict.id, { ...values, version: editDict.version }); message.success('字典更新成功'); } else { await createDictionary(values); @@ -82,9 +82,9 @@ export default function DictionaryManager() { } }; - const handleDeleteDict = async (id: string) => { + const handleDeleteDict = async (id: string, version: number) => { try { - await deleteDictionary(id); + await deleteDictionary(id, version); message.success('字典已删除'); fetchDictionaries(); } catch { @@ -139,7 +139,7 @@ export default function DictionaryManager() { if (!activeDictId) return; try { if (editItem) { - await updateDictionaryItem(activeDictId, editItem.id, values as UpdateDictionaryItemRequest); + await updateDictionaryItem(activeDictId, editItem.id, { ...values, version: editItem.version } as UpdateDictionaryItemRequest); message.success('字典项更新成功'); } else { await createDictionaryItem(activeDictId, values); @@ -155,9 +155,9 @@ export default function DictionaryManager() { } }; - const handleDeleteItem = async (dictId: string, itemId: string) => { + const handleDeleteItem = async (dictId: string, itemId: string, version: number) => { try { - await deleteDictionaryItem(dictId, itemId); + await deleteDictionaryItem(dictId, itemId, version); message.success('字典项已删除'); fetchDictionaries(); } catch { @@ -196,7 +196,7 @@ export default function DictionaryManager() { handleDeleteDict(record.id)} + onConfirm={() => handleDeleteDict(record.id, record.version)} > handleDeleteItem(dictId, record.id)} + onConfirm={() => handleDeleteItem(dictId, record.id, record.version)} > handleDelete(record.id)} + onConfirm={() => handleDelete(record.id, record.version)} > handleDelete(record.id)} + onConfirm={() => handleDelete(record.id, record.version)} >