|
|
@@ -0,0 +1,251 @@
|
|
|
+<script setup>
|
|
|
+import {Descriptions, DescriptionsItem, Input, InputGroup, Select, Button, InputNumber, message} from 'ant-design-vue';
|
|
|
+import {ref, reactive, toRaw, h} from "vue";
|
|
|
+import {useVbenModal} from '@vben/common-ui';
|
|
|
+import {$t} from "@vben/locales";
|
|
|
+import { useVbenForm} from '#/adapter/form';
|
|
|
+import {useVbenVxeGrid} from "#/adapter/vxe-table.js";
|
|
|
+import {updateAutoRtpInfo} from "#/api/game_control/auto_rtp.js";
|
|
|
+
|
|
|
+
|
|
|
+const is_edit = ref(false);
|
|
|
+let form = reactive({
|
|
|
+ rtp_kill_data: [],
|
|
|
+ float_rate: 15,
|
|
|
+ default_rtp: 97,
|
|
|
+ rtp_float: 2.5,
|
|
|
+ rtp_check: 10,
|
|
|
+ new_user_number: 150
|
|
|
+});
|
|
|
+
|
|
|
+const updateTestDesc = function () {
|
|
|
+ let diff_rtp = form.rtp_float * 2;
|
|
|
+ form.rtp_kill_data.forEach((item, idx) => {
|
|
|
+ const start = form.default_rtp + (diff_rtp * idx) + form.float_rate;
|
|
|
+ let end = start + diff_rtp;
|
|
|
+ const float_rate = form.float_rate + (diff_rtp * idx);
|
|
|
+ if(idx == form.rtp_kill_data.length - 1) {
|
|
|
+ end = 9999999.99;
|
|
|
+ }
|
|
|
+ item['idx'] = idx;
|
|
|
+ item['desc'] = $t('game_control.auto_rtp.rtp_list_desc', {
|
|
|
+ ...item,
|
|
|
+ start,
|
|
|
+ end,
|
|
|
+ float_rate
|
|
|
+ });
|
|
|
+ item['min_desc'] = $t('game_control.auto_rtp.rtp_list_min_desc', {
|
|
|
+ ...item,
|
|
|
+ start,
|
|
|
+ end,
|
|
|
+ float_rate
|
|
|
+ });
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+const [Modal, modalApi] = useVbenModal({
|
|
|
+ draggable: true,
|
|
|
+ async onOpenChange(isOpen) {
|
|
|
+ if (isOpen) {
|
|
|
+ let tempData = await modalApi.getData();
|
|
|
+ tempData = JSON.parse(JSON.stringify(tempData));
|
|
|
+ form.rtp_kill_data = tempData.data.rtp_kill_data;
|
|
|
+ form.float_rate = tempData.data.float_rate;
|
|
|
+ form.new_user_number = tempData.data.new_user_number;
|
|
|
+ form.default_rtp = tempData.data.default_rtp;
|
|
|
+ form.rtp_float = tempData.data.rtp_float;
|
|
|
+
|
|
|
+ updateTestDesc();
|
|
|
+ gridApi.setGridOptions({
|
|
|
+ data: form.rtp_kill_data,
|
|
|
+ });
|
|
|
+ formApi.setValues({
|
|
|
+ new_user_number: form.new_user_number,
|
|
|
+ float_rate: form.float_rate,
|
|
|
+ })
|
|
|
+ // $start = $rtp + ($diff_rtp * $idx) + $info['float_rate'];
|
|
|
+ // $end = $start + $diff_rtp;
|
|
|
+
|
|
|
+ is_edit.value = tempData.is_edit || false;
|
|
|
+ if(is_edit.value){
|
|
|
+ modalApi.setState({
|
|
|
+ footer: true,
|
|
|
+ class:'w-[70%]',
|
|
|
+ })
|
|
|
+ }else {
|
|
|
+ modalApi.setState({
|
|
|
+ footer: false,
|
|
|
+ class:'w-[50%]',
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ onConfirm:async function () {
|
|
|
+ let values = await formApi.getValues();
|
|
|
+ let _form = {
|
|
|
+ 'new_user_number': values.new_user_number,
|
|
|
+ 'float_rate': values.float_rate,
|
|
|
+ 'rtp_kill_data': []
|
|
|
+ }
|
|
|
+ form.rtp_kill_data.forEach((item, idx) => {
|
|
|
+ _form.rtp_kill_data.push({
|
|
|
+ 'new': item.new,
|
|
|
+ 'old': item.old,
|
|
|
+ })
|
|
|
+ })
|
|
|
+ modalApi.lock();
|
|
|
+ const res = await updateAutoRtpInfo(_form);
|
|
|
+ modalApi.unlock();
|
|
|
+ if(res.state) {
|
|
|
+ modalApi.setData({
|
|
|
+ 'is_reload': true
|
|
|
+ });
|
|
|
+ await modalApi.close();
|
|
|
+ }else {
|
|
|
+ message.error(res.message);
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+const userNumberList = [];
|
|
|
+[50, 60, 70, 80, 90, 100, 150, 200, 300, 400, 500].forEach((value) => {
|
|
|
+ userNumberList.push({
|
|
|
+ 'label': value + '局',
|
|
|
+ 'value': value,
|
|
|
+ })
|
|
|
+})
|
|
|
+const floatRateList = [];
|
|
|
+for(let i=1;i<=15;i++) {
|
|
|
+ floatRateList.push({
|
|
|
+ 'label': i + '%',
|
|
|
+ 'value': i,
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+const [Form, formApi] = useVbenForm({
|
|
|
+ // 所有表单项共用,可单独在表单内覆盖
|
|
|
+ commonConfig: {
|
|
|
+ // 所有表单项
|
|
|
+ componentProps: {
|
|
|
+ class: 'w-full',
|
|
|
+ },
|
|
|
+ labelWidth: 220,
|
|
|
+ },
|
|
|
+ scrollToFirstError: true,
|
|
|
+ layout: 'horizontal',
|
|
|
+ schema: [
|
|
|
+ {
|
|
|
+ component: 'Select',
|
|
|
+ componentProps: {
|
|
|
+ filterOption: true,
|
|
|
+ options: userNumberList,
|
|
|
+ showSearch: true,
|
|
|
+ },
|
|
|
+ defaultValue: form.new_user_number,
|
|
|
+ fieldName: 'new_user_number',
|
|
|
+ label: $t('game_control.auto_rtp.new_user_number'),
|
|
|
+ rules: 'required',
|
|
|
+ suffix: () => h('span', { style: 'font-size:14px;color:#666;' }, $t('game_control.auto_rtp.new_user_number_desc')),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ component: 'Select',
|
|
|
+ componentProps: {
|
|
|
+ filterOption: true,
|
|
|
+ options: floatRateList,
|
|
|
+ showSearch: true,
|
|
|
+ },
|
|
|
+ defaultValue: form.float_rate,
|
|
|
+ fieldName: 'float_rate',
|
|
|
+ label: $t('game_control.auto_rtp.float_rate'),
|
|
|
+ rules: 'required',
|
|
|
+ suffix: () => h('span', { style: 'font-size:14px;color:#666;' }, $t('game_control.auto_rtp.float_rate_desc')),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ component: 'Input',
|
|
|
+ fieldName: 'rtp_kill_data',
|
|
|
+ label: $t('game_control.auto_rtp.rtp_list_config'),
|
|
|
+ rules: 'required',
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ wrapperClass: 'grid-cols-1',
|
|
|
+ showDefaultActions: false,
|
|
|
+});
|
|
|
+
|
|
|
+const gridOptions = {
|
|
|
+ height: 400,
|
|
|
+ rowConfig: {
|
|
|
+ isHover: true,
|
|
|
+ },
|
|
|
+ columns: [
|
|
|
+ { title: $t('common.serial'), type: 'seq', width: 50 },
|
|
|
+ { field: 'min_desc', title: $t('game_control.auto_rtp.user_rtp_change_desc'), width: 480},
|
|
|
+ {
|
|
|
+ title: $t('game_control.auto_rtp.new_old_diff_user'),
|
|
|
+ headerAlign: 'center',
|
|
|
+ children: [
|
|
|
+ { field: 'new', title: $t('game_control.auto_rtp.new_user'), slots: {'default':"new_input"}, minWidth: 120 },
|
|
|
+ { field: 'old', title: $t('game_control.auto_rtp.old_user'), slots: {'default':"old_input"}, minWidth: 120 },
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title:$t('common.action'),
|
|
|
+ slots:{'default':"action"},
|
|
|
+ minWidth: 100,
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ data: form.rtp_kill_data,
|
|
|
+ pagerConfig: {
|
|
|
+ enabled: false
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+const [Grid, gridApi] = useVbenVxeGrid({ gridOptions });
|
|
|
+
|
|
|
+
|
|
|
+const deleteKill = function (row) {
|
|
|
+ form.rtp_kill_data.splice(row.idx, 1);
|
|
|
+ updateTestDesc();
|
|
|
+}
|
|
|
+const addKill = function () {
|
|
|
+ form.rtp_kill_data.push({new: 0, old: 0});
|
|
|
+ updateTestDesc();
|
|
|
+}
|
|
|
+
|
|
|
+</script>
|
|
|
+
|
|
|
+<template>
|
|
|
+ <Modal>
|
|
|
+ <Descriptions v-if="!is_edit" bordered :labelStyle="{'width':'60px'}" :column="1">
|
|
|
+ <DescriptionsItem v-for="(item, index) in form.rtp_kill_data" :label=" index + 1">
|
|
|
+ {{item.desc}}
|
|
|
+ </DescriptionsItem>
|
|
|
+ </Descriptions>
|
|
|
+ <Form v-else class="grid-form-class-diy">
|
|
|
+ <template #rtp_kill_data="slotProps">
|
|
|
+ <Grid class="grid-class">
|
|
|
+ <template #new_input="{row}">
|
|
|
+ <InputNumber v-model:value="form.rtp_kill_data[row.idx]['new']" addon-after="%"></InputNumber>
|
|
|
+ </template>after
|
|
|
+ <template #old_input="{row}">
|
|
|
+ <InputNumber v-model:value="form.rtp_kill_data[row.idx]['old']" addon-after="%"></InputNumber>
|
|
|
+ </template>
|
|
|
+ <template #toolbar-actions>
|
|
|
+ <Button type="primary" v-if="form.rtp_kill_data.length < 20" @click="addKill">添加</Button>
|
|
|
+ </template>
|
|
|
+ <template #action="{row}">
|
|
|
+ <Button v-if="form.rtp_kill_data.length > 1" type="primary" @click="deleteKill(row)" size="small" danger>{{$t('common.delete')}}</Button>
|
|
|
+ </template>
|
|
|
+ </Grid>
|
|
|
+ </template>
|
|
|
+ </Form>
|
|
|
+ </Modal>
|
|
|
+</template>
|
|
|
+
|
|
|
+<style scoped>
|
|
|
+.grid-class {width: 100%}
|
|
|
+.grid-form-class-diy ::v-deep .ant-select {width: 25%}
|
|
|
+</style>
|