PreviewPromotionalInvoiceDetailDialog.vue 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. <template>
  2. <div>
  3. <el-dialog title="账单详情" v-model="dialogVisible" width="70%">
  4. <div>
  5. <el-table :data="[detail]" style="width: 100%" border>
  6. <el-table-column prop="startTime" label="账单周期">
  7. <template #default="{ row }">
  8. <div class="flex">
  9. <div>{{ row.startTime?.split(" ")[0] }}</div>
  10. <div class="mx-2">至</div>
  11. <div>{{ row.endTime?.split(" ")[0] }}</div>
  12. </div>
  13. </template>
  14. </el-table-column>
  15. <el-table-column prop="archiveId" label="账单所属第三方名称">
  16. <template #default="{ row }">
  17. <div class="flex">
  18. <div>{{ row.agency?.nickname }}【{{ row.agency?.id }}】</div>
  19. </div>
  20. </template>
  21. </el-table-column>
  22. <el-table-column
  23. prop="agencyReceiveBalance"
  24. label="累计支付到第三方总金额"
  25. :formatter="v => (v.agencyReceiveBalance / 100).toFixed(2)"
  26. />
  27. <el-table-column
  28. prop="toMechanismBalance"
  29. label="结算后平台应收收款金额"
  30. :formatter="v => (v.toMechanismBalance / 100).toFixed(2)"
  31. />
  32. <el-table-column
  33. prop="mechanismReceiveBalance"
  34. label="累计支付到平台总金额"
  35. :formatter="v => (v.mechanismReceiveBalance / 100).toFixed(2)"
  36. />
  37. <el-table-column
  38. prop="toAgencyBalance"
  39. label="结算后第三方应收款金额"
  40. :formatter="v => (v.toAgencyBalance / 100).toFixed(2)"
  41. />
  42. <el-table-column prop="serviceName" label="结算状态">
  43. <template #default="{ row }">
  44. <div :class="settlementStatusList[row.status - 1]?.color">
  45. {{ settlementStatusList[row.status - 1]?.label }}
  46. </div>
  47. </template>
  48. </el-table-column>
  49. </el-table>
  50. <el-button type="primary" class="my-3" v-if="detail.status == 2" @click="handleSettle">设为已结算</el-button>
  51. <el-divider />
  52. <div>
  53. <div class="flex justify-between">
  54. <div class="flex">
  55. <div>{{ detail.startTime?.split(" ")[0] }}</div>
  56. <div class="mx-2">至</div>
  57. <div class="mr-3">{{ detail.endTime?.split(" ")[0] }}</div>
  58. 订单详情(系统只显示这期间内支付已完成订单)
  59. </div>
  60. <el-button v-if="state.recordList.length" :icon="Document" type="primary" link @click="handleExport"
  61. >导出详情</el-button
  62. >
  63. </div>
  64. <el-table :data="state.recordList" style="width: 100%" border class="my-4">
  65. <el-table-column prop="sn" label="订单信息">
  66. <template #default="{ row }">
  67. <div>
  68. <span>{{ row.order.sn }}</span>
  69. <el-tag>【会员卡订单】</el-tag>
  70. </div>
  71. </template>
  72. </el-table-column>
  73. <el-table-column prop="promotionSite" label="订单来源信息">
  74. <template #default="{ row }">
  75. <div>
  76. <div>{{ row?.order?.promotionSite?.name }}</div>
  77. <div style="color: #a8abb2">[ {{ row.order?.promotionSite?.sn }} ]</div>
  78. </div>
  79. </template>
  80. </el-table-column>
  81. <el-table-column
  82. prop="promotionGoods"
  83. :formatter="v => v.order.promotionGoods?.memberCardName"
  84. label="订单商品名称"
  85. />
  86. <el-table-column prop="promotionGoods" label="实付金额">
  87. <template #default="{ row }">
  88. <div>
  89. {{ row.order.promotionGoods.price / 100 }}
  90. </div>
  91. </template>
  92. </el-table-column>
  93. <el-table-column prop="status" :formatter="v => v.order.promotionGoods?.memberCardName" label="订单状态">
  94. <template #default="{ row }">
  95. <div :class="statusList[row.order.status - 1]?.color">
  96. {{ statusList[row.order.status - 1]?.label }}
  97. </div>
  98. </template>
  99. </el-table-column>
  100. <el-table-column prop="createdAt" label="支付时间" />
  101. <el-table-column prop="payType" label="支付方式" :formatter="() => '微信支付'" />
  102. <el-table-column prop="paymentType" label="支付款流向">
  103. <template #default="{ row }">
  104. <div>
  105. {{ row.order.paymentType === 1 ? "平台" : row?.order.agency?.nickname }}
  106. </div>
  107. <div style="color: #a8abb2">
  108. [ 收款ID:{{ row.order.paymentType === 1 ? row.order.mechanismId : row.order.promotionSite.sn }}
  109. ]
  110. <br />
  111. </div>
  112. </template>
  113. </el-table-column>
  114. <el-table-column
  115. prop="paymentType"
  116. label="结算比例"
  117. :formatter="
  118. v =>
  119. v.order.paymentType == 1
  120. ? `${(v.order.promotionGoods?.toPlatformSettleRate).toFixed(2)}%`
  121. : `${v.order.promotionGoods?.toAgencySettleRate.toFixed(2)}%`
  122. "
  123. />
  124. <el-table-column
  125. prop="toAgencyBalance"
  126. label="结算后第三方应收款金额"
  127. :formatter="v => (v.type == 2 ? (v.balance / 100).toFixed(2) : '0.00')"
  128. />
  129. <el-table-column
  130. prop="toMechanismBalance"
  131. label="结算后平台应收款金额"
  132. :formatter="v => (v.type == 1 ? (v.balance / 100).toFixed(2) : '0.00')"
  133. />
  134. </el-table>
  135. <el-pagination
  136. class="mt-4 justify-end"
  137. background
  138. layout="prev, pager, next"
  139. :total="state.total"
  140. :page-size="state.query.pageSize"
  141. @current-change="changePage"
  142. />
  143. </div>
  144. </div>
  145. </el-dialog>
  146. </div>
  147. </template>
  148. <script setup>
  149. import { handleDownloadFile } from "@/utils";
  150. import { ref, computed, defineProps, defineEmits, reactive } from "vue";
  151. import { statusList, settlementStatusList } from "../constant.ts";
  152. import { ElMessage } from "element-plus";
  153. import { Document } from "@element-plus/icons-vue";
  154. import request from "@/api";
  155. const props = defineProps({
  156. show: {
  157. type: Boolean,
  158. default: false
  159. },
  160. rowData: {
  161. type: Object,
  162. default: () => {}
  163. }
  164. });
  165. const emits = defineEmits(["update:show", "success"]);
  166. const detail = ref({});
  167. const state = reactive({
  168. query: {
  169. page: 1,
  170. pageSize: 10
  171. },
  172. total: 0,
  173. recordList: []
  174. });
  175. const dialogVisible = computed({
  176. get() {
  177. return props.show;
  178. },
  179. set(n) {
  180. emits("update:show", n);
  181. }
  182. });
  183. const handleSettle = () => {
  184. request.post(`archivesService/agency/orderBill/settle?id=${detail.value.id}`).then(resp => {
  185. ElMessage.success(resp.message);
  186. emits("success");
  187. initData(detail.value.id);
  188. });
  189. };
  190. const initData = id => {
  191. request.get(`archivesService/agency/orderBill/detail?id=${id}`).then(resp => {
  192. detail.value = resp.data.detail;
  193. });
  194. getOrderBillRecord(id);
  195. };
  196. const getOrderBillRecord = id => {
  197. request
  198. .get("archivesService/agency/orderBill/record/paginate", {
  199. ...state.query,
  200. billId: id
  201. })
  202. .then(resp => {
  203. state.recordList = resp.data.list;
  204. state.total = resp.data.total;
  205. });
  206. };
  207. const handleExport = () => {
  208. request
  209. .post(
  210. `archivesService/agency/orderBill/export`,
  211. {
  212. id: detail.value.id
  213. },
  214. {
  215. responseType: "blob"
  216. }
  217. )
  218. .then(resp => {
  219. const fileName = `${detail.value.startTime?.split(" ")[0]} 至 ${
  220. detail.value.endTime?.split(" ")[0]
  221. } 订单详情(系统只显示这期间内支付已完成订单)`;
  222. handleDownloadFile(resp, fileName);
  223. });
  224. };
  225. const changePage = page => {
  226. state.query.page = page;
  227. getOrderBillRecord(detail.value.id);
  228. };
  229. defineExpose({
  230. initData
  231. });
  232. </script>