index.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. <template>
  2. <app-modal direction="right" height="100%" v-model:show="showModal" :refresh="refresh">
  3. <app-view class="g-form">
  4. <template #header>
  5. <app-navbar :title="selectedRow.autoid ? '修改发票信息' : '新增发票信息'" @back="closed" />
  6. </template>
  7. <Form ref="formRef" class="g-form__container" @submit="formSubmit">
  8. <CellGroup inset>
  9. <Field name="ReceiptType" label="发票类型" :rules="formRules.ReceiptType"
  10. :is-link="!selectedRow.autoid">
  11. <template #input>
  12. <app-select v-model="formData.ReceiptType" :options="getReceiptTypeList()"
  13. :readonly="!!selectedRow.autoid" />
  14. </template>
  15. </Field>
  16. <Field v-model="formData.UserName" :rules="formRules.UserName" name="UserName" label="发票抬头"
  17. placeholder="必填" />
  18. <template v-if="formData.ReceiptType === ReceiptType.Company">
  19. <Field v-model="formData.TaxpayerID" :rules="formRules.TaxpayerID" name="TaxpayerID" label="税号"
  20. placeholder="必填" />
  21. <Field v-model="formData.ReceiptBank" :rules="formRules.ReceiptBank" name="ReceiptBank"
  22. label="开户银行" placeholder="选填" />
  23. <Field v-model="formData.ReceiptAccount" :rules="formRules.ReceiptAccount" name="ReceiptAccount"
  24. label="银行账号" placeholder="选填" />
  25. <Field v-model="formData.Address" :rules="formRules.Address" name="Address" label="企业地址"
  26. placeholder="选填" />
  27. <Field v-model="formData.ContactInfo" :rules="formRules.ContactInfo" name="ContactInfo"
  28. label="企业电话" placeholder="选填" />
  29. </template>
  30. <Field v-model="formData.Email" :rules="formRules.Email" name="Email" label="邮箱" placeholder="选填" />
  31. </CellGroup>
  32. </Form>
  33. <template #footer>
  34. <div class="g-form__footer">
  35. <Button type="warning" @click="formDelete" round block v-if="selectedRow.autoid">删除</Button>
  36. <Button type="primary" @click="formRef?.submit" round block>保存</Button>
  37. </div>
  38. </template>
  39. </app-view>
  40. </app-modal>
  41. </template>
  42. <script lang="ts" setup>
  43. import { shallowRef, PropType } from 'vue'
  44. import { CellGroup, Button, Field, Form, FormInstance, showFailToast, FieldRule } from 'vant'
  45. import { fullloading, dialog } from '@/utils/vant'
  46. import { ReceiptType, getReceiptTypeList } from '@/constants/receipt'
  47. import { validateRules } from '@/constants/regex'
  48. import { useInvoiceForm } from '@/business/user'
  49. import AppModal from '@/components/base/modal/index.vue'
  50. import AppSelect from '@mobile/components/base/select/index.vue'
  51. const props = defineProps({
  52. selectedRow: {
  53. type: Object as PropType<Model.WrUserReceiptInfoRsp>,
  54. default: () => ({})
  55. }
  56. })
  57. const { formData, addOrUpdate, deleteInvoice } = useInvoiceForm(props.selectedRow)
  58. const formRef = shallowRef<FormInstance>()
  59. const showModal = shallowRef(true)
  60. const refresh = shallowRef(false) // 是否刷新父组件数据
  61. // 表单验证规则
  62. const formRules: { [key in keyof Proto.UserReceiptInfoReq]?: FieldRule[] } = {
  63. UserName: [{
  64. required: true,
  65. message: '请输入发票抬头',
  66. }],
  67. TaxpayerID: [{
  68. required: true,
  69. message: '请输入纳税人识别号',
  70. }],
  71. Email: [{
  72. validator: (val) => {
  73. if (validateRules.email.validate(val)) {
  74. return true
  75. }
  76. return validateRules.email.message
  77. }
  78. }],
  79. }
  80. // 表单提交
  81. const formSubmit = () => {
  82. fullloading((hideLoading) => {
  83. addOrUpdate().then(() => {
  84. hideLoading()
  85. closed(true)
  86. }).catch((err) => {
  87. showFailToast(err)
  88. })
  89. })
  90. }
  91. // 删除发票
  92. const formDelete = () => {
  93. dialog({
  94. message: '是否删除该发票?',
  95. showCancelButton: true
  96. }).then(() => {
  97. fullloading((hideLoading) => {
  98. deleteInvoice().then(() => {
  99. hideLoading()
  100. closed(true)
  101. }).catch((err) => {
  102. showFailToast(err)
  103. })
  104. })
  105. })
  106. }
  107. // 关闭弹窗
  108. const closed = (isRefresh = false) => {
  109. refresh.value = isRefresh
  110. showModal.value = false
  111. }
  112. // 暴露组件属性给父组件调用
  113. defineExpose({
  114. closed,
  115. })
  116. </script>