import { defineStore } from 'pinia' import { ref, reactive } from 'vue' import { findAllConfig, saveConfig } from '@/api/forecast/forecast-order' import { useI18n } from 'vue-i18n' import { reqIsSucceed } from '@/utils' import { handleApiError } from '@/utils/errorHandler' import { ElMessage } from 'element-plus' interface ConfigLog { id: number advanceDays: number forceConvertDays: number remark: string updatedBy: string updatedAt: string } export const useConfigStore = defineStore('forecastConfig', () => { const { t } = useI18n() // State — 默认值与 seed 中 activeConfigs 保持一致 (ADVANCE_DAYS=20, FORCE_CONVERT_DAYS=20) const config = reactive({ leadDays: 20, forceDays: 20, updatedBy: '', updatedAt: '', }) const configLogs = ref([]) const saving = ref(false) const loading = ref(false) // 原始值备份(用于检测是否变更) const _original = reactive({ leadDays: 20, forceDays: 20, }) /** * 加载配置 */ async function fetchConfig() { loading.value = true try { const res = await findAllConfig() if (reqIsSucceed(res)) { const data = res.data if (data) { // 从 API 响应中解析 configs 数组 const configs = data.configs || [] const leadItem = configs.find((c: { configKey: string }) => c.configKey === 'ADVANCE_DAYS') const forceItem = configs.find((c: { configKey: string }) => c.configKey === 'FORCE_CONVERT_DAYS') config.leadDays = leadItem ? Number(leadItem.configValue) : 20 config.forceDays = forceItem ? Number(forceItem.configValue) : 20 config.updatedBy = String(data.lastUpdatedBy || '') config.updatedAt = data.lastUpdateDate || '' // 保存原始值 _original.leadDays = config.leadDays _original.forceDays = config.forceDays } } else { handleApiError(res.code, res.msg) } } catch (error: unknown) { const err = error as { code?: string; message?: string } handleApiError(err?.code || 'unknown', err?.message) } finally { loading.value = false } } /** * 保存配置 */ async function saveConfigAction(remark: string) { // 检测是否变更 if (config.leadDays === _original.leadDays && config.forceDays === _original.forceDays) { ElMessage.warning(t('forecast-order.config.noChange')) return false } saving.value = true try { const res = await saveConfig({ params: { configs: [ { configKey: 'ADVANCE_DAYS', configValue: String(config.leadDays) }, { configKey: 'FORCE_CONVERT_DAYS', configValue: String(config.forceDays) }, ], remark: remark || undefined, }, }) if (reqIsSucceed(res)) { ElMessage.success(t('forecast-order.toast.saveDraftSuccess')) // 更新原始值 _original.leadDays = config.leadDays _original.forceDays = config.forceDays return true } else { handleApiError(res.code, res.msg) return false } } catch (error: unknown) { const err = error as { code?: string; message?: string } handleApiError(err?.code || 'unknown', err?.message) return false } finally { saving.value = false } } /** * 加载修改记录(与 seed 数据 history 一致:30 → 25 → 20) */ async function fetchLogs() { try { configLogs.value = [ { id: 1, advanceDays: 30, forceConvertDays: 30, remark: '初始配置', updatedBy: '管理员', updatedAt: '2026-06-01 08:00:00', }, { id: 2, advanceDays: 25, forceConvertDays: 25, remark: '调整为25天', updatedBy: '管理员', updatedAt: '2026-06-05 10:00:00', }, { id: 3, advanceDays: 20, forceConvertDays: 20, remark: '旺季调整为20天', updatedBy: '管理员', updatedAt: '2026-06-10 14:00:00', }, ] } catch (error: unknown) { const err = error as { code?: string; message?: string } handleApiError(err?.code || 'unknown', err?.message) } } return { config, configLogs, saving, loading, fetchConfig, saveConfig: saveConfigAction, fetchLogs, } })