addEditorTwo.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <script lang="ts" setup>
  2. import { ref, reactive, onMounted, inject, watch } from "vue";
  3. import { UploadRequestOptions } from 'element-plus';
  4. import { Delete } from '@element-plus/icons-vue'
  5. import { tableShowOverflowTooltip } from '@/utils/globalVariables'
  6. import { formatDate } from '@/utils/times'
  7. import { downloadFile } from '@/utils/tools'
  8. import { post, get, uploadFile } from "@/utils/request";
  9. const props = defineProps<{
  10. paymentPlan: any[],
  11. enclosure: any[],
  12. enclosureDetele: any[]
  13. }>()
  14. const globalPopup = inject<GlobalPopup>('globalPopup')
  15. const paymentPlan = ref(props.paymentPlan)
  16. const enclosure = ref(props.enclosure)
  17. const enclosureDetele = ref<any[]>([])
  18. const uploadRef = ref<any>()
  19. watch(() => props.paymentPlan, (newVal, _oldVal) => {
  20. paymentPlan.value = newVal || []
  21. })
  22. watch(() => props.enclosure, (newVal, _oldVal) => {
  23. enclosure.value = newVal || []
  24. })
  25. watch(() => props.enclosureDetele, (newVal, _oldVal) => {
  26. enclosureDetele.value = newVal || []
  27. })
  28. const typeOptions = [
  29. { label: '增值税专用发票', value: 0 },
  30. { label: '增值税普通发票', value: 1 },
  31. ]
  32. function calculateTaxAmount(index: number) {
  33. const { amount = 0, taxRate = 0, taxAmount = 0 } = paymentPlan.value[index]
  34. if(!amount && !amount) {
  35. return
  36. }
  37. const shui = taxRate / 100
  38. const zhi = amount / (1 + shui) * shui
  39. paymentPlan.value[index].taxAmount = +(zhi.toFixed(2))
  40. }
  41. // 上传附件
  42. async function httpUploadFile(param: UploadRequestOptions) {
  43. const { file } = param
  44. enclosure.value.push({ name: file.name, file, needUpload: true })
  45. return
  46. }
  47. function addPlan() {
  48. paymentPlan.value.push({
  49. isPayed: false,
  50. payDate: formatDate(new Date()),
  51. amount: '0',
  52. isBilled: true
  53. })
  54. }
  55. function deteleTables(row: any, index: number, type: 'paymentPlan' | 'enclosure') {
  56. if (type === 'paymentPlan') {
  57. paymentPlan.value.splice(index, 1)
  58. } else {
  59. if(row.id) {
  60. enclosureDetele.value.push(row.id)
  61. }
  62. enclosure.value.splice(index, 1)
  63. }
  64. }
  65. function getAddEditorData() {
  66. return {
  67. paymentPlan: paymentPlan.value,
  68. enclosure: enclosure.value,
  69. enclosureDetele: enclosureDetele.value
  70. }
  71. }
  72. defineExpose({
  73. getAddEditorData
  74. })
  75. </script>
  76. <template>
  77. <div>
  78. <div>回款计划</div>
  79. <el-table :show-overflow-tooltip="tableShowOverflowTooltip" :data="paymentPlan" height="260">
  80. <el-table-column label="是否已回款" width="100">
  81. <template #default="scope">
  82. <el-checkbox v-model="scope.row.isPayed" label="已回款" />
  83. </template>
  84. </el-table-column>
  85. <el-table-column label="回款日期" width="180">
  86. <template #default="scope">
  87. <el-date-picker v-model="scope.row.payDate" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
  88. placeholder="回款日期" style="width: 150px;" />
  89. </template>
  90. </el-table-column>
  91. <el-table-column label="金额(含税)" width="180">
  92. <template #default="scope">
  93. <el-input v-model="scope.row.amount" v-enter-number placeholder="金额(含税)" style="width: 150px;">
  94. <template #prefix>
  95. <el-text class="mx-1" type="info">¥</el-text>
  96. </template>
  97. </el-input>
  98. </template>
  99. </el-table-column>
  100. <el-table-column label="是否已开票" width="100">
  101. <template #default="scope">
  102. <el-checkbox v-model="scope.row.isBilled" label="已开票" />
  103. </template>
  104. </el-table-column>
  105. <el-table-column label="开票日期" width="180">
  106. <template #default="scope">
  107. <el-date-picker v-model="scope.row.billDate" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
  108. placeholder="开票日期" style="width: 150px;" />
  109. </template>
  110. </el-table-column>
  111. <el-table-column label="开票种类增值税" width="180">
  112. <template #default="scope">
  113. <el-select v-model="scope.row.invoiceType" placeholder="请选择">
  114. <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value"></el-option>
  115. </el-select>
  116. </template>
  117. </el-table-column>
  118. <el-table-column label="税率%" width="180">
  119. <template #default="scope">
  120. <el-input-number v-model="scope.row.taxRate" controls-position="right" :min="0.1" :max="100" @change="calculateTaxAmount(scope.$index)"></el-input-number>
  121. </template>
  122. </el-table-column>
  123. <el-table-column label="税额" width="180">
  124. <template #default="scope">
  125. <el-input-number v-model="scope.row.taxAmount" controls-position="right" :min="0"></el-input-number>
  126. </template>
  127. </el-table-column>
  128. <el-table-column prop="operation" width="80" fixed="right">
  129. <template #header>
  130. <el-link type="primary" :underline="false" @click="addPlan()">添加</el-link>
  131. </template>
  132. <template #default="scope">
  133. <el-button type="danger" :icon="Delete" size="small"
  134. @click="deteleTables(scope.row, scope.$index, 'paymentPlan')"></el-button>
  135. </template>
  136. </el-table-column>
  137. </el-table>
  138. <div>附件</div>
  139. <el-table :show-overflow-tooltip="tableShowOverflowTooltip" :data="enclosure" height="260">
  140. <el-table-column label="序号" width="100">
  141. <template #default="scope">
  142. {{ scope.$index + 1 }}
  143. </template>
  144. </el-table-column>
  145. <el-table-column label="文件名称" prop="name"></el-table-column>
  146. <el-table-column label="操作" width="80">
  147. <template #default="scope">
  148. <el-link type="primary" :underline="false" v-if="scope.row.id" @click="downloadFile(scope.row.url, scope.row.name)">下载</el-link>
  149. </template>
  150. </el-table-column>
  151. <el-table-column label="操作" width="80">
  152. <template #header>
  153. <el-upload ref="uploadRef" :http-request="httpUploadFile" :show-file-list="false" element-loading-text="正在上传"
  154. multiple>
  155. <template #trigger>
  156. <el-link type="primary" :underline="false">添加</el-link>
  157. </template>
  158. </el-upload>
  159. </template>
  160. <template #default="scope">
  161. <el-button type="danger" :icon="Delete" size="small"
  162. @click="deteleTables(scope.row, scope.$index, 'enclosure')"></el-button>
  163. </template>
  164. </el-table-column>
  165. </el-table>
  166. </div>
  167. </template>
  168. <style lang="scss" scoped></style>