diff --git a/saiadmin-artd/src/components/core/charts/art-bar-chart/index.vue b/saiadmin-artd/src/components/core/charts/art-bar-chart/index.vue index d677196..f6b239c 100644 --- a/saiadmin-artd/src/components/core/charts/art-bar-chart/index.vue +++ b/saiadmin-artd/src/components/core/charts/art-bar-chart/index.vue @@ -22,6 +22,7 @@ // 数据配置 data: () => [0, 0, 0, 0, 0, 0, 0], xAxisData: () => [], + xAxisName: '', barWidth: '40%', stack: false, @@ -124,24 +125,30 @@ } = useChartComponent({ props, checkEmpty: () => { - // 检查单数据情况 - if (Array.isArray(props.data) && typeof props.data[0] === 'number') { + if (!Array.isArray(props.data) || !props.data.length) return true + + const first = props.data[0] + // 单数据情况:number[] 或可转为数字的数组(兼容后端 int 返回为 string) + if (typeof first === 'number' && !Number.isNaN(first)) { const singleData = props.data as number[] - return !singleData.length || singleData.every((val) => val === 0) + return singleData.every((val) => val === 0 || Number.isNaN(Number(val))) + } + if (typeof first === 'string' && !Number.isNaN(Number(first))) { + const singleData = props.data.map((v) => Number(v)) + return singleData.every((val) => val === 0 || Number.isNaN(val)) } - // 检查多数据情况 - if (Array.isArray(props.data) && typeof props.data[0] === 'object') { + // 多数据情况 + if (typeof first === 'object' && first !== null && 'name' in first) { const multiData = props.data as BarDataItem[] - return ( - !multiData.length || - multiData.every((item) => !item.data?.length || item.data.every((val) => val === 0)) + return multiData.every( + (item) => !item.data?.length || item.data.every((val) => val === 0 || Number.isNaN(Number(val))) ) } return true }, - watchSources: [() => props.data, () => props.xAxisData, () => props.colors], + watchSources: [() => props.data, () => props.xAxisData, () => props.xAxisName, () => props.colors], generateOptions: (): EChartsOption => { const options: EChartsOption = { grid: getGridWithLegend(props.showLegend && isMultipleData.value, props.legendPosition, { @@ -152,6 +159,9 @@ tooltip: props.showTooltip ? getTooltipStyle() : undefined, xAxis: { type: 'category', + name: props.xAxisName || undefined, + nameLocation: 'middle', + nameGap: 25, data: props.xAxisData, axisTick: getAxisTickStyle(), axisLine: getAxisLineStyle(props.showAxisLine), diff --git a/saiadmin-artd/src/types/component/chart.ts b/saiadmin-artd/src/types/component/chart.ts index c3225c9..0c8cb0a 100644 --- a/saiadmin-artd/src/types/component/chart.ts +++ b/saiadmin-artd/src/types/component/chart.ts @@ -117,6 +117,8 @@ export interface BarChartProps extends BaseChartProps, AxisDisplayProps, Interac data: number[] | BarDataItem[] /** X轴标签数据 */ xAxisData?: string[] + /** X轴名称(如:色子点数) */ + xAxisName?: string /** 柱状图宽度 */ barWidth?: string | number /** 是否堆叠显示 */ diff --git a/saiadmin-artd/src/views/plugin/dice/play_record/index/modules/edit-dialog.vue b/saiadmin-artd/src/views/plugin/dice/play_record/index/modules/edit-dialog.vue index abb1c45..827d53d 100644 --- a/saiadmin-artd/src/views/plugin/dice/play_record/index/modules/edit-dialog.vue +++ b/saiadmin-artd/src/views/plugin/dice/play_record/index/modules/edit-dialog.vue @@ -336,6 +336,13 @@ if (formData.roll_number == null && formData.rollArrayItems.length === 5) { formData.roll_number = formData.rollArrayItems.reduce((s, n) => (s ?? 0) + (n ?? 0), 0) || null } + // 点数和有值但五个点数为空或无效时,根据 roll_number 补全显示(兼容历史错误数据) + const sum = formData.roll_number != null ? Number(formData.roll_number) : 0 + const hasNull = formData.rollArrayItems.some((n) => n == null) + const itemsSum = formData.rollArrayItems.reduce((s, n) => (s ?? 0) + (n ?? 0), 0) ?? 0 + if (sum >= 5 && sum <= 30 && (hasNull || itemsSum !== sum)) { + formData.rollArrayItems = defaultRollArrayItems(sum) + } } /** 将接口的 roll_array 转为固定 5 项数组,不足补 null */ @@ -360,6 +367,16 @@ return items.slice(0, 5) } + /** 点数和有值但五个点数缺失时,根据点数和生成默认 5 个数(与后端 defaultRollArrayForSum 一致) */ + function defaultRollArrayItems(sum: number): (number | null)[] { + const s = Math.max(5, Math.min(30, Math.floor(Number(sum)))) + const base = Math.floor(s / 5) + const rem = s - 5 * base + const arr: number[] = Array(5).fill(base) + for (let i = 0; i < rem; i++) arr[i]++ + return arr.map((v) => Math.max(1, Math.min(6, v))) + } + const handleClose = () => { visible.value = false formRef.value?.resetFields() diff --git a/saiadmin-artd/src/views/plugin/dice/reward_config/index/index.vue b/saiadmin-artd/src/views/plugin/dice/reward_config/index/index.vue index 6f9e69d..ec84e09 100644 --- a/saiadmin-artd/src/views/plugin/dice/reward_config/index/index.vue +++ b/saiadmin-artd/src/views/plugin/dice/reward_config/index/index.vue @@ -114,7 +114,7 @@ { prop: 'ui_text', label: '前端显示文本', align: 'center' }, { prop: 'real_ev', label: '真实资金结算', align: 'center' }, { prop: 'tier', label: '所属档位', sortable: true, align: 'center' }, - { prop: 'weight', label: '权重(%)', width: 100, align: 'center' }, + { prop: 'weight', label: '权重(1-10000)', width: 110, align: 'center' }, // { prop: 'create_time', label: '创建时间', sortable: true, align: 'center' }, { prop: 'operation', diff --git a/saiadmin-artd/src/views/plugin/dice/reward_config/index/modules/edit-dialog.vue b/saiadmin-artd/src/views/plugin/dice/reward_config/index/modules/edit-dialog.vue index ebca4f9..8c7ce56 100644 --- a/saiadmin-artd/src/views/plugin/dice/reward_config/index/modules/edit-dialog.vue +++ b/saiadmin-artd/src/views/plugin/dice/reward_config/index/modules/edit-dialog.vue @@ -37,19 +37,25 @@ - - + -
- 色子点数 5、30 固定 100% 豹子,不可修改权重 +
+ 色子点数 5、30 固定 10000,不可修改权重
+ + + + + + emit('update:modelValue', value) }) - /** BIGWIN 且 grid_number 为 5 或 30 时豹子概率固定为 100%(禁止手动调整) */ - const isWeightFixed100 = computed( + /** BIGWIN 且 grid_number 为 5 或 30 时权重固定为 10000(禁止手动调整) */ + const isWeightFixed10000 = computed( () => formData.tier === 'BIGWIN' && (formData.grid_number === 5 || formData.grid_number === 30) @@ -120,20 +126,18 @@ weight: [ { validator: (_rule: unknown, value: number | null, callback: (e?: Error) => void) => { - if (formData.tier !== 'BIGWIN') { - callback() - return - } const n = value != null ? Number(value) : NaN - if (Number.isNaN(n) || n < 0 || n > 100) { - callback(new Error('权重仅 BIGWIN 可设定,且必须为 0-100%')) + if (Number.isNaN(n) || n < 1 || n > 10000) { + callback(new Error('权重必须为 1-10000')) return } callback() }, trigger: 'blur' } - ] + ], + n_start_index: [], + s_start_index: [] }) /** @@ -145,7 +149,9 @@ ui_text: '', real_ev: '', tier: '', - weight: 0 as number, + weight: 1 as number, + n_start_index: 0 as number, + s_start_index: 0 as number, remark: '' } @@ -166,7 +172,7 @@ } ) - /** 当 BIGWIN 且 grid_number 为 5 或 30 时,权重固定为 100 便于展示 */ + /** 当 BIGWIN 且 grid_number 为 5 或 30 时,权重固定为 10000 便于展示 */ watch( () => [formData.tier, formData.grid_number], () => { @@ -174,7 +180,7 @@ formData.tier === 'BIGWIN' && (formData.grid_number === 5 || formData.grid_number === 30) ) { - formData.weight = 100 + formData.weight = 10000 } } ) @@ -197,7 +203,7 @@ */ const initForm = () => { if (!props.data) return - const numKeys = ['id', 'grid_number', 'real_ev', 'weight'] + const numKeys = ['id', 'grid_number', 'real_ev', 'weight', 'n_start_index', 's_start_index'] for (const key of Object.keys(formData)) { if (!(key in props.data)) continue const val = props.data[key] @@ -228,18 +234,13 @@ try { await formRef.value.validate() const payload = { ...formData } - if (payload.tier !== 'BIGWIN') { - payload.weight = 0 - } else if (payload.grid_number === 5 || payload.grid_number === 30) { - payload.weight = 100 - } else { - if (payload.grid_number === 5 || payload.grid_number === 30) { - payload.weight = 100 - } else { - const w = Number(payload.weight) - payload.weight = Number.isNaN(w) ? 0 : Math.max(0, Math.min(100, w)) - } + const w = Number(payload.weight) + payload.weight = Number.isNaN(w) ? 1 : Math.max(1, Math.min(10000, w)) + if (payload.tier === 'BIGWIN' && (payload.grid_number === 5 || payload.grid_number === 30)) { + payload.weight = 10000 } + payload.n_start_index = Number(payload.n_start_index) || 0 + payload.s_start_index = Number(payload.s_start_index) || 0 if (props.dialogType === 'add') { await api.save(payload) ElMessage.success('新增成功') diff --git a/saiadmin-artd/src/views/plugin/dice/reward_config/index/modules/weight-ratio-dialog.vue b/saiadmin-artd/src/views/plugin/dice/reward_config/index/modules/weight-ratio-dialog.vue index 0c64d79..81d1d86 100644 --- a/saiadmin-artd/src/views/plugin/dice/reward_config/index/modules/weight-ratio-dialog.vue +++ b/saiadmin-artd/src/views/plugin/dice/reward_config/index/modules/weight-ratio-dialog.vue @@ -13,19 +13,18 @@