addInvoiceDialog.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <template>
  2. <el-dialog v-model="visible" title="新增开票信息" width="800px" @close="handleClose">
  3. <el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
  4. <el-row :gutter="20">
  5. <el-col :span="24">
  6. <el-form-item label="纳税人识别号" prop="taxId">
  7. <el-input v-model="form.taxId" placeholder="">
  8. <template #append>
  9. <el-button>还原</el-button>
  10. </template>
  11. </el-input>
  12. </el-form-item>
  13. </el-col>
  14. </el-row>
  15. <el-row :gutter="20">
  16. <el-col :span="24">
  17. <el-form-item label="开户行行号" prop="bankCode">
  18. <el-input v-model="form.bankCode" placeholder="请输入开户行行号" />
  19. </el-form-item>
  20. </el-col>
  21. </el-row>
  22. <el-row :gutter="20">
  23. <el-col :span="24">
  24. <el-form-item label="开户行名称" prop="bankId">
  25. <el-select v-model="form.bankId" placeholder="请选择" class="w-full" filterable>
  26. <el-option v-for="bank in bankList" :key="bank.id" :label="`${bank.bnId} , ${bank.bnName}`" :value="bank.id" />
  27. </el-select>
  28. </el-form-item>
  29. </el-col>
  30. </el-row>
  31. <el-row :gutter="20">
  32. <el-col :span="24">
  33. <el-form-item label="银行账户" prop="bankAccount">
  34. <el-input v-model="form.bankAccount" placeholder="请输入银行账户" />
  35. </el-form-item>
  36. </el-col>
  37. </el-row>
  38. <el-row :gutter="20">
  39. <el-col :span="24">
  40. <el-form-item label="电话" prop="phone">
  41. <el-input v-model="form.phone" placeholder="请输入电话" />
  42. </el-form-item>
  43. </el-col>
  44. </el-row>
  45. <el-row :gutter="20">
  46. <el-col :span="24">
  47. <el-form-item label="地址" prop="address">
  48. <el-input v-model="form.address" placeholder="" />
  49. </el-form-item>
  50. </el-col>
  51. </el-row>
  52. <el-row :gutter="20">
  53. <el-col :span="24">
  54. <el-form-item label="是否主账号" prop="isPrimaryAccount">
  55. <el-radio-group v-model="form.isPrimaryAccount">
  56. <el-radio v-for="dict in sys_platform_yes_no" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio>
  57. </el-radio-group>
  58. </el-form-item>
  59. </el-col>
  60. </el-row>
  61. </el-form>
  62. <template #footer>
  63. <div class="dialog-footer">
  64. <el-button type="primary" @click="handleConfirm">确认</el-button>
  65. <el-button @click="handleClose">取消</el-button>
  66. </div>
  67. </template>
  68. </el-dialog>
  69. </template>
  70. <script setup lang="ts">
  71. import type { InvoiceInfoForm } from '@/api/customer/customerFile/invoiceInfo/types';
  72. import { listBank } from '@/api/company/bank';
  73. import { BankVO } from '@/api/company/bank/types';
  74. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  75. const { sys_platform_yes_no } = toRefs<any>(proxy?.useDict('sys_platform_yes_no'));
  76. const bankList = ref<BankVO[]>([]);
  77. interface Props {
  78. modelValue: boolean;
  79. editData?: InvoiceInfoForm;
  80. }
  81. interface Emits {
  82. (e: 'update:modelValue', value: boolean): void;
  83. (e: 'confirm', data: InvoiceInfoForm): void;
  84. }
  85. const props = withDefaults(defineProps<Props>(), {
  86. modelValue: false,
  87. editData: undefined
  88. });
  89. const emit = defineEmits<Emits>();
  90. const formRef = ref<any>(null);
  91. const visible = computed({
  92. get: () => props.modelValue,
  93. set: (val) => emit('update:modelValue', val)
  94. });
  95. const form = reactive<InvoiceInfoForm>({
  96. taxId: undefined,
  97. bankCode: '',
  98. bankId: undefined,
  99. bankName: '',
  100. bankAccount: '',
  101. phone: '',
  102. address: '',
  103. isPrimaryAccount: '0',
  104. status: '0',
  105. remark: ''
  106. });
  107. const rules = {
  108. bankCode: [{ required: true, message: '请输入开户行行号', trigger: 'blur' }],
  109. bankName: [{ required: true, message: '请选择开户行名称', trigger: 'change' }],
  110. bankAccount: [{ required: true, message: '请输入银行账户', trigger: 'blur' }],
  111. phone: [{ required: true, message: '请输入电话', trigger: 'blur' }]
  112. };
  113. // 监听编辑数据
  114. watch(
  115. () => props.editData,
  116. (newVal) => {
  117. if (newVal) {
  118. Object.assign(form, newVal);
  119. }
  120. },
  121. { immediate: true, deep: true }
  122. );
  123. // 确认
  124. const handleConfirm = async () => {
  125. try {
  126. await formRef.value?.validate();
  127. emit('confirm', { ...form });
  128. handleClose();
  129. } catch (error) {
  130. console.error('表单验证失败:', error);
  131. }
  132. };
  133. // 获取银行列表
  134. const getBankList = async () => {
  135. try {
  136. const res = await listBank({ pageNum: 1, pageSize: 9999, isShow: '0' });
  137. bankList.value = res.rows || [];
  138. } catch (error) {
  139. console.error('获取银行列表失败', error);
  140. }
  141. };
  142. onMounted(() => {
  143. getBankList();
  144. });
  145. // 关闭
  146. const handleClose = () => {
  147. formRef.value?.resetFields();
  148. Object.assign(form, {
  149. taxId: undefined,
  150. bankCode: '',
  151. bankId: undefined,
  152. bankName: '',
  153. bankAccount: '',
  154. phone: '',
  155. address: '',
  156. isPrimaryAccount: '0',
  157. status: '0',
  158. remark: ''
  159. });
  160. emit('update:modelValue', false);
  161. };
  162. </script>