orderDetail.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. <template>
  2. <div id="">
  3. <el-dialog
  4. :visible.sync="visible"
  5. width="1200px"
  6. :show-close="false"
  7. :close-on-click-modal="false"
  8. :append-to-body="true"
  9. @closed="close"
  10. >
  11. <div slot="title" class="hearders">
  12. <div class="leftTitle">
  13. 详情
  14. </div>
  15. <div class="rightBoxs">
  16. <img
  17. src="@/assets/img/Close@2x.png"
  18. alt=""
  19. @click="visible = false"
  20. />
  21. </div>
  22. </div>
  23. <p style="font-size:14px;color:#333;font-weight:bold;">
  24. 订单编号:<span
  25. style="margin-right:14px;color:#007aff;font-weight:400;"
  26. >{{ orderInfo.handleOrderSn }}</span
  27. >订单状态:<span
  28. style="margin-right:14px;color:#007aff;font-weight:400;"
  29. >{{ getPayStatus(orderInfo.payStatus) }}</span
  30. >
  31. 密码说明: <strong style="font-weight:400;">第一次开通学员,密码则为身份证后六位数</strong>
  32. </p>
  33. <el-main v-loading="loading" style="padding:20px 0px;">
  34. <el-descriptions class="margin-top" :column="3" border>
  35. <el-descriptions-item label="创建时间">
  36. {{ $tools.timestampToTime(orderInfo.createTime, false) }}
  37. </el-descriptions-item>
  38. <el-descriptions-item label="通过时间">
  39. {{ $tools.timestampToTime(orderInfo.payTime, false) }}
  40. </el-descriptions-item>
  41. <el-descriptions-item :label="$store.state.TENANT_NANE == '480813706424615769' ? '课程类型': '商品类型'">
  42. {{
  43. orderInfo.goodsType == 1
  44. ? "课程"
  45. : orderInfo.goodsType == 2
  46. ? "题库"
  47. : ""
  48. }}
  49. </el-descriptions-item>
  50. <el-descriptions-item label="教育类型">
  51. {{ orderInfo.educationName }}
  52. </el-descriptions-item>
  53. <el-descriptions-item label="培训项目">
  54. {{ orderInfo.projectName + " - " + orderInfo.businessName }}
  55. </el-descriptions-item>
  56. <!-- <el-descriptions-item label="订购人数">
  57. {{ orderInfo.userNum || 0 }}位
  58. </el-descriptions-item>
  59. <el-descriptions-item label="订购数量">
  60. {{ orderInfo.goodsNum || 0 }}个
  61. </el-descriptions-item> -->
  62. <el-descriptions-item label="下单金额">
  63. ¥{{ orderInfo.orderPrice | formatPrice }}
  64. </el-descriptions-item>
  65. <el-descriptions-item label="退款金额">
  66. ¥{{ orderInfo.goodsRefund | formatPrice }}
  67. </el-descriptions-item>
  68. <el-descriptions-item label="实际金额">
  69. ¥{{ orderInfo.realPrice | formatPrice }}
  70. </el-descriptions-item>
  71. <el-descriptions-item label="支付方式">
  72. {{ orderInfo.payType == 1 ? "微信" : "对公转账" }}
  73. </el-descriptions-item>
  74. <el-descriptions-item label="转账凭证">
  75. <el-button
  76. type="text"
  77. v-if="
  78. (orderInfo.payStatus == 1 ||
  79. orderInfo.payStatus == 2 ||
  80. orderInfo.payStatus == -2) &&
  81. orderInfo.payType == 2
  82. "
  83. @click="openZZ(orderInfo.handleOrderSn)"
  84. >查看</el-button
  85. >
  86. </el-descriptions-item>
  87. <el-descriptions-item label="发票状态">
  88. {{ showInvoice(orderInfo.invoiceStatus) }}
  89. <span v-if="orderInfo.invoiceUrl && orderInfo.invoiceStatus == 2"
  90. >({{ orderInfo.invoiceUrl.split(",").length }}张)<el-button
  91. type="text"
  92. @click="downinvoice(orderInfo.invoiceUrl.split(','))"
  93. >下载</el-button
  94. >
  95. </span>
  96. </el-descriptions-item>
  97. <el-descriptions-item label="下单备注">
  98. {{ orderInfo.companyRemark }}
  99. </el-descriptions-item>
  100. <el-descriptions-item label="审核意见">
  101. {{ orderInfo.checkReason }}
  102. </el-descriptions-item>
  103. </el-descriptions>
  104. </el-main>
  105. <el-divider></el-divider>
  106. <el-main style="padding:20px 0px;">
  107. <el-table
  108. max-height="400px"
  109. ref="table"
  110. size="small"
  111. :data="tableData"
  112. style="width: 100%"
  113. border
  114. :header-cell-style="{
  115. 'background-color': '#eee',
  116. color: '#333',
  117. fontSize: '14px'
  118. }"
  119. >
  120. <el-table-column align="center" type="index" width="50" label="序号">
  121. </el-table-column>
  122. <el-table-column
  123. align="center"
  124. v-for="(item, index) in tableSet"
  125. :key="index"
  126. :label="item.label"
  127. :prop="item.prop"
  128. >
  129. <template slot-scope="scope">
  130. <span v-if="item.scope == 'progress'">
  131. <span v-if="scope.row.refundStatus == 1">已关闭</span>
  132. <span v-else>
  133. {{ scope.row.stuAllNum + scope.row.recordNum }} /
  134. {{ scope.row.secAllNum + scope.row.examNum }}</span
  135. >
  136. </span>
  137. <div v-else-if="item.scope == 'isOptions'">
  138. <span v-for="(items, indexs) in item.options" :key="indexs"
  139. ><span v-if="items.value == scope.row[item.prop]">{{
  140. items.label
  141. }}</span></span
  142. >
  143. </div>
  144. <span v-else-if="item.scope == 'price'">
  145. ¥{{ scope.row[item.prop] | formatPrice }}
  146. </span>
  147. <span v-else>{{ scope.row[item.prop] }}</span>
  148. </template>
  149. </el-table-column>
  150. </el-table>
  151. </el-main>
  152. </el-dialog>
  153. <public-transfer ref="publicTransfer" />
  154. </div>
  155. </template>
  156. <script>
  157. import publicTransfer from "./order/step-2/publicTransfer.vue";
  158. export default {
  159. components: { publicTransfer },
  160. data() {
  161. return {
  162. loading: false,
  163. visible: false,
  164. orderInfo: {},
  165. tableData: [],
  166. tableSet: [
  167. { label: "姓名", prop: "realname" },
  168. { label: "身份证号", prop: "idCard" },
  169. { label: "手机号码", prop: "telPhone" },
  170. { label: "年份", prop: "year" },
  171. { label: "科目", prop: "subjectNames" },
  172. { label: "商品", prop: "goodsName" },
  173. { label: "金额", prop: "goodsRealPrice", scope: "price" },
  174. { label: "学习进度", scope: "progress" },
  175. {
  176. label: "退款状态",
  177. prop: "refundStatus",
  178. scope: "isOptions",
  179. options: [
  180. { label: "待审核", value: 0 },
  181. { label: "已退款", value: 1 },
  182. { label: "不通过", value: 2 }
  183. ]
  184. },
  185. { label: "退款原因", prop: "refundReason" },
  186. { label: "审核意见", prop: "periodReason" }
  187. ]
  188. };
  189. },
  190. methods: {
  191. openBoxs(sn) {
  192. this.orderInfo = {};
  193. this.tableData = [];
  194. this.visible = true;
  195. this.loading = true;
  196. this.$request
  197. .orderhandledetail({ handleOrderSn: sn })
  198. .then(res => {
  199. this.orderInfo = res.data;
  200. })
  201. .finally(() => {
  202. this.loading = false;
  203. });
  204. this.$request.orderhandlegoodsList({ handleOrderSn: sn }).then(res => {
  205. this.tableData = res.rows || [];
  206. });
  207. },
  208. close() {
  209. this.loading = false;
  210. },
  211. openZZ(sn) {
  212. this.$refs.publicTransfer.openBoxs(sn, false);
  213. },
  214. showInvoice(i) {
  215. var str = "";
  216. switch (i) {
  217. case 1:
  218. str = "待审核";
  219. break;
  220. case 2:
  221. str = "已开票";
  222. break;
  223. case 3:
  224. str = "不通过";
  225. break;
  226. case 4:
  227. str = "已失效";
  228. break;
  229. default:
  230. str = "未开票";
  231. break;
  232. }
  233. return str;
  234. },
  235. downinvoice(ary) {
  236. for (let i = 0; i < ary.length; i++) {
  237. this.download(this.$tools.splitImgHost(ary[i]));
  238. }
  239. },
  240. //下载
  241. download(url, fileName = "") {
  242. let xhr = new XMLHttpRequest();
  243. xhr.open("get", url, true);
  244. xhr.setRequestHeader("Content-Type", `application/pdf`);
  245. xhr.responseType = "blob";
  246. let that = this;
  247. xhr.onload = function() {
  248. if (this.status == 200) {
  249. //接受二进制文件流
  250. var blob = this.response;
  251. that.downloadExportFile(blob, fileName);
  252. }
  253. };
  254. xhr.send();
  255. },
  256. downloadExportFile(blob, tagFileName) {
  257. let downloadElement = document.createElement("a");
  258. let href = "";
  259. if (typeof blob == "string") {
  260. downloadElement.target = "_blank";
  261. } else {
  262. href = window.URL.createObjectURL(blob); //创建下载的链接
  263. }
  264. downloadElement.href = href;
  265. downloadElement.download = tagFileName;
  266. //下载后文件名
  267. document.body.appendChild(downloadElement);
  268. downloadElement.click(); //点击下载
  269. document.body.removeChild(downloadElement); //下载完成移除元素
  270. if (typeof blob != "string") {
  271. window.URL.revokeObjectURL(href); //释放掉blob对象
  272. }
  273. },
  274. getPayStatus(i) {
  275. var str = "";
  276. switch (i) {
  277. case 0:
  278. str = "待支付";
  279. break;
  280. case 1:
  281. str = "已支付";
  282. break;
  283. case -1:
  284. str = "已关闭";
  285. break;
  286. case 2:
  287. str = "审核中";
  288. break;
  289. case -2:
  290. str = "不通过";
  291. break;
  292. default:
  293. break;
  294. }
  295. return str;
  296. }
  297. }
  298. };
  299. </script>
  300. <style lang="scss" scoped>
  301. /deep/ .el-divider--horizontal {
  302. margin: 14px 0px;
  303. }
  304. /deep/ .el-dialog {
  305. margin-top: 3vh !important;
  306. border-radius: 8px !important;
  307. .el-dialog__header {
  308. padding: 0;
  309. .hearders {
  310. height: 40px;
  311. display: flex;
  312. align-items: center;
  313. justify-content: space-between;
  314. padding: 0px 18px 0px 20px;
  315. border-bottom: 1px solid #e2e2e2;
  316. .leftTitle {
  317. font-size: 14px;
  318. font-weight: bold;
  319. color: #2f4378;
  320. }
  321. .rightBoxs {
  322. display: flex;
  323. align-items: center;
  324. img {
  325. width: 14px;
  326. height: 14px;
  327. margin-left: 13px;
  328. cursor: pointer;
  329. }
  330. }
  331. }
  332. }
  333. .el-dialog__footer {
  334. padding: 0;
  335. .dialog-footer {
  336. padding: 0px 40px;
  337. height: 70px;
  338. border-top: 1px solid #e2e2e2;
  339. display: flex;
  340. align-items: center;
  341. justify-content: flex-end;
  342. }
  343. }
  344. }
  345. /deep/.el-button {
  346. border-radius: 8px;
  347. }
  348. /deep/ .el-descriptions-item__label.is-bordered-label {
  349. color: #333;
  350. font-weight: bold;
  351. }
  352. </style>