NewFeeForm.vue 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <template>
  2. <a-modal
  3. :visible="visible"
  4. :title="editMode ? $t('plan.editFee') : $t('plan.addFee')"
  5. @ok="handleSubmit"
  6. @cancel="handleCancel"
  7. :width="800"
  8. >
  9. <a-form :model="formData" :rules="rules" ref="formRef" >
  10. <a-divider>{{ $t('plan.basicInfo') }}</a-divider>
  11. <a-form-item field="feeCode" :label="$t('plan.feeCode')" required>
  12. <a-input v-model="formData.feeCode" :placeholder="$t('plan.enterFeeCode')" :maxLength="60" show-word-limit />
  13. </a-form-item>
  14. <a-form-item field="feeName" :label="$t('plan.feeName')" required>
  15. <a-input v-model="formData.feeName" :placeholder="$t('plan.enterFeeName')" :maxLength="60" show-word-limit />
  16. </a-form-item>
  17. <a-form-item field="supplier" :label="$t('plan.supplier')" required>
  18. <a-select v-model="formData.supplier" :placeholder="$t('plan.selectSupplier')">
  19. <a-option value="supplier1">{{ $t('plan.supplier1') }}</a-option>
  20. <a-option value="supplier2">{{ $t('plan.supplier2') }}</a-option>
  21. </a-select>
  22. </a-form-item>
  23. <a-form-item field="dataType" :label="$t('plan.dataType')" required>
  24. <a-radio-group v-model="formData.dataType">
  25. <a-radio value="general">{{ $t('plan.general') }}</a-radio>
  26. <a-radio value="specific">{{ $t('plan.specific') }}</a-radio>
  27. </a-radio-group>
  28. </a-form-item>
  29. <a-form-item field="billingCategory" :label="$t('plan.billingCategory')" required>
  30. <a-radio-group v-model="formData.billingCategory">
  31. <a-radio value="data">{{ $t('plan.data') }}</a-radio>
  32. <a-radio value="voice">{{ $t('plan.voice') }}</a-radio>
  33. <a-radio value="nb">{{ $t('plan.nb') }}</a-radio>
  34. <a-radio value="sms">{{ $t('plan.sms') }}</a-radio>
  35. </a-radio-group>
  36. </a-form-item>
  37. <a-form-item field="status" :label="$t('plan.status')" required>
  38. <a-radio-group v-model="formData.status">
  39. <a-radio value="normal">{{ $t('plan.status.normal') }}</a-radio>
  40. <a-radio value="disabled">{{ $t('plan.status.disabled') }}</a-radio>
  41. <a-radio value="offline">{{ $t('plan.status.offline') }}</a-radio>
  42. </a-radio-group>
  43. </a-form-item>
  44. <a-divider>{{ $t('plan.billingInfo') }}</a-divider>
  45. <a-form-item field="billingCycle" :label="$t('plan.billingCycle')" required>
  46. <a-radio-group v-model="formData.billingCycle">
  47. <a-radio value="daily">{{ $t('plan.daily') }}</a-radio>
  48. <a-radio value="monthly">{{ $t('plan.monthly') }}</a-radio>
  49. </a-radio-group>
  50. </a-form-item>
  51. <a-form-item field="packageSize" :label="$t('plan.packageSize')" required>
  52. <a-input-number v-model="formData.packageSize" :placeholder="$t('plan.enterPackageSize')" style="width: 200px" />
  53. <a-select v-model="formData.packageUnit" style="width: 80px; margin-left: 10px;">
  54. <a-option value="KB">KB</a-option>
  55. <a-option value="MB">MB</a-option>
  56. <a-option value="GB">GB</a-option>
  57. </a-select>
  58. </a-form-item>
  59. <a-form-item field="standardPrice" :label="$t('plan.standardPrice')" required>
  60. <a-input-number v-model="formData.standardPrice" :placeholder="$t('plan.enterPrice')" style="width: 200px" />
  61. <span style="margin: 0 10px;">{{ $t('plan.currency') }}/</span>
  62. <a-select v-model="formData.priceUnit" style="width: 120px;">
  63. <a-option value="day">{{ $t('plan.billingCycleType') }}</a-option>
  64. <a-option value="month">{{ $t('plan.month') }}</a-option>
  65. </a-select>
  66. </a-form-item>
  67. <a-form-item field="subscriptionPeriod" :label="$t('plan.subscriptionPeriod')" required>
  68. <a-input-number v-model="formData.minPeriod" :placeholder="$t('plan.minimum')" style="width: 100px" />
  69. <span style="margin: 0 10px;">{{ $t('plan.monthsMin') }}</span>
  70. <a-input-number v-model="formData.maxPeriod" :placeholder="$t('plan.maximum')" style="width: 100px" />
  71. <span style="margin-left: 10px;">{{ $t('plan.monthsMax') }}</span>
  72. </a-form-item>
  73. <a-form-item field="overagePrice" :label="$t('plan.overagePrice')">
  74. <a-input-number v-model="formData.overagePrice" :placeholder="$t('plan.enterOveragePrice')" style="width: 200px" />
  75. <span style="margin: 0 10px;">{{ $t('plan.currency') }}/</span>
  76. <a-select v-model="formData.overageUnit" style="width: 80px;">
  77. <a-option value="KB">KB</a-option>
  78. <a-option value="MB">MB</a-option>
  79. <a-option value="GB">GB</a-option>
  80. </a-select>
  81. </a-form-item>
  82. <a-form-item field="connectionTimes" :label="$t('plan.connectionTimes')">
  83. <a-input-number v-model="formData.connectionTimes" placeholder="0" />
  84. <span style="margin-left: 10px;">{{ $t('plan.times') }}</span>
  85. </a-form-item>
  86. <a-form-item field="voiceRate" :label="$t('plan.voiceRate')">
  87. <a-input-number v-model="formData.voiceRate" placeholder="0" />
  88. <span style="margin-left: 10px;">{{ $t('plan.currency') }}/{{ $t('plan.minute') }}</span>
  89. </a-form-item>
  90. <a-form-item field="billingCode" :label="$t('plan.billingCode')">
  91. <a-input v-model="formData.billingCode" :placeholder="$t('plan.autoGenerated')" disabled />
  92. </a-form-item>
  93. </a-form>
  94. </a-modal>
  95. </template>
  96. <script setup>
  97. import { ref, reactive } from 'vue';
  98. import { Message } from '@arco-design/web-vue';
  99. import { useI18n } from 'vue-i18n';
  100. const { t } = useI18n();
  101. const props = defineProps({
  102. visible: Boolean,
  103. editMode: Boolean,
  104. editData: Object,
  105. });
  106. const emit = defineEmits(['update:visible', 'submit']);
  107. const formRef = ref(null);
  108. const formData = reactive({
  109. feeCode: '',
  110. feeName: '',
  111. supplier: '',
  112. dataType: 'general',
  113. billingCategory: 'data',
  114. status: 'normal',
  115. billingCycle: 'daily',
  116. packageSize: null,
  117. packageUnit: 'MB',
  118. standardPrice: null,
  119. priceUnit: 'day',
  120. minPeriod: 1,
  121. maxPeriod: 60,
  122. overagePrice: null,
  123. overageUnit: 'MB',
  124. connectionTimes: 0,
  125. voiceRate: 0,
  126. billingCode: t('plan.autoGenerated'),
  127. });
  128. const rules = {
  129. feeCode: [{ required: true, message: t('plan.feeCodeRequired') }],
  130. feeName: [{ required: true, message: t('plan.feeNameRequired') }],
  131. supplier: [{ required: true, message: t('plan.supplierRequired') }],
  132. dataType: [{ required: true, message: t('plan.dataTypeRequired') }],
  133. billingCategory: [{ required: true, message: t('plan.billingCategoryRequired') }],
  134. status: [{ required: true, message: t('plan.statusRequired') }],
  135. billingCycle: [{ required: true, message: t('plan.billingCycleRequired') }],
  136. packageSize: [{ required: true, type: 'number', message: t('plan.packageSizeRequired') }],
  137. standardPrice: [{ required: true, type: 'number', message: t('plan.standardPriceRequired') }],
  138. minPeriod: [{ required: true, type: 'number', message: t('plan.minPeriodRequired') }],
  139. maxPeriod: [{ required: true, type: 'number', message: t('plan.maxPeriodRequired') }],
  140. };
  141. const handleSubmit = () => {
  142. formRef.value.validate((errors) => {
  143. if (!errors) {
  144. emit('submit', { ...formData });
  145. emit('update:visible', false);
  146. } else {
  147. console.error('Validation failed', errors);
  148. Message.error(t('plan.fillRequiredFields'));
  149. }
  150. });
  151. };
  152. const handleCancel = () => {
  153. emit('update:visible', false);
  154. };
  155. </script>
  156. <style scoped>
  157. .arco-form-item {
  158. margin-bottom: 18px;
  159. }
  160. </style>