invoice.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. <template>
  2. <div class="ml-[20px] min-h-[70vh] px-[20px] py-[30px] w-[1000px] bg-[#fff] rounded-[var(--rounded-big)]">
  3. <div class="h-full" v-loading="invoiceTableData.loading">
  4. <div class="flex items-center justify-between mb-[23px] leading-[20px]">
  5. <div class="flex flex-wrap">
  6. <div class="text-[16px] mr-[50px] text-[#666] cursor-pointer" :class="{'!text-primary font-500': invoiceTableData.params.is_invoice == item.value}" v-for="(item,index) in invoiceType" :key="index" @click="handleClick(item.value)">{{item.name}}</div>
  7. </div>
  8. </div>
  9. <div v-if="invoiceTableData.data.length && !invoiceTableData.loading">
  10. <div>
  11. <div class="rounded-[12px] overflow-hidden mb-[20px] border-[1px] border-solid border-[#eee]" v-for="(item,index) in invoiceTableData.data" :key="index">
  12. <div class="h-[54px] leading-[52px] text-[14px] px-[20px] bg-[#fafafa] flex items-center justify-between">
  13. <div class="flex items-center">
  14. <div class="bg-[#bbb] text-[#fff] mr-[20px] rounded-[2px] text-[12px] leading-[1] py-[2px] px-[4px]">{{ item.is_invoice_name }}</div>
  15. <div class="text-[#999] mr-[20px] oppoSans-R">{{item.orderData.create_time}}</div>
  16. <div class="text-[#999] mr-[50px] oppoSans-R">
  17. <span>发票类型:</span>
  18. <span class="text-[#333] font-400 oppoSans-R">{{item.type_name}}</span>
  19. </div>
  20. </div>
  21. </div>
  22. <div class="flex justify-between items-center pl-[20px] ">
  23. <div class="w-[786px] my-[20px] border-r-[1px] border-dashed border-[rgb(238, 238, 238)]" >
  24. <div class="flex items-center mb-[20px]" v-for="(subItem,subIndex) in item.orderData.orderGoods" :key="subIndex">
  25. <div class="flex items-center cursor-pointer">
  26. <el-image class="rounded-[var(--rounded-mid)]" style="width: 100px; height: 100px" v-if="subItem.goods_image" :src="img(subItem.goods_image)" fit="cover">
  27. <template #error>
  28. <img src="@/assets/images/goods_default.png" class="w-[100px] h-[100px] rounded-[var(--rounded-mid)]">
  29. </template>
  30. </el-image>
  31. <div class="ml-[20px] flex flex-col justify-center flex-1">
  32. <div class="text-[14px] text-[#333] truncate w-[635px] mb-[14px] font-500 oppoSans-M">{{subItem.goods_name}}</div>
  33. <div class="text-[14px] text-[#333] truncate w-[635px] mb-[15px] font-400 oppoSans-R" v-if="subItem.sku_name">规格:{{subItem.sku_name}}</div>
  34. <div class="text-[14px] text-[#333] oppoSans-R mr-[20px]">¥{{ subItem.goods_money }}×{{ subItem.num }}</div>
  35. </div>
  36. </div>
  37. </div>
  38. </div>
  39. <div class="w-[180px] pt-[20px] pb-[6px]">
  40. <div class="w-[86px] h-[30px] leading-[28px] text-[12px] text-[#333] rounded-[15px] text-center border-[1px] border-solid border-[#ccc] cursor-pointer mx-auto mb-[14px] " @click="handleDetail(item.id)">{{t('detail')}}</div>
  41. </div>
  42. </div>
  43. </div>
  44. </div>
  45. <div class="mt-[16px] flex justify-end">
  46. <el-pagination v-model:current-page="invoiceTableData.page" v-model:page-size="invoiceTableData.limit" layout="prev, pager, next" background :total="invoiceTableData.total"
  47. @size-change="loadInvoiceList()" @current-change="loadInvoiceList" />
  48. </div>
  49. </div>
  50. <div v-if="!invoiceTableData.data.length && !invoiceTableData.loading">
  51. <el-empty description="暂无数据" :image-size="200" :image="img('static/resource/images/system/empty.png')"/>
  52. </div>
  53. </div>
  54. <!-- 发票详情 -->
  55. <el-dialog v-model="dialogInvoiceVisible" :title="t('invoiceInfo')" width="600px" :destroy-on-close="true">
  56. <el-scrollbar height="250px" v-loading="loading">
  57. <el-form :model="invoiceData" label-width="100px" ref="formRef" class="px-[10px]" label-position="left">
  58. <el-row>
  59. <el-col :span="12" v-if="invoiceData.is_invoice_name">
  60. <el-form-item :label="t('invoiceStatus')">
  61. <div class="input-width">{{ invoiceData.is_invoice_name }}</div>
  62. </el-form-item>
  63. </el-col>
  64. <el-col :span="12" v-if="invoiceData.header_name">
  65. <el-form-item :label="t('headerName')">
  66. <div class="input-width">{{ invoiceData.header_name }}</div>
  67. </el-form-item>
  68. </el-col>
  69. <el-col :span="12" v-if="invoiceData.header_type_name">
  70. <el-form-item :label="t('headTypeName')">
  71. <div class="input-width">{{ invoiceData.header_type_name }}</div>
  72. </el-form-item>
  73. </el-col>
  74. <el-col :span="12" v-if="invoiceData.name">
  75. <el-form-item :label="t('name')">
  76. <div class="input-width">{{ invoiceData.name }}</div>
  77. </el-form-item>
  78. </el-col>
  79. <el-col :span="12" v-if="invoiceData.invoice_number">
  80. <el-form-item :label="t('invoiceNumber')">
  81. <div class="input-width">{{ invoiceData.invoice_number}}</div>
  82. </el-form-item>
  83. </el-col>
  84. <el-col :span="12" v-if="invoiceData.type_name">
  85. <el-form-item :label="t('typeName')">
  86. <div class="input-width">{{ invoiceData.type_name}}</div>
  87. </el-form-item>
  88. </el-col>
  89. <el-col :span="12">
  90. <el-form-item :label="t('email')">
  91. <div class="input-width">{{ invoiceData.email }}</div>
  92. </el-form-item>
  93. </el-col>
  94. <el-col :span="12" v-if="invoiceData.money">
  95. <el-form-item :label="t('money')">
  96. <div class="input-width">{{ invoiceData.money}}</div>
  97. </el-form-item>
  98. </el-col>
  99. <el-col :span="12" v-if="invoiceData.invoice_time">
  100. <el-form-item :label="t('invoiceTime')">
  101. <div class="input-width">{{ invoiceData.invoice_time === 0 ? '' : invoiceData.invoice_time }}</div>
  102. </el-form-item>
  103. </el-col>
  104. <template v-if="invoiceData.header_type == 2">
  105. <el-col :span="12" v-if="invoiceData.tax_number">
  106. <el-form-item :label="t('taxNumber')">
  107. <div class="input-width">{{ invoiceData.tax_number}}</div>
  108. </el-form-item>
  109. </el-col>
  110. <el-col :span="12" v-if="invoiceData.bank_name">
  111. <el-form-item :label="t('bankTame')">
  112. <div class="input-width">{{ invoiceData.bank_name }}</div>
  113. </el-form-item>
  114. </el-col>
  115. <el-col :span="12" v-if="invoiceData.bank_card_number">
  116. <el-form-item :label="t('bankCardNumber')">
  117. <div class="input-width">{{ invoiceData.bank_card_number }}</div>
  118. </el-form-item>
  119. </el-col>
  120. <el-col :span="12" v-if="invoiceData.address">
  121. <el-form-item :label="t('address')">
  122. <div class="input-width">{{ invoiceData.address }}</div>
  123. </el-form-item>
  124. </el-col>
  125. <el-col :span="12" v-if="invoiceData.telephone">
  126. <el-form-item :label="t('telephone')">
  127. <div class="input-width">{{ invoiceData.telephone }}</div>
  128. </el-form-item>
  129. </el-col>
  130. </template>
  131. <el-col :span="12">
  132. <el-form-item :label="t('applyTime')">
  133. <div class="input-width">{{ invoiceData.create_time }}</div>
  134. </el-form-item>
  135. </el-col>
  136. <el-col :span="12" v-if="invoiceData.invoice_voucher">
  137. <el-form-item :label="t('invoiceVoucher')">
  138. <div><img class="w-[50px] max-h-[50px] inline-block" :src="img(invoiceData.invoice_voucher)" alt="" @click="previewImage" ></div>
  139. </el-form-item>
  140. </el-col>
  141. <el-col :span="12" v-if="invoiceData.remark">
  142. <el-form-item :label="t('remark')">
  143. <div class="input-width break-all">{{ invoiceData.remark }}</div>
  144. </el-form-item>
  145. </el-col>
  146. </el-row>
  147. </el-form>
  148. </el-scrollbar>
  149. <template #footer>
  150. <div class="dialog-footer">
  151. <el-button type="primary" class="!bg-[var(--el-color-primary)] !border-[var(--el-color-primary)]" @click="dialogInvoiceVisible = false" dark>{{ t('confirm') }}</el-button>
  152. </div>
  153. </template>
  154. </el-dialog>
  155. <el-image-viewer :url-list="previewImageList" v-if="imageViewer.show" @close="imageViewer.show = false" :initial-index="imageViewer.index" :zoom-rate="1" />
  156. </div>
  157. </template>
  158. <script setup lang="ts">
  159. import { reactive, ref } from 'vue'
  160. import { getMallInvoice , getMallInvoiceDetail} from '@/addon/mall/api/invoice'
  161. import { useRouter } from 'vue-router'
  162. const router = useRouter()
  163. const invoiceType = [
  164. {
  165. name: '全部',
  166. value: 'all'
  167. },{
  168. name: '已开票',
  169. value: 1
  170. },{
  171. name: '未开票',
  172. value: 0
  173. }]
  174. // 获取会员列表
  175. const invoiceTableData = reactive({
  176. page: 1,
  177. limit: 10,
  178. total: 0,
  179. loading: true,
  180. data: [],
  181. params: {
  182. is_invoice: 'all'
  183. }
  184. })
  185. const loadInvoiceList = (page = 1) =>{
  186. invoiceTableData.page = page
  187. invoiceTableData.loading = true
  188. getMallInvoice({
  189. page: invoiceTableData.page,
  190. limit: invoiceTableData.limit,
  191. ... invoiceTableData.params
  192. }).then((res: any) =>{
  193. invoiceTableData.loading = false
  194. invoiceTableData.total = res.data.total
  195. invoiceTableData.data = res.data.data.map((el: any) => {
  196. el.orderData.orderGoods.forEach((v: any) => {
  197. v.rowNum = el.orderData.orderGoods.length
  198. })
  199. return el
  200. })
  201. })
  202. }
  203. loadInvoiceList()
  204. // 切换状态
  205. const handleClick = (event:any) =>{
  206. invoiceTableData.params.is_invoice = event
  207. loadInvoiceList()
  208. }
  209. // 查看发票详情
  210. const loading = ref(false)
  211. const dialogInvoiceVisible = ref(false)
  212. const invoiceData = ref<any>({})
  213. const handleDetail = (id: any) =>{
  214. loading.value = true
  215. getMallInvoiceDetailFn(id)
  216. dialogInvoiceVisible.value = true
  217. }
  218. const getMallInvoiceDetailFn = async (id:any) => {
  219. invoiceData.value = await (await getMallInvoiceDetail(id)).data
  220. if(invoiceData.value.invoice_voucher) {
  221. previewImageList.push(img(invoiceData.value.invoice_voucher))
  222. }
  223. loading.value = false
  224. }
  225. let previewImageList: string[] = reactive([])
  226. /**
  227. * 查看图片
  228. */
  229. const imageViewer = reactive({
  230. show: false,
  231. index: 0
  232. })
  233. const previewImage = () => {
  234. imageViewer.show = true
  235. }
  236. </script>
  237. <style lang="scss" scoped>
  238. </style>