123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- <template>
- <a-modal
- :visible="visible"
- :title="editMode ? $t('plan.editFee') : $t('plan.addFee')"
- @ok="handleSubmit"
- @cancel="handleCancel"
- :width="800"
- >
- <a-form :model="formData" :rules="rules" ref="formRef" >
- <a-divider>{{ $t('plan.basicInfo') }}</a-divider>
- <a-form-item field="feeCode" :label="$t('plan.feeCode')" required>
- <a-input v-model="formData.feeCode" :placeholder="$t('plan.enterFeeCode')" :maxLength="60" show-word-limit />
- </a-form-item>
- <a-form-item field="feeName" :label="$t('plan.feeName')" required>
- <a-input v-model="formData.feeName" :placeholder="$t('plan.enterFeeName')" :maxLength="60" show-word-limit />
- </a-form-item>
- <a-form-item field="supplier" :label="$t('plan.supplier')" required>
- <a-select v-model="formData.supplier" :placeholder="$t('plan.selectSupplier')">
- <a-option value="supplier1">{{ $t('plan.supplier1') }}</a-option>
- <a-option value="supplier2">{{ $t('plan.supplier2') }}</a-option>
- </a-select>
- </a-form-item>
- <a-form-item field="dataType" :label="$t('plan.dataType')" required>
- <a-radio-group v-model="formData.dataType">
- <a-radio value="general">{{ $t('plan.general') }}</a-radio>
- <a-radio value="specific">{{ $t('plan.specific') }}</a-radio>
- </a-radio-group>
- </a-form-item>
- <a-form-item field="billingCategory" :label="$t('plan.billingCategory')" required>
- <a-radio-group v-model="formData.billingCategory">
- <a-radio value="data">{{ $t('plan.data') }}</a-radio>
- <a-radio value="voice">{{ $t('plan.voice') }}</a-radio>
- <a-radio value="nb">{{ $t('plan.nb') }}</a-radio>
- <a-radio value="sms">{{ $t('plan.sms') }}</a-radio>
- </a-radio-group>
- </a-form-item>
- <a-form-item field="status" :label="$t('plan.status')" required>
- <a-radio-group v-model="formData.status">
- <a-radio value="normal">{{ $t('plan.status.normal') }}</a-radio>
- <a-radio value="disabled">{{ $t('plan.status.disabled') }}</a-radio>
- <a-radio value="offline">{{ $t('plan.status.offline') }}</a-radio>
- </a-radio-group>
- </a-form-item>
- <a-divider>{{ $t('plan.billingInfo') }}</a-divider>
- <a-form-item field="billingCycle" :label="$t('plan.billingCycle')" required>
- <a-radio-group v-model="formData.billingCycle">
- <a-radio value="daily">{{ $t('plan.daily') }}</a-radio>
- <a-radio value="monthly">{{ $t('plan.monthly') }}</a-radio>
- </a-radio-group>
- </a-form-item>
- <a-form-item field="packageSize" :label="$t('plan.packageSize')" required>
- <a-input-number v-model="formData.packageSize" :placeholder="$t('plan.enterPackageSize')" style="width: 200px" />
- <a-select v-model="formData.packageUnit" style="width: 80px; margin-left: 10px;">
- <a-option value="KB">KB</a-option>
- <a-option value="MB">MB</a-option>
- <a-option value="GB">GB</a-option>
- </a-select>
- </a-form-item>
- <a-form-item field="standardPrice" :label="$t('plan.standardPrice')" required>
- <a-input-number v-model="formData.standardPrice" :placeholder="$t('plan.enterPrice')" style="width: 200px" />
- <span style="margin: 0 10px;">{{ $t('plan.currency') }}/</span>
- <a-select v-model="formData.priceUnit" style="width: 120px;">
- <a-option value="day">{{ $t('plan.billingCycleType') }}</a-option>
- <a-option value="month">{{ $t('plan.month') }}</a-option>
- </a-select>
- </a-form-item>
- <a-form-item field="subscriptionPeriod" :label="$t('plan.subscriptionPeriod')" required>
- <a-input-number v-model="formData.minPeriod" :placeholder="$t('plan.minimum')" style="width: 100px" />
- <span style="margin: 0 10px;">{{ $t('plan.monthsMin') }}</span>
- <a-input-number v-model="formData.maxPeriod" :placeholder="$t('plan.maximum')" style="width: 100px" />
- <span style="margin-left: 10px;">{{ $t('plan.monthsMax') }}</span>
- </a-form-item>
- <a-form-item field="overagePrice" :label="$t('plan.overagePrice')">
- <a-input-number v-model="formData.overagePrice" :placeholder="$t('plan.enterOveragePrice')" style="width: 200px" />
- <span style="margin: 0 10px;">{{ $t('plan.currency') }}/</span>
- <a-select v-model="formData.overageUnit" style="width: 80px;">
- <a-option value="KB">KB</a-option>
- <a-option value="MB">MB</a-option>
- <a-option value="GB">GB</a-option>
- </a-select>
- </a-form-item>
- <a-form-item field="connectionTimes" :label="$t('plan.connectionTimes')">
- <a-input-number v-model="formData.connectionTimes" placeholder="0" />
- <span style="margin-left: 10px;">{{ $t('plan.times') }}</span>
- </a-form-item>
- <a-form-item field="voiceRate" :label="$t('plan.voiceRate')">
- <a-input-number v-model="formData.voiceRate" placeholder="0" />
- <span style="margin-left: 10px;">{{ $t('plan.currency') }}/{{ $t('plan.minute') }}</span>
- </a-form-item>
- <a-form-item field="billingCode" :label="$t('plan.billingCode')">
- <a-input v-model="formData.billingCode" :placeholder="$t('plan.autoGenerated')" disabled />
- </a-form-item>
- </a-form>
- </a-modal>
- </template>
- <script setup>
- import { ref, reactive } from 'vue';
- import { Message } from '@arco-design/web-vue';
- import { useI18n } from 'vue-i18n';
- const { t } = useI18n();
- const props = defineProps({
- visible: Boolean,
- editMode: Boolean,
- editData: Object,
- });
- const emit = defineEmits(['update:visible', 'submit']);
- const formRef = ref(null);
- const formData = reactive({
- feeCode: '',
- feeName: '',
- supplier: '',
- dataType: 'general',
- billingCategory: 'data',
- status: 'normal',
- billingCycle: 'daily',
- packageSize: null,
- packageUnit: 'MB',
- standardPrice: null,
- priceUnit: 'day',
- minPeriod: 1,
- maxPeriod: 60,
- overagePrice: null,
- overageUnit: 'MB',
- connectionTimes: 0,
- voiceRate: 0,
- billingCode: t('plan.autoGenerated'),
- });
- const rules = {
- feeCode: [{ required: true, message: t('plan.feeCodeRequired') }],
- feeName: [{ required: true, message: t('plan.feeNameRequired') }],
- supplier: [{ required: true, message: t('plan.supplierRequired') }],
- dataType: [{ required: true, message: t('plan.dataTypeRequired') }],
- billingCategory: [{ required: true, message: t('plan.billingCategoryRequired') }],
- status: [{ required: true, message: t('plan.statusRequired') }],
- billingCycle: [{ required: true, message: t('plan.billingCycleRequired') }],
- packageSize: [{ required: true, type: 'number', message: t('plan.packageSizeRequired') }],
- standardPrice: [{ required: true, type: 'number', message: t('plan.standardPriceRequired') }],
- minPeriod: [{ required: true, type: 'number', message: t('plan.minPeriodRequired') }],
- maxPeriod: [{ required: true, type: 'number', message: t('plan.maxPeriodRequired') }],
- };
- const handleSubmit = () => {
- formRef.value.validate((errors) => {
- if (!errors) {
- emit('submit', { ...formData });
- emit('update:visible', false);
- } else {
- console.error('Validation failed', errors);
- Message.error(t('plan.fillRequiredFields'));
- }
- });
- };
- const handleCancel = () => {
- emit('update:visible', false);
- };
- </script>
- <style scoped>
- .arco-form-item {
- margin-bottom: 18px;
- }
- </style>
|