PreviewPromotionalInvoiceDetailDialog.vue 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  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="statusList[row.status - 1]?.color">
  45. {{ statusList[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 prop="promotionGoods" :formatter="v => v.order.promotionGoods.memberCardName" label="订单商品名称" />
  82. <el-table-column prop="promotionGoods" label="实付金额">
  83. <template #default="{ row }">
  84. <div>
  85. {{ row.order.promotionGoods.price / 100 }}
  86. </div>
  87. </template>
  88. </el-table-column>
  89. <el-table-column prop="status" :formatter="v => v.order.promotionGoods.memberCardName" label="订单状态">
  90. <template #default="{ row }">
  91. <div :class="orderStatusList[row.order.status - 1]?.color">
  92. {{ orderStatusList[row.order.status - 1]?.label }}
  93. </div>
  94. </template>
  95. </el-table-column>
  96. <el-table-column prop="createdAt" label="支付时间" />
  97. <el-table-column prop="payType" label="支付方式" :formatter="() => '微信支付'" />
  98. <el-table-column prop="paymentType" label="支付款流向">
  99. <template #default="{ row }">
  100. <div>
  101. {{ row.order.paymentType === 1 ? "平台" : row?.order.agency?.nickname }}
  102. </div>
  103. <div style="color: #a8abb2">
  104. [ 收款ID:{{ row.order.mchId }}]
  105. <br />
  106. <!-- [账号ID: {{ row.order.agencyId }}] -->
  107. </div>
  108. </template>
  109. </el-table-column>
  110. <el-table-column
  111. prop="paymentType"
  112. label="结算比例"
  113. :formatter="
  114. v =>
  115. v.order.paymentType == 1
  116. ? `${(v.order.promotionGoods?.toPlatformSettleRate).toFixed(2)}%`
  117. : `${v.order.promotionGoods?.toAgencySettleRate.toFixed(2)}%`
  118. "
  119. />
  120. <el-table-column
  121. prop="toAgencyBalance"
  122. label="结算后第三方应收款金额"
  123. :formatter="v => (v.type == 2 ? (v.balance / 100).toFixed(2) : '0.00')"
  124. />
  125. <el-table-column
  126. prop="toMechanismBalance"
  127. label="结算后平台应收款金额"
  128. :formatter="v => (v.type == 1 ? (v.balance / 100).toFixed(2) : '0.00')"
  129. />
  130. </el-table>
  131. <el-pagination
  132. class="mt-4 justify-end"
  133. background
  134. layout="prev, pager, next"
  135. :total="state.total"
  136. :page-size="state.query.pageSize"
  137. @current-change="changePage"
  138. />
  139. </div>
  140. </div>
  141. </el-dialog>
  142. </div>
  143. </template>
  144. <script setup>
  145. import { handleDownloadFile } from "@/utils";
  146. import { ref, computed, defineProps, defineEmits, reactive } from "vue";
  147. import { statusList } from "../constant.ts";
  148. import { statusList as orderStatusList } from "../constant.ts";
  149. import { ElMessage } from "element-plus";
  150. import { Document } from "@element-plus/icons-vue";
  151. import request from "@/api";
  152. const props = defineProps({
  153. show: {
  154. type: Boolean,
  155. default: false
  156. },
  157. rowData: {
  158. type: Object,
  159. default: () => {}
  160. }
  161. });
  162. const emits = defineEmits(["update:show", "success"]);
  163. const detail = ref({});
  164. const state = reactive({
  165. query: {
  166. page: 1,
  167. pageSize: 10
  168. },
  169. total: 0,
  170. recordList: []
  171. });
  172. const dialogVisible = computed({
  173. get() {
  174. return props.show;
  175. },
  176. set(n) {
  177. emits("update:show", n);
  178. }
  179. });
  180. const handleSettle = () => {
  181. request.post(`archivesService/agency/orderBill/settle?id=${detail.value.id}`).then(resp => {
  182. ElMessage.success(resp.message);
  183. emits("success");
  184. initData(detail.value.id);
  185. });
  186. };
  187. const initData = id => {
  188. request.get(`archivesService/agency/orderBill/detail?id=${id}`).then(resp => {
  189. detail.value = resp.data.detail;
  190. });
  191. getOrderBillRecord(id);
  192. };
  193. const getOrderBillRecord = id => {
  194. request
  195. .get("archivesService/agency/orderBill/record/paginate", {
  196. ...state.query,
  197. billId: id
  198. })
  199. .then(resp => {
  200. state.recordList = resp.data.list;
  201. state.total = resp.data.total;
  202. });
  203. };
  204. const handleExport = () => {
  205. request
  206. .post(
  207. `archivesService/agency/orderBill/export`,
  208. {
  209. id: detail.value.id
  210. },
  211. {
  212. responseType: "blob"
  213. }
  214. )
  215. .then(resp => {
  216. const fileName = `${detail.value.startTime?.split(" ")[0]} 至 ${
  217. detail.value.endTime?.split(" ")[0]
  218. } 订单详情(系统只显示这期间内支付已完成订单)`;
  219. handleDownloadFile(resp, fileName);
  220. });
  221. };
  222. const changePage = page => {
  223. state.query.page = page;
  224. getOrderBillRecord(detail.value.id);
  225. };
  226. defineExpose({
  227. initData
  228. });
  229. </script>