NewSupplierForm.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. <template>
  2. <a-modal :visible="visible" :title="editMode ? $t('supplier.editSupplier') : $t('supplier.addSupplier')"
  3. @ok="handleSubmit" @cancel="handleCancel" :mask-closable="false" :width="800">
  4. <a-tabs v-model:activeKey="activeTab">
  5. <a-tab-pane key="1" :title="$t('supplier.basicInfo')">
  6. <a-form :model="formData" :rules="rules" ref="formRef">
  7. <a-form-item field="supplierName" :label="$t('supplier.supplierName')" required>
  8. <a-input v-model="formData.supplierName" :placeholder="$t('supplier.enterSupplierName')" />
  9. </a-form-item>
  10. <a-form-item field="operatorType" :label="$t('supplier.operatorType')" required>
  11. <a-radio-group v-model="formData.operatorType">
  12. <a-radio value="chinamobile">{{ $t('supplier.operatorTypes.chinamobile') }}</a-radio>
  13. <a-radio value="chinaunicom">{{ $t('supplier.operatorTypes.chinaunicom') }}</a-radio>
  14. <a-radio value="chinatelecom">{{ $t('supplier.operatorTypes.chinatelecom') }}</a-radio>
  15. <a-radio value="international">{{ $t('supplier.operatorTypes.international') }}</a-radio>
  16. <a-radio value="foreign_local">{{ $t('supplier.operatorTypes.foreign_local') }}</a-radio>
  17. </a-radio-group>
  18. </a-form-item>
  19. </a-form>
  20. </a-tab-pane>
  21. <a-tab-pane key="2" :title="$t('supplier.operatorApiConfig')">
  22. <a-form :model="formData.apiConfig" :rules="apiConfigRules" ref="apiConfigFormRef">
  23. <a-form-item field="apiTemplate" :label="$t('supplier.apiTemplate')" required>
  24. <a-select v-model="formData.apiConfig.apiTemplate"
  25. :placeholder="$t('supplier.selectApiTemplate')">
  26. <a-option value="telecom_CMP">{{ $t('supplier.apiTemplates.telecom_CMP') }}</a-option>
  27. <!-- 添加其他API模板选项 -->
  28. </a-select>
  29. </a-form-item>
  30. <a-form-item field="apiUrl" :label="$t('supplier.apiUrl')" required>
  31. <a-input v-model="formData.apiConfig.apiUrl" :placeholder="$t('supplier.enterApiUrl')" />
  32. </a-form-item>
  33. <a-form-item field="realNameAuthUrl" :label="$t('supplier.realNameAuthUrl')">
  34. <a-input v-model="formData.apiConfig.realNameAuthUrl"
  35. :placeholder="$t('supplier.enterRealNameAuthUrl')" />
  36. </a-form-item>
  37. <a-form-item field="realNameUrlParam" :label="$t('supplier.realNameUrlParam')">
  38. <a-input v-model="formData.apiConfig.realNameUrlParam"
  39. :placeholder="$t('supplier.enterRealNameUrlParam')" />
  40. </a-form-item>
  41. <a-form-item field="appKey" :label="$t('supplier.appKey')" required>
  42. <a-input v-model="formData.apiConfig.appKey" :placeholder="$t('supplier.enterAppKey')" />
  43. </a-form-item>
  44. <a-form-item field="apiSecret" :label="$t('supplier.apiSecret')" required>
  45. <a-input v-model="formData.apiConfig.apiSecret" :placeholder="$t('supplier.enterApiSecret')" />
  46. </a-form-item>
  47. <a-form-item field="key" :label="$t('supplier.key')">
  48. <a-input v-model="formData.apiConfig.key" :placeholder="$t('supplier.enterKey')" />
  49. </a-form-item>
  50. <a-form-item field="stopCardAction" :label="$t('supplier.stopCardAction')">
  51. <a-select v-model="formData.apiConfig.stopCardAction"
  52. :placeholder="$t('supplier.selectStopCardAction')">
  53. <a-option value="suspend">{{ $t('supplier.stopCardActions.suspend') }}</a-option>
  54. <!-- 添加其他停卡动作选项 -->
  55. </a-select>
  56. </a-form-item>
  57. </a-form>
  58. </a-tab-pane>
  59. <a-tab-pane key="3" :title="$t('supplier.advancedConfig')">
  60. <a-form :model="formData.advancedConfig" :rules="advancedConfigRules" ref="advancedConfigFormRef">
  61. <a-form-item field="needManualRealName" :label="$t('supplier.needManualRealName')" required>
  62. <a-radio-group type="button" v-model="formData.advancedConfig.needManualRealName">
  63. <a-radio value="需要">{{ $t('supplier.need') }}</a-radio>
  64. <a-radio value="无需">{{ $t('supplier.noNeed') }}</a-radio>
  65. </a-radio-group>
  66. </a-form-item>
  67. <a-form-item field="autoSyncUsage" :label="$t('supplier.autoSyncUsage')" required>
  68. <a-radio-group type="button" v-model="formData.advancedConfig.autoSyncUsage">
  69. <a-radio value="启用">{{ $t('supplier.enable') }}</a-radio>
  70. <a-radio value="停用">{{ $t('supplier.disable') }}</a-radio>
  71. </a-radio-group>
  72. </a-form-item>
  73. <a-form-item field="useOperatorApi" :label="$t('supplier.useOperatorApi')" required>
  74. <a-radio-group type="button" v-model="formData.advancedConfig.useOperatorApi">
  75. <a-radio value="调用">{{ $t('supplier.call') }}</a-radio>
  76. <a-radio value="不调用">{{ $t('supplier.noCall') }}</a-radio>
  77. </a-radio-group>
  78. </a-form-item>
  79. <a-form-item field="setQuantityLimit" :label="$t('supplier.setQuantityLimit')">
  80. <a-radio-group type="button" v-model="formData.advancedConfig.setQuantityLimit">
  81. <a-radio value="达量断网">{{ $t('supplier.quantityLimit') }}</a-radio>
  82. <a-radio value="不达量断网">{{ $t('supplier.noQuantityLimit') }}</a-radio>
  83. </a-radio-group>
  84. </a-form-item>
  85. <a-form-item field="useOperatorDataPool" :label="$t('supplier.useOperatorDataPool')" required>
  86. <a-radio-group type="button" v-model="formData.advancedConfig.useOperatorDataPool">
  87. <a-radio value="启用">{{ $t('supplier.enable') }}</a-radio>
  88. <a-radio value="不启用">{{ $t('supplier.disable') }}</a-radio>
  89. </a-radio-group>
  90. </a-form-item>
  91. <a-form-item field="silentPeriod" :label="$t('supplier.silentPeriod')" required>
  92. <a-input-number v-model="formData.advancedConfig.silentPeriod"
  93. :placeholder="$t('supplier.enterSilentPeriod')" />
  94. </a-form-item>
  95. <a-form-item field="unusedSuspensionDays" :label="$t('supplier.unusedSuspensionDays')">
  96. <a-input-number v-model="formData.advancedConfig.unusedSuspensionDays"
  97. :placeholder="$t('supplier.enterDays')" />
  98. </a-form-item>
  99. <a-form-item field="maxWhitelistAdditions" :label="$t('supplier.maxWhitelistAdditions')">
  100. <a-input-number v-model="formData.advancedConfig.maxWhitelistAdditions"
  101. :placeholder="$t('supplier.enterTimes')" />
  102. </a-form-item>
  103. <a-form-item field="totalActiveWhitelists" :label="$t('supplier.totalActiveWhitelists')">
  104. <a-input-number v-model="formData.advancedConfig.totalActiveWhitelists"
  105. :placeholder="$t('supplier.enterCount')" />
  106. </a-form-item>
  107. <a-form-item field="dailyWhitelistRemovals" :label="$t('supplier.dailyWhitelistRemovals')">
  108. <a-input-number v-model="formData.advancedConfig.dailyWhitelistRemovals"
  109. :placeholder="$t('supplier.enterCount')" />
  110. </a-form-item>
  111. <a-form-item field="whitelistAddOrder" :label="$t('supplier.whitelistAddOrder')">
  112. <a-select v-model="formData.advancedConfig.whitelistAddOrder"
  113. :placeholder="$t('supplier.selectOrder')">
  114. <a-option value="noWhitelist">{{ $t('supplier.noWhitelist') }}</a-option>
  115. <!-- 添加其他选项 -->
  116. </a-select>
  117. </a-form-item>
  118. <a-form-item field="numberGenerationRule" :label="$t('supplier.numberGenerationRule')">
  119. <a-input v-model="formData.advancedConfig.numberGenerationRule"
  120. :placeholder="$t('supplier.enterNumberGenerationRule')" />
  121. </a-form-item>
  122. </a-form>
  123. </a-tab-pane>
  124. </a-tabs>
  125. </a-modal>
  126. </template>
  127. <script setup>
  128. import { ref, reactive, watch } from 'vue';
  129. import { Message } from '@arco-design/web-vue';
  130. import { useI18n } from 'vue-i18n';
  131. const { t } = useI18n();
  132. const props = defineProps({
  133. visible: Boolean,
  134. editMode: Boolean,
  135. editData: Object,
  136. });
  137. const emit = defineEmits(['update:visible', 'submit']);
  138. const activeTab = ref('1');
  139. const formRef = ref(null);
  140. const apiConfigFormRef = ref(null);
  141. const advancedConfigFormRef = ref(null);
  142. const formData = reactive({
  143. supplierName: '',
  144. operatorType: '',
  145. apiConfig: {
  146. apiTemplate: '',
  147. apiUrl: '',
  148. realNameAuthUrl: '',
  149. realNameUrlParam: '',
  150. appKey: '',
  151. apiSecret: '',
  152. key: '',
  153. stopCardAction: '',
  154. },
  155. advancedConfig: {
  156. needManualRealName: '',
  157. autoSyncUsage: '',
  158. useOperatorApi: '',
  159. setQuantityLimit: '',
  160. useOperatorDataPool: '',
  161. silentPeriod: null,
  162. unusedSuspensionDays: null,
  163. maxWhitelistAdditions: null,
  164. totalActiveWhitelists: null,
  165. dailyWhitelistRemovals: null,
  166. whitelistAddOrder: '',
  167. numberGenerationRule: '',
  168. },
  169. });
  170. const rules = {
  171. supplierName: [{ required: true, message: t('supplier.supplierNameRequired') }],
  172. operatorType: [{ required: true, message: t('supplier.operatorTypeRequired') }],
  173. };
  174. const apiConfigRules = {
  175. apiTemplate: [{ required: true, message: t('supplier.apiTemplateRequired') }],
  176. apiUrl: [{ required: true, message: t('supplier.apiUrlRequired') }],
  177. appKey: [{ required: true, message: t('supplier.appKeyRequired') }],
  178. apiSecret: [{ required: true, message: t('supplier.apiSecretRequired') }],
  179. };
  180. const advancedConfigRules = {
  181. needManualRealName: [{ required: true, message: t('supplier.needManualRealNameRequired') }],
  182. autoSyncUsage: [{ required: true, message: t('supplier.autoSyncUsageRequired') }],
  183. useOperatorApi: [{ required: true, message: t('supplier.useOperatorApiRequired') }],
  184. useOperatorDataPool: [{ required: true, message: t('supplier.useOperatorDataPoolRequired') }],
  185. silentPeriod: [{ required: true, type: 'number', message: t('supplier.silentPeriodRequired') }],
  186. // ... 可以根据需要添加其他字段的验证规则 ...
  187. };
  188. watch(() => props.editData, (newVal) => {
  189. if (newVal) {
  190. Object.assign(formData, newVal);
  191. }
  192. }, { immediate: true });
  193. const handleSubmit = () => {
  194. Promise.all([
  195. formRef.value.validate(),
  196. apiConfigFormRef.value.validate(),
  197. advancedConfigFormRef.value.validate()
  198. ]).then(([baseErrors, apiErrors, advancedErrors]) => {
  199. const errors = [...(baseErrors || []), ...(apiErrors || []), ...(advancedErrors || [])];
  200. if (errors.length === 0) {
  201. emit('submit', { ...formData });
  202. emit('update:visible', false);
  203. } else {
  204. console.error('Validation failed', errors);
  205. Message.error(t('supplier.fillRequiredFields'));
  206. }
  207. }).catch((error) => {
  208. console.error('Validation error', error);
  209. Message.error(t('supplier.fillRequiredFields'));
  210. });
  211. };
  212. const handleCancel = () => {
  213. emit('update:visible', false);
  214. };
  215. </script>
  216. <style scoped>
  217. .arco-form-item {
  218. margin-bottom: 18px;
  219. }
  220. </style>